Skip to content

release: 13.42.0 - #44797

Merged
HowardBraham merged 143 commits into
stablefrom
release/13.42.0
Jul 31, 2026
Merged

HowardBraham merged 143 commits into
stablefrom
release/13.42.0

Conversation

@metamaskbot

@metamaskbot metamaskbot commented Jul 23, 2026 •

Copy link
Copy Markdown
Collaborator

🚀 v13.42.0 Testing & Release Quality Process

Hi Team,
As part of our new MetaMask Release Quality Process, here’s a quick overview of the key processes, testing strategies, and milestones to ensure a smooth and high-quality deployment.


📋 Key Processes

Testing Strategy

  • Developer Teams:
    Conduct regression and exploratory testing for your functional areas, including automated and manual tests for critical workflows.
  • QA Team:
    Focus on exploratory testing across the wallet, prioritize high-impact areas, and triage any Sentry errors found during testing.
  • Customer Success Team:
    Validate new functionalities and provide feedback to support release monitoring.

GitHub Signoff

  • Each team must sign off on the Release Candidate (RC) via GitHub by the end of the validation timeline (Tuesday EOD PT).
  • Ensure all tests outlined in the Testing Plan are executed, and any identified issues are addressed.

Issue Resolution

  • Resolve all Release Blockers (Sev0 and Sev1) by Tuesday EOD PT.
  • For unresolved blockers, PRs may be reverted, or feature flags disabled to maintain release quality and timelines.

Cherry-Picking Criteria

  • Only critical fixes meeting outlined criteria will be cherry-picked.
  • Developers must ensure these fixes are thoroughly reviewed, tested, and merged by Tuesday EOD PT.

🗓️ Timeline and Milestones

  1. Today (Friday): Begin Release Candidate validation.
  2. Tuesday EOD PT: Finalize RC with all fixes and cherry-picks.
  3. Wednesday: Buffer day for final checks.
  4. Thursday: Submit release to app stores and begin rollout to 1% of users.
  5. Monday: Scale deployment to 10%.
  6. Tuesday: Full rollout to 100%.

✅ Signoff Checklist

Each team is responsible for signing off via GitHub. Use the checkbox below to track signoff completion:

Team sign-off checklist

  • Accounts
  • Assets
  • Bots Team
  • Core Extension UX
  • Core Platform
  • Delegation
  • Design System
  • Extension Platform
  • MetaMask Delivery
  • Money Movement
  • Networks
  • Onboarding
  • Perps
  • Product Safety
  • Social & AI
  • Swaps and Bridge

This process is a major step forward in ensuring release stability and quality. Let’s stay aligned and make this release a success! 🚀

Feel free to reach out if you have questions or need clarification.

Many thanks in advance

Reference

n3ps and others added 30 commits July 16, 2026 16: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**

The account transactions API that can sometimes return a Swap item
missing the destination token.

This PR falls back to "Swapped X" 

## **Changelog**

CHANGELOG entry: Fixed activity titles for swaps that are missing
destination token data

## **Related issues**

<!--
Fixes:
-->

## **Manual testing steps**

1. Open Activity and find a swap that only has a source token (no
destination).
2. Confirm the row title uses incomplete-swap copy (e.g. "Swapped ETH")
and shows the source amount as primary.
3. Open the activity details header and confirm the same title.
4. Confirm a normal swap with both tokens still shows "Swapped ETH for
USDC" (or equivalent).

<!--
## **Screenshots/Recordings**

### **Before**

### **After**
-->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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/contributor-docs/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

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

Made with [Cursor](https://cursor.com)

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
…reads (#44483)

<!--
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: fixed a bug where attempting to connect a hardware
wallet without going through could lock the user out of accounts
operations on Firefox

## **Related issues**

Fixes: 
- https://consensyssoftware.atlassian.net/browse/MUL-1826
- #43261

## **Manual testing steps**

1. Try to add a new hardware wallet while leaving it locked on Firefox
2. While the connection loader is spinning, open the popup and try
adding a new HD account - should work
3. Reload the page and re-open the popup, The "Syncing..." label should
not be stuck in the accounts list, and normal account operations should
be possible

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 core hardware keyring orchestration and introduces lock-free
reads with intentional trade-offs (stale keyring instance vs. global
mutex wedge); mitigated by read-only facade, bounded timeout, and tests.
> 
> **Overview**
> Fixes wallet-wide deadlocks when a hardware connect or status probe
hangs on a locked device (e.g. Firefox) by **not holding the
KeyringController operation mutex** for the slow part of those flows.
> 
> Hardware reads (`connectHardware` paging, Ledger/Trezor probes,
`checkHardwareStatus`, etc.) now pass **`deviceRead: true`** into
`#withKeyringForDevice`. Setup that can mutate persisted state
(`setHdPath`, Ledger transport preference, Trezor model, Lattice
`network`) still runs under **`withKeyringV2`**; the actual device
interaction runs on **`withKeyringV2Unsafe`** with a **5-minute
`Promise.race` timeout** and a clear error message if the UI would
otherwise wait forever.
> 
> Callbacks on the lock-free path only receive
**`restrictKeyringForDeviceRead`**: a **frozen** facade that exposes
`hdPath`, `bridge`, and a fixed allowlist of read methods (bound to the
real keyring), with mutating APIs absent at runtime. Unit tests cover
the facade; a controller regression test asserts **`addNewAccount` can
finish** while a mocked hanging `getFirstPage` is pending and that the
abandoned read rejects on timeout.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
6dab979. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…3.40.0 (#44536)

## **Description**

When viewing the details of a cross-chain bridge transaction, the status
showed **"Confirmed"** as soon as the source-chain transaction landed,
even though the destination leg of the bridge was still in flight.

The activity item that drives this view comes from the indexed accounts
API, which only observes the source chain: it maps `BRIDGE_WITHDRAW` to
a `bridge` item whose `status` is derived solely from the source
transaction (`isError ? 'failed' : 'success'`). So once the source tx
confirmed, the details view rendered "Confirmed" regardless of the
actual end-to-end bridge state.

This change resolves the displayed status from the local bridge history
(`BridgeStatusController`), which tracks the true end-to-end status. A
small pure helper, `getBridgeDisplayStatus`, maps the bridge history
status to the displayed status (`COMPLETE → success`, `FAILED → failed`,
`PENDING`/`SUBMITTED`/`UNKNOWN → pending`) and falls back to the
source-only API status when no local bridge history is available. The
bridge details view now uses this resolved status.

## **Changelog**

CHANGELOG entry: Fixed cross-chain bridge transaction details showing
"Confirmed" before the destination transaction had completed; the status
now remains "Pending" until the bridge finishes end-to-end.

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/SWAPS-4788

## **Manual testing steps**

1. Open the extension with a network that supports bridging enabled
(e.g. Linea).
2. Start a cross-chain bridge (e.g. bridge a token from Linea to
Polygon).
3. As soon as the source-chain transaction confirms (but before the
destination leg completes), go to the Activity tab and open the "Bridged
…" transaction.
4. Verify the **Status** row shows **Pending** (previously it
incorrectly showed **Confirmed**).
5. Wait for the bridge to complete end-to-end.
6. Reopen the transaction details and verify the **Status** row now
shows **Confirmed**.

<!--
## **Screenshots/Recordings**

### **Before**

### **After**
-->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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**
> Display-only status resolution in bridge details with fallback
behavior and unit tests; no auth, payments, or persistence changes.
> 
> **Overview**
> Bridge transaction **details** no longer show **Confirmed** as soon as
the source chain tx lands. The **Status** row now uses
**`getBridgeDisplayStatus`**, which prefers **local bridge history**
(`BridgeStatusController`) over the indexed API item (source-chain
only).
> 
> **`COMPLETE` → success**, **`FAILED` → failed**, and **in-flight**
states (**`PENDING` / `SUBMITTED` / `UNKNOWN`**) → **pending** when the
API item is already `success`. If history is missing, the API
**fallback** status is unchanged. A source **`failed`** fallback still
wins over a misleading pending while the destination is in flight.
> 
> Unit tests cover the helper and **`BridgeDetails`** status rendering.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
50e93a4. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Webpack is now the sole bundler for the extension, so this PR removes
the legacy **Browserify / Gulp build system** and all of its supporting
infrastructure. There is no behavior change to the shipped extension —
this is a build-system / CI / tooling cleanup.

**Removed**

- The Browserify/Gulp build (`development/build/*` task files,
transforms, entry point) and the
`development/generate-lavamoat-policies.js` helper. `development/build/`
keeps only the shared, still-used bits (`constants.js`,
`set-environment-variables.js`, `transforms/import-meta-url.js`).
- Browserify LavaMoat policies (`lavamoat/browserify/*`) and the
build-system policy (`lavamoat/build-system/*`).
- Browserify/Gulp-only dependencies from `package.json` (`browserify`,
`lavamoat-browserify`, `bify-module-groups`, `watchify`,
`gulp-{watch,zip,sort,postcss,livereload}`, `vinyl*`, `terser`, `del`,
`eta`, `loose-envify`, `pumpify`, `randomcolor`, `ini`, `fancy-log`,
`labeled-stream-splicer`, `@metamask/build-utils`) plus the orphaned
`watchify` patch/resolution.
- The Browserify variants of the CI build/e2e jobs, and the "Deprecated
Browserify fallback builds" section from the metamaskbot "Builds ready"
PR comment. The old `development/sourcemap-validator.js`
(Browserify-only) is replaced by the existing Webpack validator.

**Repointed to Webpack**

- Build scripts now drive Webpack: `build`, `build:dev`, `dist`,
`build:test*`, `validate-source-maps`, `lavamoat:auto`. The
now-meaningless `:webpack` suffixes were collapsed (e.g.
`build:test:webpack` → `build:test`, `validate-source-maps:webpack` →
`validate-source-maps`), and `build`/`build:dev` were kept as aliases
for muscle memory (`yarn webpack:lavamoat:build` / `yarn webpack`).
- CI workflows (`run-build`, `e2e-chrome`, `e2e-firefox`, `main`,
`nightly-build`, `publish-release-*`,
`update-/validate-lavamoat-policies`) build via `yarn
webpack:lavamoat:build*`; the path-filter and CI helper scripts were
updated to match.
- The Webpack LavaMoat policies were **regenerated** to reflect the
canonical-name changes caused by dropping the direct deps (e.g. `eta` →
`html-bundler-webpack-plugin>eta`, `terser` →
`terser-webpack-plugin>terser`).

**depcheck**

Packages that are genuinely used but that depcheck can't detect
statically (`babelify` — invoked as a string transform in the
ts-migration dashboard; `eslint-import-resolver-node`/`-typescript` —
referenced by short name in `.eslintrc.js`) were added to
`.depcheckrc.yml` ignores instead of being removed.

## **Changelog**

CHANGELOG entry: null

<!-- Build-system / CI / tooling only; no end-user-facing change. -->

## **Related issues**

Fixes: MetaMask/MetaMask-planning#7145

## **Manual testing steps**

This is a build-infra change, so testing is about confirming the Webpack
builds still work end-to-end (CI exercises all of these):

1. `yarn dist` and `yarn dist:mv2` produce loadable Chrome (MV3) and
Firefox (MV2) builds.
2. `yarn build:test`, `yarn build:test:mv2`, and `yarn build:test:flask`
produce test builds and the E2E suites pass in CI.
3. `yarn build:dev` produces a dev build and `yarn start` watch mode
still works.
4. `yarn validate-source-maps` passes against a build.
5. `yarn lavamoat:auto` regenerates the Webpack policies with no diff,
and the `validate-lavamoat-policies` CI jobs are green.

## **Screenshots/Recordings**

N/A — build infrastructure only.

### **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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**
> Large CI/build-surface change with no runtime extension logic change;
merge risk is missed workflow references or broken release/E2E if
webpack parity regresses.
> 
> **Overview**
> Removes the legacy **Browserify/Gulp** build pipeline
(`development/build/*`, MV3 `app-init.js` entry, Browserify LavaMoat
policies) so **Webpack + LavaMoat** is the only path for dev, test,
dist, and release artifacts.
> 
> **CI and release** drop parallel Browserify build/E2E jobs and
browserify zip uploads; workflows, shard matrices, QA stats,
Slack/nightly messaging, and GitHub release creation now target webpack
artifacts only. Test-build commands lose the redundant `:webpack` suffix
(e.g. `build:test:webpack` → `build:test`); `run-build` always runs
`webpack:tsc` and `validate-source-maps` without a bundler switch.
> 
> **Tooling/docs** update LavaMoat validation to webpack policies only,
move sourcemap validation to
`development/webpack/sourcemap-validator.ts`, trim Babel plugins that
existed only for Browserify, and refresh contributor docs/README/AGENTS
for webpack-first commands.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
dbc45e3. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/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**

Allow using browser navigation when viewing the activity details

<!--
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**

1. Go to this an Activity detail page
2. Use browser navigation

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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**
> Localized UI navigation changes in the activity list with no auth,
data, or payment impact; edge cases around hash routing when already on
a tx details URL are handled with replaceState.
> 
> **Overview**
> Activity transaction details now update the URL hash when opened and
integrate with the browser **Back** button instead of only toggling
local modal state.
> 
> Opening an activity **pushes** (or **replaces**) history with
`#/tx/{chainId}/{hash}` via `TX_DETAILS_ROUTE`. Closing the modal calls
**`history.back()`** after analytics, and a **`popstate`** listener
clears the selected item so the details view dismisses when the user
navigates back.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
cdd3c54. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
## **Description**

Resolves the Activity redesign and deletes legacy components and related
code

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to the Home tab → Activity
2. Click a transaction to open details
3. Switch to an asset page (e.g. ETH)

<!--
## **Screenshots/Recordings**

### **Before**

### **After**
-->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

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

Made with [Cursor](https://cursor.com)

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
…iting for element to be located By(css selector, [data-testid="choose-wallet-type-import-account"]) (#44464)

<!--
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 flaky E2E `Add wallet > Import wallet using json file`.

**Problem:** Clicking `account-list-add-wallet-button` could succeed in
WebDriver while AccountTreeController sync briefly re-disabled the
button between the enabled check and the actual click. The click was
silently swallowed (no Selenium error), navigation to Choose Wallet Type
never happened, and the test timed out waiting for
`choose-wallet-type-import-account`.

**Solution:** Add `waitForAddWalletButtonStablyEnabled()` on the account
list page object. It waits until the Add wallet button matches
`:not([disabled])` and stays that way for `stableFor: 2000ms`, so
AccountTreeController sync flicker (`isAccountTreeSyncingInProgress`)
has settled before a single `clickElement`. Wire it into
`importAccountWithJsonFile` and `addNewImportedAccount`.

**Files changed:**

- `test/e2e/page-objects/pages/account-list-page.ts`
- `test/e2e/tests/multichain-accounts/add-wallet.spec.ts`

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. Start a test build (`yarn start:test` or `yarn build:test`).
2. Unlock a wallet with account sync / identity mocks active so
AccountTreeController sync can run.
3. Open the account list.
4. Click **Add wallet**.
5. Confirm the Choose Wallet Type page appears (options such as Import
an account are visible).
6. Optionally complete Import account via JSON file and confirm the
imported account shows in the list.

<!--
## **Screenshots/Recordings**

### **Before**

### **After**
-->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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**
> E2e page-object-only changes that add a synchronization wait before
existing clicks; no production app logic.
> 
> **Overview**
> Fixes flaky **Add wallet → Import** E2E failures where WebDriver could
click `account-list-add-wallet-button` while AccountTree sync briefly
re-disabled it, so the click did nothing and the test timed out on
`choose-wallet-type-import-account`.
> 
> Adds **`waitForAddWalletButtonStablyEnabled()`**, which waits until
the Add wallet control matches `:not([disabled])` and remains enabled
for **2s** (`stableFor`) via `driver.waitUntil`, then calls it at the
start of **`addNewImportedAccount`** and **`importAccountWithJsonFile`**
before opening the choose-wallet flow. Also introduces the enabled-only
selector and reorders page-object field declarations (no behavior
change).
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
503da46. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
… for React 19 (#44493)

<!--
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**
Legacy React context consumption (`static contextType`,
`I18nContext.Consumer`) is removed in React 19. This PR completes the
migration started in #6932 by converting the last remaining consumers to
the modern `createContext` / `useI18nContext` pattern.

Most of the ~49 files listed in the issue were already migrated in prior
refactors (many renamed from .component.js to .tsx). This PR covers the
final 10 stragglers:
```
permissions-connect-footer.component.js
confirm-reset-account.component.js
page-container-footer.component.js
selected-account.component.js
editable-label.js
connected-sites-list.component.js
domain-input.component.js
confirm-delete-network.component.js
hide-token-confirmation-modal.js
error-boundary.tsx
```

Each class component using `static contextType = I18nContext` was
converted to a functional component using `useI18nContext()`. The error
boundary fallback was extracted to an exported `ErrorFallback` component
using the hook instead of `I18nContext.Consumer`.

<!--
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: MetaMask/MetaMask-planning#6932

## **Manual testing steps**

1. Go to this page...
2.
3.

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 user-facing flows (hide token, delete network, reset activity,
send recipient input) and changes the ignoreTokens dispatch shape;
behavior should match the typed action API but warrants regression on
those modals and send.
> 
> **Overview**
> Finishes the React 19 i18n migration by removing the last **`static
contextType = I18nContext`** and **`I18nContext.Consumer`** usage across
ten UI surfaces, moving them to **`useI18nContext()`** inside functional
components (or a small hook-based fallback).
> 
> **`error-boundary`** now renders an exported **`ErrorFallback`** that
uses the hook instead of a consumer inside the class boundary. The other
nine files are **`.js` → `.tsx`** refactors (connected sites list,
permissions connect footer, selected account, editable label, page
container footer, send **domain-input**, confirm delete network, confirm
reset account, hide token confirmation modal) with typed props and hooks
replacing class lifecycle where needed.
> 
> Collateral updates: **`files-to-convert.json`** drops the converted
`.js` paths; hide-token tests expect **`ignoreTokens`** with
**`tokensToIgnore` as an array**, **`dontShowLoadingIndicator`**, and
**`networkClientId`** only (no **`chainId`** in the payload). Minor UI
tweaks include **`AvatarFaviconSize`**, favicon **`name`** fallback, and
**`editable-label`** switching to design-system **`FormTextField`** with
**`onKeyDown`** / **`isError`**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
089a85f. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
## **Changelog**

CHANGELOG entry: Upgrades Sentry SDK from v8 to v10, improving telemetry
and enabling full incorporation of backend instrumentation (API, RPC,
DB, Cache, CDN domains) into Sentry distributed tracing.

## Description

- **`lazyLoadIntegration` patch** — re-applied for v10. The v8 patch is
removed and replaced by
`.yarn/patches/@sentry-browser-npm-10.38.0-d1e984c1c7.patch`, which
stubs `lazyLoadIntegration` (CDN-based remote-code loading, not
permitted in extension stores) across v10's four build variants
(`cjs/dev`, `cjs/prod`, `esm/dev`, `esm/prod`).
- **`setupSentry.js`** — adapted to v10 (`logger` now imported from
`@sentry/core` rather than `@sentry/utils`, `propagateTraceparent`,
transport wiring); tests updated (`setupSentry.test.js`,
`sentry-make-transport.test.ts`).
- **`@sentry/utils` removal** — v10 folded `@sentry/utils` into
`@sentry/core`. Ported `addFetchInstrumentationHandler` import to
`@sentry/core` and adapted propagation context's renamed `spanId` →
`propagationSpanId` (`sentry-trace-propagation.ts` + test).
- **`traceparent` parent-linkage fix** — replacing the manual header
injection with `propagateTraceparent` also fixes distributed-trace
parent linkage, where backend spans do not nest under their client
request span and instead are attached as siblings.
- Broken before: the manual header sent trace-flags `01` on deferred
decisions with a span id no real span carries (69% of backend entry
spans orphaned), or the enclosing custom root's id instead of the
request span's (31% attached as siblings of their own `http.client`
span).
- Fixed by v10: deferred and unsampled decisions propagate `00`, and a
recorded request span propagates its own id. Pinned against the unmocked
SDK in
[`sentry-traceparent-semantics.test.ts`](https://github.com/MetaMask/metamask-extension/blob/94feaed1e9b/app/scripts/lib/sentry-traceparent-semantics.test.ts)
(eafb4e5).
- Guarded: `setupSentry.test.js` enforces that
`shouldCreateSpanForRequest` never filters a
`BACKEND_TRACE_PROPAGATION_TARGETS` URL, since a filtered span
propagated as a `traceparent` parent re-orphans the backend subtree
(7ca3ead; constraint note at
[`setupSentry.js#L326-L334`](https://github.com/MetaMask/metamask-extension/blob/94feaed1e9b/app/scripts/lib/setupSentry.js#L326-L334)).
- Scope: this PR delivers the client half of stitching. End-to-end
nesting also requires the backend collectors to record on `-01` parents
(today ~5% of client-kept traces get backend halves; tracked SRE-side),
and rooting background fetches in their own traces is
MetaMask-planning#7354.

## Validation

The upgrade must preserve **equivalent coverage** — the same errors,
transactions, tags, scrubbing, and sampling, with no unexplained volume
change — not just a green suite. Verified at three layers (plan in
**#43819**, tooling in **#43820**):

**1 — Snapshot equivalence (always-on).**
`test/e2e/tests/metrics/{errors,traces}.spec.ts` capture the real
envelopes sent to a mocked DSN and `deepStrictEqual` the attached state
against committed fixtures (`state-snapshots/errors-*`), pinning which
state fields are sent / masked / removed and which transactions fire
(`UI Startup`, `/home.html`). Green on v10; the only required fixture
change was a benign timing race (`pendingShieldCohort` /
`srpSessionData`), not a behavioral regression.

**2 — Envelope capture-and-diff.** The fixed flow — unlock →
developer-options error → home pageload — runs against a **v8** ([CI
run](https://github.com/MetaMask/metamask-extension/actions/runs/28265989394))
and a **v10** ([CI
run](https://github.com/MetaMask/metamask-extension/actions/runs/28265990584))
build. A high-priority mock intercepts *every* Sentry POST (both DSNs),
so each side's full per-flow set is captured (~40 envelopes: sessions,
~30 transactions, several error events) regardless of the per-build mock
setup, then normalized (volatile ids/timestamps stripped) and compared
by type, signature, and tag coverage — on the same browser engine, to
exclude engine-specific noise (e.g. Firefox omits CLS). Result —
**equivalent**:

- **No telemetry type or tag is dropped by v10.** Every
transaction/event type v10 emits — `UI Startup`, `/home.html`, the
multichain account-creation suite (`Provider Create Accounts`, `Create
{Solana,Bitcoin} Account Batch`, `Wallet Alignment`, `Multichain Account
Syncing`, …), `AggregatedBalanceSelector`, the developer-options
`TestError` event, and `session` — is present in v8 with identical tag
coverage, including `otelTraceId` (distributed-trace correlation) and
the `wallet.*` / web-vitals tags on the UI traces.
- **Residual diffs are background-telemetry noise, not regressions.**
Per-type counts vary run-to-run within a single SDK; the only type
asymmetry (a `BackendWebSocketService Connection` trace present in one
of three captured runs) and a `service` tag on incidental background RPC
errors are timing artifacts, not v10 behavior.
- **No per-flow volume change** — comparable envelope counts on both
SDKs (~37–44 per flow) and zero performance-DSN envelopes. v10's larger
tracing volume documented in `test/e2e/mock-e2e.js` (~800
performance-DSN envelopes in a heavy multichain run) is
scenario-specific — the quota axis tracked in **#43410**, not exercised
by this flow.

**3 — Production staged-rollout validation (post-ship).** Compare the
`metamask` Sentry project's last-v8 vs first-v10 release: error volume &
grouping, transaction/span volume & perf-unit consumption (quota —
#43410), tag/trace completeness, and sampling ≈ 0.75%.

**v10-specific deltas asserted explicitly:** (a) privacy-critical state
masking unchanged (no unmasked field leaks); (b) span serialization —
the snap `startTrace` RPC returns the `SerializedTraceContext` shape
(`_traceId`/`_spanId`), so the result round-trips into a later
`startTrace` call's `parentContext` and nests; (c)
`propagateTraceparent` emits exactly one `traceparent`
(`consensysTracePropagationIntegration` appends only Consensys
`baggage`, no header injection of its own); (d)
`beforeSend`/`rewriteReport` scrubbing intact; (e) `traceparent`
contents — deferred and negatively sampled decisions propagate
trace-flags `00`, and a recorded request span propagates its own span
id, not the enclosing root's (`sentry-traceparent-semantics.test.ts`,
real SDK, no mocks — complements #44053's gating/scoping assertions).

## **Related issues**

- Verification: #43819 (coverage-equivalence harness)
- Surfaced (not caused) by removing the e2e startup band-aids: #43817
(closed) → #43958 (snap discovery mock gap, open)
- Quota context: #43410
- Parent-linkage / orphaned backend subtrees: MetaMask-planning#7354
(this PR fixes the sibling-nesting mode and the deferred-decision `01`
flag; #7354 owns rooting the remaining orphan half)

## **Manual testing steps**

1. Build the extension for both pipelines (`yarn build:test` and `yarn
build:test:webpack`) and load it — it should boot to the home screen
with no `.controller-loaded` timeout and no `inaccessible under
scuttling mode` / `addEventListener is not a function` errors in the
console.
2. Trigger an error (e.g. via developer options) and confirm it still
reports to Sentry with the expected, scrubbed payload.
3. Confirm `browser.sentry-cdn.com` is absent from the built `dist/`
output (the `lazyLoadIntegration` stub must hold — store compliance).

## **Screenshots/Recordings**

N/A — no user-facing UI change.

### **Before**

### **After**

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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**
> Large SDK bump touches error reporting, sampling, distributed tracing,
and extension scuttling/LavaMoat policy; behavioral fixes to traceparent
propagation affect backend correlation, though equivalence is heavily
tested.
> 
> **Overview**
> Upgrades **`@sentry/browser`** to **10.38.0** (and aligns
**`@sentry/core`** / **`@sentry/node`**), drops **`@sentry/utils`**, and
replaces the v8 Yarn patch with a v10 patch that **stubs
`lazyLoadIntegration`** so the extension cannot load integrations from
`browser.sentry-cdn.com`.
> 
> **Distributed tracing** now relies on the SDK’s
**`propagateTraceparent: true`** instead of manual W3C `traceparent`
injection in `consensysTracePropagationIntegration`, which only
**appends Consensys `baggage`**. `setupSentry.js` documents that backend
trace-propagation URLs must **not** be filtered by
`shouldCreateSpanForRequest`, so client request spans stay linked to
backend traces. Snap **`startTrace`** returns a JSON-safe `{ _traceId,
_spanId }` instead of spreading a Sentry span.
> 
> **Init / bundling:** removes the **`globalThis.nw`**
shared-environment workaround; adds **`skipBrowserExtensionCheck`** in
unit tests; extends LavaMoat globals (`WebAssembly`, `Request`,
`requestIdleCallback`) and build env vars to satisfy v10 serverless
checks; refreshes LavaMoat Sentry policies for **`@sentry/core`**.
> 
> **Tests & E2E:** imports move to **`@sentry/core`**; new
**`sentry-traceparent-semantics.test.ts`** and
**`sentry-session-lifecycle.test.ts`**; transport/session tests updated
for v10 async sessions; metrics snapshots relax timing-sensitive fields;
E2E mocks add Bitcoin genesis verification, mock performance Sentry
envelopes, and longer waits where v10 background work competes with UI.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
bc1577d. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: MajorLift <34228073+MajorLift@users.noreply.github.com>
Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
Co-authored-by: Jongsun Suh <jongsun.suh@icloud.com>
…44597)

<!--
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**

Ports Mobile’s Runway RC fix so Extension “What’s in this RC” / Slack
notes show the real changelog and cherry-picks (not a handful of merge
commits).
- Tag lookup via `git tag --merged`
- Cherry-picks via `--ancestry-path`
- Fallback to the release branch when main-line changelog is empty /
only `release:`
- Slack links match Mobile: Cherry-picks + View full RC notes
<!--
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**

1. Go to this page...
2.
3.

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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**
> CI/release tooling and notification content only; no runtime extension
or auth/data paths. Risk is mis-listed RC commits if git heuristics are
wrong on an unusual branch layout.
> 
> **Overview**
> Ports Mobile’s Runway RC behavior so Extension **“What’s in this RC”**
PR comments and Slack notifications show meaningful cherry-picks and
changelog instead of sparse merge noise.
> 
> **Git extraction** in `cherry-picks-section` now resolves the prior
release with `git tag --merged`, lists cherry-picks with
`--ancestry-path`, and builds changelog from main (`--first-parent`,
skipping merge commits). When that range is empty or only `release:`
commits, it **falls back to the release branch** (`previousTag..HEAD`)
and labels the section accordingly. Run-specific **anchor IDs**
(`cherry-picks`, `changelog`, `whats-in-this-rc`) are always emitted so
deep links work even when a section is empty.
> 
> **Slack RC notifications** match Mobile: a dedicated **Cherry-picks**
link to the PR comment anchor, **View full RC notes** instead of the raw
`CHANGELOG.md` blob, link unfurling disabled, and the footer omitted
when there is nothing to link.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
d1e0d94. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Adds the signing page shell and orchestrator hook, but no production
route points to it yet.

Dependencies: Depends on
#43942.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Refs: https://consensyssoftware.atlassian.net/browse/MUL-1717

## **Manual testing steps**

Not testable because route is not wired.


## **Screenshots/Recordings**





### **Before**

### **After**

Storybook screenshots 

<img width="1318" height="536" alt="Screenshot 2026-07-10 at 21 09 52"
src="https://github.com/user-attachments/assets/4d8cf26f-ef7f-4e26-a974-cfa5fb0aed45"
/>
<img width="1333" height="535" alt="Screenshot 2026-07-10 at 21 09 56"
src="https://github.com/user-attachments/assets/6dc74172-c90a-4c5d-88e2-135e7f9bc17a"
/>
<img width="1304" height="447" alt="Screenshot 2026-07-10 at 21 10 02"
src="https://github.com/user-attachments/assets/2b08caa8-1bb0-4844-b10a-3f2aed5df4f8"
/>
<img width="1341" height="600" alt="Screenshot 2026-07-10 at 21 10 07"
src="https://github.com/user-attachments/assets/1bc56fd2-e416-48fb-8813-d1e727b6885d"
/>
<img width="1320" height="597" alt="Screenshot 2026-07-10 at 21 10 11"
src="https://github.com/user-attachments/assets/cc191927-ba65-4fe0-98a7-69c22b635301"
/>
<img width="1333" height="590" alt="Screenshot 2026-07-10 at 21 10 15"
src="https://github.com/user-attachments/assets/3e2e29a5-6f7a-4958-9a93-41445dc52ee4"
/>



## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

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

Made with [Cursor](https://cursor.com)

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Charly Chevalier <charly.chevalier@consensys.net>
…ckground migration (#44380)

## **Description**

Final cleanup for the analytics event migration (umbrella #43885,
**15f**).

Now that product events use `useAnalytics()` / `createEventBuilder` (or
background `trackEvent` / `trackAnalyticsEvent`), this PR:

- Migrates the last UI consumer (`useABTest` / `Experiment Viewed`) off
`MetaMetricsContext.trackEvent`
- Removes `MetaMetricsController` messenger shims for `trackEvent`,
`identify`, and `trackPage`
- Updates leftover types, docs, and tests for the new path

`MetaMetricsContext` remains for buffered traces. Event emission no
longer goes through `MetaMetricsController:trackEvent` or
`MetaMetricsContext.trackEvent` call sites.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes: #43885 (15f · Platform background cleanup)

## **Manual testing steps**

Events should still behave as before, cf. manual testing steps detailed
in this PR: #42885

<!--
## **Screenshots/Recordings**
### **Before**
### **After**
-->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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.

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
…NERS (#44017)

## **Description**

[INFRA-3735](https://consensyssoftware.atlassian.net/browse/INFRA-3735)
— Runway single orchestrator for release cut + CWS + AMO store uploads.

[INFRA-3662](https://consensyssoftware.atlassian.net/browse/INFRA-3662)
— CODEOWNERS on store-submission workflows and scripts.

### What this PR delivers

- **`runway-extension-release-and-submit.yml`** — Phases 0–3 wired via
`workflow_call` (not `gh workflow run`) so Runway OIDC identity is
preserved for WIF CEL / IAM.
- **Phase 0** — branch, version, optional `release_sha` integrity check,
CI gate, Runway sender (release branches), GitHub Release detection,
fail-fast on release SHA mismatch when store phases enabled.
- **Phase 1** — `publish-release-from-release-head.yml`; auto-skipped
when `v{version}` already exists at `release_sha`.
- **Phase 2** — CWS production + Flask; `:fetchStatus` idempotency
(`CWS_EXPECTED_VERSION`, including `{semver}-flask.0` for Flask).
- **Phase 3** — AMO Flask only; Lambda idempotent re-run. (Production
AMO excluded — AMO doesn't support delayed publishing; prod submission
will be an independent `workflow_dispatch` follow-up.)
- **Idempotency model** — re-dispatch or re-run failed jobs; completed
phases auto-skip. Manual `skip_*` inputs are break-glass only.
- **Safe default** — `execute_store_phases=false` until Runway
production hook is wired after E2E.

### Out of scope / follow-up

- Runway production hook
([INFRA-3674](https://consensyssoftware.atlassian.net/browse/INFRA-3674))
until E2E green (e.g. throwaway `release/99.99.0` test — deferred).
- Production AMO submission — will be triggered independently via
`workflow_dispatch` (AMO doesn't support delayed publishing; timing must
align with CWS rollout).
- `adjust-cws-rollout.yml`
([INFRA-3651](https://consensyssoftware.atlassian.net/browse/INFRA-3651))
— separate PR.
- `publish-release-from-release-head.yml` — covered by existing
`/.github/workflows/` platform CODEOWNERS (no separate INFRA-3662 line
unless security requests).

Ops runbook (local, not in repo):
`metamask-extension.worktrees/1_docs/infra-3735-orchestrator/RUNBOOK.md`

## **Changelog**

CHANGELOG entry: null

## **Related issues**

-
[INFRA-3735](https://consensyssoftware.atlassian.net/browse/INFRA-3735)
-
[INFRA-3662](https://consensyssoftware.atlassian.net/browse/INFRA-3662)

## **Manual testing steps**

1. After merge, from a `release/X.Y.Z` branch (or test fork): Actions →
**Runway extension release and store submit**.
2. **Phase 0 only:** `version` matching branch,
`execute_store_phases=false` → validation passes; summary shows store
phases skipped.
3. **Before Runway hook:** E2E with throwaway semver (e.g. `99.99.0`)
and `execute_store_phases=true` — full chain + re-dispatch idempotency
(deferred until post-merge).
4. Confirm callee store workflows accept `workflow_call` from
orchestrator without OIDC/WIF failures.

<!--
## **Screenshots/Recordings**

### **Before**

### **After**
-->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/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.

[INFRA-3735]:
https://consensyssoftware.atlassian.net/browse/INFRA-3735?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
[INFRA-3662]:
https://consensyssoftware.atlassian.net/browse/INFRA-3662?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
[INFRA-3674]:
https://consensyssoftware.atlassian.net/browse/INFRA-3674?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **High Risk**
> Changes production release and Chrome/Firefox store submission paths,
including OIDC/WIF identity, idempotent store uploads, and who can
approve workflow edits—mistakes could block releases or allow wrong
artifacts to ship.
> 
> **Overview**
> Adds a **Runway-driven release pipeline** (INFRA-3735) and tightens
**review ownership** for store-submission automation (INFRA-3662).
> 
> **`runway-extension-release-and-submit.yml`** is the new single
entrypoint: Phase 0 validates `release/*`, version/`release_sha`, CI,
Runway bot identity, and whether `v{version}` already exists at the
commit (fail-fast on SHA mismatch when store phases run). With
`execute_store_phases=true`, it chains **`workflow_call`** into publish
→ CWS (prod + Flask) → AMO (prod + Flask), with manual `skip_*`
break-glass and per-version concurrency. Store phases default off until
Runway production wiring.
> 
> **`publish-release-from-release-head.yml`** gains **`workflow_call`**
and per-ref **concurrency** so the orchestrator can invoke it while
serializing publish runs.
> 
> **CWS upload** is callable via **`workflow_call`**, authenticates to
GCP **before** download, and adds **`:fetchStatus` idempotency**
(`CWS_EXPECTED_VERSION`, including `{semver}-flask.0`) so re-runs skip
when a matching draft exists or wait on `IN_PROGRESS` uploads.
> 
> **AMO upload** adds **`workflow_call`** inputs for orchestrator use
(OIDC/IAM notes unchanged in behavior).
> 
> **CODEOWNERS** overrides platform ownership for the orchestrator,
CWS/AMO upload workflows, rollout workflow, and
`release-create-gh-release.sh` to **extension-security** and
**release-team**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
ac71781. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Alejandro Som <560018+alucardzom@users.noreply.github.com>
…ors (#44525)

Apply core #9537 locally via Yarn patch on 11.0.0 so TokenDataSource and
TokensApiClient use Token API /v1/suggestedOccurrenceFloors (fallback
3).

<!--
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: patch @metamask/assets-controller for suggested
occurrence floors

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 which ERC-20 tokens pass spam filters and appear in
lists/balances; messenger event renames could break asset refresh if
delegation is wrong.
> 
> **Overview**
> Bumps **`@metamask/assets-controller` to 11.0.0** and applies a **Yarn
patch** (core #9537) so token spam filtering and RPC token lists use
Token API **`/v1/suggestedOccurrenceFloors`** instead of a fixed floor
of 3 or hardcoded per-chain values.
> 
> In the patch, **`TokenDataSource`** loads per-chain floors in parallel
with supported networks, applies them to EVM ERC-20 occurrence filtering
(still defaulting to **3** when the API is missing or fails), and also
queues metadata fetches for balance entries missing images.
**`TokensApiClient`** caches the same floors endpoint and uses it for
the `occurrenceFloor` query param on per-chain token list requests.
> 
> **Messenger wiring** is updated to subscribe to exported
**`:stateChange`** events (`AccountTreeController`, `ClientController`,
`NetworkEnablementController`) instead of **`:stateChanged`** aliases,
with matching unit test expectations. The previous **10.x**
assets-controller patch is dropped.
> 
> **E2E** mocks `GET …/v1/suggestedOccurrenceFloors` globally so tests
do not call the live Token API.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
d1b46f7. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
#44602)

Adds validation to the custom token import flow to ensure token decimals
are a whole number from 0 to 36.

Previously, fractional decimal values like 0.0001 could pass validation
because they were valid numbers within range. Since token decimals are
later used as an exponent when formatting balances/activity, malformed
values can cause crashes if persisted.

## **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: added decimal validation

## **Related issues**

Fixes:

## **Manual testing steps**

1. Open MetaMask.
2. Go to Tokens.
3. Open Manage tokens.
4. Select Import custom token.
5. Enter a valid token contract address.
6. In the Token decimal field, enter 0.0001.
7. Verify an error is shown
8. Verify the Add token button remains disabled.
9. Change the decimals value to a valid whole number, such as 18.
10. Verify the error clears and the token can be added.

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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**
> Localized UI validation change on token import with a guard against
bad persisted decimals; limited scope and covered by a new test.
> 
> **Overview**
> Custom token import now **rejects non-integer decimal values** (e.g.
`0.0001`) in addition to enforcing the existing 0–36 range, so invalid
decimals cannot be saved and later break balance/activity formatting.
> 
> Validation in `custom-token-import.tsx` uses `Number.isInteger` in the
decimals change handler and on submit. The error string moves from
`decimalsMustZerotoTen` to **`tokenDecimalsMustBeWholeNumber`** (“Enter
a whole number between 0 and 36.”) in English locales; the old key is
removed across locale files. A unit test covers fractional input showing
the error and disabling **Add token**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
a3a8193. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/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**

The [Bottom Nav Bar
experiment](https://www.figma.com/design/IZBp8tbuEAo2vqqRSckNgg/Extension-IA---bottom-nav-bar?node-id=0-1&p=f&m=dev)
has Swap as one of the Bottom tabs. To fit with the design of the other
pages in the bottom nav (Perps, Activity, Home), this PR adjusts the
title style and removes the back button on the Swap page as navigation
now occurs using the bottom nav. All of these changes are behind the
bottom nav a/b test flag that is not on yet.

Other changes have been made to the Swaps page which are not behind the
feature flag, to ensure that there is enough room on the page when
bottom bar is enabled and that the Swaps CTA always shows:
- removes unneeded padding from the Bridge Banner list when there are no
banners being shown
- makes the CTA sticky when a quote is being shown

The behaviour of this Swaps bottom nav bar is the same as the home page
Swaps action button i.e. no quote preservation.

Note as this creates a new ingress point to swaps we'd have to update
the bridge controller to add `MetaMetricsSwapsEventSource.BottomNavBar`
as a location property value as well as update the segment schema.

## **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 conditional Swap page header when bottom nav
experiment is on

## **Related issues**

Relates: https://consensyssoftware.atlassian.net/browse/CEUX-1141

## **Manual testing steps**

1. Set the dummy hook `useBottomNavBar` to return `true` instead of
`false`
2. See the bottom nav bar and click into the Swaps item
3. Confirm that back button is not shown
4. Confirm that Swaps CTA is sticky when a quote is shown
5. Confirm that clicking the Swaps bottom nav bar item does nothing, but
navigating away clears any existing swaps quote
6. Set the dummy hook `useBottomNavBar` to return `false` again
7. Confirm that existing Swaps experience works as before but now the
Swaps CTA is sticky when a quote is shown

## **Screenshots/Recordings**

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

### **Before**

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

### **After**

Swap cross-chain sidepanel:
<img width="504" height="724" alt="image"
src="https://github.com/user-attachments/assets/95ec4d41-7ed7-4602-8b77-5225f5525209"
/>


Swap same-chain sidepanel:
<img width="502" height="726" alt="image"
src="https://github.com/user-attachments/assets/d057255e-6736-4a14-b65a-164cc7241161"
/>

Swap cross-chain popup:
<img width="399" height="598" alt="image"
src="https://github.com/user-attachments/assets/6b609124-cf28-42e1-bf04-2cc321eb4bf4"
/>

Swap same-chain popup:
<img width="402" height="604" alt="image"
src="https://github.com/user-attachments/assets/db7481b5-1d58-46d7-bcae-e77e95fd095b"
/>


## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 swap navigation, bridge state reset, and confirmation routing
(`stayOnHomePage`); mistakes could clear quotes unexpectedly or break
swap entry/exit in the bottom-nav experiment.
> 
> **Overview**
> Aligns **bottom nav** with the Swaps/bridge flow: the Swaps tab now
opens swap via **`openBridgeExperience`** with analytics source
**`BottomNavBar`**, does nothing when already on swaps, and **resets the
bridge controller** when leaving swaps (matching bridge back-button
behavior). Other tabs pass **`stayOnHomePage: true`** on navigate to
avoid confirmation-router bounce during reset.
> 
> When **`useBottomNavBar()`** is on, the bridge page shows a **title +
settings** header (no back button); otherwise the existing header with
back remains. **Prepare swap** layout changes: alert banners render only
when there is content (no empty banner padding), and the **footer CTA**
is **sticky** at the bottom with updated padding/background.
> 
> Adds **`MetaMetricsSwapsEventSource.BottomNavBar`** and expands unit
tests for nav, bridge reset, and empty alert state.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
91bc4f9. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/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**

Adds per-payment-method quote previews to the ramps payment selection
screen, matching mobile `PaymentSelectionModal` behavior.

1. **Reason:** Users choosing a payment method should see what crypto
they'd receive (and fiat equivalent) for the amount entered on
build-quote, plus clear limit/unavailable feedback when a method can't
quote.
2. **Solution:** Pass the debounced build-quote amount into payment
selection, batch-fetch quotes for all payment method IDs via
`useRampsQuotes`, and render a `RampsQuoteDisplay` column on each list
item (loading skeletons, amounts, warning + limit message / quote
unavailable). Rows without a success quote are disabled after load;
custom-action quotes stay selectable without amounts.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

<!--
Fixes:
-->

## **Manual testing steps**

1. Open the extension buy/ramps build-quote flow with a selected token
and provider.
2. Enter a fiat amount (e.g. regional default or 100).
3. Tap the payment method pill to open payment selection.
4. Verify each payment method shows a quote preview (crypto amount +
fiat) or a loading skeleton while quotes fetch.
5. Lower the amount below a provider min (or raise above max) and reopen
payment selection; verify the affected method shows a warning, a min/max
purchase message (or "Quote unavailable."), and cannot be selected.
6. Select a method with a valid quote and confirm you return to
build-quote with that method selected.

## **Screenshots/Recordings**

<!--
### **Before**
### **After**
-->

<img width="582" height="243" alt="Screenshot 2026-07-16 at 6 24 50 AM"
src="https://github.com/user-attachments/assets/7f418b6c-ba29-47c3-a75f-d859b34518b1"
/>

<img width="548" height="261" alt="Screenshot 2026-07-16 at 6 25 07 AM"
src="https://github.com/user-attachments/assets/09860546-f946-462d-a58a-4467c634cbf3"
/>


## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

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

Made with [Cursor](https://cursor.com)

---------

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**

Migrates the post-disconnect-all toast from the deprecated toast
component

<!--
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: CEUX-1182

## **Manual testing steps**

1. Connect to a dapp
2. Menu > Dapp connections 
3. Click disconnect all

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 toast migration; disconnect-all behavior and copy are
unchanged.
> 
> **Overview**
> **Disconnect-all feedback** on the permissions page now uses the
shared **`toast`** helper instead of local state and inline **`Toast` /
`ToastContainer`** in the footer.
> 
> After **Disconnect all**, **`handleDisconnectAll`** calls
**`toast.success`** or **`toast.error`** with the same i18n strings and
stable toast **`id`** values, and the footer no longer renders toast UI.
**`t`** was added to the callback dependency array.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
b2b76a8. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Migrate privacy delete MetaMetrics success/error toasts from the
deprecated multichain Toast to react-hot-toast via ui/toast.

<!--
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: CEUX-1181

## **Manual testing steps**

1. Go to Settings > Privacy
2. Click Delete MetaMetrics data

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 toast migration in a settings privacy flow; behavior and copy
stay the same with no auth or data-path changes.
> 
> **Overview**
> Replaces inline **multichain** `Toast`/`ToastContainer` feedback on
Settings → Privacy **Delete MetaMetrics data** with the shared
**`ui/toast`** API (`toast.success` / `toast.error` + `ToastContent`).
> 
> Success and error toasts are now triggered from
`DeleteMetametricsModal` callbacks with stable toast `id`s, and the two
boolean state flags plus ~40 lines of conditional toast JSX are removed.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
44a00fb. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
…#44482)

<!--
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**

### Context

Support links from the extension previously appended raw analytics
identifiers (`metamask_profile_id`, `metamask_canonical_profile_id`,
`metamask_metametrics_id`) when users consented to share data. This
exposed long-lived identifiers in support URLs.

This PR replaces the raw analytics identifiers with a short-lived
customer-service JWT from
`AuthenticationController:getCustomerServiceToken`.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes: #44199

Related:
[#43798](#43798)

## **Manual testing steps**

1. Go to menu > Support > Confirm (Share device details with support):
this opens a new tab with the support website => confirm
`customer_service_token` param is defined in the URL and
`metamask_profile_id`, `metamask_canonical_profile_id`, and
`metamask_metametrics_id` are not present.
2. Go to menu > Settings > About MetaMask > Visit our support center >
Confirm (Share device details with support): this opens a new tab with
the support website => confirm `customer_service_token` param is defined
in the URL and `metamask_profile_id`, `metamask_canonical_profile_id`,
and `metamask_metametrics_id` are not present.
3. Build Extension with `ENABLE_SETTINGS_PAGE_DEV_OPTIONS=true` in
`.metamaskrc`. Go to menu > Settings > Debug > Generate a Page Crash >
Contact support > Confirm (Share device details with support): this
opens a new tab with the support website => confirm
`customer_service_token` param is defined in the URL and
`metamask_profile_id`, `metamask_canonical_profile_id`, and
`metamask_metametrics_id` are not present.
4. Repeat any of the flows above and click **Reject** (do not share
device details with support). Confirm the support URL does not include
`customer_service_token`, `metamask_profile_id`,
`metamask_canonical_profile_id`, `metamask_metametrics_id`, or
`shield_id`.

<!--
## **Screenshots/Recordings**

### **Before**

### **After**
-->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 how support links carry user-identifying data and add async
auth with timeout/cancel behavior across consent and subscription flows;
mis-handling could leak old IDs or block support, but scope is limited
to support URL building and related UI.
> 
> **Overview**
> Support URLs no longer append long-lived **profile / MetaMetrics IDs**
when users consent to share device details. Consent flows now fetch a
**short-lived `customer_service_token`** via
`AuthenticationController:getCustomerServiceToken` and pass it (with
`metamask_version` and optional `shield_id`) through
`buildSupportLinkWithUserData`.
> 
> A new **`getCustomerServiceToken`** UI action calls the background
messenger with a **5s timeout** and returns `undefined` on failure so
support can still open without a token. The visit-support consent modal
**loads while fetching**, disables actions during the request, and
**cancels sharing** if the user dismisses the modal before the token
returns. Subscription support contact uses the same async token path.
> 
> Tests and e2e mocks were updated for the new query param and auth mock
behavior (including static vs factory auth responses).
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
e3db76a. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
## **Description**

Splits the locally-enriched mUSD conversion from the swap-details
template into a dedicated template.

Fixes the empty source token row and adds the transaction steps summary 

## **Changelog**

CHANGELOG entry: Fixed the mUSD conversion activity details

## **Related issues**

Fixes:
https://consensys.slack.com/archives/C09AYKX30P3/p1784182784586309

## **Manual testing steps**

1. Open a confirmed mUSD conversion from the activity list.
2. Confirm "You sent" shows the token + amount and "You received" shows
mUSD.
3. Confirm the Network fee, Total, and step summary (with block-explorer
links) render.

## **Screenshots/Recordings**

### **Before**

<!-- "You sent" showed no amount (or was blank); no fee/summary. -->

### **After**

<img width="355" height="569" alt="image"
src="https://github.com/user-attachments/assets/f81a50b7-5ed3-43d9-956c-f5d0df5f92e9"
/>


<!-- "You sent" shows the amount; network fee, total, and summary
present. -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 activity details and hook extraction; no auth or transaction
submission changes, with optional API fetch for display enrichment.
> 
> **Overview**
> **Convert** activity items now use a dedicated **`ConvertDetails`**
template instead of **`SwapDetails`**, aimed at locally enriched mUSD
conversions.
> 
> The new screen pulls **`metamaskPay`** data from local transaction
meta to show **network fee**, **total**, and the **transaction steps
summary**. **"You sent"** is filled by fetching the **source** on-chain
transaction (via **`metamaskPay.sourceHash`**) and deriving the sent
amount from value transfers.
> 
> Shared hooks **`useApiTransaction`** (cache + API fetch) and
**`useLocalTransactionMeta`** replace duplicated logic in
**`transaction-details`** and perps detail templates. **`SwapDetails`**
no longer handles convert; it always shows **Swap again**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
655a1a6. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/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**

Migrates the toast notification when clicking the homescreen Buy button

<!--
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: CEUX-1188

## **Manual testing steps**

1. Go to this page...
2.
3.

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 notification refactor with unchanged trigger conditions
(non-ramps buy path); no auth, data, or payment logic changes.
> 
> **Overview**
> Replaces the wallet overview **Buy** “tab opened” notification with
the shared **`toast.success`** stack instead of a local multichain
`Toast` + component state.
> 
> When ramps are disabled and **Buy** opens Portfolio in a new tab, the
same copy and export icon are shown via **`ToastContent`**, with a
stable toast id (`buy-tab-opened-toast`). The inline
**`TabOpenedToast`** helper and **`showTabOpenedToast`** state/render
path are removed.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
e3b5cf0. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
## **Description**

Adds the Tron swap token registry and full bridge quote fixtures to
`common-tron.ts`, including `TRON_SWAP_TOKEN_REGISTRY`,
`TronQuoteFixture`, and `mockBridgeGetTronQuoteFor` for parameterized
TRX→USDT (and other) swap quotes with the complete payload the swap UI
expects (fees, slippage, price data).

Rebased onto `main` after #44157 and #44485 merged, removing duplicate
history that inflated the prior diff to ~2009 lines. This PR is now
**657 changed lines** (383 additions, 274 deletions) in a single file.

Part of the local-blockchain E2E initiative (WPN-536). Together with the
preceding merged Tron mock PRs, this supersedes #43723.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Part of the local-blockchain E2E initiative (WPN-536).
Together with #44157 and #44485 supersedes #43723.

## **Manual testing steps**

1. `yarn build:test`
2. `yarn test:e2e:single test/e2e/tests/tron/check-balance.spec.ts
--browser=chrome` (expect 3/3 passing).

## **Screenshots/Recordings**

N/A — test infrastructure only, no user-facing UI change.

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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**
> Changes are confined to Tron E2E mock helpers in a single test file;
no production wallet, bridge, or auth paths are modified.
> 
> **Overview**
> Extends Tron E2E mocks so swap flows can drive **bridge `getQuote`**
responses from a **`TronQuoteFixture`** (`src`/`dest` symbols, amounts,
optional metabridge fee) via **`mockBridgeGetTronQuoteFor`**, while
**`mockBridgeGetTronQuote`** keeps the prior default TRX→USDT case by
delegating to that helper.
> 
> Quote payloads are built from **`TRON_SWAP_TOKEN_REGISTRY`** (fees,
slippage floor, Rango/SunSwap metadata). **TRX→USDT** trades now include
a **TriggerSmartContract** shape with **protobuf-encoded
`raw_data_hex`** and a **SHA256 `txID`** tied to `call_value`; other
pairs get a lightweight placeholder trade.
> 
> **`mockTronSpotPrices`** and **`mockTronAssets`** accept an optional
**`TronNode`** token map, derive asset IDs from shared **TRC10/TRC20
defaults**, return **spot prices filtered by `assetIds`**, and supply
**non-null** prices for GAS_FREE and SEED where they were previously
`null`.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
cd71987. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
release: sync stable to main for version 13.40.0
<!--
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 a reusable`useEventListener` hook and migrate existing
`addEventListener`/`removeEventListener` usages

## **Changelog**

CHANGELOG entry: null

<!--
## **Related issues**

Fixes:
-->

## **Manual testing steps**

1. Open the extension popup and full screen views
2. Open/close menus, modals, and popovers (Escape, outside click)
3. Confirm theme still follows OS preference when set to System

## **Screenshots/Recordings**

### **Before**
```
useEffect(() => {
      document.addEventListener('keydown', handleEscKey);
      document.addEventListener('mousedown', handleClickOutside);

      return () => {
        document.removeEventListener('keydown', handleEscKey);
        document.removeEventListener('mousedown', handleClickOutside);
      };
    }, []);
```
### **After**
```
useEventListener('keydown', handleEscKey);
useEventListener('mousedown', handleClickOutside);
```

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

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

Made with [Cursor](https://cursor.com)

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**

Migrates the multichain review permissions page toast 

<!--
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: CEUX-1183

## **Manual testing steps**

1. Connect to a dapp
2. Menu > Dapp pemissions
3. Edit the allowed chains

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 toast plumbing on the dapp permissions review page; the main
product change is losing the account-permissions confirmation toast.
> 
> **Overview**
> **Migrates network-permission feedback** on the multichain review
permissions page from inline `ToastContainer` / multichain `Toast`
components to the shared `ui/toast` API (`toast.success` +
`ToastContent`), including the dapp favicon and a stable toast id when
chains are updated or when Redux signals the permitted-network toast
should show.
> 
> **Removes the account-permissions success toast** from the page footer
(and drops the `accountPermissionToast` string from all locale files),
so only the network update path still surfaces a confirmation via the
global toaster.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
fb428dd. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Cursor Agent <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**

Removing dead code

<!--
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**

1. Go to this page...
2.
3.

## **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
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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**
> Large surface area of deletions including transaction typing and
activity filtering; grep shows no leftover imports, but any dynamic or
external consumers could still break.
> 
> **Overview**
> This PR **removes unused exports, helpers, and entire modules** across
background scripts, shared libs, and UI, along with the tests that only
covered them.
> 
> Notable deletions include **transaction list helpers**
(`resolveTransactionType`, `mapTransactionTypeToCategory`), **activity
chain filtering** (`filterTransactionByChain`), **CSP nonce injection**
(`add-nonce-to-csp`), **custom protocol / deep-linking**
(`openCustomProtocol`), **OAuth** `getProfilePairingEnv` (profile sync
env still comes from `OauthConfigMap`), and **asset routing**
`buildAssetRoutePathFromParts` (CAIP path building via
`buildAssetRoutePath` remains). Custom token import tests now stub
**`getTokenStandardAndDetailsByChain`** instead of
**`tokenInfoGetter`**.
> 
> The ts-migration dashboard list drops entries for removed
`deep-linking` files; **`SOLANA_WALLET_NAME`** is inlined in tests where
needed.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
0ea1765. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
## **Description**

Adds a ramps provider selection screen so users can change the selected
provider from the payment method page, with per-provider quotes loading
asynchronously.

1. **Reason:** After choosing amount and payment method, users need a
way to switch providers (mobile/portfolio parity) before continuing.
2. **Solution:** New `/ramps/provider-selection` route lists providers
with portfolio-style wordmark logos and quote amounts. Selecting a
provider updates `selectedProvider` and returns to payment methods.
Relative logo paths from the providers API are resolved against the
on-ramp content CDN.

Depends on / stacks on #44526.

## **Changelog**

CHANGELOG entry: Added a provider selection screen in ramps so users can
compare quotes and change their buy provider.

## **Related issues**

Fixes:

## **Manual testing steps**

1. Run the extension (`yarn start`) with ramps enabled.
2. Start a buy flow and enter a fiat amount on build quote.
3. Continue to the payment method page and confirm payment methods show
quotes.
4. Tap **Change provider** in the footer.
5. On the providers screen, confirm provider wordmark logos load (not
letter circles) and quotes appear asynchronously per row.
6. Select a different provider and confirm you return to payment methods
with the footer reflecting the new provider.
7. Confirm tags like best rate / most reliable / previously used appear
when applicable, and unavailable/limit cases show a subtitle.

## **Screenshots/Recordings**

### **Before**

<!-- Payment method page had no provider change entrypoint. -->

### **After**

<!-- Add screenshots of payment method footer + provider selection list
with logos/quotes. -->

<img width="505" height="920" alt="Screenshot 2026-07-20 at 1 48 58 PM"
src="https://github.com/user-attachments/assets/63fe314e-c48c-44a0-853d-51802acbe008"
/>

<img width="536" height="982" alt="Screenshot 2026-07-20 at 1 48 07 PM"
src="https://github.com/user-attachments/assets/3b1dfc80-c093-4015-8acf-37f064bdef55"
/>


<img width="320" height="606" alt="provider-selection"
src="https://github.com/user-attachments/assets/677cf6e3-c295-42e5-923f-848800ce50ec"
/>


## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 fiat on-ramp provider selection and quote fetching (money
path) with a behavior change allowing payment methods without quotes;
risk is mitigated by tests and controller-backed selection.
> 
> **Overview**
> Adds a **provider selection** step to the native ramps buy flow so
users can compare on-ramp providers and switch away from the payment
method screen.
> 
> A new `/ramps/provider-selection` route lists providers for the
selected token, optionally loads **per-provider quotes** for the current
payment method and amount (with `region` / `fiat` now part of quote
cache keys), and sorts rows with an “Other options” split when quotes or
asset support differ. Rows can show tags (best rate, most reliable,
previously used) and localized min/max limit subtitles when a quote
fails.
> 
> The **payment method** screen gains a footer (“Buying via …” +
**Change provider**) on all states where a provider is selected;
choosing a method **no longer disables** rows that lack a successful
quote. Quote requests from payment method and provider selection pass
user region and fiat currency.
> 
> Supporting pieces include `RampsChangeProviderFooter`, provider list
helpers, `getProviderLimitMessage`, `providerSupportsAsset`, new i18n
strings, and tests/snapshots.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
381275b. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
## **Description**

Introduces import aliases to replace deep relative paths like
../../../some-directory/....

Why
- Readability: import origin is obvious at a glance
- Refactor-safe: moving files doesn't break imports
- Enforces architecture: #/shared and #/ui make the dependency direction
explicit
- No breaking changes: old relative imports continue to work, adoption
is gradual

For this first phase, adding these aliases: #/shared and #/ui

Also updates `import-x/order` so these imports rank as internal 

```jsx
// Any file can now:

import { something } from '#shared/constants/app';
import { Component } from '#ui/components/some-component';

// Instead of

import { something } from '../../../../shared/constants/app';
import { Component } from '../../../ui/components/some-component';
```

## **Changelog**

CHANGELOG entry: null

<!--
## **Related issues**

Fixes:
-->

## **Manual testing steps**

1. In a TS/TSX file under `ui/`, add `import { SECOND } from
'#shared/constants/time';` and confirm TypeScript/VS Code resolves it.
2. Confirm `import-x/order` expects `#ui`/`#shared` imports after
external packages and before `../` / `./` relatives.
3. Run a unit test that imports via `#shared/...` and confirm Jest
resolves it.

<!--
## **Screenshots/Recordings**

### **Before**

### **After**
-->



## **Pre-merge author checklist**

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

## **Pre-merge reviewer checklist**

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

Made with [Cursor](https://cursor.com)
…b Action (#45009)

- chore: New Crowdin Translations by GitHub Action cp-13.42.0 (#44746)
@metamask-ci

metamask-ci Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor
Builds ready [95f14e7]
⚡ Performance Benchmarks (Total: 🟢 13 pass · 🟡 7 warn · 🔴 3 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30483452551 | Baseline logs

Metricschrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 srpButtonToSrpForm(p95) [CI log]🟢 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🔴 longTaskCount(p95) [CI log]🔴 [CI log]

Regressions (🔴 3 failures)

Interaction Benchmarks · Samples: 5
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]
confirmTx
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
🔴 bridge_load_asset_picker

📈 Results compared to the previous 5 runs on main

  • ↓ loadNewAccount/inp: -32%
  • ↑ loadNewAccount/fcp: +12%
  • ↑ loadNewAccount/lcp: +112%
  • ↓ confirmTx/longTaskTotalDuration: -31%
  • ↓ confirmTx/longTaskMaxDuration: -25%
  • ↓ confirmTx/tbt: -55%
  • ↓ confirmTx/inp: -32%
  • ↓ confirmTx/fcp: -22%
  • ↓ confirmTx/lcp: -22%
  • ↑ bridgeUserActions/bridge_load_page: +12%
  • ↓ bridgeUserActions/bridge_load_asset_picker: -38%
  • ↓ bridgeUserActions/longTaskCount: -44%
  • ↓ bridgeUserActions/longTaskTotalDuration: -55%
  • ↓ bridgeUserActions/longTaskMaxDuration: -30%
  • ↓ bridgeUserActions/tbt: -75%
  • ↓ bridgeUserActions/total: -12%
  • ↓ bridgeUserActions/inp: -23%
  • ↓ bridgeUserActions/fcp: -12%
  • ↑ loadNewAccount/inp: +14%
  • ↑ loadNewAccount/lcp: +1459%
  • ↑ confirmTx/confirm_tx: +12%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↑ confirmTx/total: +12%
  • ↓ confirmTx/inp: -17%
  • ↓ confirmTx/fcp: -46%
  • ↑ confirmTx/lcp: +1197%
  • ↑ bridgeUserActions/bridge_load_page: +296%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +1155%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +189%
  • ↓ bridgeUserActions/inp: -15%
  • ↑ bridgeUserActions/lcp: +1166%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 loadNewAccount/FCP: p75 1.9s
  • 🟡 loadNewAccount/FCP: p75 1.8s
  • 🟡 loadNewAccount/LCP: p75 2.7s
  • 🟡 bridgeUserActions/FCP: p75 1.9s
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ startupStandardHome/uiStartup: -24%
  • ↓ startupStandardHome/load: -25%
  • ↓ startupStandardHome/domContentLoaded: -25%
  • ↓ startupStandardHome/domInteractive: -44%
  • ↓ startupStandardHome/backgroundConnect: -22%
  • ↓ startupStandardHome/firstReactRender: -27%
  • ↓ startupStandardHome/initialActions: -50%
  • ↓ startupStandardHome/loadScripts: -25%
  • ↓ startupStandardHome/setupStore: -25%
  • ↓ startupStandardHome/fcp: -34%
  • ↓ startupStandardHome/lcp: -24%
User Journey Benchmarks · Samples: 5 · real API 🔴 3
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 doneButtonToHomeScreen
🔴 total
🟢 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 total
🔴 [CI log]
🔴 total
assetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
importSrpHome
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
sendTransactions
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ onboardingImportWallet/srpButtonToSrpForm: +13%
  • ↑ onboardingImportWallet/doneButtonToHomeScreen: +45%
  • ↑ onboardingImportWallet/openAccountMenuToAccountListLoaded: +57%
  • ↑ onboardingImportWallet/longTaskCount: +43%
  • ↑ onboardingImportWallet/longTaskTotalDuration: +11%
  • ↑ onboardingImportWallet/total: +18%
  • ↓ onboardingNewWallet/srpButtonToPwForm: -10%
  • ↓ onboardingNewWallet/agreeButtonToOnboardingSuccess: -32%
  • ↑ onboardingNewWallet/longTaskCount: +25%
  • ↑ onboardingNewWallet/longTaskTotalDuration: +16%
  • ↓ onboardingNewWallet/longTaskMaxDuration: -20%
  • ↑ onboardingNewWallet/tbt: +34%
  • ↑ solanaAssetDetails/assetClickToPriceChart: +31%
  • ↓ solanaAssetDetails/longTaskCount: -100%
  • ↓ solanaAssetDetails/longTaskTotalDuration: -100%
  • ↓ solanaAssetDetails/longTaskMaxDuration: -100%
  • ↓ solanaAssetDetails/tbt: -100%
  • ↑ solanaAssetDetails/total: +31%
  • ↑ solanaAssetDetails/inp: +11%
  • ↑ solanaAssetDetails/fcp: +15%
  • ↑ importSrpHome/loginToHomeScreen: +16%
  • ↑ importSrpHome/homeAfterImportWithNewWallet: +19%
  • ↑ importSrpHome/longTaskCount: +27%
  • ↑ importSrpHome/longTaskTotalDuration: +21%
  • ↑ importSrpHome/tbt: +15%
  • ↑ importSrpHome/total: +18%
  • ↓ importSrpHome/cls: -15%
  • ↑ sendTransactions/selectTokenToSendFormLoaded: +20%
  • ↓ sendTransactions/reviewTransactionToConfirmationPage: -19%
  • ↑ sendTransactions/longTaskCount: +300%
  • ↑ sendTransactions/longTaskTotalDuration: +354%
  • ↑ sendTransactions/longTaskMaxDuration: +354%
  • ↑ sendTransactions/tbt: +1700%
  • ↓ sendTransactions/total: -15%
  • ↓ sendTransactions/lcp: -63%
  • ↓ sendTransactions/cls: -20%
  • ↑ swap/longTaskCount: +167%
  • ↑ swap/longTaskTotalDuration: +96%
  • ↑ swap/longTaskMaxDuration: +45%
  • ↑ swap/tbt: +68%
  • ↓ swap/lcp: -72%
  • ↓ swap/cls: -30%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 importSrpHome/INP: p75 328ms
  • 🟡 sendTransactions/INP: p75 224ms
  • 🟡 sendTransactions/LCP: p75 2.7s
  • 🟡 swap/FCP: p75 1.9s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ dappPageLoad/pageLoadTime: -27%
  • ↓ dappPageLoad/domContentLoaded: -22%
  • ↓ dappPageLoad/firstPaint: -14%
  • ↓ dappPageLoad/firstContentfulPaint: -14%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: -25.6 KiB (-0.17%)
  • ui: 1.71 KiB (0.01%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 432 Bytes (0.02%)
  • zip: -6.11 MiB (-22.5%)

🍒 What's in this RC

Cherry-picks (5 commits)
Commit Description
95f14e76ab release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45009)
387e08ad64 release(cp): bump: brace-expansion to 5.0.8 (#44924)
9e657a96f9 release(runway): cherry-pick fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44927)
7b1c84e9b7 release(cp): build: no more PNGs inside SVGs allowed, delete unused images (#44832)
03507b5e03 Merge branch 'stable' into release/13.42.0

Changelog (136 commits since v13.41.0)
Commit Description
95f14e76ab release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45009)
387e08ad64 release(cp): bump: brace-expansion to 5.0.8 (#44924)
9e657a96f9 release(runway): cherry-pick fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44927)
7b1c84e9b7 release(cp): build: no more PNGs inside SVGs allowed, delete unused images (#44832)
ea212236bf release(cp): fix: restored old behavior to show Paid by MetaMask label in sponsored transactions from activity page cp-13.41.0 (#44780)
8d9aabc289 release(runway): cherry-pick fix: handle missing account for cross-chain asset deeplinks cp-13.42.0 (#44913)
e8690470e1 release(runway): cherry-pick fix: updated checkbox and permissions page width cp-13.42.0 (#44906)
fbd3a5e978 release(runway): cherry-pick fix(activity): apply text color token to native dialog for dark theme cp-13.42.0 (#44873)
d5f6239719 release(cp): bump: tar to 7.5.22, ignore react-router advisories cp-13.41.0 (#44862)
78ce2e0cf9 release(cp): fix(deep-links): restore interstitial protection cp-13.42.0 (#44830)
5738947439 release(runway): cherry-pick fix(activity): transaction details width cp-13.42.0 (#44856)
a8682562fc release(runway): cherry-pick feat: keep the balance left aligned for lower viewport cp-13.42.0 (#44854)
189763ce27 release(cp): cherry-pick fix(assets): include tokens with large balances and few decimals in aggregated balance cp-13.41.0
8423f220d3 release: release-changelog/13.42.0 (#44798)
0c93b31dd8 Merge release/13.41.0 into release/13.42.0
446c5a25b5 fix: apply bg-alternative to legacy Popover in pure black theme (#44730)
c2c37a8a68 fix: apply border-muted to global menu drawer in pure black theme (#44729)
7e15155002 chore: remove unused legacy modals from ui/components/app/modals (#44731)
b03252588b fix: add device response timeout to Trezor bridges (#44626)
9ee3d987a7 feat: show skeleton for the whole balance block if the balance is not cached (#44703)
960369d180 fix: require interstitial for CAIP-19 asset deep links (#44639)
ef34172a99 refactor: migrate formatters to client-utils (#44624)
88c41e5489 test: cover Wallet Creation Attempted Segment event (#44673)
7a14cd7f6c feat: Updated the styles for swaps page (#44762)
ad64202e93 test: MMQA - 2035 - Fix antipatterns in sendPage which can lead to flakiness (#44640)
845b4a8f4a feat: updated avatarbase and banner alert to use DS (#44763)
3802fdba7c chore: migrate AvatarFavicon to MMDS (#44764)
a1b13be185 feat: seedless controller v10.1.0 (#44771)
864f5e5294 fix: patch bridge controller to exclude Stellar and Arc cp-13.41.0 (#44749)
ab4fbefa8d fix: non-evm bridge activity (#44751)
62fd747287 chore: removed deprecated checkbox with DS (#44765)
643d4d57cc test: added e2e tests for the new logic showing energy and bandwidth in sign transaction confirmation (#44756)
0fd8198e4b chore: remove border from pages (#44721)
1910a59ff9 feat(ledger): wire ledgerDmk flag to offscreen mode switching (#43488)
56f0a34156 chore: introduce bulk error suppression (#44739)
bd13fb6ec3 chore: updated networks for hardware accounts (#44531)
ab79e887a9 fix: updated search to be sticky and banner to scroll cp-13.41.0 (#44696)
34148d362e test(tron): prepare daily resources for E2E coverage (#44162)
4cd1d95222 chore: bump @metamask/tron-wallet-snap to ^1.33.1 (#44716)
906fee2c9d chore: bump assets controllers and remove patches (#44713)
dad0511577 test: fix flaky QrSync multi-SRP import confirm staleness timeout (#44700)
d50de2fac4 fix(metametrics): silence unmatched route Sentry noise for known paths (#44718)
4103808cae fix(ci): Remove "What's in this RC ...and more changes" section to match Extension RC Slack message to Mobile layout cp-13.41.0 (#44740)
7b2c1b2665 chore: update to ESLint v9 (#44734)
9faf0a6b5d feat: apply bg-alternative and border-muted to legacy Modal in pure black mode (#44726)
969f5c2aaa chore: update swap row labels (#44637)
2aa9b938e0 feat: apply bg-alternative and border-muted to ModalContent dialog in pure black mode (#44720)
9e40a87367 chore: New Crowdin Translations by GitHub Action cp-13.41.0 (#44595)
3ea61fd698 chore: remove unused ESLint directives from shared (#44679)
07651ccf9c chore: remove unused ESLint directives from ui/components (#44683)
0b58311684 chore: remove unused ESLint directives from remaining ui (#44685)
148b0844e4 bump: sharp to 0.35.3 (#44688)
ad1bbf43ce feat: show verified badge on swaps token button (#44623)
d5047c3a86 chore: replace sub tab screen opened metrics (#44093)
bb150a4058 feat: added skeleton for token list after stale open (#44705)
1d3f77fb38 ci: Harden absolute benchmark gate against within-noise breaches (#44609)
f3bd7f870e chore: align dapp connection bar styling with Figma spec (#44539)
42315a4087 feat: navigate users to batch sell through deeplink (#44671)
396263b848 chore: remove unneeded styles (#44693)
2acd3840a2 refactor(activity): use native dialog for transaction details (#44599)
65292d06fb bump: immutable to 5.1.9, fast-uri to 3.1.4, dompurify to 3.4.12, sass-embedded to 1.100.0 cp-13.41.0 (#44678)
57638a9616 chore: remove unused ESLint ignore directives from development (#44676)
7cb3eb6037 chore: split eslint ignore react-compiler directives (#44686)
14c815595a chore: remove unused ESLint directives from ui/pages (#44684)
8eac23857c chore: remove unused ESLint ignore directives from app (#44674)
8d99a5f7d3 test: fix flaky tests Add wallet Import wallet... (#44649)
4a1c57b063 test: fix flaky test Add account added account should persist after wallet lock (#44712)
2b218f3e77 chore(eslint): ignore .yarn and webpack build directory (#44666)
67b21b1e1b chore: update transaction controller (#44656)
77c6773132 chore: adds handler for top-traders (Follow Trading) deeplink redirect (#44660)
bceab0bb1e chore: bump @metamask/tron-wallet-snap to ^1.33.0 (#44698)
fa3885cf81 feat: setup for new defi flag (#44652)
0afcd07800 test: refactor snap-account-abstraction page object to remove references to other page objects (#44690)
3051cf4133 test: refactor account-list page object to remove references to other page objects (#44651)
edb7daa756 fix: clear orphaned advancedGasFee preference (migration 216) (#44205)
59f15bc6b0 fix: remove useAssetActivation test to unblock assets controllers bump up (#44699)
52b4b3d877 feat: removed back transitions unused selector (#44691)
f9f5e1dc48 fix: update slider step to one in batch sell (#44648)
a7847a0538 fix: do not render assets without quotes in review modal (#44650)
efa96b445e refactor: use modern clipboard api (#44622)
80b66e6c4e chore: removed sidepanel viewport max width constraint (#44647)
6d970c423d test: encryption and decryption Segment events (#44607)
1ff9bf422b chore: remove unused ESLint ignore directives from test directory (#44669)
2518a3727c feat(ui): add pure-black dark mode behind build-time flag (#44183)
d07ea1771f test: update swaps unit test mocks (#44627)
c6fc026ec2 chore: refactor ESLint overrides (#44663)
6fb3e32f55 bump: valibot to 1.4.2, body-parser to 1.20.6 and 2.3.0 (#44664)
b8c3584c53 fix(notifications): keep announcement home link in tab (#43419)
6e0219f5d6 chore: skip linting Jest snapshots (#44665)
a84d6539f5 feat: render high rate alert modal in batch sell review page (#44646)
0d81022be0 feat: integrate STX failTransaction fix (bridge stuck-pending) (#44372)
8f66b8fc55 feat: add bottom nav bar source to perps view events (#44611)
6fb1d6ba46 chore: update @metamask/gator-permissions-snap to version 2.4.0 (#44499)
9b12c19790 test: cover Empty Buy Banner Displayed event (#44617)
6c0217c496 feat: add bottom nav transitions (#44641)
8ae5ce634e chore: use same toaster-bottom-offset var for legacy toasts (#44654)
5da5008a3a test: MMQA - 1975 - Enhance feature flag validation/drift PR to omit re-orders without value change (#43814)
261773c0bb test: fix flaky tests Check balance For a non 0 balance account... (#44479)
5207d27d9c feat: add bottom nav experiment display logic and e2e tests (#44403)
1f66fc6cd7 release: Bump main version to 13.42.0 (#44642)
9962ac769f feat: implement close positions with limit orders (#44466)
477be3b0bc feat(e2e): add Tron test fixtures and environment helpers (#44160)
ffd91160c9 fix: various fixes and improvements on batch sell select page (#44603)
e091fe0b04 fix(assets): wire tempMigrateAssetsInfoMetadataAssets3346 into AssetsController init (#44303)
b685e6bf62 test: MMQA - 2034 - Fix antipatterns in qr-sync.spec.ts (#44600)
1548788667 bump: multiple to fix audit cp-13.41.0 (#44634)
6647504ca3 feat: consume backend-suggested slippage in unified swap/bridge (#44537)
e29c451b29 feat: import alias via node subpath imports (#44621)
f7f67d320b feat(ramps): add provider selection page with async quotes (#44553)
e9b745e8e5 chore: remove dead code (#44612)
bb5e12f804 refactor: migrate multichain review permissions toast (#44505)
fc5d600b60 refactor: add useEventListener (#44596)
c95feca137 Merge origin/main into stable-main-13.40.0
d8c683d6c9 feat(e2e): add Tron swap token registry and quote fixtures (#44159)
39d6aa6899 refactor: migrate buy button toast (#44510)
4fa405c7e6 fix: dedicated convert mUSD details cp-13.41.0 (#44586)
a6942d1c60 feat(support): replace raw profile params with customer service token (#44482)
d4987093b8 refactor: migrate delete metametrics toast (#44503)
22c64b7f3f refactor: migrate permissions disconnect-all toast (#44504)
227a3644f0 feat(ramps): show per-method quotes on payment selection (#44526)
abc8a8267c feat: update bottom bar navigation to swaps page (#44233)
3784ae3945 feat: added decimal validation for custom token import flow cp-13.41.0 (#44602)
b495bf455d chore: patch @metamask/assets-controller for suggested occurrence floors (#44525)
88bc6591dc feat(ci): add Runway orchestrator starter and store submission CODEOWNERS (#44017)
1894816b17 refactor(analytics): remove MetaMetricsController shims and finish background migration (#44380)
c4af8823c1 feat(hardware-wallets): add signing page orchestrator (#43943)
e8baf89ff4 fix(ci): align Extension RC Slack notes with Mobile Runway changelog (#44597)
7bfc16cfc0 bump: Upgrade @sentry/browser from 8.33.1 to 10.38.0 (#42867)
a25c6a5b07 chore(6932): convert final legacy context consumers to useI18nContext for React 19 (#44493)
9b908f58d4 test: fix Add wallet Import wallet using json file - TimeoutError: Waiting for element to be located By(css selector, [data-testid="choose-wallet-type-import-account"]) (#44464)
6183003c90 refactor: resolve activity list redesign (#44365)
576a79fa6d chore: allow history navigate on activity details (#44467)
593690c0f7 chore: remove browserify (#44433)
1456a2100a fix: keep bridge activity item as pending until dest tx resolves cp-13.40.0 (#44536)
aa09362f39 fix: don't hold the KeyringController lock during hardware wallets reads (#44483)
0f5ef841a3 refactor(activity): handle swaps missing destination token (#44501)

AI Test Plan

Risk Score High Risk Medium Risk Files Changed Commits
45/100 4 4 1281 139
Cherry-Pick Scenarios (2)

High Risk Scenarios (1)

1. Security: Deep-link Interstitial Protection

Risk Level: HIGH

Why This Matters: Cherry-pick 44830 restores the deep-link interstitial, preventing silent or drive-by approvals; a regression here is a direct security risk.

Test Steps:

  1. Open a MetaMask deep link that triggers a sensitive action (e.g., add network or connect to a site); verify an interstitial screen appears showing origin, action summary, and Allow/Deny.
  2. Attempt to bypass via repeated deep link triggers or background tab; confirm the action is blocked until the user explicitly Allows.
  3. Choose Deny and confirm no connection/network is added and the extension returns safely to home.
  4. Choose Allow once and confirm the action proceeds exactly once; triggering the deep link again shows the interstitial again.

Medium Risk Scenarios (1)

1. Cross-chain Asset Deep Links with Missing Account

Risk Level: MEDIUM

Why This Matters: Cherry-pick 44913 fixes handling of missing accounts for cross-chain deep links; without it, users could see crashes, wrong balances, or unsafe default selections.

Test Steps:

  1. With a wallet that has no account on the target chain, open a deep link to view an asset on another EVM chain (e.g., Polygon); verify the extension shows a safe prompt to switch/create/select an account or network instead of crashing.
  2. Follow the recommended action (e.g., create/select an account or switch network) and confirm the target asset view loads correctly with accurate balances.
  3. Cancel the prompt and verify the extension exits gracefully to a safe screen without partial state or incorrect balances.
  4. Repeat with multiple accounts (including imported) to confirm correct account mapping and no cross-account leakage.

Release Scenarios (6)

High Risk Scenarios (3)

1. Token Management (Assets Controller v11 upgrade)

Risk Level: HIGH

Why This Matters: Core asset management logic changed; regressions can cause missing/wrong balances, asset duplication, or loss of user-added tokens/NFTs.

Test Steps:

  1. Upgrade an existing profile (with several custom ERC-20s and NFTs across Mainnet and at least one L2) to 13.42.0 and unlock.
  2. On Mainnet, verify token balances load and refresh; switch to another network (e.g., Polygon) and confirm tokens/NFTs are not cross-contaminated.
  3. Add a custom ERC-20 by contract address; verify correct name/symbol/decimals and that balance populates; then remove it and confirm it disappears from the asset list and portfolio.
  4. Import or detect an NFT; confirm image/metadata load correctly and that switching networks hides it appropriately.
  5. Toggle token detection on/off in Settings and verify auto-detected tokens appear/disappear without affecting manually added assets.

2. State Migrations (Migration 219)

Risk Level: HIGH

Why This Matters: Migrations can corrupt or reset state, breaking access to funds, networks, or history.

Test Steps:

  1. Prepare a pre-upgrade profile on the previous stable (e.g., 13.41.x) with: 2+ accounts, a custom RPC network, connected sites, fiat display set, and existing tx history (including at least one pending tx).
  2. Upgrade to 13.42.0 and unlock; verify the wallet loads without migration errors or loops.
  3. Confirm accounts, connected sites, custom network(s), currency/primary currency settings, and privacy settings are preserved.
  4. Verify transaction history is intact and pending txs remain actionable; send a small new tx to ensure no approval regressions.
  5. Lock, close the browser, reopen, and unlock; verify no second migration runs and state remains consistent.

3. Message Encryption/Decryption (eth_getEncryptionPublicKey / eth_decrypt)

Risk Level: HIGH

Why This Matters: Cryptographic request flows must enforce correct permissions and account scoping; regressions risk data leakage or broken dapp integrations.

Test Steps:

  1. Connect a test dapp that requests eth_getEncryptionPublicKey; approve and confirm the prompt shows the correct origin and selected account.
  2. Have the dapp encrypt a message with the returned key, then request eth_decrypt; approve and confirm the decrypted message matches the original.
  3. Repeat eth_decrypt and choose Reject; verify the dapp receives userRejectedRequest and no decryption occurs.
  4. Switch to a different account and retry both methods; confirm prompts reflect the active account and no keys/decryptions are exposed for non-selected accounts.

Medium Risk Scenarios (3)

1. Metrics Opt-in/Out and Event Gating (Metametrics Controller)

Risk Level: MEDIUM

Why This Matters: Changes to analytics gating can silently enable data collection without consent or suppress essential telemetry.

Test Steps:

  1. Fresh install and complete onboarding; when prompted for metrics, choose No thanks.
  2. Perform common actions (open Activity, switch networks, add/remove a token, initiate and cancel a tx) and confirm no analytics payloads are sent (inspect background logs or proxy).
  3. Enable metrics in Settings > Security & privacy; repeat actions and confirm events are sent with anonymized properties (no raw account addresses).
  4. Opt-out again, reload the extension, and confirm the preference persists and events stop.

2. Alerts System (confirm/multiple/inline alerts)

Risk Level: MEDIUM

Why This Matters: Alert regressions can hide critical warnings or block key flows, leading to user mistakes or abandoned actions.

Test Steps:

  1. Trigger a confirm alert (e.g., remove an account or reset account) and verify modal content, focus, Escape/Enter key behavior, and that Confirm/Cancel perform expected actions.
  2. Trigger multiple alerts (e.g., network mismatch from a dapp plus a gas estimate warning) and verify multiple-alert handling stacks correctly; dismissing one leaves the other intact.
  3. Trigger an inline alert (e.g., initiate a tx on the wrong network) and verify correct severity style/contrast in light and dark themes; dismiss and confirm it does not reappear incorrectly.

3. RPC/API Error Handling (User-facing provider and network errors)

Risk Level: MEDIUM

Why This Matters: Error handler changes affect users’ ability to understand and recover from failures, preventing stuck states.

Test Steps:

  1. From a connected dapp, send a tx designed to fail (e.g., insufficient funds); verify the error shows as a clear, non-blocking message with actionable guidance.
  2. Temporarily set an invalid RPC URL for a custom network and perform an action; verify a clear connectivity error is shown and the UI recovers once the URL is fixed.
  3. Initiate a signature or tx approval and press Reject; confirm the dapp receives an EIP-1193 userRejectedRequest and the UI shows an accurate, non-generic message.

Teams Sign-off Status

Signed off: None yet

Awaiting sign-off (4):
Accounts, Assets, Networks, Security


Generated by AI Test Plan Analyzer (gpt-5) at 2026-07-29T19:48:24.382Z

AI generated test plan (JSON): test-plan-13.42.0.json

…5011)

- fix: swaps stale dest exchange rates cp-13.42.0 (#44968)

<!--
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 condition that prevents fetching token prices when cached values
exist in the asset controller states. Token prices will now be fetched
on each quote fetch to prevent displaying stale fiat amounts

<!--
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: chore: bump bridge controllers to fix stale dest
exchange rates

## **Related issues**

Fixes https://consensyssoftware.atlassian.net/browse/SWAPS-4851

## **Manual testing steps**


```gherkin
Feature: swap destination amount price

  Scenario: user requests a USDC->ETH quote
    Given they get a quote

    When user switches the assets (note the dest fiat amount)
    Then the src fiat amount matches the previous dest amount
    When user switches the assets again (note the dest fiat amount)
    Then the src fiat amount matches the previous dest amount

```

## **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
Extension Coding

Standards](https://github.com/MetaMask/metamask-extension/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-extension/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 swap/bridge pricing behavior and controller messenger
permissions; impact is localized to bridge UI and exchange-rate
fetching, but incorrect rates would mislead users on fiat amounts.
> 
> **Overview**
> Fixes **stale destination fiat amounts** when swapping by always
refreshing source-token exchange rates instead of reusing cached market
data.
> 
> **`useBridgeExchangeRates`** now dispatches `setSrcTokenExchangeRates`
whenever a source token is selected, removing the guard that skipped the
fetch when `exchangeRateFromMarketData` already had a value.
> 
> **Bridge controller packages** are bumped
(`@metamask/bridge-controller` **78.0.1**,
`@metamask/bridge-status-controller` **74.6.0**), with related
transitive updates (`keyring-api`, `keyring-utils`). The bridge
controller messenger **stops delegating**
`TokenRatesController:getState` and
`MultichainAssetsRatesController:getState`, aligning with the updated
controllers’ use of **`AssetsController:getExchangeRatesForBridge`**.
> 
> LavaMoat webpack policies are updated for the
**`@metamask/keyring-api>@metamask/keyring-utils`** dependency path.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
3df4a4d. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
[c1a5d29](c1a5d29)

Co-authored-by: Micaela Estabillo <100321200+micaelae@users.noreply.github.com>
Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
@metamask-ci

metamask-ci Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor
Builds ready [cd5a5de]
⚡ Performance Benchmarks (Total: 🟢 15 pass · 🟡 5 warn · 🔴 3 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30514925166 | Baseline logs

Metricschrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 srpButtonToSrpForm(p95) [CI log]🟢 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🔴 longTaskCount(p95) [CI log]🔴 [CI log]

Regressions (🔴 3 failures)

Interaction Benchmarks · Samples: 5
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
confirmTx
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ confirmTx/longTaskTotalDuration: -11%
  • ↓ confirmTx/tbt: -19%
  • ↓ bridgeUserActions/bridge_load_asset_picker: -16%
  • ↓ bridgeUserActions/longTaskCount: -44%
  • ↓ bridgeUserActions/longTaskTotalDuration: -35%
  • ↓ bridgeUserActions/tbt: -11%
  • ↑ loadNewAccount/inp: +14%
  • ↓ loadNewAccount/fcp: -59%
  • ↑ loadNewAccount/lcp: +980%
  • ↑ confirmTx/confirm_tx: +11%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↑ confirmTx/total: +11%
  • ↓ confirmTx/inp: -32%
  • ↓ confirmTx/fcp: -58%
  • ↑ confirmTx/lcp: +978%
  • ↑ bridgeUserActions/bridge_load_page: +109%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +100%
  • ↓ bridgeUserActions/bridge_search_token: -12%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↓ bridgeUserActions/fcp: -56%
  • ↑ bridgeUserActions/lcp: +939%
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]–
startupPowerUserHome
[Sentry log · main/release]
–🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ startupStandardHome/uiStartup: -20%
  • ↓ startupStandardHome/load: -19%
  • ↓ startupStandardHome/domContentLoaded: -20%
  • ↓ startupStandardHome/domInteractive: -23%
  • ↓ startupStandardHome/backgroundConnect: -20%
  • ↓ startupStandardHome/firstReactRender: -24%
  • ↓ startupStandardHome/initialActions: -33%
  • ↓ startupStandardHome/loadScripts: -20%
  • ↓ startupStandardHome/setupStore: -17%
  • ↓ startupStandardHome/longTaskCount: -33%
  • ↓ startupStandardHome/longTaskTotalDuration: -28%
  • ↓ startupStandardHome/longTaskMaxDuration: -23%
  • ↓ startupStandardHome/tbt: -27%
  • ↓ startupStandardHome/inp: -11%
  • ↓ startupStandardHome/fcp: -19%
  • ↑ startupStandardHome/lcp: +262%
  • ↑ startupPowerUserHome/uiStartup: +18%
  • ↑ startupPowerUserHome/load: +16%
  • ↑ startupPowerUserHome/domContentLoaded: +16%
  • ↑ startupPowerUserHome/domInteractive: +13%
  • ↑ startupPowerUserHome/firstReactRender: +18%
  • ↑ startupPowerUserHome/initialActions: +11%
  • ↑ startupPowerUserHome/loadScripts: +15%
  • ↑ startupPowerUserHome/setupStore: +284%
  • ↑ startupPowerUserHome/fcp: +15%
  • ↑ startupPowerUserHome/lcp: +16%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 startupPowerUserHome/LCP: p75 3.3s
User Journey Benchmarks · Samples: 5 · real API 🔴 3
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 doneButtonToHomeScreen
🔴 total
🟢 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 total
🔴 [CI log]
🔴 total
assetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
importSrpHome
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
sendTransactions
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ onboardingImportWallet/srpButtonToSrpForm: +14%
  • ↑ onboardingImportWallet/confirmSrpToPwForm: +13%
  • ↓ onboardingImportWallet/doneButtonToHomeScreen: -27%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -88%
  • ↑ onboardingImportWallet/longTaskCount: +14%
  • ↑ onboardingImportWallet/longTaskTotalDuration: +13%
  • ↑ onboardingImportWallet/tbt: +14%
  • ↓ onboardingImportWallet/total: -37%
  • ↑ onboardingNewWallet/tbt: +15%
  • ↑ solanaAssetDetails/assetClickToPriceChart: +58%
  • ↓ solanaAssetDetails/longTaskCount: -100%
  • ↓ solanaAssetDetails/longTaskTotalDuration: -100%
  • ↓ solanaAssetDetails/longTaskMaxDuration: -100%
  • ↓ solanaAssetDetails/tbt: -100%
  • ↑ solanaAssetDetails/total: +58%
  • ↑ solanaAssetDetails/inp: +11%
  • ↑ importSrpHome/loginToHomeScreen: +13%
  • ↑ importSrpHome/homeAfterImportWithNewWallet: +11%
  • ↑ importSrpHome/longTaskCount: +13%
  • ↑ importSrpHome/longTaskTotalDuration: +12%
  • ↑ importSrpHome/longTaskMaxDuration: +23%
  • ↑ importSrpHome/tbt: +18%
  • ↑ importSrpHome/total: +10%
  • ↑ importSrpHome/inp: +22%
  • ↓ importSrpHome/cls: -15%
  • ↑ sendTransactions/openSendPageFromHome: +13%
  • ↑ sendTransactions/selectTokenToSendFormLoaded: +19%
  • ↑ sendTransactions/reviewTransactionToConfirmationPage: +109%
  • ↑ sendTransactions/longTaskCount: +300%
  • ↑ sendTransactions/longTaskTotalDuration: +392%
  • ↑ sendTransactions/longTaskMaxDuration: +392%
  • ↑ sendTransactions/tbt: +2700%
  • ↑ sendTransactions/total: +106%
  • ↓ sendTransactions/lcp: -61%
  • ↓ sendTransactions/cls: -20%
  • ↑ swap/fetchAndDisplaySwapQuotes: +33%
  • ↑ swap/longTaskCount: +33%
  • ↑ swap/longTaskTotalDuration: +45%
  • ↑ swap/longTaskMaxDuration: +52%
  • ↑ swap/tbt: +89%
  • ↑ swap/total: +32%
  • ↓ swap/lcp: -72%
  • ↓ swap/cls: -30%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 importSrpHome/INP: p75 376ms
  • 🟡 sendTransactions/INP: p75 208ms
  • 🟡 sendTransactions/FCP: p75 2.0s
  • 🟡 sendTransactions/LCP: p75 2.6s
  • 🟡 swap/FCP: p75 2.0s
  • 🟡 swap/LCP: p75 2.6s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: -25.85 KiB (-0.18%)
  • ui: 1.5 KiB (0.01%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 430 Bytes (0.02%)
  • zip: -6.11 MiB (-22.5%)

🍒 What's in this RC

Cherry-picks (6 commits)
Commit Description
cd5a5de163 release(runway): cherry-pick fix: swaps stale dest exchange rates (#45011)
95f14e76ab release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45009)
387e08ad64 release(cp): bump: brace-expansion to 5.0.8 (#44924)
9e657a96f9 release(runway): cherry-pick fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44927)
7b1c84e9b7 release(cp): build: no more PNGs inside SVGs allowed, delete unused images (#44832)
03507b5e03 Merge branch 'stable' into release/13.42.0

Changelog (137 commits since v13.41.0)
Commit Description
cd5a5de163 release(runway): cherry-pick fix: swaps stale dest exchange rates (#45011)
95f14e76ab release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45009)
387e08ad64 release(cp): bump: brace-expansion to 5.0.8 (#44924)
9e657a96f9 release(runway): cherry-pick fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44927)
7b1c84e9b7 release(cp): build: no more PNGs inside SVGs allowed, delete unused images (#44832)
ea212236bf release(cp): fix: restored old behavior to show Paid by MetaMask label in sponsored transactions from activity page cp-13.41.0 (#44780)
8d9aabc289 release(runway): cherry-pick fix: handle missing account for cross-chain asset deeplinks cp-13.42.0 (#44913)
e8690470e1 release(runway): cherry-pick fix: updated checkbox and permissions page width cp-13.42.0 (#44906)
fbd3a5e978 release(runway): cherry-pick fix(activity): apply text color token to native dialog for dark theme cp-13.42.0 (#44873)
d5f6239719 release(cp): bump: tar to 7.5.22, ignore react-router advisories cp-13.41.0 (#44862)
78ce2e0cf9 release(cp): fix(deep-links): restore interstitial protection cp-13.42.0 (#44830)
5738947439 release(runway): cherry-pick fix(activity): transaction details width cp-13.42.0 (#44856)
a8682562fc release(runway): cherry-pick feat: keep the balance left aligned for lower viewport cp-13.42.0 (#44854)
189763ce27 release(cp): cherry-pick fix(assets): include tokens with large balances and few decimals in aggregated balance cp-13.41.0
8423f220d3 release: release-changelog/13.42.0 (#44798)
0c93b31dd8 Merge release/13.41.0 into release/13.42.0
446c5a25b5 fix: apply bg-alternative to legacy Popover in pure black theme (#44730)
c2c37a8a68 fix: apply border-muted to global menu drawer in pure black theme (#44729)
7e15155002 chore: remove unused legacy modals from ui/components/app/modals (#44731)
b03252588b fix: add device response timeout to Trezor bridges (#44626)
9ee3d987a7 feat: show skeleton for the whole balance block if the balance is not cached (#44703)
960369d180 fix: require interstitial for CAIP-19 asset deep links (#44639)
ef34172a99 refactor: migrate formatters to client-utils (#44624)
88c41e5489 test: cover Wallet Creation Attempted Segment event (#44673)
7a14cd7f6c feat: Updated the styles for swaps page (#44762)
ad64202e93 test: MMQA - 2035 - Fix antipatterns in sendPage which can lead to flakiness (#44640)
845b4a8f4a feat: updated avatarbase and banner alert to use DS (#44763)
3802fdba7c chore: migrate AvatarFavicon to MMDS (#44764)
a1b13be185 feat: seedless controller v10.1.0 (#44771)
864f5e5294 fix: patch bridge controller to exclude Stellar and Arc cp-13.41.0 (#44749)
ab4fbefa8d fix: non-evm bridge activity (#44751)
62fd747287 chore: removed deprecated checkbox with DS (#44765)
643d4d57cc test: added e2e tests for the new logic showing energy and bandwidth in sign transaction confirmation (#44756)
0fd8198e4b chore: remove border from pages (#44721)
1910a59ff9 feat(ledger): wire ledgerDmk flag to offscreen mode switching (#43488)
56f0a34156 chore: introduce bulk error suppression (#44739)
bd13fb6ec3 chore: updated networks for hardware accounts (#44531)
ab79e887a9 fix: updated search to be sticky and banner to scroll cp-13.41.0 (#44696)
34148d362e test(tron): prepare daily resources for E2E coverage (#44162)
4cd1d95222 chore: bump @metamask/tron-wallet-snap to ^1.33.1 (#44716)
906fee2c9d chore: bump assets controllers and remove patches (#44713)
dad0511577 test: fix flaky QrSync multi-SRP import confirm staleness timeout (#44700)
d50de2fac4 fix(metametrics): silence unmatched route Sentry noise for known paths (#44718)
4103808cae fix(ci): Remove "What's in this RC ...and more changes" section to match Extension RC Slack message to Mobile layout cp-13.41.0 (#44740)
7b2c1b2665 chore: update to ESLint v9 (#44734)
9faf0a6b5d feat: apply bg-alternative and border-muted to legacy Modal in pure black mode (#44726)
969f5c2aaa chore: update swap row labels (#44637)
2aa9b938e0 feat: apply bg-alternative and border-muted to ModalContent dialog in pure black mode (#44720)
9e40a87367 chore: New Crowdin Translations by GitHub Action cp-13.41.0 (#44595)
3ea61fd698 chore: remove unused ESLint directives from shared (#44679)
07651ccf9c chore: remove unused ESLint directives from ui/components (#44683)
0b58311684 chore: remove unused ESLint directives from remaining ui (#44685)
148b0844e4 bump: sharp to 0.35.3 (#44688)
ad1bbf43ce feat: show verified badge on swaps token button (#44623)
d5047c3a86 chore: replace sub tab screen opened metrics (#44093)
bb150a4058 feat: added skeleton for token list after stale open (#44705)
1d3f77fb38 ci: Harden absolute benchmark gate against within-noise breaches (#44609)
f3bd7f870e chore: align dapp connection bar styling with Figma spec (#44539)
42315a4087 feat: navigate users to batch sell through deeplink (#44671)
396263b848 chore: remove unneeded styles (#44693)
2acd3840a2 refactor(activity): use native dialog for transaction details (#44599)
65292d06fb bump: immutable to 5.1.9, fast-uri to 3.1.4, dompurify to 3.4.12, sass-embedded to 1.100.0 cp-13.41.0 (#44678)
57638a9616 chore: remove unused ESLint ignore directives from development (#44676)
7cb3eb6037 chore: split eslint ignore react-compiler directives (#44686)
14c815595a chore: remove unused ESLint directives from ui/pages (#44684)
8eac23857c chore: remove unused ESLint ignore directives from app (#44674)
8d99a5f7d3 test: fix flaky tests Add wallet Import wallet... (#44649)
4a1c57b063 test: fix flaky test Add account added account should persist after wallet lock (#44712)
2b218f3e77 chore(eslint): ignore .yarn and webpack build directory (#44666)
67b21b1e1b chore: update transaction controller (#44656)
77c6773132 chore: adds handler for top-traders (Follow Trading) deeplink redirect (#44660)
bceab0bb1e chore: bump @metamask/tron-wallet-snap to ^1.33.0 (#44698)
fa3885cf81 feat: setup for new defi flag (#44652)
0afcd07800 test: refactor snap-account-abstraction page object to remove references to other page objects (#44690)
3051cf4133 test: refactor account-list page object to remove references to other page objects (#44651)
edb7daa756 fix: clear orphaned advancedGasFee preference (migration 216) (#44205)
59f15bc6b0 fix: remove useAssetActivation test to unblock assets controllers bump up (#44699)
52b4b3d877 feat: removed back transitions unused selector (#44691)
f9f5e1dc48 fix: update slider step to one in batch sell (#44648)
a7847a0538 fix: do not render assets without quotes in review modal (#44650)
efa96b445e refactor: use modern clipboard api (#44622)
80b66e6c4e chore: removed sidepanel viewport max width constraint (#44647)
6d970c423d test: encryption and decryption Segment events (#44607)
1ff9bf422b chore: remove unused ESLint ignore directives from test directory (#44669)
2518a3727c feat(ui): add pure-black dark mode behind build-time flag (#44183)
d07ea1771f test: update swaps unit test mocks (#44627)
c6fc026ec2 chore: refactor ESLint overrides (#44663)
6fb3e32f55 bump: valibot to 1.4.2, body-parser to 1.20.6 and 2.3.0 (#44664)
b8c3584c53 fix(notifications): keep announcement home link in tab (#43419)
6e0219f5d6 chore: skip linting Jest snapshots (#44665)
a84d6539f5 feat: render high rate alert modal in batch sell review page (#44646)
0d81022be0 feat: integrate STX failTransaction fix (bridge stuck-pending) (#44372)
8f66b8fc55 feat: add bottom nav bar source to perps view events (#44611)
6fb1d6ba46 chore: update @metamask/gator-permissions-snap to version 2.4.0 (#44499)
9b12c19790 test: cover Empty Buy Banner Displayed event (#44617)
6c0217c496 feat: add bottom nav transitions (#44641)
8ae5ce634e chore: use same toaster-bottom-offset var for legacy toasts (#44654)
5da5008a3a test: MMQA - 1975 - Enhance feature flag validation/drift PR to omit re-orders without value change (#43814)
261773c0bb test: fix flaky tests Check balance For a non 0 balance account... (#44479)
5207d27d9c feat: add bottom nav experiment display logic and e2e tests (#44403)
1f66fc6cd7 release: Bump main version to 13.42.0 (#44642)
9962ac769f feat: implement close positions with limit orders (#44466)
477be3b0bc feat(e2e): add Tron test fixtures and environment helpers (#44160)
ffd91160c9 fix: various fixes and improvements on batch sell select page (#44603)
e091fe0b04 fix(assets): wire tempMigrateAssetsInfoMetadataAssets3346 into AssetsController init (#44303)
b685e6bf62 test: MMQA - 2034 - Fix antipatterns in qr-sync.spec.ts (#44600)
1548788667 bump: multiple to fix audit cp-13.41.0 (#44634)
6647504ca3 feat: consume backend-suggested slippage in unified swap/bridge (#44537)
e29c451b29 feat: import alias via node subpath imports (#44621)
f7f67d320b feat(ramps): add provider selection page with async quotes (#44553)
e9b745e8e5 chore: remove dead code (#44612)
bb5e12f804 refactor: migrate multichain review permissions toast (#44505)
fc5d600b60 refactor: add useEventListener (#44596)
c95feca137 Merge origin/main into stable-main-13.40.0
d8c683d6c9 feat(e2e): add Tron swap token registry and quote fixtures (#44159)
39d6aa6899 refactor: migrate buy button toast (#44510)
4fa405c7e6 fix: dedicated convert mUSD details cp-13.41.0 (#44586)
a6942d1c60 feat(support): replace raw profile params with customer service token (#44482)
d4987093b8 refactor: migrate delete metametrics toast (#44503)
22c64b7f3f refactor: migrate permissions disconnect-all toast (#44504)
227a3644f0 feat(ramps): show per-method quotes on payment selection (#44526)
abc8a8267c feat: update bottom bar navigation to swaps page (#44233)
3784ae3945 feat: added decimal validation for custom token import flow cp-13.41.0 (#44602)
b495bf455d chore: patch @metamask/assets-controller for suggested occurrence floors (#44525)
88bc6591dc feat(ci): add Runway orchestrator starter and store submission CODEOWNERS (#44017)
1894816b17 refactor(analytics): remove MetaMetricsController shims and finish background migration (#44380)
c4af8823c1 feat(hardware-wallets): add signing page orchestrator (#43943)
e8baf89ff4 fix(ci): align Extension RC Slack notes with Mobile Runway changelog (#44597)
7bfc16cfc0 bump: Upgrade @sentry/browser from 8.33.1 to 10.38.0 (#42867)
a25c6a5b07 chore(6932): convert final legacy context consumers to useI18nContext for React 19 (#44493)
9b908f58d4 test: fix Add wallet Import wallet using json file - TimeoutError: Waiting for element to be located By(css selector, [data-testid="choose-wallet-type-import-account"]) (#44464)
6183003c90 refactor: resolve activity list redesign (#44365)
576a79fa6d chore: allow history navigate on activity details (#44467)
593690c0f7 chore: remove browserify (#44433)
1456a2100a fix: keep bridge activity item as pending until dest tx resolves cp-13.40.0 (#44536)
aa09362f39 fix: don't hold the KeyringController lock during hardware wallets reads (#44483)
0f5ef841a3 refactor(activity): handle swaps missing destination token (#44501)

AI Test Plan

Risk Score High Risk Medium Risk Files Changed Commits
62/100 8 7 1284 140
Cherry-Pick Scenarios (3)

High Risk Scenarios (2)

1. Deep-links - interstitial protection before sensitive actions

Risk Level: HIGH

Why This Matters: Cherry-pick 44830 fixes restoration of interstitial protection for deep links, preventing unmediated navigation to sensitive flows.

Test Steps:

  1. Open a MetaMask deep link that triggers a sensitive action (e.g., add network or connect) from the browser.
  2. Verify an interstitial screen appears explaining the action and requiring explicit confirmation.
  3. Select Cancel and confirm no action is taken; re-open the link, Continue, and verify you reach the appropriate confirmation flow.

2. Swaps - destination exchange rate refresh and accuracy

Risk Level: HIGH

Why This Matters: Cherry-pick 45011 fixes stale destination exchange rates that can misprice swaps, risking user loss.

Test Steps:

  1. Open Swaps, choose a source token and destination token/network, and get a quote.
  2. Change the destination token or network; verify the destination exchange rate refreshes immediately on the quote and review screens.
  3. Wait at least 60 seconds and navigate back/forward to ensure rates continue updating and no stale values persist before submit.

Medium Risk Scenarios (1)

1. Deep-links - cross-chain asset deeplinks without a matching account

Risk Level: MEDIUM

Why This Matters: Cherry-pick 44913 fixes crashes or dead-ends when a deep link targets a missing account, ensuring a safe fallback and user choice.

Test Steps:

  1. Use a cross-chain asset deep link referencing an account that is not currently available (e.g., removed/locked secondary account).
  2. Open the link and verify the wallet prompts to select an available account or to add/import instead of failing.
  3. After selection, ensure the asset view or intended destination loads correctly with the chosen account context.

Release Scenarios (12)

High Risk Scenarios (6)

1. State Migration (Migration 219) - upgrade with populated vault

Risk Level: HIGH

Why This Matters: State migrations can corrupt or drop user data; verifying accounts, networks, and assets survive the upgrade guards against data loss.

Test Steps:

  1. Install a previous production build (e.g., 13.41.x), create a wallet with 2 accounts, add a custom network (e.g., Polygon), add 1 ERC-20 token and 1 NFT, and add 2 address book entries.
  2. Upgrade the extension to 13.42.0 without resetting state, then unlock.
  3. Verify both accounts, balances, custom network, tokens, NFTs, and address book entries are preserved.
  4. Export state logs (Settings > Advanced > Download State Logs) and verify migration version indicates 219 and no migration error banners appear.

2. State Migration (Migration 219) - upgrade while locked

Risk Level: HIGH

Why This Matters: Upgrading while locked stresses keyring/state initialization paths; failures here can strand users or reset wallets.

Test Steps:

  1. On 13.41.x, lock the wallet with a populated state (multiple accounts, custom network, tokens/NFTs).
  2. Upgrade to 13.42.0 while the wallet is locked.
  3. Unlock and confirm successful decryption, correct account order, and intact seed phrase restore options.
  4. Verify no unexpected reset to onboarding and no missing assets/networks.

3. Token Management - Assets Controller upgrade (auto detection on/off across networks)

Risk Level: HIGH

Why This Matters: A major Assets Controller update can affect auto-detection, token metadata accuracy, and duplication across networks.

Test Steps:

  1. On Mainnet, enable token detection (Settings > Security & privacy or relevant setting) and ensure detection is active.
  2. Add a network like Polygon and switch to it; verify commonly held tokens on that network auto-appear without duplicates.
  3. Disable token detection, remove an auto-detected token, and confirm it is not re-added after refresh or account switch.
  4. Spot-check decimals/symbols for a token with unusual decimals to ensure correct formatting.

4. Token Management - EIP-747 wallet_watchAsset confirmations

Risk Level: HIGH

Why This Matters: watchAsset flows rely on asset metadata and controller logic; regressions can misrepresent balances or spam users with duplicates.

Test Steps:

  1. From a test dapp, call wallet_watchAsset for an ERC-20 with custom decimals and a long symbol.
  2. Approve the add-token confirmation; verify the token appears with correct symbol, decimals, and logo.
  3. Attempt to add the same token again and reject; verify no duplicate entry is created.
  4. Switch accounts and networks to ensure the token scoping remains correct per account/network.

5. NFTs - detection/import and metadata media rendering

Risk Level: HIGH

Why This Matters: Assets Controller changes can impact NFT metadata resolution and display; broken media or cross-network bleed confuses users.

Test Steps:

  1. Import a known ERC-721 or ERC-1155 NFT via contract address and token ID on a supported test network.
  2. Verify image/media loads, attributes display, and collection name is correct on the NFT details screen.
  3. Switch to a different network and confirm the NFT view reflects the network context (no cross-network bleed).
  4. Refresh metadata (if available) and confirm nothing breaks and updated fields render.

6. Bridge - quote retrieval and transaction creation

Risk Level: HIGH

Why This Matters: Bridge-controller patch changes can break quoting or transaction building, risking failed or incorrect cross-chain transfers.

Test Steps:

  1. Open the Bridge tab and select a source (e.g., Sepolia) and destination network (e.g., Arbitrum Sepolia).
  2. Enter a small amount, fetch quotes, and select a recommended route.
  3. Approve any allowance if prompted, then submit the bridge transaction.
  4. Verify the Activity tab records the bridge, status updates are shown, and destination chain/amounts match the quote.

Medium Risk Scenarios (6)

1. Send Flow and Errors - alert system and API error handling

Risk Level: MEDIUM

Why This Matters: Alert system and error handler updates can hide or misstate failures, leading to mistaken resubmits or user confusion.

Test Steps:

  1. Attempt a send with insufficient funds; verify a clear error alert/modal appears and can be dismissed.
  2. Temporarily use an invalid RPC URL for the active network and attempt a send; verify the API error surfaces with actionable messaging.
  3. Restore a valid RPC, retry the send, and confirm normal success path and absence of stale error banners.

2. Dapp Connections - permissions modal and multi-account selection

Risk Level: MEDIUM

Why This Matters: UI refactors around permissions can cause mis-selection or incorrect account exposure to sites.

Test Steps:

  1. From a dapp, request connection; on the permissions modal, select multiple accounts using the account checkboxes.
  2. Approve and verify the dapp receives all selected accounts and only those accounts.
  3. Open Connected sites in the wallet, add/remove an account for that site, and verify the dapp reflects the updated permissions.

3. Message Signing - personal_sign and EIP-712 (v4)

Risk Level: MEDIUM

Why This Matters: Controller and confirmation UI changes can affect data rendering or validation, leading to unsafe or incorrect approvals.

Test Steps:

  1. From a test dapp, trigger personal_sign and review the confirmation text for accuracy and domain.
  2. Trigger eth_signTypedData_v4 for structured data; verify all fields and domain separator details are visible.
  3. Approve and verify the dapp can validate both signatures; repeat once with Reject to confirm proper error flow.

4. Encryption - eth_getEncryptionPublicKey and eth_decrypt

Risk Level: MEDIUM

Why This Matters: Even small controller changes can break public key retrieval or decryption confirmations, impacting secure messaging flows.

Test Steps:

  1. From a test dapp, request eth_getEncryptionPublicKey for the selected account and approve.
  2. Dapp encrypts a message with the returned key; request eth_decrypt from the wallet and approve.
  3. Confirm the decrypted plaintext matches the original; repeat once with Reject to ensure the correct error message is returned.

5. Activity - list and detail views across themes and sizes

Risk Level: MEDIUM

Why This Matters: Large UI refactors can cause truncation or misaligned details, leading to misinterpretation of transaction outcomes.

Test Steps:

  1. Generate a mix of activities (send, swap, bridge) and open the Activity tab.
  2. Open details for each activity and verify hash, amounts, network, gas, and status are accurate.
  3. Toggle light/dark theme and resize the window to narrow widths; verify content remains readable and unclipped.

6. Network Management - add and switch via dapp requests

Risk Level: MEDIUM

Why This Matters: Controller and UI changes can regress add/switch flows, leading to misconfigured networks or failed dapp connections.

Test Steps:

  1. From a dapp, call wallet_addEthereumChain for a test network; verify the add network confirmation shows accurate details and approve.
  2. Confirm automatic switch to the new network and verify RPC and chain ID are correct in settings.
  3. From the same dapp, call wallet_switchEthereumChain back to the original network and verify the switch and correct asset list context.

Teams Sign-off Status

Signed off: None yet

Awaiting sign-off (9):
Accounts, Assets, Confirmations, Networks, Permissions, Swaps, Swaps and Bridge, Transactions, Wallet Integrations


Generated by AI Test Plan Analyzer (gpt-5) at 2026-07-30T05:27:02.808Z

AI generated test plan (JSON): test-plan-13.42.0.json

… core client-utils cp-13.42.0 (#45039)

- fix: patch for missing slip44 entries in core client-utils cp-13.42.0
(#45006)

<!--
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?
-->

With issue #44993,
some token icons wouldn't appear for native sends. Ex: Monad, MegaETH.
Also on those networks, the corresponding activity entry would be
missing from the Token Page.

The issue came from missing slip44 entries in this file:

https://github.com/MetaMask/core/pull/9671/changes#diff-4d2d5a10eba039c36f21ec53cb573ad609cf4854cb1de5067a174d0140ace0dcL24-L35
(or the fact that existing slip44 entries could have been used instead)

The code with the missing entries is being removed/refactored. However
in the meantime the issue remains on the release/13.42.0 branch.

Solution: A patch to add the missing entries for cherry-picking on this
RC.

## **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: [patch for missing slip44 entries in core

client-utils](d7e1645)

## **Related issues**

Fixes: #44993

## **Manual testing steps**

1. From Monad and MegaETH, perform a native send (`MON` for Monad, `ETH`
for MegaETH).
2. Check the resulting Activity items:
- Before: No icon + no item from MON/ETH token page
- After: Icon appears and activity item visible from both general
activity tab and token page

## **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
Extension Coding

Standards](https://github.com/MetaMask/metamask-extension/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-extension/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**
> Scoped dependency metadata patch for native asset mapping; no auth or
transaction logic changes, though incorrect slip44 values could affect
icon/activity display on those chains.
> 
> **Overview**
> Adds a **Yarn patch** on `@metamask/client-utils@1.2.0` so
`nativeAssetsByCaipChainId` in the CAIP helpers includes **slip44** (and
symbol/decimals) for several EVM chains that were missing from the
published package—**Monad** (`eip155:143`), **Hyperliquid**
(`eip155:999`), and additional chain IDs **4326**, **4663**, and
**5042**.
> 
> `package.json` and `yarn.lock` now resolve `@metamask/client-utils`
through that patch instead of the plain npm version. This is a
**short-term RC fix** for missing native token icons and absent
token-page activity on native sends until the upstream core change
lands.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
e7a842e. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
[ed7b8fb](ed7b8fb)

Co-authored-by: maxime-oe <maxime.ouairy-ext@consensys.net>
@metamask-ci

metamask-ci Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor
Builds ready [7c8fdb7]
⚡ Performance Benchmarks (Total: 🟢 16 pass · 🟡 4 warn · 🔴 4 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30562375730 | Baseline logs

Metricschrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 metricsToWalletReadyScreen(p95) [CI log]🔴 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🔴 longTaskCount(p95) [CI log]🔴 [CI log]

Regressions (🔴 4 failures)

Interaction Benchmarks · Samples: 5
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
confirmTx
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ confirmTx/tbt: -13%
  • ↑ bridgeUserActions/bridge_load_page: +59%
  • ↑ bridgeUserActions/longTaskCount: +11%
  • ↓ loadNewAccount/inp: -24%
  • ↓ loadNewAccount/fcp: -43%
  • ↑ loadNewAccount/lcp: +1193%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↓ confirmTx/inp: -17%
  • ↑ confirmTx/lcp: +1158%
  • ↑ bridgeUserActions/bridge_load_page: +288%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +70%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +23%
  • ↓ bridgeUserActions/inp: -23%
  • ↓ bridgeUserActions/fcp: -45%
  • ↑ bridgeUserActions/lcp: +1193%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 confirmTx/FCP: p75 1.8s
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
startupPowerUserHome
[Sentry log · main/release]
–🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ startupStandardHome/uiStartup: -20%
  • ↓ startupStandardHome/load: -19%
  • ↓ startupStandardHome/domContentLoaded: -19%
  • ↓ startupStandardHome/domInteractive: -18%
  • ↓ startupStandardHome/backgroundConnect: -19%
  • ↓ startupStandardHome/firstReactRender: -23%
  • ↓ startupStandardHome/initialActions: -33%
  • ↓ startupStandardHome/loadScripts: -19%
  • ↓ startupStandardHome/setupStore: -17%
  • ↓ startupStandardHome/longTaskCount: -33%
  • ↓ startupStandardHome/longTaskTotalDuration: -27%
  • ↓ startupStandardHome/longTaskMaxDuration: -22%
  • ↓ startupStandardHome/tbt: -26%
  • ↓ startupStandardHome/inp: -11%
  • ↓ startupStandardHome/fcp: -19%
  • ↑ startupStandardHome/lcp: +266%
  • ↓ startupStandardHome/domInteractive: -26%
  • ↓ startupStandardHome/fcp: -21%
  • ↑ startupPowerUserHome/uiStartup: +12%
  • ↑ startupPowerUserHome/load: +13%
  • ↑ startupPowerUserHome/domContentLoaded: +13%
  • ↑ startupPowerUserHome/domInteractive: +17%
  • ↑ startupPowerUserHome/backgroundConnect: +34%
  • ↑ startupPowerUserHome/firstReactRender: +18%
  • ↑ startupPowerUserHome/initialActions: +11%
  • ↑ startupPowerUserHome/loadScripts: +13%
  • ↑ startupPowerUserHome/setupStore: +282%
  • ↑ startupPowerUserHome/fcp: +14%
  • ↑ startupPowerUserHome/lcp: +10%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 startupPowerUserHome/LCP: p75 3.2s
User Journey Benchmarks · Samples: 5 · real API 🔴 4
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 doneButtonToHomeScreen
🔴 total
🔴 [CI log]
🔴 total
onboardingNewWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 total
🔴 [CI log]
🔴 total
assetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
importSrpHome
[Sentry log · main/release]
🟡 [CI log]
🟡 total
🟢 [CI log]
sendTransactions
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ onboardingImportWallet/confirmSrpToPwForm: -12%
  • ↓ onboardingImportWallet/pwFormToMetricsScreen: -13%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -56%
  • ↓ onboardingImportWallet/longTaskCount: -14%
  • ↓ onboardingImportWallet/longTaskTotalDuration: -16%
  • ↓ onboardingImportWallet/total: -25%
  • ↑ onboardingNewWallet/longTaskCount: +25%
  • ↑ onboardingNewWallet/longTaskTotalDuration: +10%
  • ↓ onboardingNewWallet/tbt: -12%
  • ↓ solanaAssetDetails/assetClickToPriceChart: -38%
  • ↓ solanaAssetDetails/longTaskCount: -100%
  • ↓ solanaAssetDetails/longTaskTotalDuration: -100%
  • ↓ solanaAssetDetails/longTaskMaxDuration: -100%
  • ↓ solanaAssetDetails/tbt: -100%
  • ↓ solanaAssetDetails/total: -38%
  • ↓ solanaAssetDetails/inp: -13%
  • ↓ solanaAssetDetails/lcp: -17%
  • ↑ importSrpHome/loginToHomeScreen: +12%
  • ↑ importSrpHome/homeAfterImportWithNewWallet: +39%
  • ↑ importSrpHome/longTaskCount: +13%
  • ↑ importSrpHome/total: +36%
  • ↓ importSrpHome/cls: -15%
  • ↑ swap/openSwapPageFromHome: +71%
  • ↑ swap/longTaskCount: +33%
  • ↑ swap/longTaskTotalDuration: +33%
  • ↑ swap/longTaskMaxDuration: +40%
  • ↑ swap/tbt: +53%
  • ↓ swap/lcp: -74%
  • ↓ swap/cls: -30%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 importSrpHome/INP: p75 296ms
  • 🟡 solanaAssetDetails/FCP: p75 2.1s
  • 🟡 solanaAssetDetails/LCP: p75 2.7s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: -25.85 KiB (-0.18%)
  • ui: 1.76 KiB (0.01%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 430 Bytes (0.02%)
  • zip: -6.11 MiB (-22.5%)

🍒 What's in this RC

Cherry-picks (7 commits)
Commit Description
7c8fdb7d2e release(runway): cherry-pick fix: patch for missing slip44 entries in core client-utils cp-13.42.0 (#45039)
cd5a5de163 release(runway): cherry-pick fix: swaps stale dest exchange rates (#45011)
95f14e76ab release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45009)
387e08ad64 release(cp): bump: brace-expansion to 5.0.8 (#44924)
9e657a96f9 release(runway): cherry-pick fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44927)
7b1c84e9b7 release(cp): build: no more PNGs inside SVGs allowed, delete unused images (#44832)
03507b5e03 Merge branch 'stable' into release/13.42.0

Changelog (138 commits since v13.41.0)
Commit Description
7c8fdb7d2e release(runway): cherry-pick fix: patch for missing slip44 entries in core client-utils cp-13.42.0 (#45039)
cd5a5de163 release(runway): cherry-pick fix: swaps stale dest exchange rates (#45011)
95f14e76ab release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45009)
387e08ad64 release(cp): bump: brace-expansion to 5.0.8 (#44924)
9e657a96f9 release(runway): cherry-pick fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44927)
7b1c84e9b7 release(cp): build: no more PNGs inside SVGs allowed, delete unused images (#44832)
ea212236bf release(cp): fix: restored old behavior to show Paid by MetaMask label in sponsored transactions from activity page cp-13.41.0 (#44780)
8d9aabc289 release(runway): cherry-pick fix: handle missing account for cross-chain asset deeplinks cp-13.42.0 (#44913)
e8690470e1 release(runway): cherry-pick fix: updated checkbox and permissions page width cp-13.42.0 (#44906)
fbd3a5e978 release(runway): cherry-pick fix(activity): apply text color token to native dialog for dark theme cp-13.42.0 (#44873)
d5f6239719 release(cp): bump: tar to 7.5.22, ignore react-router advisories cp-13.41.0 (#44862)
78ce2e0cf9 release(cp): fix(deep-links): restore interstitial protection cp-13.42.0 (#44830)
5738947439 release(runway): cherry-pick fix(activity): transaction details width cp-13.42.0 (#44856)
a8682562fc release(runway): cherry-pick feat: keep the balance left aligned for lower viewport cp-13.42.0 (#44854)
189763ce27 release(cp): cherry-pick fix(assets): include tokens with large balances and few decimals in aggregated balance cp-13.41.0
8423f220d3 release: release-changelog/13.42.0 (#44798)
0c93b31dd8 Merge release/13.41.0 into release/13.42.0
446c5a25b5 fix: apply bg-alternative to legacy Popover in pure black theme (#44730)
c2c37a8a68 fix: apply border-muted to global menu drawer in pure black theme (#44729)
7e15155002 chore: remove unused legacy modals from ui/components/app/modals (#44731)
b03252588b fix: add device response timeout to Trezor bridges (#44626)
9ee3d987a7 feat: show skeleton for the whole balance block if the balance is not cached (#44703)
960369d180 fix: require interstitial for CAIP-19 asset deep links (#44639)
ef34172a99 refactor: migrate formatters to client-utils (#44624)
88c41e5489 test: cover Wallet Creation Attempted Segment event (#44673)
7a14cd7f6c feat: Updated the styles for swaps page (#44762)
ad64202e93 test: MMQA - 2035 - Fix antipatterns in sendPage which can lead to flakiness (#44640)
845b4a8f4a feat: updated avatarbase and banner alert to use DS (#44763)
3802fdba7c chore: migrate AvatarFavicon to MMDS (#44764)
a1b13be185 feat: seedless controller v10.1.0 (#44771)
864f5e5294 fix: patch bridge controller to exclude Stellar and Arc cp-13.41.0 (#44749)
ab4fbefa8d fix: non-evm bridge activity (#44751)
62fd747287 chore: removed deprecated checkbox with DS (#44765)
643d4d57cc test: added e2e tests for the new logic showing energy and bandwidth in sign transaction confirmation (#44756)
0fd8198e4b chore: remove border from pages (#44721)
1910a59ff9 feat(ledger): wire ledgerDmk flag to offscreen mode switching (#43488)
56f0a34156 chore: introduce bulk error suppression (#44739)
bd13fb6ec3 chore: updated networks for hardware accounts (#44531)
ab79e887a9 fix: updated search to be sticky and banner to scroll cp-13.41.0 (#44696)
34148d362e test(tron): prepare daily resources for E2E coverage (#44162)
4cd1d95222 chore: bump @metamask/tron-wallet-snap to ^1.33.1 (#44716)
906fee2c9d chore: bump assets controllers and remove patches (#44713)
dad0511577 test: fix flaky QrSync multi-SRP import confirm staleness timeout (#44700)
d50de2fac4 fix(metametrics): silence unmatched route Sentry noise for known paths (#44718)
4103808cae fix(ci): Remove "What's in this RC ...and more changes" section to match Extension RC Slack message to Mobile layout cp-13.41.0 (#44740)
7b2c1b2665 chore: update to ESLint v9 (#44734)
9faf0a6b5d feat: apply bg-alternative and border-muted to legacy Modal in pure black mode (#44726)
969f5c2aaa chore: update swap row labels (#44637)
2aa9b938e0 feat: apply bg-alternative and border-muted to ModalContent dialog in pure black mode (#44720)
9e40a87367 chore: New Crowdin Translations by GitHub Action cp-13.41.0 (#44595)
3ea61fd698 chore: remove unused ESLint directives from shared (#44679)
07651ccf9c chore: remove unused ESLint directives from ui/components (#44683)
0b58311684 chore: remove unused ESLint directives from remaining ui (#44685)
148b0844e4 bump: sharp to 0.35.3 (#44688)
ad1bbf43ce feat: show verified badge on swaps token button (#44623)
d5047c3a86 chore: replace sub tab screen opened metrics (#44093)
bb150a4058 feat: added skeleton for token list after stale open (#44705)
1d3f77fb38 ci: Harden absolute benchmark gate against within-noise breaches (#44609)
f3bd7f870e chore: align dapp connection bar styling with Figma spec (#44539)
42315a4087 feat: navigate users to batch sell through deeplink (#44671)
396263b848 chore: remove unneeded styles (#44693)
2acd3840a2 refactor(activity): use native dialog for transaction details (#44599)
65292d06fb bump: immutable to 5.1.9, fast-uri to 3.1.4, dompurify to 3.4.12, sass-embedded to 1.100.0 cp-13.41.0 (#44678)
57638a9616 chore: remove unused ESLint ignore directives from development (#44676)
7cb3eb6037 chore: split eslint ignore react-compiler directives (#44686)
14c815595a chore: remove unused ESLint directives from ui/pages (#44684)
8eac23857c chore: remove unused ESLint ignore directives from app (#44674)
8d99a5f7d3 test: fix flaky tests Add wallet Import wallet... (#44649)
4a1c57b063 test: fix flaky test Add account added account should persist after wallet lock (#44712)
2b218f3e77 chore(eslint): ignore .yarn and webpack build directory (#44666)
67b21b1e1b chore: update transaction controller (#44656)
77c6773132 chore: adds handler for top-traders (Follow Trading) deeplink redirect (#44660)
bceab0bb1e chore: bump @metamask/tron-wallet-snap to ^1.33.0 (#44698)
fa3885cf81 feat: setup for new defi flag (#44652)
0afcd07800 test: refactor snap-account-abstraction page object to remove references to other page objects (#44690)
3051cf4133 test: refactor account-list page object to remove references to other page objects (#44651)
edb7daa756 fix: clear orphaned advancedGasFee preference (migration 216) (#44205)
59f15bc6b0 fix: remove useAssetActivation test to unblock assets controllers bump up (#44699)
52b4b3d877 feat: removed back transitions unused selector (#44691)
f9f5e1dc48 fix: update slider step to one in batch sell (#44648)
a7847a0538 fix: do not render assets without quotes in review modal (#44650)
efa96b445e refactor: use modern clipboard api (#44622)
80b66e6c4e chore: removed sidepanel viewport max width constraint (#44647)
6d970c423d test: encryption and decryption Segment events (#44607)
1ff9bf422b chore: remove unused ESLint ignore directives from test directory (#44669)
2518a3727c feat(ui): add pure-black dark mode behind build-time flag (#44183)
d07ea1771f test: update swaps unit test mocks (#44627)
c6fc026ec2 chore: refactor ESLint overrides (#44663)
6fb3e32f55 bump: valibot to 1.4.2, body-parser to 1.20.6 and 2.3.0 (#44664)
b8c3584c53 fix(notifications): keep announcement home link in tab (#43419)
6e0219f5d6 chore: skip linting Jest snapshots (#44665)
a84d6539f5 feat: render high rate alert modal in batch sell review page (#44646)
0d81022be0 feat: integrate STX failTransaction fix (bridge stuck-pending) (#44372)
8f66b8fc55 feat: add bottom nav bar source to perps view events (#44611)
6fb1d6ba46 chore: update @metamask/gator-permissions-snap to version 2.4.0 (#44499)
9b12c19790 test: cover Empty Buy Banner Displayed event (#44617)
6c0217c496 feat: add bottom nav transitions (#44641)
8ae5ce634e chore: use same toaster-bottom-offset var for legacy toasts (#44654)
5da5008a3a test: MMQA - 1975 - Enhance feature flag validation/drift PR to omit re-orders without value change (#43814)
261773c0bb test: fix flaky tests Check balance For a non 0 balance account... (#44479)
5207d27d9c feat: add bottom nav experiment display logic and e2e tests (#44403)
1f66fc6cd7 release: Bump main version to 13.42.0 (#44642)
9962ac769f feat: implement close positions with limit orders (#44466)
477be3b0bc feat(e2e): add Tron test fixtures and environment helpers (#44160)
ffd91160c9 fix: various fixes and improvements on batch sell select page (#44603)
e091fe0b04 fix(assets): wire tempMigrateAssetsInfoMetadataAssets3346 into AssetsController init (#44303)
b685e6bf62 test: MMQA - 2034 - Fix antipatterns in qr-sync.spec.ts (#44600)
1548788667 bump: multiple to fix audit cp-13.41.0 (#44634)
6647504ca3 feat: consume backend-suggested slippage in unified swap/bridge (#44537)
e29c451b29 feat: import alias via node subpath imports (#44621)
f7f67d320b feat(ramps): add provider selection page with async quotes (#44553)
e9b745e8e5 chore: remove dead code (#44612)
bb5e12f804 refactor: migrate multichain review permissions toast (#44505)
fc5d600b60 refactor: add useEventListener (#44596)
c95feca137 Merge origin/main into stable-main-13.40.0
d8c683d6c9 feat(e2e): add Tron swap token registry and quote fixtures (#44159)
39d6aa6899 refactor: migrate buy button toast (#44510)
4fa405c7e6 fix: dedicated convert mUSD details cp-13.41.0 (#44586)
a6942d1c60 feat(support): replace raw profile params with customer service token (#44482)
d4987093b8 refactor: migrate delete metametrics toast (#44503)
22c64b7f3f refactor: migrate permissions disconnect-all toast (#44504)
227a3644f0 feat(ramps): show per-method quotes on payment selection (#44526)
abc8a8267c feat: update bottom bar navigation to swaps page (#44233)
3784ae3945 feat: added decimal validation for custom token import flow cp-13.41.0 (#44602)
b495bf455d chore: patch @metamask/assets-controller for suggested occurrence floors (#44525)
88bc6591dc feat(ci): add Runway orchestrator starter and store submission CODEOWNERS (#44017)
1894816b17 refactor(analytics): remove MetaMetricsController shims and finish background migration (#44380)
c4af8823c1 feat(hardware-wallets): add signing page orchestrator (#43943)
e8baf89ff4 fix(ci): align Extension RC Slack notes with Mobile Runway changelog (#44597)
7bfc16cfc0 bump: Upgrade @sentry/browser from 8.33.1 to 10.38.0 (#42867)
a25c6a5b07 chore(6932): convert final legacy context consumers to useI18nContext for React 19 (#44493)
9b908f58d4 test: fix Add wallet Import wallet using json file - TimeoutError: Waiting for element to be located By(css selector, [data-testid="choose-wallet-type-import-account"]) (#44464)
6183003c90 refactor: resolve activity list redesign (#44365)
576a79fa6d chore: allow history navigate on activity details (#44467)
593690c0f7 chore: remove browserify (#44433)
1456a2100a fix: keep bridge activity item as pending until dest tx resolves cp-13.40.0 (#44536)
aa09362f39 fix: don't hold the KeyringController lock during hardware wallets reads (#44483)
0f5ef841a3 refactor(activity): handle swaps missing destination token (#44501)

AI Test Plan

Risk Score High Risk Medium Risk Files Changed Commits
57/100 7 4 1285 141
Cherry-Pick Scenarios (4)

High Risk Scenarios (3)

1. Security: Deep Link Interstitial Protection

Risk Level: HIGH

Why This Matters: Cherry-pick #44830 fixes a regression that removed deep-link interstitial protection; without it, malicious links could silently perform actions.

Test Steps:

  1. From an external link (e.g., metamask://add-network?chainId=0x89 or metamask.app.link deep link), trigger opening the extension to perform an action (add network or connect).
  2. Verify an interstitial confirmation screen appears before any action is executed; review details and proceed.
  3. Cancel the interstitial and confirm no side effects occurred (no network added, no connection established).
  4. Repeat with a different action type (e.g., add token) and confirm consistent protection.

2. Deep Links: Cross-Chain Asset Links With Missing Account

Risk Level: HIGH

Why This Matters: Cherry-pick #44913 fixes crashes when handling cross-chain asset deep links without an existing account; users must be guided safely to create/select an account.

Test Steps:

  1. With only an Ethereum account configured, open a deep link targeting an asset on a different chain (e.g., BSC token details).
  2. Verify the extension prompts to add/switch to the target network and to select or create an account if none exists for that chain.
  3. Complete the prompts and confirm the asset detail screen loads; cancel mid-flow and verify a clean rollback with no crashes or blank screens.

3. Swaps: Stale Destination Exchange Rates

Risk Level: HIGH

Why This Matters: Cherry-pick #45011 fixes stale destination rate issues; incorrect rates can cause users to accept bad swaps or fail transactions.

Test Steps:

  1. Open Swaps, select a pair (e.g., ETH → USDC) and note the 'You receive' amount and rate.
  2. Rapidly change the destination token and slippage; verify the displayed destination amount and rate update promptly without showing the previous token’s rate.
  3. Wait for auto-refresh and switch networks; confirm quotes refresh and no stale data persists into the confirmation screen.
  4. Proceed to confirmation and verify the quote in the confirm screen matches the latest displayed values.

Medium Risk Scenarios (1)

1. Accounts/Networks: Missing slip44 Entries Handling

Risk Level: MEDIUM

Why This Matters: Cherry-pick #45039 adds missing slip44 entries; without correct mappings, account creation or address derivation could fail or misbehave on some chains.

Test Steps:

  1. Add or switch to a supported EVM chain with a non-standard slip44 mapping (e.g., Celo) and create a new account.
  2. Verify account creation does not error and addresses remain consistent when switching networks.
  3. Import an external private key account and ensure it displays and functions correctly across these networks (balances/transactions visible).

Release Scenarios (7)

High Risk Scenarios (4)

1. State Migration (Migration 219)

Risk Level: HIGH

Why This Matters: New migrations can corrupt or drop user data; verifying persistence of accounts, networks, and assets prevents irreversible loss and broken core flows after upgrade.

Test Steps:

  1. Start with 13.41.x profile: 2+ HD accounts, 1 imported account, custom networks (e.g., Polygon, BSC), custom tokens and 1 imported NFT; ensure dark mode enabled and fiat currency changed.
  2. Upgrade to 13.42.0 and unlock; wait for the app to fully load.
  3. Verify all accounts, balances, NFTs, connected sites, custom networks, and settings (theme, currency, token detection) persist.
  4. Open Activity and confirm historical transactions are visible and correct across networks; open a transaction details view and ensure no errors.
  5. Attempt a normal send on mainnet and a network switch to a custom RPC to confirm no blocked flows or crashes post-migration.

2. Token Management (Assets Controller 11.0.0 upgrade)

Risk Level: HIGH

Why This Matters: A major Assets Controller bump can change detection, pricing, and caching behavior; regressions here break balances, token visibility, and user trust.

Test Steps:

  1. On Ethereum and a sidechain (e.g., Polygon), toggle Token Detection on/off and observe the token list change accordingly.
  2. Add a custom ERC-20 via Add Token (contract + decimals), then verify symbol, balance, and icon render correctly in both home and asset detail views.
  3. Hide and then unhide the custom token; switch networks and confirm visibility state is network-specific and consistent.
  4. Trigger a balance refresh by switching accounts and reopening the asset; confirm balance and fiat price update without stale values.

3. NFTs (Detection/Import and Metadata Rendering)

Risk Level: HIGH

Why This Matters: NFT handling depends on asset metadata pipelines; controller or UI changes can cause missing images, wrong metadata, or duplicate/vanishing NFTs.

Test Steps:

  1. On Ethereum, import an NFT manually (contract + token ID) and verify the image, name, and ID render in the NFT tab and details screen.
  2. Switch to dark mode and reopen the NFT details; confirm text and icons remain legible and no broken images occur.
  3. Switch networks and return to Ethereum; verify NFT persists only on the correct network and metadata remains intact.
  4. Remove the NFT and reimport it; confirm no duplicate entries or cache-related glitches.

4. Bridge (Quotes, Approvals, and Confirmation)

Risk Level: HIGH

Why This Matters: Bridge flows rely on controller logic for quotes and multi-step approvals; errors can lock users in pending states or cause incorrect cross-chain transfers.

Test Steps:

  1. Open Bridge, select Ethereum → Polygon and pick a common token (e.g., USDC); request a quote and confirm fees/ETA display.
  2. Change the amount and token quickly; verify quotes refresh appropriately without stale data or spinners stuck.
  3. Proceed to confirmation; verify approval steps (if required) and final summary (source/destination chains, token, amount, fees) are accurate.
  4. Cancel from confirmation; verify any prior approvals are not left pending and Bridge returns to a clean state.

Medium Risk Scenarios (3)

1. Transaction Sending and Error Handling (API Error Handler)

Risk Level: MEDIUM

Why This Matters: Improper API error handling can mislead users and enable broken transactions; clear, recoverable errors are essential for safety and usability.

Test Steps:

  1. Configure a custom RPC that returns errors (e.g., invalid URL) and switch to it.
  2. Attempt to open the send flow or fetch account activity; verify an inline error banner/dialog appears with a clear message.
  3. Switch back to a working network and confirm the error state clears automatically and normal operations resume.
  4. From a dapp, try a transaction on the bad RPC; verify the confirm screen blocks appropriately with an actionable error.

2. Permissions and Encryption (eth_getEncryptionPublicKey / eth_decrypt)

Risk Level: MEDIUM

Why This Matters: Even small changes to encryption/decryption flows can break dapp integrations or leak data; correct prompts and permission handling are security-critical.

Test Steps:

  1. From a test dapp, request eth_getEncryptionPublicKey; approve and verify a valid key is returned to the dapp.
  2. Have the dapp encrypt a message with that key and request eth_decrypt; verify the confirmation shows the correct account and message, then approve and confirm the dapp receives plaintext.
  3. Lock the wallet, repeat eth_decrypt; ensure unlock flow triggers, then continues the request seamlessly post-unlock.
  4. Reject the decrypt request; ensure the dapp receives a proper rejection error and no stale confirmation remains open.

3. Alert System (Modals, Inline Alerts, Stacking)

Risk Level: MEDIUM

Why This Matters: Refactors to the alert system can cause missing confirmations or stuck alerts that block critical user actions and lead to mistaken confirmations.

Test Steps:

  1. Trigger a destructive action in Settings (e.g., attempt Reset Account) and verify the confirm-alert modal copies, colors, and buttons render correctly; cancel and confirm no unintended state changes.
  2. On Send flow, input an invalid address to show an inline alert; correct the address and ensure the alert dismisses immediately.
  3. While an alert is visible, trigger another (e.g., wrong password to view seed phrase); verify stacking or replacement behaves predictably without overlapping or orphaned alerts.
  4. Repeat in dark mode to ensure contrast and readability are appropriate.

Teams Sign-off Status

Signed off: None yet

Awaiting sign-off (9):
Accounts, Assets, Confirmations, Networks, Permissions, Security, Swaps, Swaps and Bridge, Transactions


Generated by AI Test Plan Analyzer (gpt-5) at 2026-07-30T17:20:36.412Z

AI generated test plan (JSON): test-plan-13.42.0.json

runway-github Bot added 3 commits July 30, 2026 12:46
- fix: clear the postcss advisories cp-13.42.0 (#44865)

CHANGELOG entry: null
…nt-creation spinner with device-read timeout cp-13.42.0 (#45053)

- fix(hardware-wallets): bound stuck account-creation spinner with device-read timeout cp-13.42.0 (#45048)

CHANGELOG entry: Fixed a bug where connecting a hardware wallet account could leave the loading spinner stuck forever if the device stopped responding
…45049)

- feat: added timer for balance loading cp-13.42.0 (#45033)

CHANGELOG entry: null
@HowardBraham

Copy link
Copy Markdown
Contributor

@SocketSecurity ignore npm/css-tree@3.2.1
@SocketSecurity ignore npm/colord@2.9.3
@SocketSecurity ignore npm/css-tree@3.2.1
@SocketSecurity ignore npm/stylelint@17.14.1

@metamask-ci

metamask-ci Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor
Builds ready [4a4800e]
⚡ Performance Benchmarks (Total: 🟢 14 pass · 🟡 6 warn · 🔴 4 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30579013429 | Baseline logs

Metricschrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 srpButtonToSrpForm(p95) [CI log]🔴 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🔴 tbt(p95) [CI log]🔴 [CI log]

Regressions (🔴 4 failures)

Interaction Benchmarks · Samples: 5
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
confirmTx
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
🟡 bridge_search_token

📈 Results compared to the previous 5 runs on main

  • ↓ bridgeUserActions/bridge_load_asset_picker: -16%
  • ↓ bridgeUserActions/longTaskCount: -44%
  • ↓ bridgeUserActions/longTaskTotalDuration: -33%
  • ↓ loadNewAccount/inp: -24%
  • ↑ loadNewAccount/lcp: +1142%
  • ↑ confirmTx/confirm_tx: +14%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↑ confirmTx/total: +14%
  • ↓ confirmTx/inp: -24%
  • ↑ confirmTx/lcp: +1246%
  • ↑ bridgeUserActions/bridge_load_page: +250%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +93%
  • ↑ bridgeUserActions/bridge_search_token: +214%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +187%
  • ↓ bridgeUserActions/inp: -23%
  • ↓ bridgeUserActions/fcp: -47%
  • ↑ bridgeUserActions/lcp: +1108%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 loadNewAccount/FCP: p75 1.8s
  • 🟡 confirmTx/FCP: p75 1.8s
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
🟡 loadScripts
startupPowerUserHome
[Sentry log · main/release]
–🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ startupStandardHome/domInteractive: -26%
  • ↓ startupStandardHome/fcp: -21%
  • ↑ startupPowerUserHome/uiStartup: +22%
  • ↑ startupPowerUserHome/load: +13%
  • ↑ startupPowerUserHome/domContentLoaded: +13%
  • ↑ startupPowerUserHome/domInteractive: +26%
  • ↑ startupPowerUserHome/backgroundConnect: +24%
  • ↑ startupPowerUserHome/firstReactRender: +10%
  • ↑ startupPowerUserHome/initialActions: +11%
  • ↑ startupPowerUserHome/loadScripts: +13%
  • ↑ startupPowerUserHome/setupStore: +274%
  • ↑ startupPowerUserHome/inp: +23%
  • ↑ startupPowerUserHome/fcp: +22%
  • ↑ startupPowerUserHome/lcp: +19%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 startupPowerUserHome/INP: p75 232ms
  • 🟡 startupPowerUserHome/LCP: p75 3.4s
User Journey Benchmarks · Samples: 5 · real API 🔴 4
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 doneButtonToHomeScreen
🔴 total
🔴 [CI log]
🔴 total
onboardingNewWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 total
🔴 [CI log]
🔴 total
assetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
importSrpHome
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
sendTransactions
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ onboardingImportWallet/srpButtonToSrpForm: +18%
  • ↑ onboardingImportWallet/doneButtonToHomeScreen: +59%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -32%
  • ↑ onboardingImportWallet/total: +23%
  • ↓ onboardingNewWallet/agreeButtonToOnboardingSuccess: -15%
  • ↑ onboardingNewWallet/tbt: +29%
  • ↑ solanaAssetDetails/assetClickToPriceChart: +26%
  • ↓ solanaAssetDetails/longTaskCount: -100%
  • ↓ solanaAssetDetails/longTaskTotalDuration: -100%
  • ↓ solanaAssetDetails/longTaskMaxDuration: -100%
  • ↓ solanaAssetDetails/tbt: -100%
  • ↑ solanaAssetDetails/total: +26%
  • ↑ importSrpHome/homeAfterImportWithNewWallet: +26%
  • ↑ importSrpHome/longTaskCount: +13%
  • ↑ importSrpHome/longTaskTotalDuration: +16%
  • ↑ importSrpHome/total: +24%
  • ↓ importSrpHome/cls: -15%
  • ↓ sendTransactions/openSendPageFromHome: -50%
  • ↓ sendTransactions/selectTokenToSendFormLoaded: -32%
  • ↓ sendTransactions/reviewTransactionToConfirmationPage: -99%
  • ↓ sendTransactions/longTaskCount: -100%
  • ↓ sendTransactions/longTaskTotalDuration: -100%
  • ↓ sendTransactions/longTaskMaxDuration: -100%
  • ↓ sendTransactions/tbt: -100%
  • ↓ sendTransactions/total: -97%
  • ↓ sendTransactions/inp: -19%
  • ↓ sendTransactions/fcp: -30%
  • ↓ sendTransactions/lcp: -64%
  • ↓ sendTransactions/cls: -20%
  • ↓ swap/openSwapPageFromHome: -59%
  • ↓ swap/fetchAndDisplaySwapQuotes: -15%
  • ↓ swap/longTaskCount: -100%
  • ↓ swap/longTaskTotalDuration: -100%
  • ↓ swap/longTaskMaxDuration: -100%
  • ↓ swap/tbt: -100%
  • ↓ swap/total: -16%
  • ↓ swap/inp: -44%
  • ↓ swap/fcp: -33%
  • ↓ swap/lcp: -80%
  • ↓ swap/cls: -30%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 importSrpHome/INP: p75 312ms
  • 🟡 solanaAssetDetails/FCP: p75 2.0s
  • 🟡 solanaAssetDetails/LCP: p75 2.6s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: -25.49 KiB (-0.17%)
  • ui: 2.4 KiB (0.01%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 422 Bytes (0.02%)
  • zip: -6.11 MiB (-22.5%)

🍒 What's in this RC

Cherry-picks (10 commits)
Commit Description
4a4800eb1c release(runway): cherry-pick feat: added timer for balance loading (#45049)
501c175040 release(runway): cherry-pick fix(hardware-wallets): bound stuck account-creation spinner with device-read timeout cp-13.42.0 (#45053)
3acb3670a3 release(runway): cherry-pick fix: clear the postcss advisories (#45051)
7c8fdb7d2e release(runway): cherry-pick fix: patch for missing slip44 entries in core client-utils cp-13.42.0 (#45039)
cd5a5de163 release(runway): cherry-pick fix: swaps stale dest exchange rates (#45011)
95f14e76ab release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45009)
387e08ad64 release(cp): bump: brace-expansion to 5.0.8 (#44924)
9e657a96f9 release(runway): cherry-pick fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44927)
7b1c84e9b7 release(cp): build: no more PNGs inside SVGs allowed, delete unused images (#44832)
03507b5e03 Merge branch 'stable' into release/13.42.0

Changelog (141 commits since v13.41.0)
Commit Description
4a4800eb1c release(runway): cherry-pick feat: added timer for balance loading (#45049)
501c175040 release(runway): cherry-pick fix(hardware-wallets): bound stuck account-creation spinner with device-read timeout cp-13.42.0 (#45053)
3acb3670a3 release(runway): cherry-pick fix: clear the postcss advisories (#45051)
7c8fdb7d2e release(runway): cherry-pick fix: patch for missing slip44 entries in core client-utils cp-13.42.0 (#45039)
cd5a5de163 release(runway): cherry-pick fix: swaps stale dest exchange rates (#45011)
95f14e76ab release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45009)
387e08ad64 release(cp): bump: brace-expansion to 5.0.8 (#44924)
9e657a96f9 release(runway): cherry-pick fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44927)
7b1c84e9b7 release(cp): build: no more PNGs inside SVGs allowed, delete unused images (#44832)
ea212236bf release(cp): fix: restored old behavior to show Paid by MetaMask label in sponsored transactions from activity page cp-13.41.0 (#44780)
8d9aabc289 release(runway): cherry-pick fix: handle missing account for cross-chain asset deeplinks cp-13.42.0 (#44913)
e8690470e1 release(runway): cherry-pick fix: updated checkbox and permissions page width cp-13.42.0 (#44906)
fbd3a5e978 release(runway): cherry-pick fix(activity): apply text color token to native dialog for dark theme cp-13.42.0 (#44873)
d5f6239719 release(cp): bump: tar to 7.5.22, ignore react-router advisories cp-13.41.0 (#44862)
78ce2e0cf9 release(cp): fix(deep-links): restore interstitial protection cp-13.42.0 (#44830)
5738947439 release(runway): cherry-pick fix(activity): transaction details width cp-13.42.0 (#44856)
a8682562fc release(runway): cherry-pick feat: keep the balance left aligned for lower viewport cp-13.42.0 (#44854)
189763ce27 release(cp): cherry-pick fix(assets): include tokens with large balances and few decimals in aggregated balance cp-13.41.0
8423f220d3 release: release-changelog/13.42.0 (#44798)
0c93b31dd8 Merge release/13.41.0 into release/13.42.0
446c5a25b5 fix: apply bg-alternative to legacy Popover in pure black theme (#44730)
c2c37a8a68 fix: apply border-muted to global menu drawer in pure black theme (#44729)
7e15155002 chore: remove unused legacy modals from ui/components/app/modals (#44731)
b03252588b fix: add device response timeout to Trezor bridges (#44626)
9ee3d987a7 feat: show skeleton for the whole balance block if the balance is not cached (#44703)
960369d180 fix: require interstitial for CAIP-19 asset deep links (#44639)
ef34172a99 refactor: migrate formatters to client-utils (#44624)
88c41e5489 test: cover Wallet Creation Attempted Segment event (#44673)
7a14cd7f6c feat: Updated the styles for swaps page (#44762)
ad64202e93 test: MMQA - 2035 - Fix antipatterns in sendPage which can lead to flakiness (#44640)
845b4a8f4a feat: updated avatarbase and banner alert to use DS (#44763)
3802fdba7c chore: migrate AvatarFavicon to MMDS (#44764)
a1b13be185 feat: seedless controller v10.1.0 (#44771)
864f5e5294 fix: patch bridge controller to exclude Stellar and Arc cp-13.41.0 (#44749)
ab4fbefa8d fix: non-evm bridge activity (#44751)
62fd747287 chore: removed deprecated checkbox with DS (#44765)
643d4d57cc test: added e2e tests for the new logic showing energy and bandwidth in sign transaction confirmation (#44756)
0fd8198e4b chore: remove border from pages (#44721)
1910a59ff9 feat(ledger): wire ledgerDmk flag to offscreen mode switching (#43488)
56f0a34156 chore: introduce bulk error suppression (#44739)
bd13fb6ec3 chore: updated networks for hardware accounts (#44531)
ab79e887a9 fix: updated search to be sticky and banner to scroll cp-13.41.0 (#44696)
34148d362e test(tron): prepare daily resources for E2E coverage (#44162)
4cd1d95222 chore: bump @metamask/tron-wallet-snap to ^1.33.1 (#44716)
906fee2c9d chore: bump assets controllers and remove patches (#44713)
dad0511577 test: fix flaky QrSync multi-SRP import confirm staleness timeout (#44700)
d50de2fac4 fix(metametrics): silence unmatched route Sentry noise for known paths (#44718)
4103808cae fix(ci): Remove "What's in this RC ...and more changes" section to match Extension RC Slack message to Mobile layout cp-13.41.0 (#44740)
7b2c1b2665 chore: update to ESLint v9 (#44734)
9faf0a6b5d feat: apply bg-alternative and border-muted to legacy Modal in pure black mode (#44726)
969f5c2aaa chore: update swap row labels (#44637)
2aa9b938e0 feat: apply bg-alternative and border-muted to ModalContent dialog in pure black mode (#44720)
9e40a87367 chore: New Crowdin Translations by GitHub Action cp-13.41.0 (#44595)
3ea61fd698 chore: remove unused ESLint directives from shared (#44679)
07651ccf9c chore: remove unused ESLint directives from ui/components (#44683)
0b58311684 chore: remove unused ESLint directives from remaining ui (#44685)
148b0844e4 bump: sharp to 0.35.3 (#44688)
ad1bbf43ce feat: show verified badge on swaps token button (#44623)
d5047c3a86 chore: replace sub tab screen opened metrics (#44093)
bb150a4058 feat: added skeleton for token list after stale open (#44705)
1d3f77fb38 ci: Harden absolute benchmark gate against within-noise breaches (#44609)
f3bd7f870e chore: align dapp connection bar styling with Figma spec (#44539)
42315a4087 feat: navigate users to batch sell through deeplink (#44671)
396263b848 chore: remove unneeded styles (#44693)
2acd3840a2 refactor(activity): use native dialog for transaction details (#44599)
65292d06fb bump: immutable to 5.1.9, fast-uri to 3.1.4, dompurify to 3.4.12, sass-embedded to 1.100.0 cp-13.41.0 (#44678)
57638a9616 chore: remove unused ESLint ignore directives from development (#44676)
7cb3eb6037 chore: split eslint ignore react-compiler directives (#44686)
14c815595a chore: remove unused ESLint directives from ui/pages (#44684)
8eac23857c chore: remove unused ESLint ignore directives from app (#44674)
8d99a5f7d3 test: fix flaky tests Add wallet Import wallet... (#44649)
4a1c57b063 test: fix flaky test Add account added account should persist after wallet lock (#44712)
2b218f3e77 chore(eslint): ignore .yarn and webpack build directory (#44666)
67b21b1e1b chore: update transaction controller (#44656)
77c6773132 chore: adds handler for top-traders (Follow Trading) deeplink redirect (#44660)
bceab0bb1e chore: bump @metamask/tron-wallet-snap to ^1.33.0 (#44698)
fa3885cf81 feat: setup for new defi flag (#44652)
0afcd07800 test: refactor snap-account-abstraction page object to remove references to other page objects (#44690)
3051cf4133 test: refactor account-list page object to remove references to other page objects (#44651)
edb7daa756 fix: clear orphaned advancedGasFee preference (migration 216) (#44205)
59f15bc6b0 fix: remove useAssetActivation test to unblock assets controllers bump up (#44699)
52b4b3d877 feat: removed back transitions unused selector (#44691)
f9f5e1dc48 fix: update slider step to one in batch sell (#44648)
a7847a0538 fix: do not render assets without quotes in review modal (#44650)
efa96b445e refactor: use modern clipboard api (#44622)
80b66e6c4e chore: removed sidepanel viewport max width constraint (#44647)
6d970c423d test: encryption and decryption Segment events (#44607)
1ff9bf422b chore: remove unused ESLint ignore directives from test directory (#44669)
2518a3727c feat(ui): add pure-black dark mode behind build-time flag (#44183)
d07ea1771f test: update swaps unit test mocks (#44627)
c6fc026ec2 chore: refactor ESLint overrides (#44663)
6fb3e32f55 bump: valibot to 1.4.2, body-parser to 1.20.6 and 2.3.0 (#44664)
b8c3584c53 fix(notifications): keep announcement home link in tab (#43419)
6e0219f5d6 chore: skip linting Jest snapshots (#44665)
a84d6539f5 feat: render high rate alert modal in batch sell review page (#44646)
0d81022be0 feat: integrate STX failTransaction fix (bridge stuck-pending) (#44372)
8f66b8fc55 feat: add bottom nav bar source to perps view events (#44611)
6fb1d6ba46 chore: update @metamask/gator-permissions-snap to version 2.4.0 (#44499)
9b12c19790 test: cover Empty Buy Banner Displayed event (#44617)
6c0217c496 feat: add bottom nav transitions (#44641)
8ae5ce634e chore: use same toaster-bottom-offset var for legacy toasts (#44654)
5da5008a3a test: MMQA - 1975 - Enhance feature flag validation/drift PR to omit re-orders without value change (#43814)
261773c0bb test: fix flaky tests Check balance For a non 0 balance account... (#44479)
5207d27d9c feat: add bottom nav experiment display logic and e2e tests (#44403)
1f66fc6cd7 release: Bump main version to 13.42.0 (#44642)
9962ac769f feat: implement close positions with limit orders (#44466)
477be3b0bc feat(e2e): add Tron test fixtures and environment helpers (#44160)
ffd91160c9 fix: various fixes and improvements on batch sell select page (#44603)
e091fe0b04 fix(assets): wire tempMigrateAssetsInfoMetadataAssets3346 into AssetsController init (#44303)
b685e6bf62 test: MMQA - 2034 - Fix antipatterns in qr-sync.spec.ts (#44600)
1548788667 bump: multiple to fix audit cp-13.41.0 (#44634)
6647504ca3 feat: consume backend-suggested slippage in unified swap/bridge (#44537)
e29c451b29 feat: import alias via node subpath imports (#44621)
f7f67d320b feat(ramps): add provider selection page with async quotes (#44553)
e9b745e8e5 chore: remove dead code (#44612)
bb5e12f804 refactor: migrate multichain review permissions toast (#44505)
fc5d600b60 refactor: add useEventListener (#44596)
c95feca137 Merge origin/main into stable-main-13.40.0
d8c683d6c9 feat(e2e): add Tron swap token registry and quote fixtures (#44159)
39d6aa6899 refactor: migrate buy button toast (#44510)
4fa405c7e6 fix: dedicated convert mUSD details cp-13.41.0 (#44586)
a6942d1c60 feat(support): replace raw profile params with customer service token (#44482)
d4987093b8 refactor: migrate delete metametrics toast (#44503)
22c64b7f3f refactor: migrate permissions disconnect-all toast (#44504)
227a3644f0 feat(ramps): show per-method quotes on payment selection (#44526)
abc8a8267c feat: update bottom bar navigation to swaps page (#44233)
3784ae3945 feat: added decimal validation for custom token import flow cp-13.41.0 (#44602)
b495bf455d chore: patch @metamask/assets-controller for suggested occurrence floors (#44525)
88bc6591dc feat(ci): add Runway orchestrator starter and store submission CODEOWNERS (#44017)
1894816b17 refactor(analytics): remove MetaMetricsController shims and finish background migration (#44380)
c4af8823c1 feat(hardware-wallets): add signing page orchestrator (#43943)
e8baf89ff4 fix(ci): align Extension RC Slack notes with Mobile Runway changelog (#44597)
7bfc16cfc0 bump: Upgrade @sentry/browser from 8.33.1 to 10.38.0 (#42867)
a25c6a5b07 chore(6932): convert final legacy context consumers to useI18nContext for React 19 (#44493)
9b908f58d4 test: fix Add wallet Import wallet using json file - TimeoutError: Waiting for element to be located By(css selector, [data-testid="choose-wallet-type-import-account"]) (#44464)
6183003c90 refactor: resolve activity list redesign (#44365)
576a79fa6d chore: allow history navigate on activity details (#44467)
593690c0f7 chore: remove browserify (#44433)
1456a2100a fix: keep bridge activity item as pending until dest tx resolves cp-13.40.0 (#44536)
aa09362f39 fix: don't hold the KeyringController lock during hardware wallets reads (#44483)
0f5ef841a3 refactor(activity): handle swaps missing destination token (#44501)

AI Test Plan

Risk Score High Risk Medium Risk Files Changed Commits
60/100 7 8 1288 144
Cherry-Pick Scenarios (6)

High Risk Scenarios (4)

1. Security: Deep Link Interstitial Protection

Risk Level: HIGH

Why This Matters: Cherry-pick 44830 fixes a regression where deep links could bypass the protective interstitial, which is a user safety boundary.

Test Steps:

  1. With the extension unlocked, open a MetaMask deep link that triggers an action (e.g., add token, add/switch network).
  2. Verify an interstitial confirmation appears showing the action and source; select Cancel and confirm no state changes.
  3. Repeat and Approve; verify the intended action executes and only once.
  4. Trigger the same deep link from an external site and confirm the same protection behavior.

2. Deep Links: Missing Account Handling for Cross-Chain Asset Links

Risk Level: HIGH

Why This Matters: Cherry-pick 44913 fixes crashes or dead-ends when deep links reference assets on chains/accounts not yet available in the wallet.

Test Steps:

  1. Use a cross-chain asset deep link targeting a network not currently added or selected in the extension.
  2. Verify the UI gracefully prompts to add/switch network and/or select an account rather than crashing or landing on a broken screen.
  3. After adding/switching, confirm the link resolves to the correct asset view without state corruption.

3. Swaps: Stale Destination Exchange Rates

Risk Level: HIGH

Why This Matters: Cherry-pick 45011 fixes stale destination quotes that can lead to incorrect expectations and potential value loss.

Test Steps:

  1. Open Swaps, select a source token and rapidly change the destination token and/or network; observe the quoted rate.
  2. Wait for a short period and confirm the destination rate refreshes automatically and stays in sync with selections.
  3. Proceed to a quote and confirm that the final rate matches the most recent pre-submission rate (no stale carryover).
  4. Adjust slippage and verify the quote/rate recalculates correctly.

4. Accounts/Keyrings: Missing SLIP-44 Entries

Risk Level: HIGH

Why This Matters: Cherry-pick 45039 fixes missing SLIP-44 mappings that can cause incorrect derivation paths, yielding wrong addresses especially on hardware wallets.

Test Steps:

  1. Connect a hardware wallet and add an account on a network with a non-standard coin type (e.g., Celo, RSK) after adding that network.
  2. Verify the derived address matches the expected path for that chain and does not mismatch previously imported addresses.
  3. Switch between networks and confirm the address stability and no derivation errors are shown.

Medium Risk Scenarios (2)

1. Hardware Wallets: Device Read Timeout during Account Creation

Risk Level: MEDIUM

Why This Matters: Cherry-pick 45053 fixes a stuck spinner that traps users when device reads hang, improving recovery and trust.

Test Steps:

  1. Start adding a Ledger/Trezor account, then simulate a stalled device read (do not confirm on device or disconnect).
  2. Verify the spinner stops after a reasonable timeout and a clear, actionable error is shown (e.g., Retry, Reconnect).
  3. Retry with the device properly connected/confirmed and ensure account import completes successfully.

2. Balances: Loading Timer to Avoid Flicker/Stale Display

Risk Level: MEDIUM

Why This Matters: Cherry-pick 45049 introduces a balance loading timer; incorrect timing can show stale values or cause confusing UI flicker.

Test Steps:

  1. On a slow network or after locking/unlocking, observe the balance area; confirm a skeleton/placeholder appears before the balance renders.
  2. Rapidly switch networks and accounts and ensure no stale balances flash and the placeholder behavior is consistent.
  3. Check the popup and full-screen views to confirm consistent timing and no layout jank.

Release Scenarios (9)

High Risk Scenarios (3)

1. State Migration (Migration 219)

Risk Level: HIGH

Why This Matters: Data migrations can corrupt or drop user data (accounts, assets, networks). A faulty migration can silently break core wallet operations.

Test Steps:

  1. Start on 13.41.x with: two software accounts, one hardware account, at least one custom network (RPC), several watched ERC-20 tokens and at least one NFT; have 1-2 connected sites and custom preferences set (currency, privacy).
  2. Upgrade to 13.42.0 and unlock; wait for any background sync to complete.
  3. Verify all accounts (including hardware) are present, selected account preserved, connected sites remain connected, and custom preferences persist.
  4. Confirm watched tokens and NFTs are still present with correct balances/fiat and no duplicated or missing assets across networks.
  5. Send a small transaction on a custom network to ensure post-migration signing/nonce/gas behavior is intact and activity history remains accessible.

2. Token Management (Assets Controller v11 upgrade)

Risk Level: HIGH

Why This Matters: A major Assets Controller change can impact token detection, metadata accuracy, and fiat conversions, directly affecting balances and user trust.

Test Steps:

  1. On Ethereum mainnet, enable token detection and verify popular tokens auto-appear with correct name, symbol, decimals, and logos.
  2. Manually watch a custom ERC-20 by contract address and verify metadata (symbol/decimals) auto-resolves correctly; remove it and confirm fiat total updates immediately.
  3. Switch to a custom EVM network; add a token on that network and verify it does not bleed into mainnet and vice versa.
  4. Toggle token detection off/on and confirm asset lists are stable and no duplicates appear after refresh.
  5. Open a token’s details and ensure fiat conversion and recent activity reflect the correct network/token.

3. Transaction Signing and Activity Details

Risk Level: HIGH

Why This Matters: Controller/UI changes can break core transaction flows and the accuracy of post-transaction details users rely on.

Test Steps:

  1. From a dapp, submit a basic native transfer on Ethereum; review the confirmation screen (gas, total) and approve.
  2. After submission, open Activity and view transaction details; verify status progression (pending → confirmed) and correct fee/nonce data.
  3. Use Speed Up on a pending tx and confirm the original tx status reflects replacement.
  4. On an EIP-1559 L2 (e.g., Arbitrum/Optimism), repeat a send and confirm gas UI behaves correctly (max fee/priority) and accurate details render in Activity.

Medium Risk Scenarios (6)

1. NFTs (Detection, Media Rendering, Placeholders)

Risk Level: MEDIUM

Why This Matters: Large-scale UI and assets changes can break NFT rendering and degrade the asset gallery experience.

Test Steps:

  1. Ensure the account holds at least one ERC-721 and one ERC-1155; open the NFTs tab and verify images/metadata load without broken placeholders.
  2. Open an NFT detail view and confirm attributes/description render and navigation is responsive.
  3. Switch between light and dark themes and confirm NFT images, badges, and placeholders remain visible and correctly styled.
  4. Import an NFT by contract + token ID and verify it appears with correct media or a graceful fallback if media fails.

2. Message Encryption/Decryption (eth_getEncryptionPublicKey, eth_decrypt)

Risk Level: MEDIUM

Why This Matters: Subtle controller changes can disrupt encryption flows, impacting dapps that rely on secure messaging.

Test Steps:

  1. Connect a test dapp that requests eth_getEncryptionPublicKey; verify the permission/confirmation appears and approve.
  2. From the dapp, encrypt a message to the selected account, then initiate eth_decrypt; approve and verify the decrypted message matches the original.
  3. Switch accounts and retry decrypt; confirm the request targets the currently selected account and fails gracefully if keys don’t match.
  4. Reject a decrypt request and ensure the dapp receives a clear error and the extension shows no residual prompts.

3. Alert System and Confirmation Modals

Risk Level: MEDIUM

Why This Matters: Wide UI refactors risk breaking critical interstitials and confirmations that protect users when granting permissions.

Test Steps:

  1. Initiate a site connection request from a new dapp; verify the connect modal shows correct site origin, permissions, and responsive layout.
  2. Trigger addEthereumChain and switchEthereumChain requests; confirm warning/interstitial copy is correct and Cancel leaves state unchanged.
  3. Initiate a signature request (personal_sign); verify warnings and details (origin, data) are clear and that Reject returns control to the dapp cleanly.

4. Analytics Consent (MetaMetrics Controller/Adapter)

Risk Level: MEDIUM

Why This Matters: Analytics changes can create privacy regressions or cause runtime errors if events fire at the wrong time.

Test Steps:

  1. Fresh install → decline MetaMetrics; perform common actions (connect site, send tx) and confirm no analytics network calls occur (check DevTools → Network for analytics endpoints).
  2. Enable MetaMetrics in Settings → Advanced; perform actions again and verify events now appear, then disable and confirm events stop.
  3. Ensure enabling/disabling does not require reload and doesn’t break normal wallet operations.

5. Network Management (Add/Remove/Switch Custom RPC)

Risk Level: MEDIUM

Why This Matters: Controller and UI changes can break chain metadata handling, causing failed balance loads or address mismatches.

Test Steps:

  1. Add a custom network with chain ID (numeric or hex), symbol, and block explorer; save and switch to it.
  2. Confirm balances load and activity filters correctly to the selected network.
  3. Switch between Mainnet and the custom network multiple times and verify address consistency and no stale balances.
  4. Remove the custom network and ensure the UI returns to a default network without errors.

6. Dapp Error Handling (API Error Handler)

Risk Level: MEDIUM

Why This Matters: Recent error handling changes risk exposing raw errors or misinforming users about transaction outcomes.

Test Steps:

  1. From a dapp, send a transaction designed to revert (e.g., failing require) and approve in the extension.
  2. After failure, verify the UI shows a clear, user-friendly error with revert reason (if available), not raw or cryptic RPC errors.
  3. Confirm the Activity entry reflects failure accurately and offers appropriate actions (e.g., view on explorer).

Teams Sign-off Status

Signed off: None yet

Awaiting sign-off (9):
Accounts, Assets, Confirmations, Networks, Security, Swaps, Transactions, Wallet, Wallet Integrations


Generated by AI Test Plan Analyzer (gpt-5) at 2026-07-30T21:06:31.082Z

AI generated test plan (JSON): test-plan-13.42.0.json

This branch was previously deployed

3 inactive deployments
release-branch — 4a4800eb Deployed Jul 31, 2026 by HowardBraham via Publish release #43
pr-comment — 4a4800eb Deployed Jul 30, 2026 by HowardBraham via Publish prerelease / Publish prerelease #155875
release-ci — 4a4800eb Deployed Jul 30, 2026 by HowardBraham via Publish prerelease / Generate AI test plan #155875
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-13.42.0 Issue or pull request that will be included in release 13.42.0 skip-benchmark-gate Disables `run-benchmarks/quality-gate` job team-bots Bot team (for MetaMask Bot, Runway Bot, etc.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.