release: 13.43.0 - #45055
release: 13.43.0#45055
Conversation
## Version Bump After Release This PR bumps the main branch version from 13.42.0 to 13.43.0 after cutting the release branch. ### Why this is needed: - **Nightly builds**: Each nightly build needs to be one minor version ahead of the current release candidate - **Version conflicts**: Prevents conflicts between nightlies and release candidates - **Platform alignment**: Maintains version alignment between MetaMask mobile and extension - **Update systems**: Ensures nightlies are accepted by app stores and browser update systems ### What changed: - Version bumped from `13.42.0` to `13.43.0` - Platform: `extension` - Files updated by `set-semvar-version.sh` script ### Next steps: This PR should be **manually reviewed and merged by the release manager** to maintain proper version flow. ### Related: - Release version: 13.42.0 - Release branch: release/13.42.0 - Platform: extension - Test mode: false --- *This PR was automatically created by the `create-platform-release-pr.sh` script.* Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** upgrade bridge packages to latest versions <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/SWAPS-4817 ## **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** - [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** > Dependency-only change, but bridge controllers sit on quote, swap, and cross-chain transaction paths—regressions would surface at runtime rather than in this diff. > > **Overview** > Bumps MetaMask bridge dependencies so the extension picks up the latest bridge package releases, with no application source changes in this PR. > > **`@metamask/bridge-controller`** goes from **77.5.0** to **^77.8.0**, and **`@metamask/bridge-status-controller`** from **74.3.0** to **^74.4.0**. Yarn resolutions still apply the existing **`@metamask/bridge-controller`** patch, now pinned to **77.8.0** (including an added resolution entry for **^77.7.0**). The lockfile refresh also updates transitive versions pulled in by those packages (e.g. **`@metamask/transaction-controller`** **^69.2.1** inside the bridge stack). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit ee326a3. 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> Co-authored-by: Maxime OUAIRY <maxime.ouairy-ext@consensys.net>
…ggregated balance cp-13.41.0 (#44796) <!-- CURSOR_AGENT_PR_BODY_BEGIN --> <!-- 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 aggregated (portfolio) balance drops tokens whose human-readable balance is greater than or equal to `10^decimals` — e.g. a 54.06B TangYuan balance with 9 decimals on BNB Chain (#44786). **Root cause:** The `getAggregatedBalanceForAccount` selector in `@metamask/assets-controller` contains a `scaleToHumanIfRaw` heuristic that guesses whether a balance amount from `assetsBalance` state is in raw base units or human-readable form based on its magnitude: whenever the asset has `decimals` metadata and the amount is `>= 10^decimals`, the amount is assumed to be raw and divided by `10^decimals`. Since TangYuan's human-readable balance (54.06B) exceeds `10^9`, it gets wrongly divided down to ~54 tokens, its fiat contribution rounds to ~$0, and it effectively disappears from the aggregated total — while individual token rows (which do not apply this heuristic) show the correct fiat value. The heuristic is unnecessary: all `AssetsController` data sources (RPC, Accounts API, WebSocket) convert balances to human-readable form before writing them to state, so amounts in `assetsBalance` are always human-readable. Guessing raw vs. human by magnitude cannot be done correctly and corrupts legitimately large balances. **Solution (extension-repo only, no dependency changes):** In `aggregateGroupBalance` (`ui/selectors/assets.balance-utils.ts`), the state passed to `getAggregatedBalanceForAccount` is augmented with an empty `assetsInfo`. The heuristic only fires when `decimals` metadata is present, and metadata is otherwise only copied into the selector's returned `entries`, which this call site discards (only `totalBalanceInFiat` and `pricePercentChange1d` are consumed). Stripping the metadata therefore disables the rescaling with no other behavioral change to the totals. This single code point covers both `selectBalanceForAllWallets` and the balance-change selectors, which are the only consumers of the package's aggregation in the extension. Tests: - `ui/selectors/assets.balance-utils.aggregation.test.ts` — end-to-end regression test through the real (unmocked) package selector with a 54.06B-token / 9-decimals balance; it fails without the fix and passes with it. - `ui/selectors/assets.balance-utils.test.ts` — pins the augmentation: asserts the state handed to the aggregation selector has empty `assetsInfo` while `assetsBalance`/`assetsPrice`/`assetPreferences` pass through untouched. The proper fix should also be upstreamed to `MetaMask/core` (`packages/assets-controller/src/selectors/balance.ts`, where `scaleToHumanIfRaw` still exists on `main`); once a fixed version is adopted the augmentation can be removed. ## **Changelog** CHANGELOG entry: Fixed the aggregated account balance excluding tokens whose balance is very large relative to their decimals (e.g. 54B TangYuan with 9 decimals) ## **Related issues** Fixes: #44786 ## **Manual testing steps** 1. Run the extension with a wallet that holds a token whose human-readable balance is at least `10^decimals` — e.g. swap into TangYuan (9 decimals) on BNB Chain so the balance is in the billions of tokens. 2. Go to the homepage / asset list and note the fiat value shown on the token's own row. 3. Verify the aggregated account balance at the top of the wallet includes that token's fiat value (previously it was missing, making the total far too low). 4. Verify tokens with ordinary balances (e.g. POSI with 18 decimals) are still priced correctly and the total matches the sum of the individual token rows. ## **Screenshots/Recordings** ### **Before** See issue - `TangYuan` was not added to aggregate calculation ### **After** <img width="524" height="624" alt="Screenshot 2026-07-23 at 20 38 24" src="https://github.com/user-attachments/assets/ba84a9a4-e839-46ed-aac9-e2b27558ffb4" /> ## **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_AGENT_PR_BODY_END --> <div><a href="https://cursor.com/agents/bc-c121dd8a-01f5-43f9-a8a8-b56931f842b8"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a> <a href="https://cursor.com/background-agent?bcId=bc-c121dd8a-01f5-43f9-a8a8-b56931f842b8"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a> </div> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
## **Description** Update cla.yml with more Cursor names. ## **Changelog** CHANGELOG entry: null <!--## **Related issues** ## **Manual testing steps** ## **Screenshots/Recordings** ## **Pre-merge author checklist** ## **Pre-merge reviewer checklist**--> <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Single CI configuration change with no runtime, auth, or data-handling impact. > > **Overview** > Updates the **CLA Signature Bot** workflow allowlist so additional Cursor-related GitHub actors are exempt from CLA checks. > > The `allowlist` in `.github/workflows/cla.yml` now includes **`cursorbot`** and **`cursor[bot]`** alongside the existing **`cursoragent`** entry, so automated Cursor PRs are treated like other trusted bots (e.g. Dependabot, Copilot). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit aabb4fa. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Flips `MM_PURE_BLACK_PREVIEW` from `false` to `true` in `builds.yml` and `.metamaskrc.dist` so that the pure black (OLED) dark mode is enabled for all users in the build. This gives us a week of testing in 13.42.x before the feature ships permanently in 13.43.0. ## **Changelog** CHANGELOG entry: Enabled pure black (OLED) dark mode for users with dark theme active. ## **Related issues** Fixes: TMCU-1166 ## **Manual testing steps** 1. Run `yarn start` (no `.metamaskrc` change needed — the flag is now `true` by default in the build). 2. Enable dark theme in Settings → Preferences and display → Theme → Dark. 3. Confirm pure black (`#000000`) background is applied throughout the extension. 4. Toggle back to light or system theme and confirm no visual regressions. 5. Check the popup flash (`popup-init.html`), side menu, modals, and popovers for correct elevation surfaces. ## **Screenshots/Recordings** ### **Before** <!-- Pure black was opt-in via .metamaskrc --> ### **After** <!-- Pure black enabled for all dark mode users --> ## **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.
## **Description** Fixes the background flash sequence system-dark users see when opening the extension in pure black mode. There are three moments where a background color is visible before the full UI renders, and they all need to agree: 1. **\`popup-init.html\`** — a static redirect page with no JavaScript. Uses \`prefers-color-scheme: dark\` to set an initial background while it redirects to \`popup.html\`. Changed from \`#121314\` to \`#000000\`. 2. **\`:root\` in \`base-styles.scss\`** — the \`light-dark()\` fallback that fires immediately on \`popup.html\` parse, before JavaScript has applied \`data-theme\` or \`data-pure-black\` attributes. Because no data attributes exist at this point, a CSS selector cannot be used — brand color tokens are the only option. Changed from \`--brand-colors-grey-grey1000\` to \`--brand-colors-black\`. 3. **\`html[data-theme='dark'][data-pure-black='true']\`** (already in \`base-styles.scss\`) — applies after JavaScript sets theme attributes. Unchanged; this continues to own the post-JS state via the semantic token. Without both changes, fixing only \`popup-init.html\` would swap one mismatch for another: \`#000000\` init flash → \`grey-grey1000\` root frame → \`#000000\` themed. > **Note:** Both changes affect all system-dark users, not just pure black users, since neither \`prefers-color-scheme\` nor \`:root\` can read MetaMask theme settings. They should not be merged until the \`MM_PURE_BLACK_PREVIEW\` feature flag ships in 13.43.0. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: TMCU-1158 ## **Manual testing steps** 1. Enable \`MM_PURE_BLACK_PREVIEW=true\` in \`.metamaskrc\` and run \`yarn start\`. 2. Enable dark theme in Settings → Preferences and display → Theme → Dark. 3. Click the extension icon — the flash from \`popup-init.html\`, the \`:root\` frame on \`popup.html\`, and the final themed background should all be pure black with no visible transition. 4. Toggle to light theme and verify the white background still appears at each stage. ## **Screenshots/Recordings** ### **Before** Flash sequence: #121314 (popup-init) → #24272A (root) → #000000 (themed) https://github.com/user-attachments/assets/27c3b95a-c36d-4e31-8b2a-e60ebe1bf6db ### **After** Flash sequence: #000000 → #000000 → #000000 — seamless https://github.com/user-attachments/assets/0e5d7183-b1bc-42f1-b161-623b99d9b7ef ## **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.
<!-- 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? --> RC Slack was gated on full main `success`, so “Builds ready” on the PR could exist while Slack never posted (e.g. 13.42.0). Slack now posts when `Publish prerelease` succeeds on a release main run, even if other jobs failed. ## **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: [Slack thread](https://consensys.slack.com/archives/C0BJLRDCADT/p1784847360954639?thread_ts=1784847158.875339&cid=C0BJLRDCADT) ## **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 notification gating only; no runtime, auth, or release artifact logic changes beyond when Slack is sent. > > **Overview** > **RC Slack notifications** now fire when release **Main** finishes with **Builds ready** (`Publish prerelease / Publish prerelease` succeeded), instead of requiring the entire **Main** workflow to be green. > > The `workflow_run` trigger still runs on completed **Main** for `release/*`, but the job `if` accepts **success** or **failure** conclusions. A new gate step uses `gh run view` (with **`actions: read`**) to require the inner **Publish prerelease** job succeeded and an open **release → stable** PR before posting. Comments in `rc-slack-notify.yml` and `slack-rc-notification.mts` describe this behavior. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 35b5992. 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 an E2E metrics test that asserts Wallet Setup Started (historically Wallet Setup Selected) is sent with the expected onboarding properties when a user creates a wallet with SRP and opts into MetaMetrics. <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/MMQA-2060 ## **Manual testing steps** CI should pass Use the below command to execute the test locally yarn start:test yarn test:e2e:single test/e2e/tests/metrics/wallet-setup-started.spec.ts --browser=chrome ## **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** > Test-only change with no production or analytics implementation modifications. > > **Overview** > Adds E2E coverage for the **Wallet Setup Started** Segment track event during onboarding. > > The new `wallet-setup-started.spec.ts` runs the create-wallet-with-SRP flow with MetaMetrics opted in, mocks Segment via the shared metrics mock helper, and asserts exactly one track event with expected properties (`account_type`, `category`, `locale`, `chain_id`, `environment_type`). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 8dfb722. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
Migrates Core UX-owned ButtonSecondary usages to the MMDS Button
component with variant={ButtonVariant.Secondary}. This removes
deprecated ButtonSecondary / ButtonSecondarySize imports from the
targeted owned files and updates the affected network, token, NFT
import, and import-account flows to use the current design system API.
## **Description**
<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->
## **Changelog**
<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`
If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`
(This helps the Release Engineer do their job more quickly and
accurately)
-->
CHANGELOG entry: null
## **Related issues**
Fixes:
## **Manual testing steps**
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**
> Presentational swap only; handlers and flows are unchanged, with minor
visual/DOM differences from the new design system button.
>
> **Overview**
> Replaces deprecated **component-library** `ButtonSecondary` with
**`@metamask/design-system-react`** `Button` using
`variant={ButtonVariant.Secondary}` in Core UX flows: native-token scam
warning modals (`token-cell`, `token-list-item`), import-account cancel
(`bottom-buttons`), import-NFT cancel, and the network list **Add a
custom network** action (including `IconName` from the design system).
>
> Prop mapping is consistent: `block` → `isFullWidth`,
`ButtonSecondarySize` → `ButtonSize`. **Primary** actions still use
`ButtonPrimary` where unchanged. Jest snapshots were updated for the new
MMDS button DOM (Tailwind-based classes and icon markup).
>
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
cf52226. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…d transactions from activity page cp-13.41.0 (#44780) <!-- 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? --> Fixes Monad swap activity details showing a network fee amount instead of `Paid by MetaMask` for gas-sponsored swaps. This PR reuses the existing gas sponsorship display logic and applies it to the new Activity Details fee rows. When a local transaction is marked as gas-sponsored, Activity Details now renders the network fee as `Paid by MetaMask` instead of showing a calculated fee. Also adds unit tests for the sponsorship logic and fee row rendering. ## **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 sponsored network fee transfer to show the `Paid by MetaMask` label in activity page ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/WPN-1713 ## **Manual testing steps** 1. Perform a MON to USDC swap on Monad. 2. Open the Activity tab. 3. Click the completed swap transaction. 4. Verify the transaction details show: - Network fee - Paid by MetaMask 5. Open the same swap from the token details activity list 6. Verify the token details transaction view also shows - Network fee - Paid by MetaMask 10. As a regression check, open a normal non-sponsored transaction 11. Verify normal transactions still show the calculated network fee amount instead of `Paid by MetaMask` 12. As another regression check, verify rejected transactions do not show `Paid by MetaMask` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> <img width="831" height="813" alt="625474154-06befb51-1ed3-48be-8a88-a91cbd295c6a" src="https://github.com/user-attachments/assets/da34bba1-ba3c-47c1-98f0-432494f4a094" /> ### **After** <!-- [screenshots/recordings] --> <img width="1009" height="1283" alt="Screenshot From 2026-07-23 15-51-51" src="https://github.com/user-attachments/assets/9b921be1-41c5-4906-94a7-1376c9f8b0a5" /> ## **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** - [X] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [X] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Display-only activity fee labeling with shared sponsorship helper; covered by unit tests and no payment or signing logic changes. > > **Overview** > Gas-sponsored swaps (e.g. Monad) were showing a calculated **network fee** in Activity Details instead of **Paid by MetaMask**. This change wires the same sponsorship rules used on the legacy transaction breakdown into the activity fee pipeline. > > Local activity items now attach a `gas-fee-sponsored` fee marker when `isGasFeeSponsored` applies (with hardware wallets, failed-without-receipt, revoke delegation, and rejected txs excluded). When API-enriched activity replaces the local row, `mergeActivityItemSponsoredFees` keeps that marker and drops the API’s base network fee. **FeesRows** renders the sponsored type as **Paid by MetaMask** via `SuccessPill`. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 1800b9b. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…lected a nonevm network (#44706) ## **Description** When a hardware-wallet account group is selected and the user switches to a Non-EVM network, MetaMask silently changes `selectedAccount` to a Snap account. Gas sponsorship / gasless eligibility still used `isHardwareWallet`, which only checks that globally selected account, so the HW account was mis-classified as eligible and “Gas sponsored” UI could incorrectly appear. This PR adds `useIsHardwareWalletAccount`, which prefers an explicit address (e.g. confirmation `txParams.from`), then the selected group’s EVM account, then the global selection. Gas sponsorship and gasless hooks (`useIsNetworkGasSponsored`, `useIsGaslessSupported`, `useGaslessSupportedSmartTransactions`) now use that helper so HW accounts stay excluded even when a Non-EVM network is selected. ## **Changelog** CHANGELOG entry: Fixed gas sponsorship incorrectly appearing for hardware wallet accounts when a Non-EVM network is selected ## **Related issues** Fixes: [MUL-2011](https://consensyssoftware.atlassian.net/browse/MUL-2011?atlOrigin=eyJpIjoiZjE0NDgwZjVlYWM4NDE2NWJmZmFhMGFiYjNjY2QzNzMiLCJwIjoiaiJ9) ## **Manual testing steps** 1. Import/connect a Ledger, Trezor, or QR hardware wallet account and select that account group. 2. Switch the selected network to a Non-EVM network (e.g. Solana). 3. Navigate to a gas-sponsored EVM network flow (e.g. send / confirmation on Monad or another sponsored chain available in your build). 4. Verify the “Gas sponsored” / gasless UI is **not** shown for the hardware wallet account. 5. Switch back to an HD/imported EOA on the same sponsored network and verify gas sponsorship still appears when expected. 6. With HW selected on an EVM network (no Non-EVM switch), confirm sponsorship remains hidden as before. ## **Screenshots/Recordings** ### **Before** https://github.com/user-attachments/assets/36df87eb-942f-41a3-8104-e094aa322795 ### **After** https://github.com/user-attachments/assets/e796243a-e042-411c-b3a6-f821ef92e5ac <!-- ## **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. [MUL-2011]: https://consensyssoftware.atlassian.net/browse/MUL-2011?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes eligibility logic for gas sponsorship and gasless confirmations across multiple hooks; behavior is narrower (more HW exclusions) but affects user-visible transaction flows. > > **Overview** > Fixes **gas sponsored** and **gasless** UI incorrectly treating Ledger/Trezor sends as eligible when the user picks a Non-EVM network while a hardware account group is still selected—`selectedAccount` can become a Snap account even though the EVM `from` address is still hardware. > > Introduces **`useIsHardwareWalletAccount`**, which resolves hardware status in order: optional address (e.g. confirmation `txParams.from`), the selected account group’s EVM EOA, then the legacy `isHardwareWallet` global selection. > > **`useIsNetworkGasSponsored`**, **`useIsGaslessSupported`**, and **`useGaslessSupportedSmartTransactions`** now use this hook instead of `isHardwareWallet` alone; confirmation paths pass **`transactionMeta?.txParams?.from`** so eligibility follows the signing account. Unit tests cover the new hook and the Non-EVM / HW `from` scenario. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 60d0ff7. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
The Google sign-in button in the onboarding flow and security settings (SRP reveal list) was using the legacy 4-segment flat Google `G` icon (`google.svg`). Google has updated their brand icon to a new gradient `G` logo. <!-- 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. --> JIRA LINK : https://consensyssoftware.atlassian.net/browse/TO-936 ## **Description** <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> - The existing `google.svg` used the outdated flat multi-colour Google `G` icon - The `srp-reveal-list__social-icon` CSS class was referenced in `reveal-srp-list.tsx` but was never defined in `index.scss`, causing the Google icon to render at 0×0 px (invisible) ### Solution - Replaced `app/images/google.svg` with Google's updated gradient `G` logo (no background, no border — logo only, compliant with Google branding guidelines for use alongside button text) - Tightened the SVG `viewBox` to crop padding, set explicit `width="20" height="20"` so the intrinsic size is always reliable regardless of CSS context - Added the missing `&__social-icon { width: 24px; height: 24px; }` rule to `reveal-srp-list/index.scss` to fix the invisible icon in the security settings page ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: Updated Google sign-in button icon to the new Google gradient `G` logo; fixed invisible Google icon on the Secret Recovery Phrase security settings page. ## **Related issues** ## **Manual testing steps** 1. Run the extension (`yarn start`) 2. Go to the onboarding welcome screen 3. Verify the Google button shows the new gradient `G` icon (no circle border, no white/dark background) 4. Verify the icon looks correct in both light and dark themes 5. Navigate to **Settings → Security & Privacy → Secret Recovery Phrase** 6. Verify the Google icon is now visible next to the social login email address (previously 0×0 and invisible) ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> <img width="519" height="174" alt="Screenshot 2026-07-23 at 1 42 46 PM" src="https://github.com/user-attachments/assets/83ecb61a-ebdf-485d-9ed3-344a54012c50" /> <img width="446" height="272" alt="Screenshot 2026-07-23 at 1 42 50 PM" src="https://github.com/user-attachments/assets/ee5d76b4-ef28-4211-9ecb-fef3d637045f" /> ### **After** <!-- [screenshots/recordings] --> <img width="470" height="649" alt="Screenshot 2026-07-23 at 1 31 36 PM" src="https://github.com/user-attachments/assets/9f6702f7-5cda-4226-bc5d-34832d626e1a" /> <img width="595" height="768" alt="Screenshot 2026-07-23 at 1 31 43 PM" src="https://github.com/user-attachments/assets/6fd53b63-2728-4b86-a725-1049b6f19819" /> <img width="737" height="822" alt="Screenshot 2026-07-23 at 1 31 54 PM" src="https://github.com/user-attachments/assets/ccec6f45-0864-4fff-9679-45be233ffca6" /> <img width="620" height="800" alt="Screenshot 2026-07-23 at 1 32 01 PM" src="https://github.com/user-attachments/assets/ae2f864b-2b42-4ecd-b2b0-3ee68df330ba" /> <img width="857" height="305" alt="Screenshot 2026-07-23 at 1 32 32 PM" src="https://github.com/user-attachments/assets/cec5aee6-fbb1-4221-b325-d4c523ccbd8f" /> <img width="886" height="313" alt="Screenshot 2026-07-23 at 1 32 42 PM" src="https://github.com/user-attachments/assets/e490d72e-8f7d-436b-aa32-141d19fb965a" /> ## **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 - [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** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Visual-only asset and stylesheet changes with no auth or business-logic impact. > > **Overview** > Updates the shared **`images/google.svg`** asset from the legacy flat four-color **G** to Google’s newer gradient **G** (cropped viewBox, 20×20 intrinsic size) so onboarding Google sign-in and other consumers pick up current branding. > > Adds the missing **`srp-reveal-list__social-icon`** rule (24×24) in `reveal-srp-list/index.scss` so the Google `<img>` on the Secret Recovery Phrase social-login card is sized and visible instead of collapsing to 0×0. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 03829ae. 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** Refactors the tokens tab E2E page object with reusable helpers and selectors needed by the Tron assets E2E cluster. This is the first slice of the former #44777 split; fixture wiring lands in the follow-up PR stacked on this branch. ## **Changelog** CHANGELOG entry: null ## **Related issues** Part of the local-blockchain E2E initiative (WPN-536). ## **Manual testing steps** 1. `yarn build:test` 2. Verify the branch builds and existing tokens-tab E2E tests still pass. ## **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. --------- Co-authored-by: Cursor <cursoragent@cursor.com>
… branches (#44779) ## **Description** Passes four `gate-override-*` inputs so the `AI PR Analyzer / Gate` check concludes `success` for medium-risk Runway cherry-picks into release branches. Fail-closed: trusted same-repo PRs only (forks excluded), author `runway-github[bot]`, base `^release/`, title `cherry.?pick`, risk within `medium`. Off for every other PR. Does not change merge automation by itself. ## **Changelog** CHANGELOG entry: null ## **Related issues** N/A ## **Manual testing steps** 1. A `runway-github[bot]` cherry-pick PR into `release/*` scored `medium` concludes the gate `success` (`Risk gate passed via override: medium ≤ medium`). 2. A `medium` PR into `main`, or from another author, stays `neutral`. ## **Screenshots/Recordings** N/A. CI config change. ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask 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. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…4790) <!-- 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** Improves the create-password UX so the "passwords don't match" error no longer nags the user on every keystroke while they are still typing the confirmation. The mismatch error now appears only once the confirm field reaches the minimum password length (`PASSWORD_MIN_LENGTH`), and still clears immediately once the values match. ### computeMismatchError: - confirm shorter than min length → false ('abc') - confirm ≥ min length but shorter than password → false ('a]2$GHvw' vs 'a]2$GHvw&W') - confirm ≥ min length, ≥ password length, and differs → true ('X]2$GHvw&W' vs 'a]2$GHvw&W') - confirm === password → false <!-- 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: show password mismatch error only when confirm password is equal or longer than PASSWORD_MIN_LENGTH ## **Related issues** Fixes: ## **Manual testing steps** 1. Go to Menu > Settings > Security and password > Password 2. Continue until change password form is shown 3. Enter a password and confirm password 4. Before "Passwords don't match" error shows right away after typing first letter of confirm password. It shows now when confirm password is equal to password minimum length which is 8 ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <img width="472" height="488" alt="image" src="https://github.com/user-attachments/assets/b3858f2b-9005-4f95-aa56-7045c14376f1" /> <!-- [screenshots/recordings] --> ### **After** https://github.com/user-attachments/assets/460a223b-e2e3-4981-96fe-33d6e788ec5c <!-- [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] > **Low Risk** > Onboarding/settings password UI validation only; behavior is narrower (fewer premature errors) with no vault or crypto changes. > > **Overview** > **Password confirmation UX** no longer shows “passwords don’t match” on every keystroke while the user is still typing confirm. The shared `PasswordForm` now uses exported **`computeMismatchError`**, which only flags a mismatch when confirm is at least **`PASSWORD_MIN_LENGTH`**, at least as long as the primary password, and not equal—so partial prefixes and short confirm input stay silent until the user has typed enough to judge a real mismatch. > > When the primary password is lengthened after confirm already matched, the mismatch message stays hidden but **`onChange`** still clears the valid password (form stays invalid). Unit coverage was added for the helper and edge cases; onboarding **create-password** and e2e onboarding tests were updated to match the new rules. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 22e1862. 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** Replaces the `selectERC20TokensByChain` Redux selector with the `getAssetImageUrl` utility function in the `GasFeeTokenIcon` component. The previous approach looked up the icon URL from the ERC20 tokens state slice, which has been refactored. The new approach uses the shared `getAssetImageUrl` helper from `asset-utils` to derive the static image URL directly from the token address and chain ID. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: ## **Manual testing steps** 1. Open MetaMask and navigate to a transaction confirmation that uses a gas fee token (pay-with-token flow). 2. Verify the token icon is displayed correctly in the gas fee row. 3. Verify the native token icon is displayed when the native token is selected. ## **Screenshots/Recordings** ### **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 - [ ] 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 confirmation UI change with equivalent fallback behavior; no auth or transaction logic touched. > > **Overview** > **Gas fee token icons** on transaction confirmations no longer read `iconUrl` from the `selectERC20TokensByChain` Redux slice. **`GasFeeTokenIcon`** now resolves the image via shared **`getAssetImageUrl(tokenAddress, chainId)`**, keeping the same behavior: **`AvatarToken`** when a URL exists, **`PreferredAvatar`** when it does not. Native-token rendering is unchanged. > > Tests **mock `getAssetImageUrl`**, assert it is called with the token address and confirmation chain ID, and cover both a returned URL and **`undefined`** fallback paths. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 1fc2747. 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: Sisyphus <clio-agent@sisyphuslabs.ai>
<!-- 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: ## **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** > Dependency version bump plus messenger delegation wiring; no direct changes to auth, keys, or payment flows. > > **Overview** > Upgrades **`@metamask/assets-controller`** from **11.1.1** to **11.2.0** (`package.json` / `yarn.lock`) so the extension picks up the latest package behavior. > > Because **11.2.0** expects remote feature flags on the controller messenger, **`getAssetsControllerMessenger`** now delegates **`RemoteFeatureFlagController:getState`** and **`RemoteFeatureFlagController:stateChange`** to the AssetsController child messenger. The assets-controller messenger unit tests were updated so the delegated action/event lists include those entries. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit b1b2834. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Extends Tron E2E fixtures with assets-focused mocks and environment wiring, and removes staking-only fixture state from the shared helper. Stacks on #44777. ## **Changelog** CHANGELOG entry: null ## **Related issues** Part of the local-blockchain E2E initiative (WPN-536). Stacks on #44777. ## **Manual testing steps** 1. `yarn build:test` 2. Verify the branch builds and existing Tron E2E tests still pass. ## **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. 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** Adds unit and E2E coverage for the Wallet Imported Segment event, asserting it fires with the expected onboarding properties when an SRP wallet import completes. <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/MMQA-2055 ## **Manual testing steps** CI should pass Execute locally using below commands: yarn test:unit ui/pages/onboarding-flow/create-password/create-password.test.tsx yarn test:e2e:single test/e2e/tests/metrics/wallet-imported.spec.ts --browser=chrome ## **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** > Test-only changes with no application or analytics implementation modifications. > > **Overview** > Adds **unit and E2E tests** so the **Wallet Imported** analytics event is verified when SRP import completes during onboarding—no production behavior changes. > > In `create-password.test.tsx`, a new case drives a successful import submit and asserts `trackEvent` emits **Wallet Imported** (onboarding category, `biometrics_enabled: false`) and **Wallet Import Attempted**. Shared helpers `getTrackedEvent` / `getWalletImportedEvent` reduce duplication with existing wallet-setup event checks. > > In `wallet-imported.spec.ts`, a dedicated E2E case mocks Segment for **Wallet Imported**, runs `completeImportSRPOnboardingFlow` with metrics opted in, and asserts a single batch payload with expected properties (`category`, `locale`, `chain_id`, `environment_type`, etc.), with profile IDs stripped pending issue #31860. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit d474157. 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** <!-- 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? --> Removes the token approval text and its tooltip from the unified swaps and bridge quote CTA. The MetaMask fee disclaimer remains visible when applicable. Obsolete approval message translations are removed, and the affected tests and snapshots are updated. ## **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: Removed the token approval message and tooltip from swap and bridge quotes ## **Related issues** Fixes: SWAPS-4823 ## **Manual testing steps** 1. Build and load the extension, then unlock the wallet. 2. Open the unified swaps and bridge flow and request an ERC-20 quote that requires token approval, testing both a same-chain swap and a cross-chain bridge. 3. Verify the CTA area does not show an approval sentence or approval tooltip. If a MetaMask fee applies, verify its fee disclaimer remains visible. ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> <img width="477" height="985" alt="Screenshot 2026-07-23 at 10 50 55 AM" src="https://github.com/user-attachments/assets/269a4066-fb19-4852-a9c5-c902d6c35bbb" /> ### **After** <!-- [screenshots/recordings] --> <img width="476" height="917" alt="Screenshot 2026-07-23 at 11 13 17 AM" src="https://github.com/user-attachments/assets/565f2166-426f-4dd6-8ce7-bf9ddaea7b94" /> ## **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** > Copy-only UI change with no transaction or approval logic modified; the main product risk is less upfront disclosure before users confirm approvals. > > **Overview** > Removes **token approval** messaging from the unified swap/bridge quote CTA so users no longer see “approves token for bridge/swap” copy or the **exact-access** info tooltip (including hardware-wallet-specific bridge approval warnings). > > `BridgeCTAInfoText` now only renders the **MetaMask fee disclaimer** when a non-discounted MM fee applies; it renders nothing when the quote needs approval but has no fee text to show. Related **locale strings** (`bridgeApprovalWarning`, `grantExactAccess`, `willApproveAmountForBridging`, etc.) are deleted across locales, with **tests and snapshots** updated to match. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit e13c215. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…4791) This PR is to make sure that the balance is left aligned for smaller viewports ## **Description** <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: null ## **Related issues** Fixes: ## **Manual testing steps** 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** https://github.com/user-attachments/assets/91524f4d-55e2-44ca-8f00-71a89b3c2f98 ## **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** > Presentation-only layout changes in wallet overview with no auth, data, or business-logic impact. > > **Overview** > **Wallet overview balance alignment** is updated so the sidepanel keeps the balance **left-aligned** when the viewport is at or below **490px**, while fullscreen/sidepanel layouts still **center** the balance on wider widths. > > Adds a **`wallet-overview-sidepanel`** class on the sidepanel environment and a shared SCSS mixin that applies `start` alignment under that breakpoint for the balance block, coin overview balance, and loading skeleton. Inline Tailwind alignment on the balance wrapper and skeleton is removed in favor of these styles, and the sidepanel max-width is centralized as a SCSS variable. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit e2e6500. 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** Align the activity transaction details max-width with the recently updated app max width ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: #44840 ## **Manual testing steps** 1. Open Activity and click a transaction. 2. Resize the window through narrow, mid (~600–900px), and wide widths. 3. Confirm details always match the app content width with no Activity showing around the edges. 4. Repeat in sidepanel while resizing the panel. <!-- ## **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) Co-authored-by: Cursor <cursoragent@cursor.com>
## **Description** [PR #43639](#43639) introduced a static route allowlist that let 14 deep-link paths bypass the full-screen interstitial even when a link had a missing or invalid signature. This conflicted with the security decision in [ADR 0011](https://github.com/MetaMask/decisions/blob/8112d93b758f27d09fc86fad09a45da52740ee35/decisions/core/0011-deep-linking-into-wallet.md?plain=1#L92-L93), which requires every deep link to show the interstitial before its destination opens. [PR #44114](#44114) subsequently added `/asset` to the skipped routes. [PR #44639](#44639) replaced that unconditional exception with an asynchronous Token API lookup that allowed assets classified as known-safe to bypass the interstitial. That lookup made `canSkipInterstitial` asynchronous in the non-blocking Manifest V3 request listener, delaying the extension redirect while `link.metamask.io` continued loading its fallback page. This PR restores the protected flow across immediate and deferred deep-link handling: - Deletes the static 14-route bypass allowlist. - Removes the unused `Route.skipInterstitial` property so route definitions cannot opt out of the security boundary. - Deletes the asynchronous `/asset` bypass and its Token API security-data plumbing. Known-safe and unknown or malicious assets now follow the same protected flow. - Restores synchronous `canSkipInterstitial` behavior. Only trusted MetaMask origins, or a valid signature combined with the user's skip preference, can bypass the router-level interstitial. - Keeps all actual deep-link route definitions, including `/asset` and the 14 formerly allowlisted routes. - Documents why `tryNavigateTo` must not perform external network or API lookups before redirecting in MV3: otherwise the fallback page can incorrectly tell users to install MetaMask when it is already installed. Regression coverage exercises missing and invalid signatures for every formerly allowlisted path, protected internal and external redirect destinations, and both known-safe and unknown or malicious asset links. The shared E2E flow once again requires the interstitial before continuing to route destinations. Validation completed: - Focused Jest suites: 116 tests passed - TypeScript type checking passed - Oxfmt and ESLint passed for every changed code file - Full LavaMoat policy regeneration passed for build tooling plus all MV2 and MV3 profiles ## **Changelog** CHANGELOG entry: Fixed deep links so protected routes no longer bypassed the security interstitial based only on their path ## **Related issues** Fixes #44816 Fixes #44817 Fixes #44818 Fixes #44819 Fixes #44820 Fixes #44821 Fixes #44822 Fixes #44823 Fixes #44824 Fixes #44825 Fixes #44826 Fixes #44827 Fixes #44828 Fixes #44829 ## **Manual testing steps** 1. Build and load the Chrome MV3 extension. 2. Open Privacy settings and ensure the option to skip the deep-link interstitial is disabled. 3. Paste `https://link.metamask.io/swap?amount=50` into the browser address bar. 4. Verify the full-screen security interstitial appears before the swap destination opens. 5. Continue through the interstitial and verify the swap destination opens. 6. Paste `https://link.metamask.io/buy` into the browser address bar. 7. Verify the security interstitial appears before the external buy destination opens. 8. Paste `https://link.metamask.io/asset?assetId=eip155%3A1%2Ferc20%3A0x6b175474e89094c44da98b954eedeac495271d0f` into the browser address bar. 9. Verify the known-safe DAI asset link also shows the security interstitial. 10. Repeat with `&sig=aW52YWxpZC1zaWduYXR1cmU=` added to a deep link and verify an invalid signature does not bypass the interstitial. <!-- ## **Screenshots/Recordings** Not applicable; this restores existing interstitial behavior without changing its visuals. ### **Before** N/A ### **After** N/A --> ## **Pre-merge author checklist** - [x] I have 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 have completed the PR template to the best of my ability - [x] I have included tests if applicable - [x] I have documented the code using JSDoc format if applicable - [x] I have applied the right labels on the PR ## **Pre-merge reviewer checklist** - [ ] I have manually tested the PR. - [ ] I confirm that this PR addresses all acceptance criteria and includes the necessary testing evidence. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **High Risk** > Changes security-sensitive deep-link navigation for many product routes and removes prior bypass behavior; incorrect logic could block legitimate flows or still expose users to unsigned links. > > **Overview** > Restores ADR-aligned deep-link security by **removing path-based and async asset bypasses** so missing or invalid signatures no longer skip the full-screen interstitial on protected routes (swap, buy, asset, etc.). > > `DeepLinkRouter.canSkipInterstitial` is **synchronous** again: only trusted MetaMask origins, or a **valid signature** plus the user’s skip preference, can bypass. The static allowlist (`interstitial-bypass.ts`), Token API–backed `/asset` checks (`interstitial-bypass-async.ts`), and `Route.skipInterstitial` are deleted; deferred deep-link handling in `utils.ts` matches the same rules. Docs warn that MV3 `onBeforeRequest` must stay free of network work before `redirectTab`. > > Tests and E2E flows now expect the interstitial for unsigned/invalid links on all formerly whitelisted paths and for external redirects from untrusted origins. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 41a4ca9. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** - tar to 7.5.22 - Ignoring three react-router advisories because they don't apply to how we're using them, and updating would require a very difficult major version bump ## **Changelog** CHANGELOG entry: null ## **Related issues** Closes: #44805 Progresses: #44859 <!--## **Manual testing steps** ## **Screenshots/Recordings** ## **Pre-merge author checklist** ## **Pre-merge reviewer checklist**--> <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Mostly lockfile and LavaMoat policy alignment plus documented audit suppressions; tar/stream changes affect Snaps packaging but are routine security bumps. > > **Overview** > **Dependency refresh** for the Snaps/tar extraction stack: `tar` moves to **7.5.22**, with related bumps (`tar-stream` 3.2.0, `streamx` 2.28.0, `tar-fs` 2.1.5, and new transitive packages such as `events-universal`, `text-decoder`, and optional `bare-*` peers). `queue-tick` drops out of the `streamx` graph in favor of that newer layout. > > **LavaMoat** webpack policies (MV2/MV3 variants) are regenerated to match: `streamx` now allows `process.nextTick` / `queueMicrotask`, wires `events-universal` and `text-decoder` instead of `queue-tick`, and drops the standalone `queue-tick` entry. > > **Yarn audit** adds three ignored React Router GHSA IDs with rationale—**HashRouter** (not server-controlled browser paths) for the open-redirect issues and **no SSR/hydration** for the `deserializeErrors` advisory—so CI stays green without a major React Router upgrade. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit e846388. 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>
## **Description** Adds a single automatic retry for `PersistenceManager` write operations. If the first `storage.local` or backup IndexedDB write fails, `PersistenceManager` waits for half of the operation safener debounce window and tries once more before surfacing the existing persistence failure path. Primary `storage.local` retry delays can be canceled when a newer `set` or `persist` supersedes the in-flight write, preventing a stale retry from running. Backup IndexedDB retries are not superseded, so an in-progress vault backup retry still completes before the newer write proceeds. The reason for this split is that a newer primary write contains fresher state, so retrying the older primary write would add storage churn and briefly write stale data. Backup writes are different: by the time a backup retry is waiting, primary storage for that operation has already succeeded. Aborting that backup retry could intentionally leave the recovery backup stale, and in split state the newer write might touch unrelated keys and never refresh backed-up keys such as `KeyringController`. Successful retries emit `writeRetryRecovered`, which is forwarded to Segment as `Data Persistence Write Retry Recovered` with the persistence operation, original error metadata, and retry delay. Also exports `PERSISTENCE_MANAGER_OPERATION_SAFENER_DEBOUNCE_MS` from `PersistenceManager` and uses it to configure the operation safener, so the retry delay is derived from the same shared timing value. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: #44681 ## **Manual testing steps** 1. Run the extension in a Chrome MV3 development build with MetaMetrics enabled so Segment events can be inspected. 2. Trigger a wallet state change while forcing the first persistence write to fail transiently, such as by temporarily making `storage.local.set` reject once in the extension background context. 3. Verify the state write succeeds on the retry, the storage failure UI is not shown, and a `Data Persistence Write Retry Recovered` event is emitted with the original error metadata. 4. While a primary write retry is waiting, trigger and persist a newer state change. Verify the stale retry is canceled and the newer state is written. 5. Force the first backup IndexedDB write to fail, then trigger a newer state change while the retry is waiting. Verify the backup retry still completes before the newer write proceeds. 6. Force both the initial write and retry to fail, then verify the existing storage failure handling still runs. <!-- ## **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). - [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. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **High Risk** > Changes core wallet persistence and vault backup behavior; incorrect retry or supersede logic could lose state or leave backups stale, though existing failure paths remain when both attempts fail. > > **Overview** > Adds a **single automatic retry** for `PersistenceManager` `set`/`persist` paths and IndexedDB vault backup writes. After the first failure it waits **500ms** (half the shared operation-safener debounce) and tries once more before the existing failure UI and Sentry reporting. > > **Primary** `storage.local` retries can be **canceled** when a newer `set` or `persist` supersedes the in-flight write, so stale state is not written. **Backup** IndexedDB retries are **not** superseded so an in-progress vault backup can finish before newer writes proceed. > > Successful retries emit `writeRetryRecovered`, wired in `setup-initial-state-hooks` to Segment as **`Data Persistence Write Retry Recovered`** with operation name, original error metadata, and retry delay. **`PERSISTENCE_MANAGER_OPERATION_SAFENER_DEBOUNCE_MS`** is exported and reused by `safe-reload` debouncing. > > Test support: `simulateStorageSetFailure` accepts **`'once'`** (first write per manager instance only). Unit and e2e coverage added for retry, supersede, and analytics. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 708f9ff. 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: Jongsun Suh <jongsun.suh@icloud.com>
… cp-13.42.0 (#44863) ## **Description** Fixes the dark theme regression in transaction details introduced by #44599 (native \`<dialog>\` refactor). The browser UA stylesheet sets \`color: canvastext\` directly on \`<dialog>\` elements, which overrides the inherited \`color: var(--color-text-default)\` from \`html[data-theme]\`. Because \`canvastext\` resolves based on the browser's native color-scheme rather than MetaMask's \`data-theme\` attribute, text inside the dialog renders with the wrong color in dark mode. Adding \`text-default\` here sets the MMDS color token as an author style directly on the dialog element, taking precedence over the UA rule and restoring correct text color for all descendants. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes #44836 ## **Manual testing steps** > **Note:** The bug only reproduces when your OS/system theme differs from the MetaMask theme. Set your OS to **light** mode and MetaMask to **dark** mode to trigger it. 1. Set OS appearance to Light mode 2. In MetaMask, go to Settings → General → Theme → Dark 3. Go to Activity 4. Click any transaction 5. Verify all text in the transaction details dialog is visible (white/light on dark background, not invisible black) ## **Screenshots/Recordings** ### **Before** <img width="1506" height="869" alt="Screenshot 2026-07-24 at 1 34 22 PM" src="https://github.com/user-attachments/assets/825237cc-e95b-4915-abf1-d94aa1cebdf6" /> <img width="451" height="624" alt="Image" src="https://github.com/user-attachments/assets/fa5e2a3a-4153-40e9-a821-fc7e9e9417b3" /> ### **After** <img width="1507" height="871" alt="Screenshot 2026-07-24 at 1 31 51 PM" src="https://github.com/user-attachments/assets/34383cb5-1e6f-46d8-a15a-a05411510fba" /> <img width="455" height="651" alt="Image" src="https://github.com/user-attachments/assets/289b0c93-f702-4645-a2a0-680f4406b593" /> ## **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.
<!-- 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 the locally enriched bridge transaction title text that incorrectly changes when switching to a non-EVM network ## **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: fix: local bridge activity label when switching to non-evm accounts ## **Related issues** Fixes: #44591 ## **Manual testing steps** 1. Do a token bridge 2. Switch network to Bitcoin ## **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 transactions appear in local activity and how bridge labels resolve when multichain network selection differs from EVM account; limited to activity UI/selectors, not funds or auth. > > **Overview** > Fixes **local activity / bridge label enrichment** when the user switches to a non-EVM network (e.g. Bitcoin) while staying on the same account group. > > `selectLocalTransactions` and `selectLocalActivityItems` now filter and enrich using **`selectEvmAddress`** (the EVM account in the selected group) instead of **`getSelectedInternalAccount`** (which tracks the network-selected account). **`selectEvmAddress`** is defined earlier in `activity.ts` so those selectors can depend on it. > > Across locale files, **`activity_deposit_*_description`** strings are cleared to empty messages (titles unchanged), so deposit rows no longer show redundant subtitle copy. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 07b9d35. 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** This PR adds the Tron network E2E cluster and the `home-network-filter` page object it depends on. It is one reviewable step of a linear stack and replaces #43659. Validated locally: `network.spec.ts` passes 5/6, with the 1 failure being an element-visibility timeout that is likely local flake — CI is the arbiter. Based on a fresh `main` and under 1000 changed lines. ## **Changelog** CHANGELOG entry: null ## **Related issues** Part of the local-blockchain E2E initiative (WPN-536). Replaces #43659. ## **Manual testing steps** 1. `yarn build:test` 2. `yarn test:e2e:single test/e2e/tests/tron/network.spec.ts --browser=chrome` (locally 5/6; the 1 element-visibility timeout is likely local flake — CI is the arbiter). ## **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. --------- 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** Cleanup and replace deprecated selectors ## **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** > Bridge history matching is narrower than the removed multi-field `getBridgeHistoryItem` logic, so bridge/swap activity status and intent-bridge pending cancel/speed-up rules could differ in edge cases. > > **Overview** > **Centralizes bridge history resolution** for activity and pending-transaction UI by adding exported `selectBridgeHistoryItemForTx`, which resolves by tx hash (via bridge-status selectors), direct `txHistory` key on meta id, then original tx meta id. > > **Activity selectors** drop the deprecated raw `txHistory` selector and the inline `getBridgeHistoryItem` group scan; local swap/bridge rows now call the shared lookup with `initialTransaction` only, and non-EVM bridge enrichment passes `{ hash: transaction.id }` instead of id-only. > > **Pending transaction actions** read bridge history through `useSelector` + `selectBridgeHistoryItemForTx` instead of `useBridgeTxHistoryData`; tests mock Redux and the new selector accordingly. A JSDoc note on `hasIntentBridgeActivity` was removed from the hook params type only. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit db8cad3. 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** After a Chrome Web Store upload is approved and published, rollout percentage is today adjusted manually in the CWS Developer Dashboard. This PR adds an audited, human-initiated path to raise deploy percentage via CWS API v2. **Problem:** Manual dashboard changes are hard to audit and easy to mis-apply (rollback, large jumps, 100% without explicit confirmation). **Solution:** - New `.github/workflows/adjust-cws-rollout.yml` — `workflow_dispatch` only; targets `dev`, `production`, `flask` (aligned with INFRA-3734 upload model). - **Separate from upload:** upload = Runway + WIF on `cws-dev` / `cws-production` / `cws-flask` (draft only). Rollout = human judgment after monitoring (`docs/sensitive-release.md` 1% protocol). - **Authorization:** dedicated rollout GitHub Environments with required reviewers (platform must create): - `cws-rollout-dev` (UAT smoke) - `cws-rollout-production` (main listing) - `cws-rollout-flask` (Flask listing) - Bot/Runway dispatch explicitly rejected; human initiates → environment approver confirms → guardrails → CWS API. - Guardrails script reports **all** violations before exit (range, no rollback, 100% confirm, 50-point max step). - CWS v2 `:fetchStatus` for current `deployPercentage`; `:setPublishedDeployPercentage` to apply. - `if: always()` audit summary (actor, environment, target, version, previous/requested %, run URL). **Open question (see INFRA-3651):** Runway-driven vs workflow-driven rollout for production — pending Mark / Gauthier / Victor. **Platform follow-up (not in this PR):** 1. Create `cws-rollout-*` GitHub Environments + required reviewers (after RE confirmation). 2. Extend GCP WIF CEL + IAM bindings for rollout envs on dev and prod (`adjust-cws-rollout.yml`; no Runway pin on rollout path). ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: [INFRA-3651](https://consensyssoftware.atlassian.net/browse/INFRA-3651) ## **Manual testing steps** **Prerequisite:** Platform creates `cws-rollout-dev` / `cws-rollout-production` / `cws-rollout-flask` and WIF CEL for `adjust-cws-rollout.yml`. 1. **Dev — rollback:** Published version at e.g. 10%; dispatch `desired_percentage=5` → guardrails fail with rollback message; attach run link to INFRA-3651. 2. **Dev — 100% without confirm:** Dispatch `desired_percentage=100` without `confirm_full_rollout=yes` → guardrails fail; attach run link. 3. **Dev — success:** Valid version, e.g. 5% → 10% → guardrails pass → CWS updated; audit summary correct; attach run link. 4. **Production — bot block:** Any bot dispatch → rejected before GCP auth; attach run link. 5. **Production — human success:** RE dispatches → environment approver confirms → rollout updated on production listing; attach run link. 6. **Flask — human success:** Same as production on Flask listing (`EXTENSION_ID_FLASK`); attach run link. ## **Screenshots/Recordings** N/A — CI/workflow only; evidence is GitHub Actions run summaries and CWS listing state. ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask 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)). ## **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-3651]: https://consensyssoftware.atlassian.net/browse/INFRA-3651?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes who can move production extension rollout % and how (WIF + CWS API), but bots are blocked, rollbacks are refused in-workflow, and GitHub Environment reviewers are required before apply. > > **Overview** > Adds a **human-only** GitHub Actions path to raise Chrome Web Store **published deploy percentage** after upload, separate from `upload-extension-to-cws.yml` (Runway/draft upload). > > New **`adjust-cws-rollout.yml`** is `workflow_dispatch` with inputs for manifest **version**, **desired_percentage** (1–100), and **target** (`dev` / `production` / `flask`). Each target maps to a dedicated **`cws-rollout-*` GitHub Environment** (required reviewers), rejects **Bot** senders, requires **`refs/heads/main`**, resolves WIF/listing vars like the upload workflow, and authenticates to CWS with the chromewebstore scope. > > The job calls **`:fetchStatus`**, derives **current** `deployPercentage` only from the **live published** `crxVersion` (Flask uses `{version}-flask.0`), then runs **`adjust-cws-rollout-guardrails.sh`** (valid ranges, **no rollback** when desired < current, no-op when equal) before **`:setPublishedDeployPercentage`**. An **`if: always()`** step writes an audit table to the run summary (actor, env, target, version, before/after %, step outcomes). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 88a5e3e. 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>
commented
Aug 8, 2026
Builds ready [dfc2567]
⚡ Performance Benchmarks (Total: 🟢 10 pass · 🟡 7 warn · 🔴 4 fail)
Bundle size diffs [🚨 Warning! Bundle size has increased!]
🍒 What's in this RCCherry-picks (12 commits)
Changelog (162 commits since v13.42.0)
AI Test Plan
Cherry-Pick Scenarios (2)High Risk Scenarios (1)1. Smart Transactions - Sentinel endpoint routingRisk Level: HIGH Why This Matters: Cherry-pick #45214 fixes STX controller routing; incorrect endpoints can break all STX sends or strand users mid-flow. Test Steps:
Medium Risk Scenarios (1)1. Perps - Order book on order entry pageRisk Level: MEDIUM Why This Matters: Cherry-pick #45151 adds a new user-facing order book; incorrect wiring can misprice orders or break trading UX. Test Steps:
Release Scenarios (10)High Risk Scenarios (5)1. State Migrations 220/221 - Persistent state integrityRisk Level: HIGH Why This Matters: New migrations can corrupt or drop user data (accounts, networks, tokens, pending approvals) and block core wallet flows. Test Steps:
2. State Migrations 220/221 - Metametrics consent and defaultsRisk Level: HIGH Why This Matters: Metametrics-controller changes can mistakenly flip consent or leak PII, creating privacy regressions post-migration. Test Steps:
3. Smart Transactions - submit and fallbackRisk Level: HIGH Why This Matters: Controller and patch changes around Smart Transactions can break send flows or strand users in non-functional routes. Test Steps:
4. Dapp Permissions - Unconnected account alertRisk Level: HIGH Why This Matters: Incorrect unconnected-account gating can silently block dapp flows or allow unintended account access. Test Steps:
5. Balances - Account group balance accuracyRisk Level: HIGH Why This Matters: Incorrect aggregation or stale state can misrepresent user funds, eroding trust in balances shown. Test Steps:
Medium Risk Scenarios (5)1. Perps - Live market data stream resilienceRisk Level: MEDIUM Why This Matters: Perps stream bridge changes can cause stalls or memory leaks, breaking real-time trading UX. Test Steps:
2. Network Management - Invalid custom network alertRisk Level: MEDIUM Why This Matters: Incorrect or noisy network validation interrupts normal use and may mislead users about network safety. Test Steps:
3. Assets - Network filter and control bar behaviorsRisk Level: MEDIUM Why This Matters: Filter logic regressions can hide assets or confuse totals, leading to missed funds or actions. Test Steps:
4. App State - Route and UI state persistenceRisk Level: MEDIUM Why This Matters: App-state-controller changes can create jarring resets or stuck UI flows after lock/unlock or reload. Test Steps:
5. Analytics Events - Emission and redactionRisk Level: MEDIUM Why This Matters: Refactors in the metametrics controller may alter event names or redaction, risking broken dashboards or privacy leaks. Test Steps:
Teams Sign-off StatusSigned off: None yet Awaiting sign-off (6): Generated by AI Test Plan Analyzer (gpt-5) at 2026-08-08T02:10:15.163Z AI generated test plan (JSON): test-plan-13.43.0.json |
…GHSA-2v37-7h3g-55p8` (#45372) - chore: bump nanoid to `^3.3.17` to clear `GHSA-2v37-7h3g-55p8` cp-13.43.0 (#45362) ## **Description** `nanoid` is a direct production dependency and `main` resolved it to 3.3.16. [GHSA-2v37-7h3g-55p8](GHSA-2v37-7h3g-55p8) covers `< 3.3.17` — a custom generator built with `customAlphabet` / `customRandom` loops indefinitely when `size` is zero. This moves the declared range to `^3.3.17` and consolidates every 3.x descriptor in the tree onto a single 3.3.17 entry: ``` "nanoid@npm:^3.3.10, ^3.3.11, ^3.3.16, ^3.3.17, ^3.3.8": version: 3.3.17 ``` Two notes for anyone repeating this, because the obvious commands both fail in different directions: - **`yarn dedupe` alone does not reach it.** Dedupe consolidates onto the highest version *already in the lockfile*, so with 3.3.16 resolved it is a no-op — the version has to be introduced with `yarn up` first. - **A bare `yarn up nanoid` overshoots.** nanoid's `latest` dist-tag is `6.0.1`, so it rewrites the range to `^6.0.1` and pulls a major; the 3.x line ships under the `legacy` tag. Pinning to `@^3.3.17` keeps it in range. The remaining `nanoid@2.1.11` is untouched and unaffected — dev-only, reached through `redux-devtools-core`. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: #45334 Reachability triage for this advisory, including why the upgrade path here is clean unlike #45325's: #45334 (comment) ## **Manual testing steps** Dependency-only change with no runtime surface, so verification is by resolution and audit rather than by using the app. 1. `yarn install` 2. `grep -A2 '^"nanoid@npm' yarn.lock` → every `^3.3.x` descriptor resolves to a single `3.3.17` entry 3. `yarn npm audit --recursive --environment production` → nanoid no longer reported ### Results on this branch | check | result | |---|---| | declared range | `dependencies.nanoid` = `^3.3.17` | | resolution | all five 3.x descriptors consolidated onto **3.3.17** | | production audit | nanoid **not flagged** | | diff scope | `package.json` 1 line, `yarn.lock` 10 lines | ## **Screenshots/Recordings** N/A — no user-visible 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 - [ ] I’ve included tests if applicable — N/A, dependency bump - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable — N/A - [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** > Patch-level dependency bump with lockfile consolidation only; no source changes and stays on nanoid 3.x. > > **Overview** > Bumps the direct production dependency **`nanoid`** from `^3.3.8` to **`^3.3.17`** and refreshes **`yarn.lock`** so every `^3.3.x` descriptor resolves to a single **3.3.17** entry (replacing **3.3.16**). > > This addresses [GHSA-2v37-7h3g-55p8](GHSA-2v37-7h3g-55p8), where `customAlphabet` / `customRandom` can loop indefinitely when `size` is zero on versions below 3.3.17. There are **no application or runtime code changes**—only dependency resolution. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 3e63d80. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> [a58c242](a58c242) --------- Co-authored-by: Jongsun Suh <jongsun.suh@icloud.com> Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
commented
Aug 10, 2026
Builds ready [c81d0a9]
⚡ Performance Benchmarks (Total: 🟢 13 pass · 🟡 5 warn · 🔴 4 fail)
Bundle size diffs [🚨 Warning! Bundle size has increased!]
🍒 What's in this RCCherry-picks (13 commits)
Changelog (163 commits since v13.42.0)
AI Test Plan
Cherry-Pick Scenarios (2)High Risk Scenarios (1)1. Smart Transactions – Tx Sentinel routing for RobinhoodRisk Level: HIGH Why This Matters: Cherry-pick 45214 fixes Smart Transactions controller routing to the Robinhood tx-sentinel; incorrect routing would cause stuck or failed transactions for affected users. Test Steps:
Medium Risk Scenarios (1)1. Perps – Order Book on Order Entry pageRisk Level: MEDIUM Why This Matters: Cherry-pick 45151 adds a new order book in the order entry flow; rendering, real-time updates, and order placement integration must work to avoid broken trading experiences. Test Steps:
Release Scenarios (10)High Risk Scenarios (5)1. State Migrations (220/221) – Full upgrade with rich user stateRisk Level: HIGH Why This Matters: Migrations can corrupt/lose critical user state; a bad migration can break permissions, networks, or privacy settings across all users. Test Steps:
2. State Migrations (220/221) – Backfill/edge-case resilienceRisk Level: HIGH Why This Matters: Real users often have older or partially corrupted state; migrations must be robust to avoid lockouts and data loss. Test Steps:
3. Transaction Flow – Smart Transactions on/off and fallbackRisk Level: HIGH Why This Matters: Any regression in transaction submission, fee display, or status tracking can cause financial loss or user lockout. Test Steps:
4. Network Management – Invalid Custom Network AlertRisk Level: HIGH Why This Matters: Incorrectly allowing actions on an invalid network can cause failed transactions and loss of user trust. Test Steps:
5. Privacy & Telemetry – MetaMetrics Controller changesRisk Level: HIGH Why This Matters: Telemetry consent and event gating are critical for compliance and user trust; regressions can cause privacy violations. Test Steps:
Medium Risk Scenarios (5)1. Dapp Connections – Unconnected Account Alert behaviorRisk Level: MEDIUM Why This Matters: Incorrect alerts can confuse users or lead to accidental actions with the wrong account. Test Steps:
2. Assets – Network filter and Control Bar behaviorRisk Level: MEDIUM Why This Matters: Incorrect filtering can hide assets or mislead users about balances, causing support issues and loss of trust. Test Steps:
3. Balances – Account group balance aggregationRisk Level: MEDIUM Why This Matters: Incorrect totals or rounding lead to user confusion and perceived balance discrepancies. Test Steps:
4. Perps – Streaming/bridge stability (market data updates)Risk Level: MEDIUM Why This Matters: Streaming regressions can degrade performance or show stale prices, risking user mistakes. Test Steps:
5. App State – Lock/Unlock and UI state persistenceRisk Level: MEDIUM Why This Matters: App state controller changes can cause navigation glitches that block access to core features. Test Steps:
Teams Sign-off StatusSigned off: None yet Awaiting sign-off (7): Generated by AI Test Plan Analyzer (gpt-5) at 2026-08-10T18:27:52.032Z AI generated test plan (JSON): test-plan-13.43.0.json |
…lear `GHSA-55q2-fjhq-7xh7` (#45377) - chore: bump `dompurify` to `3.4.13` to clear `GHSA-55q2-fjhq-7xh7` cp-13.43.0 (#45364) ## **Description** `dompurify` is a direct production dependency. [GHSA-55q2-fjhq-7xh7](GHSA-55q2-fjhq-7xh7) covers `<= 3.4.12` — during `IN_PLACE` sanitization a hook that removes an element leaves that element's detached descendants executable, because `_sanitizeElements()` returns early without calling `_neutralizeSubtree()`. **This is not a plain version bump.** `dompurify` was declared *as a patch spec* in both `dependencies` and `resolutions`, each hard-pinning the exact version 3.4.12, so `yarn up dompurify` cannot move it. Three things change together: - the dependency spec → `patch:dompurify@npm%3A3.4.13#...` - the matching `resolutions` entry - the patch itself, rebased 3.4.12 → 3.4.13 via `yarn patch` / `yarn patch-commit` **The carried-forward patch is unrelated to this advisory** — it rewrites `'<!-->'` and `'<!---->'` as concatenations so the literals do not trip LavaMoat's `SES_HTML_COMMENT_REJECTED`. Same two edits, only line offsets moved: ```diff - dirty = '<!-->'; + // Modifying to avoid lavamoat SES_HTML_COMMENT_REJECTED + dirty = '<!' + '--' + '>'; - body = _initDocument('<!---->'); + // Modifying to avoid lavamoat SES_HTML_COMMENT_REJECTED + body = _initDocument('<!' + '--' + '--' + '>'); ``` ### Patch scope: carried forward unchanged The 3.4.12 patch covered three bundles; this covers the same three — 3 files, 6 hunks. `dist/purify.js` is the UMD build, so it takes the same two edits one indent level deeper. Verified rather than asserted — both the `+`/`-` content and the file set diff clean against the 3.4.12 patch: ``` diff <(grep -E '^[+-]' old.patch | grep -vE '^(\+\+\+|---)' | sort) \ <(grep -E '^[+-]' new.patch | grep -vE '^(\+\+\+|---)' | sort) # no output ``` ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: #45325 Reachability triage for this advisory — why the vulnerable path is not reachable as we use DOMPurify, and why an upgrade was still the cheaper disposition than a suppression with a guarded invariant: #45325 (comment) ## **Manual testing steps** Verification is against the **installed artifact**, not the manifest — a patch that silently failed to apply would still leave `package.json` looking correct. 1. `yarn install` 2. `cat node_modules/dompurify/package.json | grep version` → `3.4.13` 3. `grep -c "'<!' + '--'" node_modules/dompurify/dist/purify.{cjs.js,es.mjs}` → `2` each (patch applied) 4. `grep -c "dirty = '<!-->'" node_modules/dompurify/dist/purify.{cjs.js,es.mjs}` → `0` each (no unpatched literals) 5. `grep -c "_neutralizeSubtree(currentNode)" node_modules/dompurify/dist/purify.cjs.js` → `2` (upstream fix present on both hook-detach paths) 6. `yarn npm audit --recursive --environment production` 7. `yarn jest ui/pages/notifications/notification-components/feature-announcement` ### Results on this branch | check | result | |---|---| | installed version | **3.4.13** | | SES patch applied | 2 occurrences in each of all three bundles | | patch scope | 3 files / 6 hunks — identical file set and `+`/`-` content to the 3.4.12 patch | | unpatched literals remaining | **0** in both files | | upstream fix present | `_neutralizeSubtree(currentNode)` guards **both** hook-detach returns | | production audit | dompurify **not flagged** | | consumer tests | **11/11 passing** | | diff scope | `package.json` 4 lines, `yarn.lock` 18 lines, patch renamed 3.4.12 → 3.4.13 | ## **Screenshots/Recordings** N/A — no user-visible 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 - [ ] I’ve included tests if applicable — N/A, dependency bump; existing consumer suite exercised - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable — N/A - [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** > Dependency-only security upgrade with the same behavioral patch as before; no application code changes, though dompurify is on the HTML sanitization path. > > **Overview** > **Upgrades `dompurify` from 3.4.12 to 3.4.13** to address **GHSA-55q2-fjhq-7xh7** (hook-driven element removal could leave detached descendants unsanitized in `IN_PLACE` mode). Because the dependency is pinned as a Yarn **patch** spec in both `dependencies` and `resolutions`, the change updates those entries and `yarn.lock` to `patch:dompurify@npm%3A3.4.13#...` rather than a simple version bump. > > The existing **LavaMoat** workaround is **rebased unchanged** onto 3.4.13: HTML comment placeholders (`'<!-->'`, `'<!---->'`) are built via string concatenation in the three dist bundles so they do not trigger `SES_HTML_COMMENT_REJECTED`. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit f49a90a. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> [0967a06](0967a06) --------- Co-authored-by: Jongsun Suh <jongsun.suh@icloud.com> Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
commented
Aug 10, 2026
Builds ready [a70b6f9]
⚡ Performance Benchmarks (Total: 🟢 13 pass · 🟡 5 warn · 🔴 4 fail)
Bundle size diffs [🚨 Warning! Bundle size has increased!]
🍒 What's in this RCCherry-picks (14 commits)
Changelog (164 commits since v13.42.0)
AI Test Plan
Cherry-Pick Scenarios (2)High Risk Scenarios (1)1. Smart Transactions - tx-sentinel (Robinhood URL) integrationRisk Level: HIGH Why This Matters: Cherry-pick 45214 fixes Smart Transactions controller routing by adding a tx-sentinel Robinhood URL; a misconfiguration here can break submissions or protection checks globally. Test Steps:
Medium Risk Scenarios (1)1. Perps - Order book on Order Entry pageRisk Level: MEDIUM Why This Matters: Cherry-pick 45151 introduces a new order book UI within the entry flow; streaming data or render issues can block trading and degrade user trust. Test Steps:
Release Scenarios (10)High Risk Scenarios (5)1. State Migrations (220/221) - Upgrade resilienceRisk Level: HIGH Why This Matters: Migrations can corrupt or drop persisted data; ensuring seamless upgrade prevents account loss, broken connections, or privacy regressions. Test Steps:
2. MetaMetrics Controller changes - consent and event gatingRisk Level: HIGH Why This Matters: Changes to MetaMetrics controller can silently break consent gating or spam analytics; this directly impacts user privacy and compliance. Test Steps:
3. Assets list control bar and network filteringRisk Level: HIGH Why This Matters: Multiple UI components changed around network filtering; any mismatch can hide assets or mislead users about balances. Test Steps:
4. Invalid Custom Network AlertRisk Level: HIGH Why This Matters: Prevents users from transacting on misconfigured networks, reducing the risk of lost funds. Test Steps:
5. Unconnected Account Alert for dappsRisk Level: HIGH Why This Matters: Prevents accidental use of the wrong account with dapps, a common cause of user error. Test Steps:
Medium Risk Scenarios (5)1. App State Controller - lock/unlock and onboarding gatingRisk Level: MEDIUM Why This Matters: App state flags drive many UI flows; regressions can trap users in onboarding loops or mis-route after unlock. Test Steps:
2. Account Group Balance - aggregate accuracyRisk Level: MEDIUM Why This Matters: Incorrect aggregate balances can cause user confusion or bad financial decisions; changes to this component need validation. Test Steps:
3. Bridge flow regression check (quotes to confirmation)Risk Level: MEDIUM Why This Matters: Underlying controller/package patch shifts can silently affect Bridge logic; a sanity check reduces risk of broken cross-network flows. Test Steps:
4. Asset list performance and scrolling with large token setsRisk Level: MEDIUM Why This Matters: Large UI refactors can degrade list virtualization and responsiveness, harming everyday usability. Test Steps:
5. Analytics events on confirmation screensRisk Level: MEDIUM Why This Matters: Confirm screens often emit critical events; ensuring correct gating avoids privacy violations and analytics regressions. Test Steps:
Teams Sign-off StatusSigned off: None yet Awaiting sign-off (8): Generated by AI Test Plan Analyzer (gpt-5) at 2026-08-10T19:27:51.486Z AI generated test plan (JSON): test-plan-13.43.0.json |
commented
Aug 10, 2026
Builds ready [a70b6f9]
⚡ Performance Benchmarks (Total: 🟢 13 pass · 🟡 5 warn · 🔴 4 fail)
Bundle size diffs [🚨 Warning! Bundle size has increased!]
🍒 What's in this RCCherry-picks (14 commits)
Changelog (164 commits since v13.42.0)
AI Test Plan
Cherry-Pick Scenarios (2)High Risk Scenarios (1)1. Smart Transactions - Tx status tracking via updated tx-sentinel (Robinhood URL)Risk Level: HIGH Why This Matters: Cherry-pick 45214 fixes the Smart Transactions controller to use a new tx-sentinel endpoint; endpoint mismatches can break status tracking, leaving transactions stuck or misreported. Test Steps:
Medium Risk Scenarios (1)1. Perps - Order book on order entry pageRisk Level: MEDIUM Why This Matters: Cherry-pick 45151 adds a new user-facing order book; integration issues can block order entry, prefill the wrong price, or display stale data during live trading. Test Steps:
Release Scenarios (9)High Risk Scenarios (3)1. State Migrations 220/221 - Core wallet stateRisk Level: HIGH Why This Matters: Migrations can corrupt or drop critical wallet state (accounts, permissions, networks). Two new migrations (220, 221) raise the risk of subtle data loss or incorrect defaults after upgrade. Test Steps:
2. MetaMetrics consent and event gating (MetaMetrics Controller refactor)Risk Level: HIGH Why This Matters: Substantial MetaMetrics controller changes can cause consent regressions (unexpected prompts), lost preferences, or misfired analytics in critical flows. Test Steps:
3. Connected Sites & Permissions persistence across account switchingRisk Level: HIGH Why This Matters: Controller and app-state changes can break fine-grained permission mappings per account, leading to privacy and UX issues when switching accounts. Test Steps:
Medium Risk Scenarios (6)1. Alerts - Invalid Custom NetworkRisk Level: MEDIUM Why This Matters: This alert’s logic directly guides users away from misconfigured networks; logic changes can cause false positives/negatives that strand users. Test Steps:
2. Alerts - Unconnected Account (Dapp connection)Risk Level: MEDIUM Why This Matters: Recent UI logic changes to this alert can confuse users about which account is connected, impacting security and transaction correctness. Test Steps:
3. Assets List - Network Filter & Control Bar behaviorRisk Level: MEDIUM Why This Matters: Multiple UI updates to the control bar and filter can cause state desyncs (wrong assets shown) and persistence bugs that confuse users managing tokens. Test Steps:
4. Account Group Balance - Aggregation and fiat conversionRisk Level: MEDIUM Why This Matters: Recent component changes can create mis-aggregation or stale totals, misleading users about their total holdings. Test Steps:
5. Perps streaming bridge - connection resilienceRisk Level: MEDIUM Why This Matters: Stream bridge logic changes risk stale or missing market data, directly impacting trading UX and decision-making. Test Steps:
6. Account Icon Tour / First-run UI gatingRisk Level: MEDIUM Why This Matters: Small logic tweaks to first-run cues can result in repetitive prompts or missed guidance that degrade onboarding UX. Test Steps:
Teams Sign-off StatusSigned off: None yet Awaiting sign-off (8): Generated by AI Test Plan Analyzer (gpt-5) at 2026-08-10T20:38:54.640Z AI generated test plan (JSON): test-plan-13.43.0.json |
b0e35f5 to
3575467
Compare
3575467 to
e398446
Compare
commented
Aug 11, 2026
Builds ready [e398446]
⚡ Performance Benchmarks (Total: 🟢 0 pass · 🟡 0 warn · 🔴 0 fail)
Bundle size diffs [🚨 Warning! Bundle size has increased!]
🍒 What's in this RCCherry-picks (15 commits)
Changelog (165 commits since v13.42.0)
AI Test Plan
Cherry-Pick Scenarios (2)High Risk Scenarios (1)1. Smart Transactions – tx-sentinel routing (Robinhood)Risk Level: HIGH Why This Matters: Cherry-pick #45214 fixes Smart Transactions controller routing; incorrect sentinel URL would break preflight/monitoring, stalling or misreporting transactions. Test Steps:
Medium Risk Scenarios (1)1. Perps – Order Book on Order Entry pageRisk Level: MEDIUM Why This Matters: Cherry-pick #45151 adds a new live Order Book to a trading surface; rendering or streaming regressions mislead users at the point of order placement. Test Steps:
Release Scenarios (10)High Risk Scenarios (5)1. State Migrations 220/221 – data integrity on upgradeRisk Level: HIGH Why This Matters: Migrations can corrupt or drop persisted data; ensuring accounts, networks, and permissions survive the upgrade is critical to prevent user lockout or fund visibility issues. Test Steps:
2. State Migrations 220/221 – stability and idempotencyRisk Level: HIGH Why This Matters: Migrations must be no-op after the first run and must not break new installs; repeated initialization can surface race conditions that corrupt storage. Test Steps:
3. MetaMetrics – consent gating and event suppressionRisk Level: HIGH Why This Matters: Large changes in metametrics-controller can unintentionally send events when consent is off or include sensitive data, violating user privacy expectations. Test Steps:
4. MetaMetrics – event context accuracyRisk Level: HIGH Why This Matters: Incorrect or missing event context (e.g., wrong chainId/account state) undermines product analytics and can cause misrouted experiments or support issues. Test Steps:
5. App State – lock/unlock and UI restorationRisk Level: HIGH Why This Matters: App-state-controller changes risk UI dead-ends or inconsistent state after lifecycle events, which directly impacts usability and support burden. Test Steps:
Medium Risk Scenarios (5)1. Custom Network validation – invalid custom network alertRisk Level: MEDIUM Why This Matters: Network misconfiguration can silently break transactions; the alert must be timely, accurate, and recoverable via clear actions. Test Steps:
2. Connected sites – unconnected account alertRisk Level: MEDIUM Why This Matters: Prevents users from signing with unintended accounts and clarifies site connection state, reducing signing mistakes. Test Steps:
3. Assets – network filter in Asset List and total balance accuracyRisk Level: MEDIUM Why This Matters: Filtering errors or stale balance aggregation mislead users about holdings, potentially causing incorrect decisions. Test Steps:
4. Perps – live data stream stability (order entry/market data)Risk Level: MEDIUM Why This Matters: Perps stream bridge/controller changes can cause silent data stalls or cross-context leaks, directly affecting trading accuracy. Test Steps:
5. Onboarding/UI tours – Account Icon Tour gatingRisk Level: MEDIUM Why This Matters: Tour gating interacts with persisted app state; regressions cause repetitive prompts or missing guidance for new users. Test Steps:
Teams Sign-off StatusSigned off: None yet Awaiting sign-off (5): Generated by AI Test Plan Analyzer (gpt-5) at 2026-08-11T08:22:03.538Z AI generated test plan (JSON): test-plan-13.43.0.json |
🚀 v13.43.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