[pull] main from MetaMask:main#643
Merged
pull[bot] merged 25 commits intoReality2byte:mainfrom Mar 31, 2026
Merged
Conversation
…dpoint cp-7.71.1 cp-7.72.0 (#28098) - fix: point DIGEST_API_URL to production endpoint (#28088) ## **Description** <!-- 1. What is the reason for the change? The fallback URL for `DIGEST_API_URL` was pointing at the development endpoint. --> <!-- 2. What is the improvement/solution? Switch the hardcoded fallback to the production endpoint so that builds without an explicit env var hit production. --> Switches the hardcoded fallback value for `DIGEST_API_URL` in `AppConstants.ts` from the dev endpoint (`digest.dev-api.cx.metamask.io`) to the production endpoint (`digest.api.cx.metamask.io`). Also moves the `@metamask/sdk-communication-layer` import to the top of the file to follow alphabetical import ordering. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: ## **Manual testing steps** N/A ## **Screenshots/Recordings** ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- Generated with the help of the pr-description AI skill --> Made with [Cursor](https://cursor.com) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk: only changes a constant fallback URL and import ordering. Main impact is that builds without `DIGEST_API_URL` will now call the production digest service instead of the dev endpoint. > > **Overview** > Updates `AppConstants.DIGEST_API_URL` to default to the production `https://digest.api.cx.metamask.io/api/v1` endpoint when the `DIGEST_API_URL` env var is not set. > > Also reorders the `DEFAULT_SERVER_URL` import to match expected import ordering. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 9d584a4. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> [8603e1c](8603e1c) Co-authored-by: Xavier Brochard <xavier.brochard@consensys.net>
This PR updates the change log for 7.71.1. (Hotfix - no test plan generated.) --------- Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com> Co-authored-by: chloeYue <chloe.gao@consensys.net>
- Keep ## [7.71.1] hotfix + full ## [7.71.0] from stable. - Footer: [Unreleased] v7.71.1...HEAD; [7.71.1] v7.71.0...v7.71.1; [7.71.0] unchanged. - Normalize Predict withdraw bullet to ASCII apostrophe. Made-with: Cursor
…ne (#27532) Revert ASCII normalization for stable-merge conflict resolution. Made-with: Cursor
# 🚀 v7.71.1 Testing & Release Quality Process Hi Team, As part of our new **MetaMask Release Quality Process**, here’s a quick overview of the key processes, testing strategies, and milestones to ensure a smooth and high-quality deployment. --- ## 📋 Key Processes ### Testing Strategy - **Developer Teams:** Conduct regression and exploratory testing for your functional areas, including automated and manual tests for critical workflows. - **QA Team:** Focus on exploratory testing across the wallet, prioritize high-impact areas, and triage any Sentry errors found during testing. - **Customer Success Team:** Validate new functionalities and provide feedback to support release monitoring. ### GitHub Signoff - Each team must **sign off on the Release Candidate (RC)** via GitHub by the end of the validation timeline (**Tuesday EOD PT**). - Ensure all tests outlined in the Testing Plan are executed, and any identified issues are addressed. ### Issue Resolution - **Resolve all Release Blockers** (Sev0 and Sev1) by **Tuesday EOD PT**. - For unresolved blockers, PRs may be reverted, or feature flags disabled to maintain release quality and timelines. ### Cherry-Picking Criteria - Only **critical fixes** meeting outlined criteria will be cherry-picked. - Developers must ensure these fixes are thoroughly reviewed, tested, and merged by **Tuesday EOD PT**. --- ## 🗓️ Timeline and Milestones 1. **Today (Friday):** Begin Release Candidate validation. 2. **Tuesday EOD PT:** Finalize RC with all fixes and cherry-picks. 3. **Wednesday:** Buffer day for final checks. 4. **Thursday:** Submit release to app stores and begin rollout to 1% of users. 5. **Monday:** Scale deployment to 10%. 6. **Tuesday:** Full rollout to 100%. --- ## ✅ Signoff Checklist Each team is responsible for signing off via GitHub. Use the checkbox below to track signoff completion: # Team sign-off checklist - [ ] Mobile Platform This process is a major step forward in ensuring release stability and quality. Let’s stay aligned and make this release a success! 🚀 Feel free to reach out if you have questions or need clarification. Many thanks in advance # Reference - Testing plan sheet - https://docs.google.com/spreadsheets/d/1tsoodlAlyvEUpkkcNcbZ4PM9HuC9cEM80RZeoVv5OCQ/edit?gid=404070372#gid=404070372
This PR syncs the stable branch to main for version 100.10.0. *Synchronization Process:* - Fetches the latest changes from the remote repository - Resets the branch to match the stable branch - Attempts to merge changes from main into the branch - Handles merge conflicts if they occur *File Preservation:* Preserves specific files from the stable branch: - CHANGELOG.md - bitrise.yml - android/app/build.gradle - ios/MetaMask.xcodeproj/project.pbxproj - package.json Indicates the next version candidate of main to 100.10.0
…nalytics from useMetrics to useAnalytics (#27984) --- ## **Description** <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> Migrates analytics calls in security and wallet UI components from the deprecated `useMetrics` hook (and its `withAnalyticsAwareness` HOC) to the new `useAnalytics` hook and direct `analytics` module. This is part of the broader C3 analytics migration (#26686). The changes cover: - **Hook-based components** (`BackupAlert`, `BalanceEmptyState`, `Carousel`, `OTAUpdatesModal`, `OptinMetrics`, `ScreenshotDeterrent`, `UpdateNeeded`, `ProtectWalletMandatoryModal`): replace `useMetrics()` with `useAnalytics()` - **Class-based components** (`ProtectYourWalletModal`, `ErrorBoundary`, `AdvancedSettings`, `GeneralSettings`): replace the `withAnalyticsAwareness` HOC injection with direct imports of `analytics` and `AnalyticsEventBuilder` - **Tests**: update mock patterns from `useMetrics` to `useAnalytics`, using `jest.mocked()` and `createMockUseAnalyticsHook` where appropriate No behaviour changes — the analytics events fired are identical. ## **Changelog** CHANGELOG entry: null ## **Related issues** Refs: #26814 ## **Manual testing steps** N/A ## **Screenshots/Recordings** ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- Generated with the help of the pr-description AI skill --> <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Primarily a mechanical analytics refactor, but it touches multiple security/onboarding and error-reporting surfaces where incorrect event building could silently break telemetry or consent-related tracking. > > **Overview** > Migrates analytics instrumentation across several wallet/security UI surfaces from deprecated `useMetrics` and HOC-injected analytics props to the new `useAnalytics` hook and direct `analytics` + `AnalyticsEventBuilder` usage (notably in class components like `ErrorBoundary`, settings screens, and `ProtectYourWalletModal`). > > Updates analytics trait APIs to use `identify` (replacing `addTraitsToUser`) and adjusts how queued onboarding events are rebuilt before tracking in `OptinMetrics`. > > Refactors unit tests and Jest mocks accordingly, standardizing on `createMockUseAnalyticsHook` and updating expectations to match the new event object shape/constants (e.g., `MetaMetricsEvents` usage and `saveDataRecording` changes). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1faf069. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Adds **opt-in** developer tooling so Money Movement / RAMPS engineers can stream `RampsController` state and calls to a local browser dashboard without loading the bridge for every dev build. - **`RAMPS_DEBUG_DASHBOARD=true`** in `.js.env` + Metro restart enables the bridge; **`RAMPS_DEBUG_DASHBOARD_URL`** overrides the WebSocket URL (devices/emulators). - **Dynamic `import()`** from `ramps-controller-init.ts` so the bridge (including fetch instrumentation) is omitted from the bundle unless enabled. - **`app/components/UI/Ramp/debug/README.md`** — setup, `adb reverse`, env vars. - **`ramps-debug-dashboard/`** — self-contained Node server (`npm ci` + `node server.mjs`); session logs gitignored. - Includes prior commit on this branch: **CODEOWNERS** paths for Money Movement (`@MetaMask/money-movement`) and **`ramps-debug-dashboard/`** entry. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: RAMPS debug dashboard Scenario: Dashboard receives data when opt-in env is set Given a debug build with RAMPS_DEBUG_DASHBOARD=true in .js.env and Metro restarted And ramps-debug-dashboard is running (npm ci && node server.mjs) When the app launches and RampsController is active Then the browser UI at http://localhost:8099 shows state/method traffic And Metro logs include a RampsDebug connected message ``` ## **Screenshots/Recordings** <div> <a href="https://www.loom.com/share/4644574b45ae42e6beda7d17b627a6ca"> <p>Ramps Debug Dashboard - Watch Video</p> </a> <a href="https://www.loom.com/share/4644574b45ae42e6beda7d17b627a6ca"> <img style="max-width:300px;" src="https://cdn.loom.com/sessions/thumbnails/4644574b45ae42e6beda7d17b627a6ca-cc0038d0a8a8afd5-full-play.gif#t=0.1"> </a> </div> ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Dev-only code now conditionally patches `fetch` and wraps `RampsController` methods when `RAMPS_DEBUG_DASHBOARD=true`, which could affect local debugging behavior if enabled. Production behavior should remain unchanged due to `__DEV__` gating and optional `require`. > > **Overview** > Adds an **opt-in, `__DEV__`-only** “RAMPS debug dashboard” that streams `RampsController` state changes, method calls (with timing/cache-hit heuristics), and selected ramps-related `fetch` traffic to `ws://localhost:8099`. > > Introduces a self-contained host dashboard under `scripts/money-movement/debug-dashboard/` (Node HTTP+WebSocket server, JSONL session logging, and `yarn ramps:debug-dashboard` runner) plus new docs and env var guidance in `.js.env.example`. > > Updates `ramps-controller-init` to conditionally `require` and initialize the bridge when `RAMPS_DEBUG_DASHBOARD=true`, adds Jest coverage for that gating, and excludes the new debug tooling from Sonar coverage and the security code scanner. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b8ed425. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->
## **Description**
<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->
Increase Check bundle size CI step from 53 to 54. PRs that are adding
new libraries are blocked by this constraint.
## **Changelog**
<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`
If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`
(This helps the Release Engineer do their job more quickly and
accurately)
-->
CHANGELOG entry:
## **Related issues**
Fixes:
## **Manual testing steps**
```gherkin
Feature: my feature name
Scenario: user [verb for user action]
Given [describe expected initial app state]
When user [verb for user action]
Then [describe expected outcome]
```
## **Screenshots/Recordings**
<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
### **Before**
<!-- [screenshots/recordings] -->
### **After**
<!-- [screenshots/recordings] -->
## **Pre-merge author checklist**
- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.
## **Pre-merge reviewer checklist**
- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Low Risk**
> Low risk workflow-only change; it solely relaxes a CI guardrail and
could allow slightly larger bundles to merge without review.
>
> **Overview**
> In `.github/workflows/ci.yml`, **relaxes the `JS bundle size check`
gate** by increasing the allowed `ios/main.jsbundle` size threshold from
`53` to `54` when running `./scripts/js-bundle-stats.sh`.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
74e8abd. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** adding dev options for money account deposit / withdraw ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/CONF-1109 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** <img width="392" height="850" alt="Screenshot 2026-03-26 at 8 48 07 PM" src="https://github.com/user-attachments/assets/ea37bd84-2eba-41c2-83ca-7835f9b97047" /> ## **Pre-merge author checklist** - [X] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [X] I've completed the PR template to the best of my ability - [X] I've included tests if applicable - [X] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [X] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk: changes are confined to developer-only confirmation triggers and new feature-flag selectors/registry defaults, gated behind remote flags defaulting to false. > > **Overview** > Adds two new developer-only confirmation triggers, **Money Account Deposit** and **Money Account Withdraw**, which appear in `ConfirmationsDeveloperOptions` only when corresponding remote feature flags are enabled and create a Polygon transaction batch (proxy `value` tx + USDC.e `transfer`) using `TransactionType.moneyAccountDeposit`/`moneyAccountWithdraw`. > > Introduces `moneyAccount` remote-flag selectors (`selectMoneyAccountDepositEnabledFlag`, `selectMoneyAccountWithdrawEnabledFlag`), registers the new `moneyAccount` flag with default-disabled values in the E2E feature flag registry, and extends unit tests and `testIds` to cover flag-gated rendering and button press behavior. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 5c9502e. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
#28150) ## **Description** <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> Adds temporary (non-destructive) versions of the TestFlight upload and nightly build workflows to test the ephemeral build branch pattern without modifying the production workflows. **New files:** - **`create-build-branch.yml`** — Reusable workflow that creates an ephemeral `build/<source>-<timestamp>` branch from a source ref, avoiding version-bump pushes to protected branches like `main` - **`upload-to-testflight-temp.yml`** — Copy of `upload-to-testflight.yml` with: `workflow_call` support, ephemeral branch via `create-build-branch.yml`, build number in the summary - **`nightly-build-temp.yml`** — Copy of `nightly-build.yml` refactored to: run on cron schedule instead of push-triggered, call `upload-to-testflight-temp.yml` for iOS exp/rc, use `create-build-branch.yml` + `build.yml` for Android exp/rc **Also updated:** - **`CODEOWNERS`** — Added explicit `@MetaMask/mobile-platform` ownership for `create-build-branch.yml` The originals (`upload-to-testflight.yml`, `nightly-build.yml`) are **unchanged**. ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: null ## **Related issues** Fixes: ## **Manual testing steps** N/A — CI workflow changes only. Verify by triggering `upload-to-testflight-temp` or `nightly-build-temp` via `workflow_dispatch` and confirming the ephemeral branch is created, build succeeds, and branch is cleaned up. ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- Generated with the help of the pr-description AI skill --> Made with [Cursor](https://cursor.com) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Adds new scheduled and reusable GitHub Actions workflows that create/push/delete ephemeral branches and fetch Apple credentials from AWS; misconfiguration could affect CI runs or repo branches, but production workflows are unchanged. > > **Overview** > Introduces a reusable `create-build-branch.yml` workflow that creates and pushes an ephemeral `build/<source>-<timestamp>` branch for version-bump commits, avoiding direct pushes to protected refs. > > Adds temporary workflows to exercise this pattern: `upload-to-testflight-temp.yml` builds iOS from the ephemeral branch, uploads the IPA to TestFlight using Apple API keys fetched via AWS OIDC/Secrets Manager, and then deletes the build branch; `nightly-build-temp.yml` runs on a daily cron to trigger iOS (exp then rc) and Android (exp then rc) builds using ephemeral branches and performs Android branch cleanup. > > Updates `CODEOWNERS` to assign `@MetaMask/mobile-platform` ownership for `create-build-branch.yml`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b98371a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->
## **Description**
<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->
This PR adds Google Wallet (Android) in-app provisioning support for the
MetaMask Card feature. Users can now add their MetaMask Card directly to
Google Wallet from within the app.
### What is the reason for the change?
Users currently cannot add their MetaMask Card to Google Wallet directly
from the app. They need to manually add the card through the Google
Wallet app, which provides a suboptimal user experience.
### What is the improvement/solution?
- Implements `GoogleWalletAdapter` that integrates with the
`@expensify/react-native-wallet` library for Android
- Updates the `providers.ts` factory to return `GoogleWalletAdapter` for
Android platform
- Adds CI/CD pipeline changes to clone the private TapAndPay SDK before
Android builds (GitHub Actions and Bitrise)
- Configures `react-native.config.js` to conditionally enable the wallet
library only when the SDK is present
- Updates `android/build.gradle` to include a local Maven repository for
the TapAndPay SDK
## **Changelog**
<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`
If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`
(This helps the Release Engineer do their job more quickly and
accurately)
-->
CHANGELOG entry: Added Google Wallet in-app provisioning for MetaMask
Card on Android
## **Related issues**
Fixes:
## **Manual testing steps**
```gherkin
Feature: Google Wallet In-App Provisioning
Scenario: User adds MetaMask Card to Google Wallet
Given user is logged in and has an active MetaMask Card
And user is on the Card Home screen on an Android device
And the "Add to Google Wallet" button is visible
When user taps on "Add to Google Wallet" button
Then the Google Wallet provisioning flow is initiated
And user completes the Google Wallet verification
And the card is added to Google Wallet
And a success toast is displayed
Scenario: User sees disabled button when card is already in wallet
Given user is logged in and has an active MetaMask Card
And the card is already added to Google Wallet
When user navigates to the Card Home screen
Then the "Add to Google Wallet" button is not visible
```
## **Screenshots/Recordings**
<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
### **Before**
<!-- [screenshots/recordings] -->
### **After**
<!-- [screenshots/recordings] -->
## **Pre-merge author checklist**
- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.
## **Pre-merge reviewer checklist**
- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Medium Risk**
> Introduces new Google Wallet provisioning flow and CI logic to fetch a
private Tap-and-Pay SDK, which can affect Android build/release behavior
and wallet tokenization edge cases.
>
> **Overview**
> Enables **Google Wallet (Android) in-app provisioning** for MetaMask
Card by adding a new `GoogleWalletAdapter` (including “Yellow Path”
*resume* handling via token lookup/listing) and exporting it through the
push provisioning adapter factory.
>
> Updates Card Home push-provisioning inputs to use a KYC-derived
cardholder name (and passes `accountCreatedAt`), swaps in a new
cross-platform `AddToWalletButton` component (native on iOS, localized
SVG button on Android), and adjusts the Galileo adapter contract to
return only the `opaquePaymentCard` needed for Google provisioning.
>
> Adds Android build support for the private Tap-and-Pay SDK: GitHub
Actions optionally clones the SDK into `android/libs`,
`android/build.gradle` adds a local Maven repo, and `android/libs` is
gitignored.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7273028. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
## **Description**
This PR migrates React Navigation from v5 to v6. This is a significant
infrastructure update that modernizes the navigation layer of the
application to align with the latest React Navigation best practices and
removes deprecated APIs.
Why this change?
- React Navigation v5 is no longer actively maintained
- v6 provides improved TypeScript support, better performance, and
simplified APIs
- Removes the deprecated `@react-navigation/compat` package
What changed?
| v5 API | v6 API |
|--------|--------|
| `mode="modal"` prop on Navigator | `screenOptions={{ presentation:
'modal' }}` |
| `headerMode="screen"` prop | Removed (default behavior in v6) |
| `headerMode="none"` prop | `screenOptions={{ headerShown: false }}` |
| `dangerouslyGetParent()` | `getParent()` |
| `dangerouslyGetState()` | `getState()` |
| `NavigationContainerRef` | `NavigationContainerRef<ParamListBase>` |
Dependencies updated:
- `@react-navigation/bottom-tabs`: `^5.11.11` → `^6.6.1`
- `@react-navigation/native`: `^5.9.4` → `^6.1.18`
- `@react-navigation/stack`: `^5.14.5` → `^6.4.1`
- Removed `@react-navigation/compat` (deprecated v5 compatibility
package)
## **Changelog**
CHANGELOG entry: null
## **Related issues**
fixes: [React Navigation v6
Migration](#23767)
## **Manual testing steps**
```gherkin
Feature: React Navigation v6 Migration
Scenario: user navigates between main tabs
Given the app is launched and user is logged in
When user taps on each tab (Wallet, Browser, Activity, etc.)
Then each tab screen renders correctly with proper animations
Scenario: user opens a modal screen
Given the user is on the Wallet screen
When user triggers a modal (e.g., WalletActions, NetworkSelector)
Then the modal presents with correct slide-up animation
And the modal dismisses correctly when closed
Scenario: user navigates with back button
Given the user has navigated deep into a stack (e.g., Settings > Security)
When user presses the back button or swipes back
Then navigation returns to the previous screen correctly
Scenario: user opens bottom sheets
Given the user is on any screen with bottom sheet functionality
When user triggers a bottom sheet (e.g., Account Connect, Token Sort)
Then the bottom sheet presents correctly over the current screen
And background content remains visible behind transparent areas
```
## **Screenshots/Recordings**
### **Before**
N/A - No visual changes expected
### **After**
No visual changes expected. To ensure that the ui has not changed
#27385 was created to
view the comparison of ui through the flow via visual regression
## **Pre-merge author checklist**
- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.
## **Pre-merge reviewer checklist**
- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **High Risk**
> Touches core navigation structure and presentation settings across
many stacks/modals, so regressions could break routing, back behavior,
or modal/sheet presentation. Changes also alter theming/background
handling, which can cause subtle UI layering issues.
>
> **Overview**
> Updates app navigation to React Navigation v6 patterns by removing
deprecated navigator props like `mode` and moving modal behavior to
`screenOptions.presentation` (and related per-screen options), while
centralizing `clearStackNavigatorOptions` and adjusting many flows (App,
MainNavigator, RootModalFlow, rewards/browser/etc.) to set appropriate
`cardStyle` backgrounds.
>
> Refactors navigation typings (e.g., `TabBarProps`/descriptors and
`NavigationContainerRef<ParamListBase>`), hardens `TabBar` against
missing descriptors, and expands unit tests/snapshots to cover tab
visibility/callbacks/on-leave behavior plus broad route/screen
registration validation. NavigationContainer theme background is set to
`transparent` to support transparent modals, shifting responsibility for
background color to screens.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b6a3bcb. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ng cp-7.72.0 (#28147) <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** Fixes a regression where the Claim bonus CTA for mUSD could remain visible after a successful claim and allow reopening claim flow with effectively no claimable value. The solution introduces a post-claim lock in useMerklBonusClaim, then unlocks that CTA after reward data is refreshed (manual pull-to-refresh, section refresh/remount, or periodic auto-refresh). It also fixes stale reward state handling so old claimable values are cleared when reward fetch returns no matching reward. ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: Fixed an issue where the mUSD Claim bonus button could remain visible after claiming and trigger another claim flow. ## **Related issues** Fixes: #28135 ## **Manual testing steps** ```gherkin Feature: mUSD claim bonus CTA state lifecycle Scenario: CTA hides after successful claim and reappears after refresh when claimable again Given user has claimable mUSD bonus And user is on Homepage with Cash section visible When user taps "Claim bonus" and confirms the transaction Then loader is shown briefly And "Claim bonus" is hidden after successful submission When user pulls to refresh Homepage Then Cash section refreshes And claim bonus eligibility is re-evaluated When sufficient time passes for auto-refresh interval Then claim bonus eligibility is re-evaluated automatically Scenario: stale claimable state is cleared Given previous claimable reward was shown When rewards fetch returns no matching reward Then "Claim bonus" is not shown ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [screenshots/recordings] --> ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Touches claim CTA gating and introduces a periodic fetch interval; incorrect locking/versioning could hide the CTA or increase background network activity unexpectedly. > > **Overview** > Fixes the mUSD Merkl “Claim bonus” CTA lifecycle by adding a **post-claim session lock** in `useMerklBonusClaim` that hides the CTA after a successful claim submission and only re-enables it after rewards data has refreshed (via a new `rewardsFetchVersion`). > > Enhances `useMerklRewards` with **auto-refresh (60s)**, a `rewardsFetchVersion` counter, and clearing of stale `claimableReward` when a refetch returns no matching reward; the Homepage now wires `CashSection` into the global refresh flow and exposes a section `refresh()` that forces a remount of the cash row to reset claim state. Tests were updated/added to cover the lock/unlock behavior, stale clearing, interval cleanup, version increments, and cash row remount on refresh. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 67ccc05. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** Add info section for money account deposits. ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/CONF-1104 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** <img width="398" height="852" alt="Screenshot 2026-03-27 at 8 13 12 PM" src="https://github.com/user-attachments/assets/87162fcd-e4b7-48c2-9f80-75faa6eb1024" /> ## **Pre-merge author checklist** - [X] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [X] I've completed the PR template to the best of my ability - [X] I've included tests if applicable - [X] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [X] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Touches the confirmation UX for `TransactionType.moneyAccountDeposit`, including hiding the footer by default and suppressing the alert banner, which could impact users’ ability to review/confirm if the transaction type is misclassified or the new UI path has gaps. > > **Overview** > Adds a dedicated `MoneyAccountDepositInfo` section for `TransactionType.moneyAccountDeposit`, wiring it into the confirmation `Info` switch and setting a new navbar title key. > > Updates confirmation behavior for money account deposits to use the redesigned/full-screen confirmation flow, hide the footer by default, and exclude these transactions from the `AlertBanner` display. Adds/extends unit tests and introduces the new `Routes.MONEY_ACCOUNT.ROOT` plus an English string for the new confirmation title. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b31d9c2. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
) I separated our Crowdin workflow files into two: one to upload updated source strings (English) to Crowdin, and the other to pull down completed and approved translations, which generates a PR that we will merge alongside releases. <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Updated Crowdin workflow files** I separated our Crowdin workflow files into two: one to upload updated source strings (English) to Crowdin, and the other to pull down completed and approved translations, which generates a PR that we will merge alongside releases. I also added the "chore" prefix to the names of the PRs to improve our merging process. <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: Having two separate workflows allows us more control over when translations are pulled down from Crowdin, which will streamline our process as we aim to align translation PRs with the releases that the strings pertain to. --> ## **Pre-merge author checklist** - [X] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [X] I've completed the PR template to the best of my ability - [ ] I've included tests if applicable - [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. - [ ] <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk workflow-only change that alters when Crowdin sync runs and how translation PRs are created; main risk is misconfiguration leading to missed uploads/downloads. > > **Overview** > Splits the Crowdin GitHub Actions automation into two workflows: a `push`-triggered job that **only uploads source strings** to Crowdin, and a separate scheduled/manual job that **downloads only approved translations**. > > The new download workflow creates translation update PRs titled `chore: New Crowdin Translations by GitHub Action`, while the upload workflow disables translation downloads and adds a short job timeout for both jobs. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 555c5ad. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** This PR bumps the webdriverio dependencies to 9.27.0 to then be used in #27939. This bump brings significant improvements on the Appium service. <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/MMQA-1454 ## **Manual testing steps** N/A ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** N/A <!-- [screenshots/recordings] --> ### **After** N/A <!-- [screenshots/recordings] --> ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.
…d settings to useAnalytics (#27855) ## **Description** <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> Part of the C3 analytics migration (#26686). This PR covers the navigation hook and global test setup cleanup. **What changed:** - **`useConnectionHandler.tsx`**: replaces `useMetrics` with `useAnalytics` — the tracked events (`CONNECTION_DROPPED`, `CONNECTION_RESTORED`) and navigation behaviour are unchanged - **`useConnectionHandler.test.ts`**: updates mocks from `useMetrics`/`MetricsEventBuilder` to `useAnalytics`/`AnalyticsEventBuilder` using `jest.mocked()` and `createMockUseAnalyticsHook` - **`testSetup.js`**: removes the global `withAnalyticsAwareness` HOC mock — the HOC is being deprecated and no longer needs a global stub The rest of the original scope (TabBar, security/wallet UI components, Settings, Bridge) has been split into separate PRs for easier review by the respective code owners: - [#27983](#27983) — TabBar (`@MetaMask/design-system-engineers`) - [#27984](#27984) — Security/wallet UI components & Settings (`@MetaMask/mobile-core-ux`) - [#27985](#27985) — Bridge hook (`@MetaMask/swaps-engineers`) ## **Changelog** CHANGELOG entry: null ## **Related issues** Ref: #26814 ## **Manual testing steps** N/A ## **Screenshots/Recordings** ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk refactor limited to analytics plumbing and Jest mocks; navigation timing and tracked event names remain the same. > > **Overview** > Updates `useConnectionHandler` to call `useAnalytics` (instead of `useMetrics`) while keeping the same offline navigation timeout and emitting the same `MetaMetricsEvents` for connection dropped/restored. > > Adjusts `useConnectionHandler.test.ts` to mock `useAnalytics` via `createMockUseAnalyticsHook` and to build assertions with `AnalyticsEventBuilder`, and removes the now-unneeded global `withAnalyticsAwareness` HOC mock from `testSetup.js`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 21fe914. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…#28109) <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** Integrates the Predict "pay with any token" flow into the shared confirmation `PayWithModal`, enabling users to pay for prediction market orders using any token (not just their Predict balance). When a `predictDepositAndOrder` transaction is active, the Pay With modal now: - Prepends a "Predict balance" option at the top of the token list (via `usePredictBalanceTokenFilter`) - Routes token selection through `PredictController.selectPaymentToken()` instead of the generic `setPayToken` path - Hides the network filter (Predict operates on a single chain — Polygon) This wires the confirmation layer into the existing Predict active order lifecycle (`PREVIEW → PAY_WITH_ANY_TOKEN → DEPOSITING → PLACING_ORDER → SUCCESS`) without changing the Predict controller or hooks themselves. ## **Changes** ### `pay-with-modal.tsx` - Imports and calls `usePredictPaymentToken` and `usePredictBalanceTokenFilter` hooks - Detects Predict context via `hasTransactionType(transactionMeta, [TransactionType.predictDepositAndOrder])` - Intercepts `onTokenPress` to route through `onPredictPaymentTokenChange` for both single-token and multi-token selection paths - Applies `predictBalanceTokenFilter` to the available tokens list when in Predict context ### `confirmations.ts` - Adds `TransactionType.predictDepositAndOrder` to: - `REDESIGNED_TRANSACTION_TYPES` — enables the redesigned confirmation UI - `FULL_SCREEN_CONFIRMATIONS` — renders as a full-screen confirmation - `HIDE_NETWORK_FILTER_TYPES` — hides the network filter in the Pay With modal ### `NotificationManager.js` - Adds `TransactionType.predictDepositAndOrder` to `SKIP_NOTIFICATION_TRANSACTION_TYPES` so system notifications are suppressed (Predict manages its own toast notifications via `usePredictOrders`) ### `pay-with-modal.test.tsx` - Mocks `usePredictPaymentToken` and `usePredictBalanceTokenFilter` hooks - Sets up default mock return values matching the hook interfaces <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: null ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [screenshots/recordings] --> ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I've included tests if applicable - [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Moderate risk because it changes pay-token selection behavior and UI filtering for a new transaction type, and alters notification-suppression rules which could affect user feedback if misclassified. > > **Overview** > Enables Predict `predictDepositAndOrder` confirmations to use the shared `PayWithModal` flow, including hiding the network filter and applying a Predict-specific token list filter. > > When in Predict context, token selection is routed through `usePredictPaymentToken().onPaymentTokenChange` instead of the generic `setPayToken` path, and tests were updated to cover the new Predict selection/filtering behavior. > > Adds `TransactionType.predictDepositAndOrder` to confirmation type allowlists (`REDESIGNED_TRANSACTION_TYPES`, `FULL_SCREEN_CONFIRMATIONS`, `HIDE_NETWORK_FILTER_TYPES`) and to `NotificationManager`'s `SKIP_NOTIFICATION_TRANSACTION_TYPES`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 53d9449. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description**
Prevent the Market Insights background animation from interrupting audio
already playing on the device.
The screen uses a muted `react-native-video` animation, but on iOS that
video can still take over the app audio session and stop music playback
from Bluetooth headphones or device speakers. This change configures the
background video to obey the silent switch and mix with other audio so
opening Market Insights no longer pauses the user’s music.
The test mock for `react-native-video` was also updated to forward props
so the view test can assert the audio-session configuration.
## **Changelog**
CHANGELOG entry: Fixed an issue where opening Market Insights could
pause audio already playing on the device.
<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`
If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`
(This helps the Release Engineer do their job more quickly and
accurately)
-->
## **Related issues**
Fixes:
## **Manual testing steps**
```gherkin
Feature: my feature name
Scenario: user [verb for user action]
Given [describe expected initial app state]
When user [verb for user action]
Then [describe expected outcome]
```
## **Screenshots/Recordings**
<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
### **Before**
<!-- [screenshots/recordings] -->
### **After**
<!-- [screenshots/recordings] -->
## **Pre-merge author checklist**
- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.
## **Pre-merge reviewer checklist**
- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Medium Risk**
> Touches media playback configuration (`react-native-video`) which can
affect audio behavior across platforms, but the change is small and
covered by a targeted unit test.
>
> **Overview**
> Prevents the Market Insights muted background animation from taking
over the app audio session by configuring `react-native-video` to
`ignoreSilentSwitch="obey"` and `mixWithOthers="mix"`.
>
> Updates the `react-native-video` Jest mock to forward arbitrary props,
and adds a view test asserting the new audio-mixing configuration on the
background video.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
96bed41. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** * Removes the `importSrpWordSuggestion` remote flag and all code that read it. The BIP39 word-suggestion bar experiment is complete, so the app no longer depends on remote config flag for that UI. * Jra: https://consensyssoftware.atlassian.net/browse/TO-647 <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: Import SRP screens always show BIP39 word suggestions when the keyboard is open, with no remote feature flag ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: Import SRP BIP39 word suggestions bar Scenario: Onboarding import wallet shows word suggestions while typing SRP Given the user is on Import from SRP And the keyboard is open When the user types partial words in the SRP field Then BIP39 word suggestions are shown and can be selected Scenario: Import new SRP (multi-SRP) shows word suggestions while typing Given the user is on Import New SRP And the keyboard is open When the user types partial words in the SRP field Then BIP39 word suggestions are shown and can be selected ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** https://github.com/user-attachments/assets/8426a0a8-11d6-4f24-8eb6-b98208f584af https://github.com/user-attachments/assets/11bf056f-a203-4fd1-a90c-27fa27982d76 <!-- [screenshots/recordings] --> ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Moderate risk because it changes onboarding wallet-import UI behavior and removes a remote kill-switch, but the logic change is small and localized to SRP import screens and flag plumbing. > > **Overview** > Removes the `importSrpWordSuggestion` remote feature flag end-to-end (feature flag enum entry, selector implementation + tests, and registry entry). > > Updates both SRP import flows (`ImportFromSecretRecoveryPhrase` and `ImportNewSecretRecoveryPhrase`) to *always* render `SrpWordSuggestions` when the keyboard is visible (and on step 0 where applicable), and drops the associated feature-flag mocks from the screen tests. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 24f7f6a. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…28114) ## **Description** Migrate the local `MainRoutes` component in Ramp Deposit routes from prop-based route access to `useRoute()` hook, eliminating the `type ScreenComponent = React.ComponentType<any>` escape hatch. Part of the React Navigation v6 migration effort to remove `no-explicit-any` violations from route files. **Changes:** - **`routes/index.tsx`**: Switch `MainRoutes` to `useRoute()`, remove `MainRoutesProps`, `ScreenComponent` alias, and cast ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: ## **Manual testing steps** N/A — pure refactoring with no user-facing behavior change. ## **Screenshots/Recordings** ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. Made with [Cursor](https://cursor.com) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk refactor limited to navigation param plumbing; behavior should remain unchanged aside from potential typing/runtime differences if the route context is misconfigured. > > **Overview** > Refactors `app/components/UI/Ramp/Deposit/routes/index.tsx` so `MainRoutes` no longer accepts a `route` prop and instead pulls `DepositNavigationParams` from React Navigation via `useRoute()`. > > This removes the local `MainRoutesProps` typing and updates imports accordingly, aiming to simplify typing and reduce `any`-style escape hatches during the React Navigation v6 migration. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b1db237. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
See Commits and Changes for more details.
Created by
pull[bot] (v2.0.0-alpha.4)
Can you help keep this open source service alive? 💖 Please sponsor : )