Skip to content

build(deps): bump react-native-worklets from 0.5.1 to 0.9.2#10

Closed
dependabot[bot] wants to merge 1 commit into
masterfrom
dependabot/npm_and_yarn/react-native-worklets-0.9.2
Closed

build(deps): bump react-native-worklets from 0.5.1 to 0.9.2#10
dependabot[bot] wants to merge 1 commit into
masterfrom
dependabot/npm_and_yarn/react-native-worklets-0.9.2

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jun 14, 2026

Copy link
Copy Markdown

Bumps react-native-worklets from 0.5.1 to 0.9.2.

Release notes

Sourced from react-native-worklets's releases.

Worklets - 0.9.2

What's Changed

Full Changelog: software-mansion/react-native-reanimated@worklets-0.9.1...worklets-0.9.2

Worklets - 0.9.1

Key changes

Support for cross-runtime Promises

Now functions that return a promise like runOnRuntimeAsync can be used on all runtimes in Bundle Mode, not only the RN Runtime. The code responsible for memory-management of JavaScript callbacks in C++ was overhauled to support this, which should reduce the memory imprint and stability of long-held callbacks in brownfield app.

Uniform Shareable hosting

Shareables can now be hosted on any runtime, not only the UI Runtime.

DX improvements

Other changes

... (truncated)

