Skip to content

[pull] main from MetaMask:main#642

Merged
pull[bot] merged 8 commits intoReality2byte:mainfrom
MetaMask:main
Mar 31, 2026
Merged

[pull] main from MetaMask:main#642
pull[bot] merged 8 commits intoReality2byte:mainfrom
MetaMask:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Mar 31, 2026

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 : )

weitingsun and others added 8 commits March 30, 2026 23:44
<!--
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**
- Create a centralized workflow Runway OTA Build Core that decide either
to run an OTA update or start a new build based on if there is an OTA
version change
- All 4 workflows use Runway OTA Build:
runway-android-production-workflow.yml, runway-android-rc-workflow.yml,
runway-ios-rc-workflow.yml and runway-ios-production-workflow.yml
- Create a workflow to tag branch if it's an OTA update:
runway-create-ota-production-tag.yml

Note: all ios workflows (rc and production) will not skip version bump
but Android will. That's because we only want to bump version once.

runway-android-rc-workflow (build):
https://github.com/MetaMask/metamask-mobile/actions/runs/23557585480
runway-ios-rc-workflow (build):
https://github.com/MetaMask/metamask-mobile/actions/runs/23557559865
runway-android-rc-workflow (OTA):
https://github.com/MetaMask/metamask-mobile/actions/runs/23561069878
runway-ios-rc-workflow (OTA):
https://github.com/MetaMask/metamask-mobile/actions/runs/23561062779

## **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 runway production workflows

## **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**
> Changes GitHub Actions release automation for OTA updates, builds, and
tagging; mistakes could misroute production OTAs, skip version bumps, or
create incorrect tags/artifacts.
> 
> **Overview**
> Adds dedicated Runway `workflow_dispatch` entrypoints for
**iOS/Android RC and production** that call a reusable
`runway-ota-build-core.yml`, wiring platform/channel/build-name
differences and enabling TestFlight upload for iOS.
> 
> Refactors `runway-ota-build-core.yml` to be `workflow_call`-driven
with new inputs (e.g., `platform`, `ota_channel`, `build_name`,
`skip_version_bump`, `upload_testflight`) and updates OTA dispatch to
use `actions/github-script@v7` plus parameterized channel/platform and
artifact naming.
> 
> Introduces reusable `runway-create-ota-production-tag.yml` to create
an annotated `v*` tag after a successful **production OTA** (idempotent,
refuses to move existing tags), and removes the legacy
`runway_android_rc_workflow.yml` in favor of the new structure.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a54a664. 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?
-->

