build(deps): bump react-native-worklets from 0.5.1 to 0.9.2#10
Closed
dependabot[bot] wants to merge 1 commit into
Closed
build(deps): bump react-native-worklets from 0.5.1 to 0.9.2#10dependabot[bot] wants to merge 1 commit into
dependabot[bot] wants to merge 1 commit into
Conversation
Author
LabelsThe following labels could not be found: Please fix the above issues or remove invalid values from |
157c246 to
0ba76c5
Compare
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>
0ba76c5 to
c2d982b
Compare
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>
Author
|
Superseded by #31. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps react-native-worklets from 0.5.1 to 0.9.2.
Release notes
Sourced from react-native-worklets's releases.
... (truncated)
Commits
cf79cabrelease(Worklets): 0.9.2b2eb2a4fix: build.gradle.kts not falling back to default ABIs (#9611)1fb7b3afix(Worklets): always expecting sourceMaps in unpackers (#9607)fe917e9fix(bundlemode):getBundleModeMetroConfigconsider user config's resolveReq...2fbb5a5fix(Worklets): Babel plugin not detecting production environment (#9609)07060c1fix(deps): declare@babel/typesas a dependency (#9511)d32ac50release(Worklets): 0.9.158a66a6release(Worklets): 0.9.0da759dbchore: bump RN compatibility to 0.86 (#9496)b1ba193feat(Worklets): Serializable regexp (#9494)Maintainer changes
This version was pushed to npm by GitHub Actions, a new releaser for react-native-worklets since your current version.