[pull] main from MetaMask:main#502
Merged
Merged
Conversation
<!--
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**
Bumps snap Bitcoin 1.10.0.
<!--
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**
> Dependency-only change, but it upgrades the Bitcoin Snap used by the
app, which can affect Bitcoin balance/transaction event behavior at
runtime. Risk is mainly from upstream snap changes rather than local
code modifications.
>
> **Overview**
> Upgrades `@metamask/bitcoin-wallet-snap` from `^1.9.0` to `^1.10.0`
and updates `yarn.lock` accordingly, pulling in the new snap release
(notably including upstream changes around balance/transaction event
emission).
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f6a98ea. 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 missing permissions to the workflow <!-- 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-1360 Follow up PR of #25694 ## **Manual testing steps** Trigger workflow Performance E2E Tests for Experimental Builds and builds are correctly created. ## **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** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] 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 broadens GitHub Actions permissions (notably `actions: write` and `id-token: write`), which could impact security if misused. > > **Overview** > Adds an explicit `permissions` block to `run-performance-e2e-experimental.yml` to allow the workflow to invoke other workflows and use OIDC as needed. > > No test logic or triggers change; this is solely an update to GitHub Actions permission scopes (`contents: read`, `id-token: write`, `actions: write`). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6c863a4. 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 migrates analytics tracking in the Predict feature from the legacy `MetaMetrics` singleton pattern to the new standardized `analytics` API as part of Batch 1-4 analytics migration. **Changes:** - Updated `PredictController` to use `analytics.trackEvent()` with `AnalyticsEventBuilder` instead of `MetaMetrics.getInstance().trackEvent()` with `MetricsEventBuilder` - Migrated `PolymarketProvider` user trait tracking from `addTraitsToUser()` to `analytics.identify()` ## **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: [MCWP-297](https://consensyssoftware.atlassian.net/browse/MCWP-297) ## **Manual testing steps** ```gherkin Feature: Predict feature analytics tracking Scenario: user interacts with Predict feature Given the app is running with analytics enabled And the user opted-in for analytics When user navigates to Predict feed, views markets, positions, and performs trades Then analytics events are tracked: - "Predict Trade Transaction" - "Predict Market Details Opened" - "Predict Position Viewed" - "Predict Activity Viewed" - "Geo Blocked Triggered" - "Predict Feed Viewed" - "Share Action" And user trait "created_polymarket_account_via_mm" "true" is identified in Mixpanel when creating Polymarket account ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** NA ### **After** NA ## **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. [MCWP-297]: https://consensyssoftware.atlassian.net/browse/MCWP-297?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes swap out the analytics implementation for Predict events and user identification, which could silently affect event/trait delivery or schema if the new builder/API differs; functional business logic is otherwise unchanged. > > **Overview** > Migrates Predict analytics from the legacy `MetaMetrics` singleton to the new `analytics` API, replacing `MetricsEventBuilder` usage with `AnalyticsEventBuilder` across Predict event tracking (trade transaction, market details opened, position/activity viewed, geoblock triggered, feed viewed, share action). > > Updates Polymarket trait capture to use `analytics.identify()` for the "created Polymarket account via MetaMask" user property, and adds/updates unit tests to mock `analytics` and assert `trackEvent` is (or isn’t) invoked for the controller’s tracking methods. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit c753df1. 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** Clear transaction confirmation when user leaves the perps order screen ## **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: #25439 ## **Manual testing steps** - Go to Perps - Start a new order - Go back to home page - Start Send flow - Select any token from any EVM network (on non-EVM networks the error does not trigger, but the flow is broken) - Input amount - Select recipient - NO error should be shown ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> no visible change ### **After** <!-- [screenshots/recordings] --> no visible change ## **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 shared confirmation state by force-rejecting on unmount; a mistake here could prematurely dismiss legitimate confirmations or change navigation/UX around confirmations. > > **Overview** > Clears any active confirmations when the Perps order screen is left by replacing `useClearConfirmationOnBackSwipe()` with an explicit unmount cleanup that calls `useConfirmActions().onReject(undefined, true)`. > > This prevents stale confirmation state from leaking into other flows (e.g., Send) after backing out of Perps. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 616455e. 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>
<!-- 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 makes the "Earn a 3% bonus" text in the mUSD conversion CTA clickable. <!-- 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: updates the "Earn a 3% bonus" text in the mUSD conversion CTA to be clickable. ## **Related issues** Fixes: [MUSD-280: mUSD Conversion Primary CTA isn't clickable](https://consensyssoftware.atlassian.net/browse/MUSD-280) ## **Manual testing steps** ```gherkin Feature: mUSD conversion CTA link text Scenario: user taps the bonus text CTA Given user is viewing the mUSD conversion CTA on the token list When user taps the "Earn a <percentage>% bonus" text Then the conversion CTA action is initiated And an analytics event is tracked with cta_text set to the bonus text ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> N/A - Text isn't clickable ### **After** <!-- [screenshots/recordings] --> https://github.com/user-attachments/assets/dc1246c9-0659-4562-93bd-f5854c50395a ## **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** > UI interaction and analytics payload changes scoped to the mUSD conversion CTA; no auth/security or persistent data changes, but tracking fields and click targets could regress if event expectations are wrong. > > **Overview** > Makes the mUSD conversion promo line ("Earn a X% bonus") tappable by wrapping it in a `TouchableOpacity` and routing it through the same CTA handler as the button. > > Updates MetaMetrics tracking to distinguish *button vs text* clicks (`cta_text` now reflects the actual pressed element), and changes network analytics fields to use `selectedChainId`/`useNetworkName` when available with a fallback to `wallet.popular_networks`. > > Expands/rewrites unit tests to cover clicking the bonus text, the new event properties (`cta_text`, `redirects_to`, `network_name` fallback), and `useNetworkName` behavior when no chain is selected. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1ddd5fd. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> <!-- BUGBOT_STATUS --><sup><a href="https://cursor.com/dashboard?tab=bugbot">Cursor Bugbot</a> reviewed your changes and found no issues for commit <u>1ddd5fd</u></sup><!-- /BUGBOT_STATUS -->
…detailed modal summary (#25635) <!-- 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 transaction activity display for mUSD conversion transactions. Previously, mUSD conversion related/duplicated transactions were not being properly hidden and displayed in the main activity list, token details activity list, and the transaction detail modal summary. Added support for finding and displaying the mUSD receive transaction hash in the activity summary. On mainnet, the send and receive operations can be in separate transactions, so we need to find and link to the correct receive transaction for the block explorer. Changes: Transaction Activity Lists: - Added TransactionType.musdConversion to POSITIVE_TRANSFER_TRANSACTION_TYPES for proper balance display - Added decoding support for musdConversion transaction type in decodeTransaction - Added navigation route for TRANSACTION_DETAILS in AssetStackFlow to enable tapping on transactions from token details Transaction Detail Modal Summary: - Created new MusdConversionSummary component with dedicated logic for mUSD conversion transactions - Added findMusdSendTransaction utility to find the relay deposit transaction - Added findMusdReceiveTransaction utility to find the mUSD receive transaction by matching transferInformation.contractAddress against the mUSD token address - Handles fallback to transactionMeta.hash when send/receive are bundled in the same transaction - Handles edge case where hash is 0x0 (shows no block explorer link) <!-- 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: n/a ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-267 Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-277 Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-287 ## **Manual testing steps** ```gherkin Feature: mUSD conversion transaction activity Scenario: View mUSD conversion in main activity list Given the user has completed an mUSD conversion When viewing the main wallet activity tab Then the mUSD conversion transaction appears with correct title and amount Scenario: View mUSD conversion in token details Given the user has completed an mUSD conversion When viewing the mUSD token details activity list Then the mUSD conversion transaction appears And tapping it opens the transaction details modal Scenario: View mUSD conversion transaction details Given the user has completed an mUSD conversion on mainnet When viewing the transaction details modal Then the Summary section shows two lines: - "Sent {stablecoin} from {chain}" with block explorer link - "Receive mUSD on {chain}" with block explorer link ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <img width="424" height="645" alt="Screenshot 2026-02-05 at 6 28 26 AM" src="https://github.com/user-attachments/assets/440966f1-2349-4b8e-a51a-7e6cbeadca5f" /> <img width="416" height="715" alt="Screenshot 2026-02-05 at 6 28 39 AM" src="https://github.com/user-attachments/assets/c9df6b46-23d8-404f-ad2d-9a303a93ac38" /> https://consensys.slack.com/files/U06EZC2Q81X/F0AD6AH8552/simulator_screen_recording_-_iphone_17_pro_-_2026-02-04_at_17.52.37.mp4 <!-- [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 transaction rendering/decoding and navigation for transaction details; mistakes could cause missing/duplicated activity rows or incorrect block-explorer links for related transaction types. > > **Overview** > Fixes how `mUSD conversion` transactions appear across activity lists and the transaction details summary. > > `decodeTransaction` now treats `TransactionType.musdConversion` as a positive transfer and decodes it via the transfer path (keyed off `transactions.tx_review_musd_conversion`) so amounts/titles render consistently. The transaction details summary logic is adjusted to render *exactly two lines* for mUSD conversion: a send line sourced from the `relayDeposit` tx, and a receive line sourced from the `musdConversion` tx (using its hash when present, suppressing the link when hash is `0x0`), while skipping any other required mUSD-related transactions to avoid duplicates. > > Adds `Routes.TRANSACTION_DETAILS` to the asset/token details stack so tapping a token’s activity item can open the transaction details screen. Updates/expands unit tests accordingly, and bumps `@metamask/transaction-controller`/`@metamask/transaction-pay-controller` (and related lockfile resolutions). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d4e98fe. 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? --> ## **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** No manual testing steps ## **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** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] 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** > Dependency-only change, but it upgrades profile syncing’s transitive `keyring`/`snaps`/`utils` packages which can subtly affect account, snap, or sync behavior at runtime. > > **Overview** > Updates dependencies to use `@metamask/profile-sync-controller@^27.1.0` and `@metamask/address-book-controller@^7.0.1`. > > The lockfile is refreshed to reflect new transitive requirements for the updated profile sync controller (notably newer `@metamask/keyring-controller`, `@MetaMask/snaps-*`, and `@metamask/utils` versions). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 95b0fa8. 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 stops allowing the hiding of mUSD if the user has the token in their token list. It blocks it in the three places that a user can hide their token <!-- 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: Updates to disable hiding of mUSD token similar to network tokens but does not display by default ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-276 ## **Manual testing steps** ```gherkin Feature: Disallow hiding mUSD token Scenario: User cannot hide mUSD from token list via long press Given user has mUSD token in their wallet When user long-presses on mUSD token in the token list Then no hide/remove menu appears Scenario: User cannot hide mUSD from asset options menu Given user is viewing mUSD token details When user opens the asset options menu (3-dot menu) Then "Remove Token" option is not displayed Scenario: User cannot hide mUSD from asset details page Given user is viewing mUSD asset details page When user scrolls to the bottom of the page Then "Hide Token" button is not displayed Scenario: User can still hide other ERC-20 tokens Given user has a non-native, non-mUSD token in their wallet When user long-presses on that token Then hide/remove menu appears as expected ``` ## **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/1301055c-7b0c-439f-aab6-1377c6488b8a <!-- [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** > Small UI/UX guardrail change gated by a simple address check; low risk aside from potentially mis-identifying mUSD if the address list changes or differs by chain in the future. > > **Overview** > Prevents users from hiding/removing the `mUSD` token by disabling the removal affordances across the UI. > > Adds a shared `isMusdToken` helper (case-insensitive address match) and uses it to: (1) suppress the long-press remove menu in `TokenListItem`, (2) hide the **Hide token** CTA in `AssetDetails`, and (3) omit the **Remove token** option in `AssetOptions`. Updates and adds tests to cover the new `mUSD` detection and the blocked removal flows. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 50fddef. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Fixes an intermittent bug where the Perps tab in Activity screen sometimes shows as empty when accessed from perps home or perps market detail screens via the "See all" button. ### Root Cause Race condition in `usePerpsTransactionHistory` hook: 1. User taps "See all" → navigates to Activity screen → Perps tab becomes active 2. `PerpsTransactionsView` mounts with `skipInitialFetch: true` (because WebSocket connection isn't established yet) 3. When connection becomes available, the hook didn't trigger a fetch because the `initialFetchDone` guard prevented it ### Solution Modified the effect in `usePerpsTransactionHistory` to detect when `skipInitialFetch` transitions from `true` to `false` (i.e., when connection is established) and trigger a fetch regardless of the `initialFetchDone` guard. ## **Changelog** CHANGELOG entry: Fixed Perps activity tab sometimes showing empty when accessed from perps home or market detail screens ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/TAT-2335 ## **Manual testing steps** ```gherkin Feature: Perps Activity View Scenario: user views perps activity from perps home Given user is on the perps home screen And user has perps transaction history When user taps "See all" in the recent activity section Then user should see the Activity screen with Perps tab selected And perps transactions should be displayed (not empty) Scenario: user views perps activity from market detail Given user is on a perps market detail screen And user has perps transaction history When user taps "See all" in the trades section Then user should see the Activity screen with Perps tab selected And perps transactions should be displayed (not empty) ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** Activity tab sometimes shows empty on first load when navigating from perps screens ### **After** Activity tab reliably shows transaction history when connection is established ## **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 - [ ] 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** > Small hook logic change gated on `skipInitialFetch` with added unit tests; main risk is triggering extra network fetches on connection flaps. > > **Overview** > Fixes an intermittent empty Perps Activity history by making `usePerpsTransactionHistory` trigger its initial `refetch()` when `skipInitialFetch` transitions from `true` to `false` (i.e., connection becomes available), rather than being blocked by the `initialFetchDone` guard. > > Adds focused tests covering connection state transitions to ensure a fetch occurs on true→false changes, does not duplicate on initial `false`, and only re-fetches once per reconnection. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 89d67fd. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…25637) <!-- 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** Prevents infinite quote loading on some chains like tron <!-- 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: exclude gas fees from swap quotes insufficientBal calculation ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/SWAPS-3933 ## **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** > Changes balance/insufficient-funds logic used in quote requests; while scoped and guarded by a flag, it can affect when quotes are requested/filtered and should be validated across native-token and gasless/sponsored scenarios. > > **Overview** > Prevents infinite bridge/swap quote loading by decoupling the quote-request `insufficientBal` computation from gas-fee data. > > `useIsInsufficientBalance` now accepts `ignoreGasFees`; when enabled (used by `useBridgeQuoteRequest`), it skips reading gas-related fields from the recommended quote and performs a token-only balance check, while leaving the UI path to continue using full gas-aware validation. Tests were updated to assert the new `ignoreGasFees: true` behavior. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3c15084. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…25626) <!-- 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 adds **Pay with any token / Perps balance** support in the Perps order flow and related UX. ## **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 Perps “Pay with” option (Perps balance or other tokens) and info tooltip on the order view. ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/TAT-1030 ## **Manual testing steps** ```gherkin Feature: Perps pay with any token and pay-with info tooltip Scenario: User selects Perps balance or another token to pay for a Perps order Given user is on Perps order view for a market (e.g. BTC) When user taps "Pay with" row Then pay-with modal opens with Perps balance and other tokens; Perps balance shows custom icon When user selects a token and confirms Then selection is reflected on the pay-with row and used for the order ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [screenshots/recordings] --> <img width="1206" height="2622" alt="simulator_screenshot_A119DE05-A515-4BF7-A95D-D44C13DCAAEB" src="https://github.com/user-attachments/assets/c9f32960-4eec-473f-8a14-74c0da350a68" /> ## **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 Perps order placement UX and fee/balance calculations and adds new controller state for selected payment token; regressions could miscompute max order size/fees or block/allow orders incorrectly when paying with non-Perps balances. > > **Overview** > Adds a **Perps “Pay with”** capability to the order flow, letting users choose between *Perps balance* (default) and a wallet token via the existing `PayWithModal`, with a new tooltip (`pay_with`) and updated `PerpsPayRow` UI. > > Updates order sizing/validation to respect the selected token’s USD balance (new `effectiveAvailableBalance`/`balanceForValidation` plumbing), clamps amounts when the pay balance drops, and shows an insufficient-funds warning when the chosen pay token can’t cover required margin. > > Reworks fee display to include bridge/deposit fees from transaction-pay when using a custom token (with loading skeleton + button disabled while fee quotes load), extends the fees tooltip to show bridge fees, and refactors deposit tracking/toasts (adds “taking longer” + cancel flow, removes stream-manager deposit-handler coordination, and skips notifications for `perpsDepositAndOrder`). > > Introduces `selectedPaymentToken` state in `PerpsController` with new `setSelectedPaymentToken`/`resetSelectedPaymentToken` actions, updates account subscriptions to accept `null` and to persist account updates into controller state so pay-token lists can display live Perps balance outside the stream provider, and adjusts tests/snapshots accordingly. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit edb793f. 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>
## **Description** This PR fixes the issue in the end of season summary where users couldn't scroll down properly if they had a small resolution and/or a more reward rows rendered. ## **Changelog** CHANGELOG entry: fix rewards end of season scroll issue ## **Screenshots/Recordings** ### **After**  <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk UI/layout change confined to end-of-season rewards rendering; main risk is unintended spacing/scroll behavior differences on some devices. > > **Overview** > Fixes end-of-season (previous season) rewards overflow/scroll issues by **constraining the container height** and rendering rewards via a `FlatList` (with nested scrolling and extra bottom padding) instead of mapping inline. > > Updates tests to cover OTHERSIDE rewards without a claim URL (locked state + navigation payload) and to assert the correct “no rewards earned” message when `currentTier.pointsNeeded` is `0` and unlocked rewards are empty. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e8731b8. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: sophieqgu <sophieqgu@gmail.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** This PR improves the mUSD claiming experience by adding an educational bottom sheet modal and auto-scrolling to the claimed token. **What changed:** 1. **New ClaimOnLineaBottomSheet:** When users tap "Claim" on mUSD rewards, a bottom sheet now appears explaining that bonuses will be issued on Linea, separate from their Ethereum mUSD balance. This helps set proper expectations before the claim transaction. 2. **Auto-scroll to Linea mUSD:** After a successful claim, the app navigates to the home page and automatically scrolls the token list to highlight the Linea mUSD token where the bonus was received. 3. **Consistent reward formatting:** Fixed display of claimable rewards to always show 2 decimal places (e.g., "0.9" → "0.90", "1" → "1.00") for currency consistency. 4. **ConditionalScrollView ref forwarding:** Added forwardRef support to enable parent components to programmatically scroll. **Why:** Users were confused about where their mUSD bonuses would appear after claiming. This educational modal and auto-scroll feature provides clarity and improves the post-claim experience. **Designs:** https://www.figma.com/design/VoEucFy6VdE4dCcmzE6Kw8/mUSD?node-id=7046-23577&t=JZw5lFoq0ZcYbdRi-0 ## **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` 5. 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 educational bottom sheet explaining that mUSD bonuses are claimed on Linea, and auto-scroll to the resulting token after successful claim ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-269 ## **Manual testing steps** ```gherkin Feature: mUSD Claim on Linea Educational Flow Scenario: User sees educational bottom sheet before claiming mUSD bonus Given user has mUSD with claimable Merkl rewards And user is viewing the mUSD asset overview When user taps the "Claim" button Then a bottom sheet appears with title "Claim bonuses on Linea" And shows mUSD icon and explanation that bonus will be issued on Linea And displays a "Terms apply" link and "Continue" button Scenario: User proceeds with claim after reading educational content Given user is viewing the ClaimOnLineaBottomSheet When user taps "Continue" Then the bottom sheet closes And the claim transaction is submitted And the Claim button shows loading state Scenario: User is navigated to Linea mUSD token after successful claim Given user has tapped "Continue" on the educational bottom sheet And the claim transaction was submitted successfully When the transaction is submitted Then user is navigated to the wallet home page And the token list scrolls to the Linea mUSD token Scenario: User can access terms of use Given user is viewing the ClaimOnLineaBottomSheet When user taps "Terms apply" link Then the mUSD conversion bonus terms URL opens in browser Scenario: User can dismiss the bottom sheet without claiming Given user is viewing the ClaimOnLineaBottomSheet When user taps the close button or swipes down Then the bottom sheet closes And no claim transaction is initiated ``` ## **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/f432842d-2c1c-4519-a602-f4a0109102d9 <!-- [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 modal navigation and cross-component scrolling via `DeviceEventEmitter`, which can be timing- and listener-lifecycle-sensitive. Also changes claim error handling and displayed messaging, which may affect user feedback paths. > > **Overview** > Adds a new `ClaimOnLineaBottomSheet` modal to educate users that mUSD bonuses are issued on Linea, with a Terms link and a Continue action that triggers the claim and immediately closes the sheet. > > Updates `ClaimMerklRewards` to open this modal on Claim, navigate back to Wallet on successful submission, and emit a `scrollToToken` event to focus the Linea mUSD token; token list and wallet home now listen for these events to scroll appropriately in both FlashList and homepage redesign (.map/ScrollView) modes. Also forwards refs through `ConditionalScrollView`, standardizes Merkl reward display to always show 2 decimals, and avoids surfacing errors for user-rejected transactions (EIP-1193 `code: 4001`) while showing a generic claim error message. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit a6da007. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Fixes background color for Perps deposit. It was set to white, now it's set back to gray. ## **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: Fixes background color for Perps deposit ## **Related issues** Fixes: ## **Manual testing steps** 1. Go to Perps deposit, background is gray now, as it was before ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** ### **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] > **Low Risk** > Small, localized UI change limited to Perps confirmation screen styling; minimal behavioral risk beyond potential visual regressions. > > **Overview** > Perps confirmations no longer pass a theme-derived `fullscreenStyle` background override into `Confirm`; they now rely on `Confirm`’s default container styling. > > The Perps route wrapper still conditionally disables safe-area insets based on `showPerpsHeader`, but drops the `useTheme` dependency that was forcing a white/incorrect background. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 239fb4b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> Signed-off-by: dan437 <80175477+dan437@users.noreply.github.com>
…ck button (#25642) <!-- 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** Fixed the navigation header on the transaction details page (used by musdConversion, perpsDeposit, predictDeposit) to show a back arrow on the top left instead of a close ("X") button on the right. The issue was that getNavigationOptionsTitle was being called with isFullScreenModal=true, which shows a close button on the right. Changed to false to display the standard back arrow navigation pattern. <!-- 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: n/a ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-274 ## **Manual testing steps** ```gherkin Feature: Transaction details navigation Scenario: user views transaction details page Given user has a completed musdConversion, perpsDeposit, or predictDeposit transaction When user navigates to the transaction details page Then a back arrow appears on the top left of the header And no close button ("X") appears on the right side of the header ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <img width="500" alt="simulator_screenshot_5866955C-CB6A-470E-9842-FA582CADCFFC" src="https://github.com/user-attachments/assets/0c405c54-1d8a-4343-88a5-abfaacb9c814" /> <!-- [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** > Small, isolated UI/navigation-option change with a targeted regression test; no changes to transaction logic or data handling. > > **Overview** > Updates `TransactionDetails` header configuration to use standard stack navigation (left back arrow) rather than fullscreen-modal behavior (right-side close button) by changing the `isFullScreenModal` flag passed to `getNavigationOptionsTitle`. > > Adds a unit test asserting the navigation options now render `headerLeft` and omit `headerRight`, preventing regressions in the transaction details header UI. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7f777ba. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…clicking on the cta does nothing (#25613) <!-- 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 separates the conditional rendering state of the "Buy mUSD" and "Get mUSD" CTAs within `useMusdCtaVisibility`. The "Get mUSD" wins a tiebreaker if both should be displayed. Also adds a `variant` property to the `shouldShowBuyGetMusdCta` so consumers know which will be rendered. ## **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: refactored ## **Related issues** Fixes: - [MUSD-285: Get mUSD CTA is displayed on an imported account with no stable coin balance on Ethereum Mainnet. Clicking on the CTA does nothing. The account holds stable coin on Linea network](https://consensyssoftware.atlassian.net/browse/MUSD-285) - [MUSD-284: After switching from a non-EVM network to all networks, the get mUSD CTA is displayed, even if the account holds mUSD on both Ethereum Mainnet and Linea](https://consensyssoftware.atlassian.net/browse/MUSD-284) ## **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 CTA decision logic and balance/token selection paths that affect navigation into buy/convert flows; behavior changes are well-covered by tests but could alter CTA visibility across network/account combinations. > > **Overview** > Fixes the primary mUSD CTA so it resolves to a single **explicit variant** (`BUY` vs `GET`) returned by `useMusdCtaVisibility`, favoring **Get** when both could apply and preventing cases where a CTA is shown but clicking it does nothing. > > Improves chain-awareness across the flow: `useMusdConversionTokens` now exposes `hasConvertibleTokensByChainId` and compares tokens using `safeFormatChainIdToHex`, `useMusdConversionFlowData` selects/returns the payment token chainId safely in hex, and `useMusdBalance` now reads balances from `selectTokensBalances` keyed by the currently selected EVM account. The asset list CTA now uses the new `variant` for label/action and adds `cta_click_target` to MetaMetrics events; tests are updated accordingly. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 08294e7. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
) ## **Description** Renames the `HeaderCenter` component to `HeaderCompactStandard` to align with the design system naming conventions and improve consistency across the codebase. **Changes include:** - Renamed folder `HeaderCenter/` → `HeaderCompactStandard/` - Renamed all 7 component files to match new naming - Updated internal component, type, and function names: - `HeaderCenter` → `HeaderCompactStandard` - `HeaderCenterProps` → `HeaderCompactStandardProps` - `getHeaderCenterNavbarOptions` → `getHeaderCompactStandardNavbarOptions` - Updated ~60 import statements and usages across the codebase - Updated test mocks and assertions to use new names This is a pure rename refactor with no functional changes. https://www.figma.com/design/1D6tnzXqWgnUC3spaAOELN/%F0%9F%A6%8A-MMDS-Components?m=auto&node-id=9975-899&t=od7vzlrIk0EL83dH-1 ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/MDP-698 ## **Manual testing steps** ```gherkin Feature: HeaderCompactStandard component Scenario: Component renders correctly after rename Given the app is launched and user is logged in When user navigates to any screen using HeaderCompactStandard (e.g., Settings, Bridge Token Selector, Earn Input View) Then the header should display correctly with title, back button, and any action buttons And no visual or functional regressions should occur Scenario: Navigation options work correctly Given user is on a screen using getHeaderCompactStandardNavbarOptions When user taps the back button Then user should be navigated to the previous screen ``` ## **Screenshots/Recordings** _No visual changes - this is a pure rename refactor. The component appearance and behavior remain identical._ ### **Before** N/A - No visual changes ### **After** N/A - No visual changes ## **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** > Primarily a mechanical rename/refactor with updated tests/stories; main risk is missed import paths or stale mocks causing runtime/module resolution failures. > > **Overview** > Renames the temp header component `HeaderCenter` to `HeaderCompactStandard`, including its prop type (`HeaderCompactStandardProps`) and the React Navigation helper (`getHeaderCompactStandardNavbarOptions`). > > Updates Storybook registration, component stories/tests, and replaces imports/usages across many screens and modals (Bridge, Ramp/Deposit, Earn, Perps, Predict, Settings, confirmations, etc.) to reference the new component and helper names; removes the old `HeaderCenter` exports/helpers. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b35a80a. 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** Following #24313 we're looking to centralize all tools and test resources in one place. This PR also: - moves the quarantined specs to `/tests`. These quarantine files are now in their respective folder (smoke and regression) instead of using a dedicated quarantine folder. - updates BUGBOT.md to review the proper location for e2e tests - jest configs for both E2E and unit tests - updates documentation to reflect the complete migration of all spec files to `/tests` - reverts back the search of e2e specs in CI. It is now scoped to `tests` since all specs have been migrated. Previous related PRs: - #24988 - #24313 - #25031 - #25095 - #25167 - #25198 - #25219 - #25263 - #25279 - #25520 - #25533 - #25598 - #25636 - #25638 - #25698 <!-- 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-1235 ## **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 - [ ] 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 CI/Jest test discovery and sharding logic, so misconfigured paths could cause E2E suites to be skipped or incorrectly partitioned; changes are largely mechanical path updates. > > **Overview** > Shifts Detox E2E spec discovery to `tests/` (smoke/regression) and deprecates `e2e/specs`, updating Jest configs, unit-test ignore patterns, CI sharding/tag selection scripts, and result parsing assumptions accordingly. > > Updates documentation and AI review guidance to reference the new `tests/(smoke|regression)` layout, and rewrites quarantined smoke/regression spec files’ imports to point at shared `e2e/` page objects/helpers while using `tests/framework` + `tests/resources` from their new locations. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 76eeb92. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Remove extra padding in the Add Chain bottom sheet to ensure consistent 16px horizontal padding throughout the component. **Issue Details:** - The `AddChainApproval` component included an unnecessary `View` wrapper with an `actionsContainer` style that contributed to the layout inconsistency - This resulted in misaligned horizontal padding across the content **Solution:** - Removed the unnecessary `View` wrapper in `AddChainApproval` to allow `NetworkVerificationInfo` to render directly inside the `BottomSheet` ## **Changelog** CHANGELOG entry: Fixes padding in add chain approval bottom sheet ## **Related issues** Fixes: [Slack Thread](https://consensys.slack.com/archives/C07RYUXAR8B/p1770134529127739?thread_ts=1770134529.127739&cid=C07RYUXAR8B) ## **Manual testing steps** ```gherkin Feature: Add Chain bottom sheet padding alignment Scenario: user views Add Chain bottom sheet Given the app is running And the user is on the network selection screen When user taps "Add a custom network" Then the Add Chain bottom sheet should display ``` ## **Screenshots/Recordings** ### **Before** Add chain bottom sheet had wrong padding <img width="300" height="837" alt="Screenshot 2026-02-04 at 1 49 11 PM" src="https://github.com/user-attachments/assets/fed594bc-d25e-418f-9268-f1de5eaaa750" /> ### **After** Padding is now fixed <img width="300" height="842" alt="Screenshot 2026-02-04 at 2 00 00 PM" src="https://github.com/user-attachments/assets/3ea543da-3bc6-4e07-bee9-1ffc1f0ad72f" /> ## **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** > UI-only layout/styling changes with snapshot updates; no changes to approval logic, data handling, or security-sensitive code. > > **Overview** > Fixes Add Chain approval bottom-sheet layout by removing the extra styled `View` wrapper in `AddChainApproval`, letting `NetworkVerificationInfo` render directly inside `BottomSheet`. > > Adjusts `NetworkVerificationInfo` footer styling by adding `footerPadding` and applying it to `BottomSheetFooter`, updating snapshots to reflect consistent 16px horizontal padding (was 8px). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 209a436. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: George Marshall <georgewrmarshall@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** Updates the look of the "Earn %" CTA displayed for ETH and Tron staking products. <!-- 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: update the look of the "Earn %" CTA displayed for ETH and Tron staking products to tag style ## **Related issues** Fixes: [MUSD-289: Update the ETH and Tron Earn CTAs Style](https://consensyssoftware.atlassian.net/browse/MUSD-289) ## **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] --> <img width="464" height="79" alt="image" src="https://github.com/user-attachments/assets/a5b89b18-a175-4d51-8df7-82f0d57eb05f" /> ### **After** <!-- [screenshots/recordings] --> <img width="464" height="79" alt="Screenshot 2026-02-05 at 12 41 18 PM" src="https://github.com/user-attachments/assets/3531f1a4-7b2e-4085-8b46-f946b6bfd37d" /> ## **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** > UI-only styling/typography changes to the staking CTA with minimal logic impact; primary risk is minor visual/layout regressions across themes or screen sizes. > > **Overview** > Updates the wallet staking "Earn %" CTA to a tag-style `TouchableOpacity` by moving styling into a new themed `StakeButton.styles.ts` and wiring it through `useStyles`. > > Removes the leading dot separator and tweaks text typography (switching to `BodyXSMedium`) while keeping the existing navigation/analytics behavior unchanged. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3ab5394. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** This PR adds two new title components to the component library (`components-temp`) for use in various UI layouts: 1. **TitleStandard** - A vertically stacked title component that displays a main title (DisplayMd variant) with optional top/bottom labels and accessories. Ideal for displaying amounts with context (e.g., "Send" label above "$4.42" with "0.002 ETH" below). 2. **TitleSubpage** - A horizontally-oriented title component with an optional start accessory (e.g., for avatars), main title (HeadingMd variant), and bottom content. Designed for subpages like token/asset details where an avatar appears to the left of the title. Both components: - Use `@metamask/design-system-react-native` primitives (Box, Text) - Support flexible customization via accessory slots and label props - Include comprehensive unit tests and Storybook stories ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/jira/software/c/projects/MDP/boards/2972?assignee=62afb43d33a882e2be47c36f&quickFilter=3325&selectedIssue=MDP-699 ## **Manual testing steps** ```gherkin Feature: TitleStandard and TitleSubpage components Scenario: View TitleStandard in Storybook Given the app is running in Storybook mode When user navigates to Components Temp > TitleStandard Then user should see various title configurations with top labels, bottom labels, and accessories Scenario: View TitleSubpage in Storybook Given the app is running in Storybook mode When user navigates to Components Temp > TitleSubpage Then user should see title layouts with start accessories (avatars), bottom labels, and title accessories ``` ## **Screenshots/Recordings** ### **Before** N/A - New components ### **After** https://github.com/user-attachments/assets/2f39031f-91c8-483a-a4f9-0237be3631a2 ## **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** > New isolated UI components plus stories/tests; no changes to app flows, state, or security-sensitive logic. > > **Overview** > Adds two new `components-temp` title components: `TitleStandard` (stacked title with optional top/bottom labels or accessories, plus inline `titleAccessory`) and `TitleSubpage` (row layout with optional `startAccessory`, inline `titleAccessory`, and bottom label/accessory). > > Registers both in Storybook and adds comprehensive unit tests covering rendering, `testID` passthrough via `*Props`, and label-vs-accessory precedence rules. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0e6c3f8. 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 moves selectors from `tests` to `app` to prevent imports from `e2e`. The E2E BUGBOT was also updated to reflect this in order to prevent this issue from happening in the future. <!-- 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: ## **Manual testing steps** N/A ## **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 - [ ] 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). - [x] 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** > Primarily updates selector imports and adds local `*.testIds.ts` files; minimal behavioral impact outside of potential broken testID references if names drift. > > **Overview** > Moves Card UI `testID`/selector constants out of `e2e/selectors` and into co-located `*.testIds.ts` files within the relevant Card views/components, updating both production components and their unit tests to import locally (e.g., `ChooseYourCard`, `ReviewOrder`, `OrderCompleted`, `DaimoPayModal`, `RecurringFeeModal`). > > Updates the E2E testing guidelines to require colocating new testIDs next to the component and provides an example to avoid importing from `e2e` in app code. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 028ff81. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…sed markets (#25680) ## **Description** Enhances the `PredictMarketHighlightsFlag` feature with version gating and closed market filtering: 1. **Version Gating**: `PredictMarketHighlightsFlag` now extends `VersionGatedFeatureFlag`, adding `minimumVersion` support. Highlights are only fetched when the user's app version meets the minimum requirement (7.64.0). 2. **Closed Market Filtering**: Highlighted markets that are closed or resolved are now filtered out, ensuring only open markets are displayed at the top of category lists. ## **Changelog** CHANGELOG entry: null ## **Related issues** N/A - Internal improvement ## **Manual testing steps** ```gherkin Feature: Predict Market Highlights Scenario: User views category with highlighted markets Given the user is on the Predict tab And the remote feature flag has highlights configured for a category And the user's app version meets the minimum version requirement When user navigates to that category Then highlighted markets appear at the top of the list And only open markets are shown in the highlights Scenario: Highlights filtered when version requirement not met Given the user is on the Predict tab And the remote feature flag has minimumVersion set to a higher version When user navigates to a category with highlights Then no highlighted markets are prepended And only regular market list is shown Scenario: Closed markets are not highlighted Given a highlighted market has been closed or resolved When user navigates to that category Then that market is not shown in the highlights section ``` ## **Screenshots/Recordings** N/A - Backend logic change, no UI changes ## **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.
## **Description**
This PR aligns the `TextField` and `TextFieldSearch` components with the
MetaMask Design System specifications.
**Key changes:**
- **Removed the `size` prop** from `TextField` - the component now uses
a consistent fixed height of 48px, simplifying the API and ensuring
design consistency across the app
- **Updated `TextField` styling**: increased border radius (8px → 12px),
updated colors to use semantic tokens (`background.muted`,
`border.muted`), and increased accessory margins (8px → 12px)
- **Updated `TextFieldSearch` styling**: uses a pill-shaped border
radius (24px), larger icons (`IconSize.Md`), and updated close icon to
`CircleX`
- **Improved single-line behavior**: `TextField` now explicitly sets
`numberOfLines={1}` and `multiline={false}` by default
- **Updated all consumers** that previously used
`size={TextFieldSize.Lg}` to use the new simplified API
- **Enhanced Storybook stories** with more comprehensive examples and
better organization
- **Simplified constants files** by removing unused sample props
## **Changelog**
CHANGELOG entry: Updated TextField and TextFieldSearch components to
align with the MetaMask Design System
## **Related issues**
Fixes:
https://consensyssoftware.atlassian.net/jira/software/c/projects/MDP/boards/2972?assignee=62afb43d33a882e2be47c36f&quickFilter=3325&selectedIssue=MDP-700
## **Manual testing steps**
```gherkin
Feature: TextField component alignment
Scenario: User sees updated TextField styling
Given the app is running
When user navigates to any screen with a TextField (e.g., Login, Import Wallet, Search)
Then the TextField should display with:
- Height of 48px
- Border radius of 12px
- Muted background color
- Muted border color (default) that becomes darker on focus
Scenario: User sees updated TextFieldSearch styling
Given the app is running
When user navigates to a screen with TextFieldSearch (e.g., token search, address book)
Then the TextFieldSearch should display with:
- Pill-shaped border radius (24px)
- Search icon on the left
- CircleX clear button when text is present
Scenario: User interacts with TextField
Given the user is on a screen with a TextField
When user taps on the TextField
Then the border color should change to indicate focus
And the TextField should accept text input as a single line
```
## **Screenshots/Recordings**
<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
### **Before**
<!-- [screenshots/recordings] -->
### **After**
TextField
https://github.com/user-attachments/assets/b7fbdb24-a957-4fba-b134-d319759a04ce
TextFieldSearch
https://github.com/user-attachments/assets/7249cdb3-1119-477b-8652-ab2f8ff1abb7
Others
https://github.com/user-attachments/assets/fb425820-d231-436f-a35f-ba75cf64e0e3
<!-- [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 a widely used form primitive and updates default styling/props
(including fixed height and focus colors), which could cause subtle
visual regressions across many screens; behavior changes are otherwise
straightforward and covered by snapshot/test updates.
>
> **Overview**
> Aligns `TextField` with updated design-system tokens by **removing the
`size` API** and standardizing the component to a fixed 48px height,
updated border/background colors, larger corner radius, and increased
accessory spacing; it also forces single-line input via
`numberOfLines={1}`/`multiline={false}`.
>
> Updates `TextFieldSearch` to match the new look (pill radius, updated
search/clear icons and sizing, and rounded styling via a new
`TextFieldSearch.styles`) and refactors Storybook stories, constants,
and unit/snapshot tests accordingly. All consumers that passed
`size={TextFieldSize.Lg}` are migrated to the simplified API.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
d7ab35c. 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?
-->
Change CardHome button colors
## **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] -->
<img width="200" height="900" alt="image"
src="https://github.com/user-attachments/assets/31e5700c-2387-4c73-a71a-6576036e2f95"
/>
### **After**
<!-- [screenshots/recordings] -->
<img width="200" height="900" alt="image"
src="https://github.com/user-attachments/assets/64bb8951-f334-406e-a916-d0070723bc28"
/>
## **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**
> UI-only styling change limited to button variants and snapshot
updates, with no impact to card flows, navigation, or data handling.
>
> **Overview**
> Updates `CardHome` to render its main call-to-action buttons (`Add
funds`, `Enable card`, `Change asset`, and the error `Try again`) using
`ButtonVariants.Primary` instead of `Secondary`, changing their visual
styling.
>
> Regenerates `CardHome` Jest snapshots to reflect the new button colors
(e.g., dark background and white label text).
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4e6f91e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
Co-authored-by: Ale Machado <alejandro@macha.do>
## Version Bump After Release This PR bumps the main branch version from 7.65.0 to 7.66.0 after cutting the release branch. ### Why this is needed: - **Nightly builds**: Each nightly build needs to be one minor version ahead of the current release candidate - **Version conflicts**: Prevents conflicts between nightlies and release candidates - **Platform alignment**: Maintains version alignment between MetaMask mobile and extension - **Update systems**: Ensures nightlies are accepted by app stores and browser update systems ### What changed: - Version bumped from `7.65.0` to `7.66.0` - Platform: `mobile` - Files updated by `set-semvar-version.sh` script ### Next steps: This PR should be **manually reviewed and merged by the release manager** to maintain proper version flow. ### Related: - Release version: 7.65.0 - Release branch: release/7.65.0 - Platform: mobile - Test mode: false --- *This PR was automatically created by the `create-platform-release-pr.sh` script.* 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**
<!--
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?
-->
Add the shared infrastructure for push provisioning cards to mobile
wallets. This base branch contains:
- Core hook (usePushProvisioning) and service (PushProvisioningService)
- Card provider adapters (GalileoCardAdapter for US users)
- Base wallet adapter interfaces and utilities
- Feature flag selectors for both platforms
- CardHome and ReviewOrder UI integration
- Localization strings and analytics events
Platform-specific implementations (GoogleWalletAdapter,
AppleWalletAdapter) are added in separate branches:
- feat/google-in-app-provisioning
- feat/apple-in-app-provisioning
## **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: Base setup for in-app provisioning
## **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 core card UX and adds new network endpoints plus a new
adapter/service stack that coordinates with native wallet SDKs, so
regressions could block card flows even though logic is
feature-flag/eligibility gated.
>
> **Overview**
> Introduces a new `pushProvisioning` module (types, constants, provider
factories, adapters, service, and `usePushProvisioning`) to support
adding a card to Apple/Google wallets via provider-encrypted payloads,
with eligibility checks, activation event handling, and standardized
error/logging utilities.
>
> `CardHome` now derives a provisioning-ready user address/card details,
calls `usePushProvisioning`, and conditionally renders an
`AddToWalletButton` (with spinner) plus success/error toasts;
shipping-address construction is extracted to shared `buildUserAddress`
utilities and `ReviewOrder` reuses the shared `ShippingAddress` type.
The card SDK gains `createGoogleWalletProvisioningRequest` and
`createApplePayProvisioningRequest` endpoints to fetch encrypted
provisioning payloads, with extensive new unit tests across the new
infrastructure and UI integration.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6974063. 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>
<!--
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 analytics event tracking when deposit is triggered from different
entry points (homepage balance, buy preview). The deposit function now
accepts optional analytics parameters including entryPoint and
amountUsd.
- Add trackPredictOrderEvent call in usePredictDeposit when analytics
properties are provided
- Pass HOMEPAGE_BALANCE entry point from PredictBalance component
- Pass BUY_PREVIEW entry point with market context from
usePredictPlaceOrder
when balance is insufficient
- Add new event values: BUY_PREVIEW entry point and transaction types
for deposit, withdraw, and claim
- Update tests to verify analytics properties are passed correctly
<!--
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**
> Touches the deposit initiation path and changes the `deposit` hook API
to accept parameters, which could break callers or alter deposit
triggering behavior if mis-wired; analytics additions are otherwise low
impact.
>
> **Overview**
> Adds analytics instrumentation to the Predict deposit flow by
extending `usePredictDeposit.deposit` to accept optional `{ amountUsd,
analyticsProperties }` and emitting
`PredictController.trackPredictOrderEvent` with `status: initiated` and
`transactionType: mm_predict_deposit` when provided.
>
> Threads the new analytics context through key entry points:
`PredictBalance` passes `entryPoint: homepage_balance` for the Add Funds
button, and `usePredictPlaceOrder` triggers a deposit on insufficient
BUY balance while passing `amountUsd`, `entryPoint: buy_preview`, and
market context (merging any existing `orderParams.analyticsProperties`).
Event constants are expanded with `BUY_PREVIEW` and new transaction type
values, and tests are updated/added to assert the new analytics payloads
and tracking behavior.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
d00ac49. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**
PR to fix navigation to buy crypto with cash on the sticky buy button by
passing the assetId
## **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: Pass assetID to the on ramp buy screen.
## **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]
> **Low Risk**
> Small navigation change limited to the token-details Buy fallback
path; risk is mainly incorrect `assetId` formatting causing the on-ramp
screen to open without preselecting the intended asset.
>
> **Overview**
> Fixes the token-details sticky **Buy** flow so that when no eligible
swap/bridge source token exists, the app navigates to on-ramp via
`goToBuy({ assetId })` instead of calling `goToBuy()` with no context.
>
> `assetId` is derived by using the token’s CAIP address directly for
non-EVM assets, or generating an EVM CAIP asset id via
`formatAddressToAssetId(address, chainId)` (with a safe fallback to
`undefined` on errors). Tests are expanded to cover EVM vs
non-EVM/trending tokens and error cases for `assetId` generation.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
ce98ac3. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: Curtis David <Curtis.David7@gmail.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**
<!--
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?
-->
The `onBuy` handler drilled down to those components already handles all
the logic to navigate correctly, so fallbacks and modals are removed
from both the new button layout and the "More" menu.
## **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 flow for "Cash buy X" button on the new token
details layout
## **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 buy-call-to-action wiring and removes embedded ramp
routing/analytics, which could change purchase entrypoints and event
reporting if callers don’t supply `onBuy` correctly.
>
> **Overview**
> Fixes the token details **“Cash buy”** flow by making `onBuy` a
required callback and invoking it directly from both the main
`TokenDetailsActions` button and the `MoreTokenActionsMenu`, removing
internal fallback navigation to fund/ramp flows.
>
> Cleans up related ramp-specific logic and metrics/tracing in the
more-actions menu, and adjusts the token-hide metric to use
`asset.chainId` for `chain_id` instead of the selected network chain id.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1646360. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…led events (#25618) <!-- 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 adds the `provider_onramp` property to the "Ramps Transaction Completed" and "Ramps Transaction Failed" analytics events for deposit/native orders. **Problem:** The Ramps Transaction Completed event does not have the `provider_onramp` property, while the On-ramp Purchase Completed event does have this field. When creating a custom Mixpanel event that combines both events for analysis, `(not set)` dominates the results because of the larger volume of native orders without this property. **Solution:** - Added `provider_onramp: string` field to `RampsTransactionCompleted` and `RampsTransactionFailed` analytics interfaces - Updated `getDepositAnalyticsPayload` function to include `provider_onramp` from `order.provider` (defaults to empty string if not present) - Updated mock data to include provider field - Updated all test expectations to include `provider_onramp` property This aligns the deposit/native orders analytics with the aggregator orders which already have `provider_onramp`, allowing for better analysis in Mixpanel custom events. **Files Changed:** - `app/components/UI/Ramp/Deposit/types/analytics.ts` - Added `provider_onramp` to interfaces - `app/components/UI/Ramp/Deposit/utils/getDepositAnalyticsPayload.ts` - Added property extraction from `order.provider` - `app/components/UI/Ramp/Deposit/testUtils/constants.ts` - Updated mock data - `app/components/UI/Ramp/Deposit/utils/getDepositAnalyticsPayload.test.ts` - Updated all test expectations ## **Changelog** CHANGELOG entry: null <!-- This is an internal analytics change, not user-facing --> ## **Related issues** Refs: Issue created in Slack from a message Related PR: Consensys/segment-schema#447 (adds `provider_onramp` to Segment tracking plan) ## **Manual testing steps** ```gherkin Feature: Analytics event tracking for deposit orders Scenario: Deposit order completion includes provider_onramp property Given a deposit order is completed successfully When the Ramps Transaction Completed event is tracked Then the event should include the provider_onramp property with the provider name (e.g., "TRANSAK", "MOONPAY") Scenario: Deposit order failure includes provider_onramp property Given a deposit order fails When the Ramps Transaction Failed event is tracked Then the event should include the provider_onramp property with the provider name ``` **Note:** Manual testing requires completing a real deposit order (requires funds). Unit tests verify the property is correctly included in analytics payloads (11/11 tests pass). ## **Screenshots/Recordings** <!-- Not applicable - this is an analytics/internal change with no UI impact --> ### **Before** N/A - Analytics change only ### **After** N/A - Analytics change only ## **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 (all 11 unit tests pass, verifying `provider_onramp` property inclusion) - [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: analytics-only payload/type changes for deposit completion/failure events; main risk is downstream consumers expecting the previous schema. > > **Overview** > Adds `provider_onramp` to deposit analytics for `RAMPS_TRANSACTION_COMPLETED` and `RAMPS_TRANSACTION_FAILED`, populating it from `order.provider` (defaulting to an empty string when missing). > > Updates the corresponding TypeScript analytics event interfaces plus deposit test fixtures and unit test expectations to validate the new field is emitted. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 5031b78. 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>
<!--
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**
Updated coloring of Earn CTA
<!--
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: updated coloring of Earn CTA
## **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] -->
<img width="928" height="158" alt="image"
src="https://github.com/user-attachments/assets/470dc2d4-9c8a-4f5a-8a42-623cf3a93e50"
/>
### **After**
<!-- [screenshots/recordings] -->
<img width="456" height="82" alt="image"
src="https://github.com/user-attachments/assets/2f9a4386-fde8-43fc-89c0-40ce8b1e60cb"
/>
## **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**
> Pure UI styling tweak limited to a single text color change with no
logic or data-flow impact.
>
> **Overview**
> Updates the Stake screen Earn CTA by changing the `StakeButton` label
from `TextColor.Primary` to `TextColor.Alternative` (no behavior,
routing, or analytics changes).
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e3888b7. 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**
Introduces the payment selection modal and payment selection flow. Users
can choose a payment method (e.g. debit/credit card). Quotes and an
option to change provider coming soon.
<!--
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: adds functionality for selecting a payment method
## **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] -->
Loom video of the feature working:
https://www.loom.com/share/bfcf206254ff46b48107f8efb55875e5
<img width="504" height="1033" alt="Screenshot 2026-02-04 at 7 19 45 PM"
src="https://github.com/user-attachments/assets/8bfd1d41-6752-4f2f-aec6-4dd7d2b002be"
/>
Loading state:
<img width="248" height="148" alt="Screenshot 2026-02-04 at 7 19 09 PM"
src="https://github.com/user-attachments/assets/43596952-5e8d-48e7-92c3-4dbdc82463cd"
/>
## **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**
> Touches Ramp navigation and selection state (payment method/provider)
and upgrades `@metamask/ramps-controller`, which could affect runtime
behavior across the ramps flow despite being mostly additive and
UI-focused.
>
> **Overview**
> Adds a new **payment selection bottom sheet modal** to the Ramp buy
flow, letting users pick a `paymentMethod` (and a stubbed
provider-selection view) and persisting the choice via
`useRampsController.setSelectedPaymentMethod`.
>
> Updates `BuildQuote` to use controller-managed
`selectedToken`/`selectedPaymentMethod` (instead of route param lookup),
display a “Select payment method” placeholder, show a loading
spinner/disable interaction while payment methods load, and navigate to
the new modal. Also centralizes payment-delay string formatting into
shared `Aggregator/utils` helpers and bumps `@metamask/ramps-controller`
to `^7.0.0`, with new/updated tests and snapshots covering the modal,
pill loading state, and navigation.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4c37973. 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 : )