The Ramps lane has been renamed to **Money Movement** on GitHub
([`@MetaMask/money-movement`](https://github.com/orgs/MetaMask/teams/money-movement)).
This updates `.github/CODEOWNERS` so review requests and
branch-protection ownership resolve to the current org team instead of
`@MetaMask/ramp`.

**What changed**

- Section comment renamed to **Money Movement Team (formerly Ramps)**.
- All `@MetaMask/ramp` entries replaced with `@MetaMask/money-movement`
(Ramp UI, fiat orders, ramps controller/messengers, selectors, path
globs, and Swaps co-owned `parseAmount` / `parseAmount.test.ts`).
- Co-ownership comment updated to reference Money Movement alongside
Swaps.

## **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: CODEOWNERS ownership update

  Scenario: No in-app verification required
    Given this pull request only changes .github/CODEOWNERS
    When reviewers validate the team slug and paths
    Then no wallet UI or device manual test is applicable
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk because it only updates `.github/CODEOWNERS` mappings; the
main impact is on review routing/branch protection if any paths or the
new team slug are incorrect.
> 
> **Overview**
> Updates `.github/CODEOWNERS` to reflect the GitHub team rename from
`@MetaMask/ramp` to `@MetaMask/money-movement` for Ramp-related paths
(UI, fiat orders, ramps controllers/messengers, selectors, and related
glob patterns).
> 
> Adds an additional `**/money-movement/**` ownership rule and updates
the Swaps co-owned `parseAmount` entries to use the new Money Movement
team.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8efd4d2. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…#28057)

<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
## **Description**

Implements balance-aware Swap defaults **only for the sticky Swap button
in Token Details**.

When users tap the sticky Swap CTA from Token Details:
- If the viewed token has a positive balance, Swap opens with:
  - `From = current token`
  - `To = swap default`
- If the viewed token has zero balance, Swap opens with:
- `From = best available token (same existing selection logic used by
sticky Buy flow)`
  - `To = current token`

Scope is intentionally narrow to avoid regressions in other swap entry
points:
- Added a dedicated `handleStickySwapPress` in `useTokenActions`
- Wired `TokenDetailsStickyFooter` to call `onSwap` (sticky-only
handler)
- Kept existing non-sticky/legacy swap navigation behavior unchanged
- Updated Security & Trust screen to continue using generic swap
behavior

## **Changelog**

CHANGELOG entry: Fixed Token Details sticky Swap button defaults to use
a balance-aware source token selection.

## **Related issues**

Fixes: N/A
Refs: https://consensyssoftware.atlassian.net/browse/ASSETS-2972
#28050

## **Manual testing steps**

```gherkin
Feature: Token Details sticky swap defaults

  Scenario: Token has positive balance
    Given user has balance in token X
    And user opens Token Details for token X
    When user taps the sticky Swap button
    Then Swap opens with token X as the source token
    And destination token is not prefilled as token X

  Scenario: Token has zero balance but user has other eligible assets
    Given user has zero balance in token X
    And user has positive balance in another eligible token Y
    And user opens Token Details for token X
    When user taps the sticky Swap button
    Then Swap opens with token Y as the source token
    And token X is prefilled as the destination token

  Scenario: Legacy/non-sticky swap path remains unchanged
    Given user opens Token Details
    When user navigates via non-sticky swap entry path
    Then existing swap defaults behave as before
```

## **Screenshots/Recordings**

### **Before**

N/A

### **After**

Tested in Offsite - Approval from @bergarces and @AmarildoGr

## **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
- [ ] 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_AGENT_PR_BODY_END -->

<div><a
href="https://cursor.com/agents/bc-ed6f6ce0-7d90-490a-8fa8-8d10df762d55"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-web-light.png"><img
alt="Open in Web" width="114" height="28"
src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a
href="https://cursor.com/background-agent?bcId=bc-ed6f6ce0-7d90-490a-8fa8-8d10df762d55"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img
alt="Open in Cursor" width="131" height="28"
src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>

---------

Co-authored-by: Prithpal Sooriya <prithpal.sooriya@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?
-->
This PR is the first part of Braze integration. It's currently only
creating Braze users based on their profile id, and registering their
FCM/APN tokens to start filling up Braze database with tokens.

## **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 Braze SDK to enhance push notifications
capabilities

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/GE-107

## **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**
> Adds a new third-party push/engagement SDK and changes native push
handling/initialization on both iOS and Android, which could affect
notification delivery and app startup. Build tooling changes (Kotlin
forcing + patched dependency) also increase risk of platform-specific
build regressions.
> 
> **Overview**
> Introduces Braze as a new mobile dependency and wires it into both
native platforms to start registering push tokens and supporting
Braze-driven notifications.
> 
> On **Android**, adds Braze API key/endpoint injection via Gradle
resources, registers `BrazeFirebaseMessagingService` as the primary FCM
handler with a fallback to the existing RN Firebase service, and
initializes Braze lifecycle callbacks; it also pins Kotlin/serialization
versions and patches `@braze/react-native-sdk` to keep builds compatible
with Kotlin 1.9.
> 
> On **iOS**, adds Braze keys to Info.plists and initializes a shared
`Braze` instance in `AppDelegate` using build-injected credentials,
enabling Braze push automation while preserving the existing permission
flow.
> 
> On the JS side, adds a small `app/core/Braze` layer plus
`useBrazeIdentity` hooked into `useIdentityEffects` to call
`Braze.changeUser(profileId)` on sign-in (skipped in E2E), along with
Jest mocks/tests and new build/CI env vars for Braze secrets (examples,
`build.sh`, workflow, and config verification).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
29b58cd. 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 change separates swaps-trending token detail navigation from the
generic explore trending flow so MetaMetrics can attribute those entry
points correctly.

It adds a dedicated `trending-swaps` token details source, passes that
source from the Bridge/Swaps trending section into
`TrendingTokenRowItem`, and keeps the default `trending` source for
existing explore-tab behavior. The added test coverage verifies the
swaps-trending navigation params include the new source.

## **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:
[SWAPS-4306](https://consensyssoftware.atlassian.net/browse/SWAPS-4306)

## **Manual testing steps**

```gherkin
Feature: Swaps trending token source tracking

  Scenario: user opens token details from swaps trending
    Given the app is running and the Bridge/Swaps trending tokens section is visible
    When the user taps a token from the Bridge/Swaps trending tokens list
    Then the Asset route is opened for that token
    And the token details navigation params use the source "trending-swaps"

  Scenario: user opens token details from explore trending
    Given the app is running and the Explore trending tokens list is visible
    When the user taps a token from the Explore trending list
    Then the Asset route is opened for that token
    And the token details navigation params continue to use the source "trending"
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- Generated with the help of the pr-description AI skill -->

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Small, scoped change to navigation params/analytics attribution with a
default preserving existing behavior; minimal functional risk aside from
potential analytics mislabeling if miswired.
> 
> **Overview**
> Routes opened from the Swaps/Bridge trending tokens section now pass a
dedicated token-details `source` value
(`TokenDetailsSource.TrendingSwaps`) instead of the generic trending
source, allowing analytics to distinguish entry points.
> 
> This introduces the new `trending-swaps` enum value, adds an optional
`tokenDetailsSource` prop to `TrendingTokenRowItem` (defaulting to
`Trending`), and updates tests to assert the Bridge section forwards the
source and that navigation params include `source: 'trending-swaps'`
when provided.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6909921. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…mations (#28136)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Removes `selectMultichainAccountsState2Enabled` selector usage from the
confirmations area now that the multichain accounts State 2 / BIP-44
feature is considered stable. The legacy code path (when the flag
returned `false`) is no longer needed.

Changes:
- Simplified `useSendScope` hook to always return State 2 behavior
(`isBIP44: true`, `isSolanaOnly: false`, `isEvmOnly: false`), removing
the `selectMultichainAccountsState2Enabled` and
`selectSelectedInternalAccount` selector dependencies.
- Removed `isBIP44` branching in `RecipientList` -- accounts always
render as BIP44-grouped list; contacts always render as flat list.
- Removed `isBIP44` prop from `Recipient` component -- always displays
`accountGroupName` (State 2 behavior) instead of conditionally choosing
between `accountGroupName` and `accountName`.
- Removed dead `isSolanaOnly` early-return in `useEVMNfts` hook (always
`false` under State 2).
- Cleaned up 7 test files: removed selector mocks, deleted legacy-path
test suites, updated mock data.

<!--
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: https://consensyssoftware.atlassian.net/browse/CONF-1088

## **Manual testing steps**

```gherkin
Feature: Confirmation screens after removing multichain State 2 feature flag

  Scenario: Send flow shows grouped recipient list
    Given the user has multiple wallets with accounts
    When the user navigates to the Send screen
    And selects a recipient from the account list
    Then the accounts are grouped by wallet name
    And each account displays its account group name

  Scenario: Send flow shows flat contact list
    Given the user has saved contacts
    When the user navigates to the Send screen
    And switches to the Contacts tab
    Then the contacts are displayed in a flat list under a "Contacts" header

  Scenario: Personal sign confirmation renders correctly
    Given the user has a pending personal_sign request
    When the user views the confirmation screen
    Then the request origin, message, and account info are displayed correctly

  Scenario: Typed sign confirmation renders correctly
    Given the user has a pending eth_signTypedData request
    When the user views the confirmation screen
    Then the typed data fields and network info are displayed correctly

  Scenario: Approve/send transaction confirmation renders correctly
    Given the user initiates a token send or approve transaction
    When the user views the confirmation screen
    Then the sender account info, network, and transaction details are displayed correctly
```

## **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**
> Removes feature-flag/legacy branching in confirmation send UI and NFT
hook behavior, which can change what names/lists render in edge cases.
Mostly refactor/deletion, but touches user-facing recipient display and
list grouping.
> 
> **Overview**
> **Confirmations no longer branch on the multichain State 2/BIP-44
feature flag.** Recipient UI is simplified to always display
`accountGroupName` (falling back to `contactName`) and drops the
`isBIP44` prop.
> 
> Send recipient lists now always group accounts by `walletName`
(BIP-44-style) while contact lists stay flat with a fixed "Contacts"
header, and the `useSendScope` hook and its tests are removed.
`useEVMNfts` also drops the Solana-only early-return, with tests
updated/trimmed to reflect the new single-path behavior and removed
selector mocks.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7dceb22. 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?
-->
`@metamask/tron-wallet-snap` has been updated to `^1.25.0` to include
the following changes:
```markdown
## [1.25.0]

### Changed

- Optimize account discovery by using a lightweight activity check (`limit=1`) instead of fetching full transaction history ([#252](MetaMask/snap-tron-wallet#252))

### Fixed

- Avoid `onAmountInput` fee estimation failures by skipping fee validation until a recipient address is available ([#259](MetaMask/snap-tron-wallet#259))
- Assert transaction structure at all entry points, rejecting malformed transactions ([#237](MetaMask/snap-tron-wallet#237))
- Disable scanning of unsupported contract types, preventing incorrect security alerts from blocking user flows ([#238](MetaMask/snap-tron-wallet#238))
  - Supported transactions are those single-contract interaction transactions of the following types: `TransferContract`, `CreateSmartContract`, `TriggerSmartContract`.
  - Unsupported transactions will show empty estimated changes and allow the user to proceed without blocking the confirmation.
- Correctly fetch and return staking rewards ([#242](MetaMask/snap-tron-wallet#242))
- Fix revert simulation error when sending TRC20 tokens ([#261](MetaMask/snap-tron-wallet#261))
- Fix infinite loading during fee estimation ([#258](MetaMask/snap-tron-wallet#258))
  - The issue was caused by a deadlock during cache updates of chain parameters.
```

## **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 a bug that was causing issues with TRC20 token
transfers

## **Related issues**

Fixes:

## **Manual testing steps**

1. Initiate a TRC20 token transfer (e.g., USDT) 
2. Type in a valid recipient address and amount
3. Observe that the button does not show an error
4. Click the button to proceed with the transfer
5. Observe that the confirmation screen is shown with no simulation
error

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

https://github.com/user-attachments/assets/e7b55fc3-9e80-4b44-8558-4cbbd9d38f62

## **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**
> Dependency-only version bump with no direct code changes in this repo;
risk is limited to any upstream behavioral changes in the TRON snap
affecting TRON-specific flows.
> 
> **Overview**
> Bumps `@metamask/tron-wallet-snap` from `1.24.0` to `^1.25.0` in
`package.json`, updating the resolved version to `1.25.0` in
`yarn.lock`.
> 
> No application code changes; this is a dependency-only update intended
to pick up upstream fixes and behavior changes in the TRON snap.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
0a08885. 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**
Added new scenario attributes to Sentry:
- Browserstack recording link
- Github action link
- Scenario team owner
<!--
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**

```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**
> Adds new external BrowserStack API calls and extra metadata to Sentry
transaction payloads during test teardown, which could impact reporting
or introduce intermittent failures if env/config changes. Core app logic
is unaffected.
> 
> **Overview**
> E2E performance runs now publish richer Sentry transactions by
**mirroring key scenario attributes**
(project/provider/team/status/retry/build variant/device/file path) into
both Sentry `tags` and each step `span.data` for easier filtering and
correlation.
> 
> The performance fixture now optionally fetches and attaches a
**BrowserStack session recording URL** (derived from the test
`sessionId` annotation and BrowserStack session details) and the Sentry
publisher also includes **GitHub Actions run/job metadata** (from
`GITHUB_*` env vars) in `extra` and span data.
> 
> Tests were updated to cover the new payload fields and to manage the
additional GitHub env vars during setup/teardown.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8b2546d. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@pull pull Bot locked and limited conversation to collaborators Mar 31, 2026
@pull pull Bot added the ⤵️ pull label Mar 31, 2026
@pull pull Bot merged commit c5c4623 into Reality2byte:main Mar 31, 2026
3 of 17 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants