release: 13.42.0 - #44797
release: 13.42.0#44797
Conversation
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** 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)
Builds ready [95f14e7]
⚡ Performance Benchmarks (Total: 🟢 13 pass · 🟡 7 warn · 🔴 3 fail)
Bundle size diffs [🚨 Warning! Bundle size has increased!]
🍒 What's in this RCCherry-picks (5 commits)
Changelog (136 commits since v13.41.0)
AI Test Plan
Cherry-Pick Scenarios (2)High Risk Scenarios (1)1. Security: Deep-link Interstitial ProtectionRisk 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:
Medium Risk Scenarios (1)1. Cross-chain Asset Deep Links with Missing AccountRisk 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:
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:
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:
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:
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:
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:
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:
Teams Sign-off StatusSigned off: None yet Awaiting sign-off (4): 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>
Builds ready [cd5a5de]
⚡ Performance Benchmarks (Total: 🟢 15 pass · 🟡 5 warn · 🔴 3 fail)
Bundle size diffs [🚨 Warning! Bundle size has increased!]
🍒 What's in this RCCherry-picks (6 commits)
Changelog (137 commits since v13.41.0)
AI Test Plan
Cherry-Pick Scenarios (3)High Risk Scenarios (2)1. Deep-links - interstitial protection before sensitive actionsRisk Level: HIGH Why This Matters: Cherry-pick 44830 fixes restoration of interstitial protection for deep links, preventing unmediated navigation to sensitive flows. Test Steps:
2. Swaps - destination exchange rate refresh and accuracyRisk Level: HIGH Why This Matters: Cherry-pick 45011 fixes stale destination exchange rates that can misprice swaps, risking user loss. Test Steps:
Medium Risk Scenarios (1)1. Deep-links - cross-chain asset deeplinks without a matching accountRisk 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:
Release Scenarios (12)High Risk Scenarios (6)1. State Migration (Migration 219) - upgrade with populated vaultRisk 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:
2. State Migration (Migration 219) - upgrade while lockedRisk Level: HIGH Why This Matters: Upgrading while locked stresses keyring/state initialization paths; failures here can strand users or reset wallets. Test Steps:
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:
4. Token Management - EIP-747 wallet_watchAsset confirmationsRisk 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:
5. NFTs - detection/import and metadata media renderingRisk 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:
6. Bridge - quote retrieval and transaction creationRisk Level: HIGH Why This Matters: Bridge-controller patch changes can break quoting or transaction building, risking failed or incorrect cross-chain transfers. Test Steps:
Medium Risk Scenarios (6)1. Send Flow and Errors - alert system and API error handlingRisk 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:
2. Dapp Connections - permissions modal and multi-account selectionRisk Level: MEDIUM Why This Matters: UI refactors around permissions can cause mis-selection or incorrect account exposure to sites. Test Steps:
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:
4. Encryption - eth_getEncryptionPublicKey and eth_decryptRisk Level: MEDIUM Why This Matters: Even small controller changes can break public key retrieval or decryption confirmations, impacting secure messaging flows. Test Steps:
5. Activity - list and detail views across themes and sizesRisk Level: MEDIUM Why This Matters: Large UI refactors can cause truncation or misaligned details, leading to misinterpretation of transaction outcomes. Test Steps:
6. Network Management - add and switch via dapp requestsRisk Level: MEDIUM Why This Matters: Controller and UI changes can regress add/switch flows, leading to misconfigured networks or failed dapp connections. Test Steps:
Teams Sign-off StatusSigned off: None yet Awaiting sign-off (9): 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>
Builds ready [7c8fdb7]
⚡ Performance Benchmarks (Total: 🟢 16 pass · 🟡 4 warn · 🔴 4 fail)
Bundle size diffs [🚨 Warning! Bundle size has increased!]
🍒 What's in this RCCherry-picks (7 commits)
Changelog (138 commits since v13.41.0)
AI Test Plan
Cherry-Pick Scenarios (4)High Risk Scenarios (3)1. Security: Deep Link Interstitial ProtectionRisk 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:
2. Deep Links: Cross-Chain Asset Links With Missing AccountRisk 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:
3. Swaps: Stale Destination Exchange RatesRisk 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:
Medium Risk Scenarios (1)1. Accounts/Networks: Missing slip44 Entries HandlingRisk 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:
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:
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:
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:
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:
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:
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:
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:
Teams Sign-off StatusSigned off: None yet Awaiting sign-off (9): 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 |
- 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
|
@SocketSecurity ignore npm/css-tree@3.2.1 |
Builds ready [4a4800e]
⚡ Performance Benchmarks (Total: 🟢 14 pass · 🟡 6 warn · 🔴 4 fail)
Bundle size diffs [🚨 Warning! Bundle size has increased!]
🍒 What's in this RCCherry-picks (10 commits)
Changelog (141 commits since v13.41.0)
AI Test Plan
Cherry-Pick Scenarios (6)High Risk Scenarios (4)1. Security: Deep Link Interstitial ProtectionRisk 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:
2. Deep Links: Missing Account Handling for Cross-Chain Asset LinksRisk 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:
3. Swaps: Stale Destination Exchange RatesRisk Level: HIGH Why This Matters: Cherry-pick 45011 fixes stale destination quotes that can lead to incorrect expectations and potential value loss. Test Steps:
4. Accounts/Keyrings: Missing SLIP-44 EntriesRisk 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:
Medium Risk Scenarios (2)1. Hardware Wallets: Device Read Timeout during Account CreationRisk 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:
2. Balances: Loading Timer to Avoid Flicker/Stale DisplayRisk 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:
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:
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:
3. Transaction Signing and Activity DetailsRisk 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:
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:
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:
3. Alert System and Confirmation ModalsRisk Level: MEDIUM Why This Matters: Wide UI refactors risk breaking critical interstitials and confirmations that protect users when granting permissions. Test Steps:
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:
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:
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:
Teams Sign-off StatusSigned off: None yet Awaiting sign-off (9): 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 |
🚀 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
Conduct regression and exploratory testing for your functional areas, including automated and manual tests for critical workflows.
Focus on exploratory testing across the wallet, prioritize high-impact areas, and triage any Sentry errors found during testing.
Validate new functionalities and provide feedback to support release monitoring.
GitHub Signoff
Issue Resolution
Cherry-Picking Criteria
🗓️ Timeline and Milestones
✅ Signoff Checklist
Each team is responsible for signing off via GitHub. Use the checkbox below to track signoff completion:
Team sign-off checklist
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