Commits
  • cf79cab release(Worklets): 0.9.2
  • b2eb2a4 fix: build.gradle.kts not falling back to default ABIs (#9611)
  • 1fb7b3a fix(Worklets): always expecting sourceMaps in unpackers (#9607)
  • fe917e9 fix(bundlemode): getBundleModeMetroConfig consider user config's resolveReq...
  • 2fbb5a5 fix(Worklets): Babel plugin not detecting production environment (#9609)
  • 07060c1 fix(deps): declare @​babel/types as a dependency (#9511)
  • d32ac50 release(Worklets): 0.9.1
  • 58a66a6 release(Worklets): 0.9.0
  • da759db chore: bump RN compatibility to 0.86 (#9496)
  • b1ba193 feat(Worklets): Serializable regexp (#9494)
  • Additional commits viewable in compare view
Maintainer changes

This version was pushed to npm by GitHub Actions, a new releaser for react-native-worklets since your current version.


@dependabot @github

dependabot Bot commented on behalf of github Jun 14, 2026

Copy link
Copy Markdown
Author

Labels

The following labels could not be found: client, dependencies. Please create them before Dependabot can add them to a pull request.

Please fix the above issues or remove invalid values from dependabot.yml.

@dependabot dependabot Bot changed the title Bump react-native-worklets from 0.5.1 to 0.9.2 build(deps): Bump react-native-worklets from 0.5.1 to 0.9.2 Jun 14, 2026
@dependabot dependabot Bot force-pushed the dependabot/npm_and_yarn/react-native-worklets-0.9.2 branch 2 times, most recently from 157c246 to 0ba76c5 Compare June 14, 2026 05:42
miningtheblocks added a commit that referenced this pull request Jun 17, 2026
… bombing, perf

Round 2 de auditoría — 6 fixes baratos de alto ROI:

- .easignore agrega *.jks, *.pkcs12, service-account*.json, *-adminsdk-*.json
  para evitar que eas build suba el keystore JKS o SA dedicados a EAS Cloud.
  (Agente #9 HIGH-09-19, Agente #11 HIGH-11-19)

- UpdateModal allowlist agrega github.com con path-check estricto al repo
  oficial /miningtheblocks/Mining-The-Blocks/releases/download/. El sitio web
  sirve el APK desde GitHub Releases y la validación previa rechazaba ese
  host → users que tapeaban "Descargar" caían al fallback miningtheblocks.com
  y nunca llegaban al APK directo.
  (Agente #9 CRIT-09-01)

- sendVerificationEmail con rate-limit 5/hora/uid via _rateLimitFirestore.
  Sin esto, un user recién creado podía bombear hasta que Gmail suspendiera
  el app-password compartido → outage TOTAL de emails (verify + claim +
  reportProblem + mint alerts).
  (Agente #6 CRIT, Agente #10 cross-ref)

- mintProcessorScheduled + cryptoPaymentProcessorScheduled con self-throttle
  (early-return si la queue está vacía). El cron corre cada 5min aunque no
  haya trabajo; saltearlo evita cargar el eth provider, secrets, y RPC calls
  a publicnode.com (sin SLA). Ahorra ~$5/mes y reduce risk de rate-limit RPC.
  (Agente #12 P0)

- WCAG-AA contrast bump en Login/Config/Profile:
  #555 (ratio ~3.5:1) → #888 (ratio ~5.4:1) en texto secundario
  #333 (ratio ~1.5:1) → #666 en primaryTxtDisabled de Login
  Cierra MED-10-45 y avanza compliance European Accessibility Act.

- i18n agrega 2 keys faltantes (profile.walletCooldown + profile.emailNotVerified)
  en EN+ES. Profile.js las usaba con fallback inline; sin las keys reales el
  user veía el key literal "profile.walletCooldown" en pantalla.
  (Agente #10 parte de CRIT-10-04)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 17, 2026
…list + deep-link

Cierra Fase 2 del Audit Round 2. 6 items que comparten "infraestructura cross-cutting"
del frontend ↔ backend.

1. requireRegistered con whitelist explícito de providers.

   Pre-fix: blacklist ("rechazar 'anonymous'"). Si Firebase habilita un
   provider nuevo (Anonymous via Console, OIDC custom, beforeSignIn blocking
   function que devuelve un provider desconocido), el flow lo aceptaba por
   default. Whitelist = default-deny: solo password / google.com / apple.com
   pasan. Provider desconocido → permission-denied:provider_not_allowed:{X}.
   (Agente #6 CRIT)

2. notifyAllUsers FCM/Expo ramificación + token cleanup automático.

   Pre-fix: TODOS los tokens iban al endpoint Expo Push API (incluyendo los
   FCM nativos que el cliente registra desde V1.1.0+). Expo respondía error
   sin tirar excepción → audit log decía "sent=N" cuando realmente fueron 0.
   La única broadcast feature del producto NO entregaba mensajes y el admin
   nunca se enteraba.

   Fix: ramificar por pushTokenType. FCM via
   getMessaging().sendEachForMulticast (hasta 500 tokens/call, devuelve
   success/error por token). Expo legacy sigue por exp.host. Tokens con
   responses "registration-token-not-registered" / "invalid-registration-token"
   se borran en batch del user doc.
   (Agente #10 CRIT-10-01 + CRIT-10-03)

3. sendPushToUser respeta settings.notify* del user + data payload + cleanup.

   Pre-fix (Agente #4 + #10 CRIT-10-02): los toggles de Config.js
   (notifyAdReady, notifyDaily, notifyRewards, notifyNewLayer) se persistían
   en users/{uid}.settings.* pero el backend nunca los leía — dark pattern
   explícito reportable a Play Store / GDPR.

   Fix: signature ampliada a sendPushToUser(uid, titles, bodies, opts). Si
   opts.notifyKey está y user.settings[notifyKey]===false, skip silencioso.
   Default opt-in (undefined → enviar, conserva flow viejo).

   3 call sites actualizados: mint complete + payment received + referral
   bonus pasan { notifyKey: 'notifyRewards', data: { url: ... } }.

   data payload + Object.fromEntries(String(v)) para que FCM acepte (FCM
   exige todos los values como strings).
   (Agente #10 CRIT-10-02 + CRIT-10-03 + HIGH-10-09)

4. t(key, vars) motor con interpolación + __DEV__ warnings.

   Pre-fix: 17 call sites reimplementaban .replace('{x}', y) — riesgo de
   reentrancia (si value contenía '{other}' el segundo .replace lo
   interpretaba), keys faltantes mostraban el key literal al usuario.

   Nuevo motor:
   - t('msg', { name, h }) interpola {name} y {h} con String(v).
   - En __DEV__ warna si la key no existe o un var declarado no fue provisto.
   - Object.prototype.hasOwnProperty.call para evitar prototype pollution.

   Profile.js migrado a la nueva API (las 2 sites con walletCooldown +
   emailNotVerified). Los otros 15 call sites siguen funcionando con la
   nueva t() porque vars es opcional (backwards-compat).
   (Agente #10 CRIT-10-04 parcial — full migration de los 15 sites queda P2)

5. addNotificationResponseReceivedListener + DeepLinkHandler ampliado.

   Pre-fix: push payload sin data → tap del push solo abre la app en la
   última screen. User que recibe "Tu NFT llegó!" no llega a MyGems.

   Fix: response listener en App.js dispara Linking.openURL(data.url) si
   el push trae data.url con scheme conocido. DeepLinkHandler ampliado de
   solo 'peaks' a peaks/gems/profile/buycredits/config/servers — alineado
   con los modal keys del OverlayModalsProvider.

   Subscription tracked en let-binding + cleanup en outer useEffect return
   para evitar leak (paralelo al notifSetupTimer cleanup).
   (Agente #10 HIGH-10-09 + HIGH-09-04 cross-ref)

Tests: 24/24 helpers tests pasan sin cambio. functions/index.js parsea OK.

Fase 2 cerrada (4 commits + Tier 1):
  Tier 1:   1e1e160 (6 quick wins)
  Commit A: d33f627 (schema + reorg + nonce lock)
  Commit B: c9b2544 (wallet hot-swap + checkRevoked + password reset)
  Commit C: 545c92c (effectiveSeed + payment checkpoint + markGemRedeemed)
  Commit D: <hash>  (push + i18n + providers + deep-link)

14 CRIT del Audit Round 2 cerrados. Próximo: Fase 3 (compliance + ops).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 17, 2026
Cierra los items legales y los de accesibilidad del funnel crítico (Login,
Registration, BuyCredits, Config).

1. terms.html (docs/ + public/): fix CNZF Argentina + retention align.

   Pre-fix: la sección "Help Resources" (cláusula 14.3, versión EN) listaba
   "CNZF — Centro Nacional de Zonas Fuera (CNZF)" como helpline para
   Argentina. Esa entidad NO EXISTE — acrónimo inventado en algún copy-paste
   roto. Para una app gambling+crypto, mostrar una organización inexistente
   a víctimas de adicción es un riesgo legal directo (potencial "engaño
   activo" en demanda). La versión ES (cláusula 14.3 español) sí listaba
   correctamente Jugadores Anónimos + CONADIC.
   Fix: EN alineado con ES (Jugadores Anónimos + CONADIC Mexico).

   Pre-fix: privacy.html decía "registros de canje: hasta 5 años";
   terms.html decía "indefinidamente para auditoría". Una autoridad
   regulatoria interpreta la inconsistencia como ambiguous notice →
   violación de lawful basis.
   Fix: 5 años en ambos docs, alineado con AML/KYC. Blockchain TX
   (Polygon) reconocidas como permanentes por diseño.
   (Agente #10 MED-10-39 + MED-10-41)

2. privacy.html (docs/ + public/): add Cloudflare + GitHub + SCC disclosure.

   Pre-fix: la lista de sub-procesadores solo incluía Google/Firebase,
   Polygon, Pinata. Faltaban:
   - Cloudflare (DNS registrar de miningtheblocks.com — procesa metadata
     DNS al visitar el sitio).
   - GitHub (Pages hostea docs/privacy.html, terms.html, adpick.html —
     procesa IPs de visitantes).
   - Standard Contractual Clauses (SCC) post-Schrems II para transferencia
     UE→USA de datos vía Google/Firebase.

   Fix: sección "Sub-procesadores" expandida con links a las políticas de
   ambos, + cláusula SCC explícita para users UE.
   (Agente #10 HIGH-10-36 + MED-10-42)

3. Login.js a11y:
   - TextInput email + password con accessibilityLabel explícito (TalkBack
     sin esto solo lee placeholder en algunos casos).
   - Sign In button accessibilityState={ disabled, busy } para que el SR
     anuncie "no disponible" / "cargando" en lugar de un genérico "botón".
   - Forgot password TouchableOpacity con paddingVertical:12 + hitSlop
     para llegar a 44pt mínimo (WCAG 2.5.5 + Android UX).
   - Language pills con accessibilityState.selected + hitSlop.
   - placeholderTextColor #555 → #888 (WCAG-AA contrast).
   (Agente #10 MED-10-43, MED-10-44, MED-10-45)

4. Registration.js a11y:
   - placeholderTextColor #555 → #888 en TODOS los TextInput (replace_all).
   - accessibilityLabel en los 6 inputs principales (firstName, lastName,
     username, phone, email, password, confirmPassword).
   - Save button accessibilityState={ disabled, busy }.

5. BuyCredits.js a11y:
   - Copy amount TouchableOpacity con accessibilityLabel="Copy {amount} USDC"
     + accessibilityHint con la instrucción "sendExactly".
   - Copy wallet TouchableOpacity con accessibilityLabel descriptivo +
     accessibilityState.disabled cuando wallet inválida.
   - newPayment button con accessibilityState.busy durante loading.

6. Config.js touch target:
   - toggleBtn paddingVertical 8 → 12 + minHeight:44 + justifyContent:center.
     Pre-fix: ~32dp altura, sub-mínimo WCAG. Post: 44dp+.

DEFERRED a P3: a11y completo en Profile, GetPeaks, MyGems, ServerList,
HowToPlay (cubrir los ~70 TouchableOpacity restantes). Patron establecido
acá facilita los grep+replace masivos en una iteración futura.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 17, 2026
…rywhere)

Cierra dos gaps de compliance / takeover response del Audit Round 2.

1. deleteMyAccount — GDPR Art. 17 + Play Store policy compliance.

   Pre-fix: el user solo podía pedir borrado por email a soporte
   (privacy.html promete <30 días). Bloqueante para Play Store policy
   (mayo 2024: self-serve account deletion in-app obligatorio para apps
   con login) y para GDPR right to erasure escalable.

   Estrategia: soft-delete con anonimización + 5y retention para AML/KYC.
   - users/{uid} preservado pero pierde TODO el PII (email, profile, avatar,
     pushToken, walletAddress, referralCode/referredBy, settings, language).
     Mantiene `deletedAt` timestamp + displayName='[deleted]'.
   - notifications/ → batch delete (no retention requirement).
   - gems/ → SE PRESERVA (NFT records + 5y AML/KYC retention).
   - usernames/{handle} → released para que otros lo puedan reclamar.
   - pendingCryptoPayments waiting → cancelled (libera amount slots).
   - Auth user → deleteUser (revoca refresh tokens automáticamente).
   - Audit log en adminActions.

   Protecciones:
   - requireRegistered + assertFreshToken (~5min token freshness mínimo).
   - Rate-limit 1/hora por uid (anti-accidente).
   - Errores parciales no rompen el flujo total (cada paso try/catch).
   (Agente #6 MED-15 + #10 HIGH-10-38 + #11 MED-11-43)

2. revokeMySessions — self-serve "logout everywhere" para sospecha takeover.

   Pre-fix: si el user sospechaba acceso no autorizado en otro device, la
   única vía era contactar admin → admin via Firebase Console llamaba
   revokeRefreshTokens manualmente. Latencia operacional alta + dependencia
   de canal humano.

   Nueva CF: requireRegistered + assertFreshToken + rate-limit 5/h, llama
   getAuth().revokeRefreshTokens(uid) + audit log. El user sigue logueado
   en este device hasta el próximo refresh (~5min Firebase JWT TTL); la
   UI hace signOut local para cierre inmediato del cliente actual.
   (Agente #6 MED + #11 MED-11-46)

3. UI: "Danger zone" en Profile.js al final del scroll.

   Dos botones agrupados visualmente:
   - 🔐 "Cerrar sesión en todos los dispositivos" — borde rojo suave
     (#3a2222), confirmación con AppAlert + style:cancel/destructive.
   - ⚠️ "Eliminar mi cuenta" — texto rojo (#ff6b6b), borde más oscuro
     (#5a1414), warning explicando retention 5y + irreversibilidad.

   Ambos botones con accessibilityLabel + accessibilityState.busy durante
   ejecución. minHeight:44 para WCAG-AA touch target.

4. i18n: 12 keys nuevas EN+ES bajo profile namespace (dangerZone,
   logoutEverywhere*, deleteAccount*, cancel).

5. callDeleteMyAccount + callRevokeMySessions en src/firebase/functions.js.

Tests: functions/index.js parsea OK. helpers tests no afectados.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 17, 2026
Cierra Agente #10 HIGH-10-10 — pre-fix había 1 solo channel Android
('default' con importance HIGH). El usuario solo podía mute/unmute el
channel entero — recibir alerts críticos de NFT minting pero apagar
broadcasts de marketing era imposible.

Cambios:

1. App.js: 5 channels Android declarados al cold-start:
   - default (legacy compat)
   - mint (NFT mints) — HIGH importance
   - payment (credit purchase confirmations) — HIGH
   - referral (referral bonuses) — HIGH
   - marketing (broadcast del equipo) — DEFAULT (menor prioridad, mute fácil)

   Todos con sound:'default' + vibrationPattern uniforme. Solo el
   description difiere para que el user entienda qué mute en
   Settings → App → Notifications.

2. sendPushToUser: nuevo opts.channelId (default a 'default' si caller
   no especifica). FCM payload android.notification.channelId enrutado.

3. 3 call sites internos actualizados:
   - mint complete → channelId='mint'
   - payment received → channelId='payment'
   - referral bonus → channelId='referral'

4. notifyAllUsers (broadcast) → channelId='marketing'. Sin esto, los
   broadcasts caían al default channel HIGH y competían con alerts
   críticos de mint.

Impact: users pueden ahora mute marketing/referrals sin perder los
HIGH-priority alerts financieros. Cumple Android Notification Channels
best practices (oblig. para apps targetSdk 26+).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 17, 2026
…nfig

Continúa el trabajo de Commit E sobre los 5 screens restantes (HowToPlay
es estático sin TouchableOpacity, queda fuera). Cierra el grueso del
gap Agente #10 MED-10-43 (0 accessibilityLabel pre-fix salvo 2 líneas).

Patrón aplicado consistente:
- TextInput: accessibilityLabel descriptivo (sin esto TalkBack solo lee
  placeholder en algunos casos).
- Primary action button: accessibilityLabel + accessibilityState con
  disabled/busy → SR anuncia "no disponible" / "cargando".
- Toggle: accessibilityLabel + accessibilityRole="switch" +
  accessibilityState.checked → SR anuncia el on/off state.
- Radio (language picker): accessibilityRole="radio" +
  accessibilityState.selected → SR anuncia "seleccionado de 2".
- Icon-only button (refresh ↻): accessibilityLabel obligatorio.
- placeholderTextColor #444 → #888 (WCAG-AA contrast).

Por screen:

  Profile.js:
  - Wallet TextInput: accessibilityLabel = t('profile.wallet').
  - Save Wallet button: accessibilityLabel + accessibilityState.busy.
  - placeholderTextColor #444 → #888 en wallet + referral inputs.

  GetPeaks.js:
  - Claim Daily button: accessibilityLabel + accessibilityState.busy.
  - Ad 1 / Ad 2 buttons: accessibilityLabel diferenciado ("(1)" / "(2)")
    + accessibilityState.busy.

  MyGems.js:
  - Code copy TouchableOpacity: accessibilityLabel con el código completo
    para SR + accessibilityHint con la label "Código".
  - Claim NFT button: accessibilityLabel + accessibilityState.busy.
  - Refresh icon ↻: accessibilityLabel + hitSlop 8 (touch target ≥44pt).

  Config.js:
  - 4 notify toggles (adReady, daily, rewards, newLayer):
    accessibilityRole="switch" + accessibilityState.checked.
  - 2 language toggles (en/es): accessibilityRole="radio" +
    accessibilityState.selected. (Recuerda: toggleBtn ya tiene minHeight:44
    + paddingVertical:12 desde Commit E.)

A11y status post-N:
✅ Login (E), Registration (E), BuyCredits (E), Profile (N), GetPeaks (N),
   MyGems (N), Config (E+N)
⚠️ HowToPlay (sin TouchableOpacity — N/A)
⚠️ ServerList (queda como P3 — 19+ TouchableOpacity, scope > 1 commit)
⚠️ ChainHistoryScreen, ActivityScreen (queda como P3)
⚠️ DynamicCube201 (cubo 3D — fundamentalmente inaccesible vía SR, requiere
   alternative experience design para a11y verdadero)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 17, 2026
…TURE.md

1. Pre-permission UI antes del system prompt nativo de notificaciones.

   Cierra CRIT (Agente #4 CRIT-FE-01 + Agente #10 HIGH-10-06): pre-fix,
   requestPermissionsAsync se disparaba auto a los 2s del login sin contexto.
   Apple HIG y Google Play recomiendan modal explicativo ANTES del prompt
   nativo — sin esto, el user rechaza por sorpresa y queda imposible de
   re-promptear sin deep-link a Settings.

   Flow nuevo (App.js useEffect [user]):
   1. Cold start con user logueado → leer AsyncStorage NOTIFICATIONS_CONSENT.
   2. Si 'yes' → setupPushToken directo.
   3. Si 'no' → skip (respetar opt-out, NO volver a preguntar).
   4. Si absent (primer login) → Alert.alert con:
      - Title: "¿Querés enterarte cuándo pasa algo?"
      - Body: explica los 3 tipos (NFT mint, payment credit, referral
        bonus) + nota "podés mutear cada categoría en Settings, sin spam".
      - Buttons: "Activar" / "No gracias" (cancelable:false).
      - On accept: setItem 'yes' + setupPushToken (que internamente llama
        requestPermissionsAsync).
      - On decline: setItem 'no' (final — no más prompts).

   StorageKeys.NOTIFICATIONS_CONSENT agregado a constants.js.
   i18n keys EN+ES agregadas (notificationsConsent{Title,Body,Accept,Decline})
   para futuro uso si migran a un modal custom (esta versión usa Alert.alert
   nativo porque i18n context no es trivialmente accesible desde App.js).

2. ARCHITECTURE.md — visión técnica del sistema.

   Cierra Agente #11 MED-11-53 — single-operator hoy, pero si llega otro dev
   o pasan el proyecto, el ramp-up es muy duro sin documentación del por qué
   detrás del cómo.

   Contenido (~350 líneas):
   - Stack (RN+Expo+Firebase+Polygon+Ethereum tooling).
   - Diagrama ASCII de componentes principales.
   - Modelo de datos Firestore (colecciones + subcolecciones + runtime locks).
   - 3 flows críticos paso a paso (mineCube, crypto payment, NFT claim) con
     referencias a qué commits del Audit Round 2 cambiaron qué.
   - Modelo de seguridad: 5 capas de defense in depth con qué cubre cada una.
   - Secrets: tabla de 3 secrets, sus consumers, rotation procedure, blast
     radius si leak.
   - Tradeoffs documentados: por qué sideload, por qué FCM nativo, por qué
     soft-delete, por qué Polygon, por qué single-operator backend.
   - Code layout completo.
   - Roadmap operacional + code-only restantes.

   Complementa RUNBOOK.md (incident response) y reports de auditoría.

Tests: App.js parsea OK. helpers tests no afectados (sin cambios funcionales
en lógica que toquen).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 17, 2026
…istory)

Cierra el último gap grande de a11y del cliente (Agente #10 MED-10-43).

ServerList tiene 31 TouchableOpacity. Focus en las 10 más importantes:

  Header:
  - Tab toggle (Active ↔ Finished): accessibilityRole="tab" +
    accessibilityState.selected → SR anuncia "tab seleccionado".
  - Menu button (☰): accessibilityRole="button" + accessibilityLabel
    + accessibilityHint + hitSlop 8 (touch target 44pt).

  Card actions:
  - History button (📋) en active + finished cards: accessibilityLabel
    descriptivo con nombre del server + hitSlop 6.
  - Join/Unlock button: YA tenía a11y (commit anterior).

  Create form:
  - TextInput "server name": accessibilityLabel + placeholderTextColor
    #555 → #888 (WCAG-AA contrast).
  - Create button: accessibilityState.busy/disabled.
  - Cancel button: accessibilityLabel explícito.

  Menu modal:
  - Menu items (peaks, gems, profile, config, howToPlay, buyCredits,
    login, report, signOut): accessibilityRole="menuitem" + label.
  - Overlay tap-to-close: accessibilityLabel "Close menu".

A11y status post-R:
✅ Login (E), Registration (E), BuyCredits (E), Config (E+N), Profile (N),
   GetPeaks (N), MyGems (N), ServerList (R)
⚠️ ChainHistoryScreen (queda como P3 — solo 1-2 TouchableOpacity)
⚠️ ActivityScreen (queda como P3 — read-only feed)
⚠️ HowToPlay (sin TouchableOpacity)
⚠️ DynamicCube201 (cubo 3D — fundamentalmente inaccesible vía SR)

Tests: ServerList parsea OK. helpers tests no afectados.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 17, 2026
… EN privacy disclosure

Cierra 4 hallazgos MED/LOW pendientes — todo cambios de texto/atributos
sin lógica nueva.

1. ChainHistoryScreen + ActivityScreen a11y (Agente #10 MED-10-43).
   Cada uno tenía 1-2 TouchableOpacity sin labels (back button, report
   button). accessibilityRole="button" + accessibilityLabel + hitSlop 8.
   Cierra el último gap a11y del cliente — todos los screens con
   interactividad ya están cubiertos. DynamicCube201 (cubo 3D) sigue
   sin a11y por naturaleza (rendering GL no es accesible vía SR).

2. verify.html default-DENY en errores no enumerados (Agente #7 LOW).
   Pre-fix (CRIT-24 documentado como "default-deny" pero código era
   default-success): el else de codes desconocidos llamaba showSuccess.
   Si Google agrega nuevo error code en el futuro (TOKEN_REVOKED,
   QUOTA_EXCEEDED, etc.) el user veía "verificado" cuando no lo estaba.
   Fix:
   - data.error.message no reconocido → showError genérico con el code
     truncado a 32 chars (para diagnóstico sin XSS).
   - Respuesta SIN .error pero sin shape esperada (email/localId/kind)
     → showError "respuesta inesperada".
   - Solo respuesta con shape correcta y SIN .error → showSuccess.

3. privacy.html EN section: agrega Cloudflare + GitHub + SCC disclosure
   (Agente #10 HIGH-10-36).
   Commit E agregó la sección ES pero la EN quedó con la lista vieja
   (solo Firebase + Polygon + Pinata). Ahora ambas secciones están
   alineadas con todos los sub-procesadores + SCC clause para UE→USA.
   Aplicado en docs/privacy.html Y public/privacy.html.

Tests: parse OK. helpers OK.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 17, 2026
…d dep, i18n hardcoded)

3 cleanups menores.

1. audioManager.cleanup() en signOut (Agente #4 MED-FE-21).
   Pre-fix: música seguía sonando después de signOut sobre la pantalla
   de Login. ~5MB residente + UX disonante.
   Fix: en App.js onAuthStateChanged, cuando u === null (signOut)
   llamamos audioManager.cleanup() antes de setUser(null). El cleanup
   es idempotente (resetea flags para que un re-init después funcione).
   Esto cubre TODOS los signOut paths (DrawerItem, ServerList session
   expired, cold-start con KEEP_SIGNED_IN=0, etc.) sin tener que
   modificar cada caller.

2. react-native-svg-transformer removido (Agente #9 MED-09-23).
   Verificado: 0 references en metro.config.js + 0 imports en src/.
   El transformer está instalado pero no se conecta — dead dep ~50KB.
   metro.config.js usa el default config sin transformer custom.
   Si en el futuro necesitan SVG como componentes (no como assets),
   re-instalar + agregar el transformer.

3. i18n key picksSuffix EN+ES en namespace profile (Agente #10 MED-10-25).
   GetPeaks.js:203 mostraba "picks" hardcoded en EN para todos los users.
   Usuarios en ES veían "picks" en lugar de "picos".
   Fix: key picksSuffix = "picks"/"picos" + GetPeaks usa t('profile.picksSuffix').

Tests: parse OK + JSON valid.

Próximo paso operacional: `npm install` para sacar react-native-svg-transformer
de node_modules + actualizar lockfile.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bumps [react-native-worklets](https://github.com/software-mansion/react-native-reanimated/tree/HEAD/packages/react-native-worklets) from 0.5.1 to 0.9.2.
- [Release notes](https://github.com/software-mansion/react-native-reanimated/releases)
- [Commits](https://github.com/software-mansion/react-native-reanimated/commits/worklets-0.9.2/packages/react-native-worklets)

---
updated-dependencies:
- dependency-name: react-native-worklets
  dependency-version: 0.9.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot changed the title build(deps): Bump react-native-worklets from 0.5.1 to 0.9.2 build(deps): bump react-native-worklets from 0.5.1 to 0.9.2 Jun 17, 2026
@dependabot dependabot Bot force-pushed the dependabot/npm_and_yarn/react-native-worklets-0.9.2 branch from 0ba76c5 to c2d982b Compare June 17, 2026 16:32
miningtheblocks added a commit that referenced this pull request Jun 18, 2026
…en CI

Tier B del backlog del audit Round 2:

1. CRIT-10-04 follow-up + Agente #10 HIGH-10-36 — privacy.html actualizada:
   - Removidos los 4 mentions obsoletos a Google AdMob (el SDK
     react-native-google-mobile-ads fue removido en Commit Q; mantenerlo en
     privacy era misleading).
   - Sección 1.6 (Publicidad) reescrita: la app NO usa native ad SDKs.
     Los ads viven en docs/adpick.html abierto por el user. La red de
     publicidad (effectivecpmnetwork) está aislada en iframe sandbox en
     subdominio separado (ads.miningtheblocks.com) sin acceso a app data.
     AD_ID NO declarado por la app.
   - Sub-procesadores ampliados: Sentry (EU/Frankfurt), Better Stack,
     Filebase (mirror IPFS). Todos con disclosure de jurisdicción de datos
     y referencia a SCC cuando aplica para transferencias UE→USA.
   - Sección 7 (Minors) limpiada de referencias COPPA-AdMob.
   - Versión EN paralela actualizada también.

2. Agente #7 P3 + Agente #11 — SBOM CycloneDX en CI:
   - Nuevo job en .github/workflows/ci.yml que genera SBOM (Software Bill
     of Materials — inventario formal de dependencias en formato CycloneDX
     estándar OWASP) en cada push.
   - 2 SBOMs por run: functions/ + repo root.
   - Tool: @cyclonedx/cdxgen (npx, sin install permanente).
   - Artifacts retenidos 90 días para tracking de CVE futuros + auditorías.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 23, 2026
Smart contract V2 (cierra CRIT-S1/S2/S3 + MED-S1 + HIGH-S1):
- Deploy: 0x2933Ff14AdeC0a4D74aD8380E5c491321bBd3195 (Polygon mainnet, verified)
- AccessControl 2-of-3 Safe (0x83a3F5...86aCD) ADMIN+PAUSER, EOA nftv2 MINTER
- Supply caps inmutables por tier [1,1,5,50,100,500,1000,4000,10000]
- tokenURI canónico por tier (caller no controla URI)
- renounceRole(ADMIN) bloqueado (anti-bricking)
- functions/index.js: ABI actualizado (mintGem 3 args sin tokenURI_)

Backend fixes (batch 3):
- #2 HIGH-1 cross-attribution USDC: senderWalletAddress opt-in + match con event.args.from
- #4 HIGH-M1 gem-loss window: gem + pendingMint dentro del TX con docIds determinísticos
- #4 HIGH-R1 cap referrer bonus: 50 invitados rewarded max (campo referralsRewarded)
- #2 HIGH-2 rateLimits TTL: expiresAt usa Timestamp.fromMillis
- #3 MED-4 Sentry PII scrubber: beforeSend + beforeBreadcrumb sobre email/wallet/phone

Build / Deploy (batch 1):
- #9 HIGH-1 credentialsSource:local en eas.json production
- #9 HIGH-3 versionCode:5 en app.json
- #9 HIGH-4 runtimeVersion appVersion en app.json
- #9 HIGH-7 MTB-v1.1.0.apk.sha256 copiado a docs/
- #9 HIGH-8 download URL -> releases/latest

Supply chain (batch 1+2):
- #5 HIGH-2 nodemailer ^8.0.10 -> ^9.0.1
- #5 HIGH-3 npm overrides ws@^8.21.0 + undici@^6.27.0
- #5 HIGH-4 npm audit en root agregado al CI
- #5 HIGH-5 @cyclonedx/cdxgen pinned a 11.5.0 (no @latest)

Privacy / Legal (batch 1+2):
- #8 HIGH-1 retention 5y AML/KYC explícito (EN + ES)
- #8 HIGH-2 governing law: Argentina/Buenos Aires (EN + ES)
- #8 HIGH-8 clarificado solo email+password sin OAuth Apple/Google (EN + ES)

Frontend security (batch 2):
- #3 HIGH-1 verify.html inline script -> public/verify.js + removido unsafe-inline
- #3 HIGH-2 el() helper sin innerHTML

Web / SEO / a11y (batch 1+2):
- #10 HIGH-5 frame-buster JS anti-clickjacking
- #10 HIGH-6 docs/robots.txt + docs/sitemap.xml
- #10 HIGH-7 OG + Twitter Card + canonical en docs/index.html
- #10 HIGH-8 label for=... en form inputs + .sr-only utility

Smart contract tooling:
- contracts/MTBGemsV2.sol (source) + contracts_build/ (hardhat 0.8.27 cancun, 17/17 tests)

Pre-commit hook: refinado patrón anti-secret para no flagear tx hashes públicos
en docs y constantes role de OpenZeppelin.

Pendiente acción manual (documentado en PENDING_FIXES.md):
- cd functions && npm install
- firebase deploy --only functions / --only hosting
- GitHub Settings -> Pages -> Enforce HTTPS
- DNS records SPF/DMARC/CAA en Cloudflare

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 23, 2026
- docs/icon.png: resize 1024x1024 -> 512x512 + PNG compression-9
                 1.14 MB -> 280 KB (75% smaller)
                 Mantenido para og:image/twitter:image (Discord, Twitter, Slack
                 previews — algunos servicios no parsean WebP)
- docs/icon.webp: nuevo, 256x256 WebP @ q85
                  8.5 KB (99.2% smaller que el original PNG)
                  Para el <img class="logo"> via <picture> con PNG fallback
- docs/index.html: <picture> + fetchpriority="high" + width/height + decoding="async"
- docs/adpick.html: idem

Pre-fix: LCP element ~1.14 MB de PNG en pantalla a 96x96. En 3G eso son
~5s antes de que el user vea el logo. Lighthouse Performance score sufría.

Post-fix: LCP < 100ms incluso en redes lentas. assets/icon.png (in-app
Android adaptive icon) NO se tocó — Google Play requiere 1024x1024 PNG.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 23, 2026
Version bump por features nuevas de la sesión 2026-06-23 (audit R2):
- Swap flow 2-step con verificación on-chain del NFT (#8 HIGH-3)
- Cookie consent banner GDPR/LGPD/CCPA (#8 HIGH-6)
- Email notifications al user al completar canje
- TOS sin lista 13 países (geo-blocking decision)
- Smart Contract V2 deployed + activo (functions/constants.js apunta acá)
- expo-three -> THREE.WebGLRenderer nativo (#5 HIGH-1)
- expo-av -> expo-audio (SDK 55 prep, #5 MED-2)
- Icon optimize 1.1MB -> 8.5KB WebP (#10 HIGH-9)
- Sentry source maps pipeline
- Keystore rotation + 3 backups offline
- DNS records (SPF + DMARC + CAA)
- Web hardening: frame-buster, robots, sitemap, OG meta, form labels

Bumps:
- app.json: version 1.1.0 -> 1.2.0, versionCode 5 -> 6
- package.json: 1.1.0 -> 1.2.0
- src/constants.js: FALLBACK_APP_VERSION 1.1.0 -> 1.2.0
- docs/index.html: download link y label -> v1.2.0
- MTB-v1.1.0.apk.sha256 archivos eliminados (se regeneran post-build)

PENDING_FIXES.md actualizado con estado final completo.

10 commits previos cerraron: 5 CRIT smart contract + 3 CRIT web + 31 HIGH
técnicos. Single HIGH legal pendiente (#8 HIGH-7 MICA + Howey) por consulta
externa, no técnico.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
miningtheblocks added a commit that referenced this pull request Jun 24, 2026
…-08)

Cierre de 2 HIGHs operacionales del audit Round 2 que quedaban abiertos
tras verificación cruzada con commits previos:

[HIGH-01-11 + HIGH-11-06] firestoreBackupScheduled validation
  Pre-fix: la function llamaba exportDocuments() y solo logueaba "started".
  La Long-Running Operation puede fallar silently → backup NO existe pero
  los logs dicen success. DR irrecuperable si el incident ocurre y el
  backup era inválido sin que nadie supiera.

  Fix:
  - Awaitar operation.promise() (resuelve cuando done=true)
  - Promise.race con timeout 5min (operations típicos < 2min)
  - On error/timeout: email alert a miningtheblocks@gmail.com con
    operation_name + project + URI + comandos para investigar.
  - Added gmailAppPassword a secrets del onSchedule.

[HIGH-11-08] Restore procedure documentado
  Pre-fix: RUNBOOK tenía 1-liner inline ("gcloud firestore import gs://...")
  en el escenario #11 del DR matrix. En una crisis real el operador
  improvisaba pasos = riesgo de error crítico.

  Nueva sección "🔧 Procedure detallado — Restore de Firestore desde
  backup" con:
  - Pre-incident: chequeo semanal del backup (commands gsutil ls + cat
    output-metadata). Schedule de test de restore real cada 3 meses
    en project mtb-restore-test (NO en prod).
  - During incident: 7 pasos detallados (stop writes via
    gcloud scheduler pause → snapshot pre-restore → identificar backup
    → import → verify counts → resume operations → anunciar).
  - Disaster scenarios (qué hacer si backup también falla: blockchain
    + email logs + USDC tx history como fuentes alternativas).
  - Auto-monitoring (post-fix 2026-06-23+) — el alert email automatiza
    detección de backup fallido sin esperar a un DR real.

Falsos positivos del análisis cruzado (verificados, NO requieren fix):
- HIGH-10-01 notifyAllUsers FCM branching: ya cerrado (línea 2199
  comment "CRIT (Round 2 Agente #10 CRIT-10-01)" + branching por
  pushTokenType === 'fcm' línea 2224).
- HIGH-10-05 firebase-tools.json: ya cerrado (scripts/_sa_init.js
  migrado a Service Account dedicado, commit e46e82d).

Tests: 38/38 passing. Lint clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@dependabot @github

dependabot Bot commented on behalf of github Jun 29, 2026

Copy link
Copy Markdown
Author

Superseded by #31.

@dependabot dependabot Bot closed this Jun 29, 2026
@dependabot dependabot Bot deleted the dependabot/npm_and_yarn/react-native-worklets-0.9.2 branch June 29, 2026 15:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants