Skip to content

release: 13.43.0 - #45055

Draft
metamaskbot wants to merge 164 commits into
stablefrom
release/13.43.0
Draft

release: 13.43.0#45055
metamaskbot wants to merge 164 commits into
stablefrom
release/13.43.0

Conversation

@metamaskbot

@metamaskbot metamaskbot commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

🚀 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

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

GitHub Signoff

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

Issue Resolution

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

Cherry-Picking Criteria

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

🗓️ Timeline and Milestones

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

✅ Signoff Checklist

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

Team sign-off checklist

  • Accounts
  • Assets
  • Bots Team
  • Confirmations
  • Core Extension UX
  • Core Platform
  • Delegation
  • Design System
  • Engagement
  • Extension Platform
  • MetaMask Delivery
  • Money Movement
  • Networks
  • Onboarding
  • Perps
  • Swaps and Bridge
  • Transactions

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

metamaskbot and others added 30 commits July 23, 2026 19:30
## 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>&nbsp;<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>&nbsp;</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 &lt; 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>
@metamask-ci

metamask-ci Bot commented Aug 5, 2026

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

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

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

Regressions (🔴 4 failures)

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

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: +18%
  • loadNewAccount/total: +18%
  • loadNewAccount/inp: +14%
  • loadNewAccount/lcp: +11%
  • confirmTx/longTaskTotalDuration: +12%
  • confirmTx/longTaskMaxDuration: +14%
  • confirmTx/tbt: +20%
  • confirmTx/inp: +14%
  • bridgeUserActions/bridge_load_page: +15%
  • bridgeUserActions/longTaskCount: +11%
  • bridgeUserActions/longTaskTotalDuration: +14%
  • bridgeUserActions/longTaskMaxDuration: +14%
  • bridgeUserActions/tbt: +36%
  • loadNewAccount/load_new_account: +25%
  • loadNewAccount/total: +25%
  • loadNewAccount/inp: -17%
  • loadNewAccount/fcp: -46%
  • loadNewAccount/lcp: +1215%
  • confirmTx/confirm_tx: +12%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +12%
  • confirmTx/inp: -24%
  • confirmTx/fcp: +11%
  • confirmTx/lcp: +1196%
  • bridgeUserActions/bridge_load_page: +399%
  • bridgeUserActions/bridge_load_asset_picker: +162%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +52%
  • bridgeUserActions/inp: -23%
  • bridgeUserActions/fcp: -45%
  • bridgeUserActions/lcp: +1226%

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

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

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/numNetworkReqs: -17%
  • startupStandardHome/domInteractive: -29%
  • startupStandardHome/numNetworkReqs: -13%
  • startupStandardHome/fcp: -24%
  • startupPowerUserHome/uiStartup: +19%
  • startupPowerUserHome/load: +23%
  • startupPowerUserHome/domContentLoaded: +23%
  • startupPowerUserHome/domInteractive: +34%
  • startupPowerUserHome/backgroundConnect: +51%
  • startupPowerUserHome/firstReactRender: +26%
  • startupPowerUserHome/initialActions: +11%
  • startupPowerUserHome/loadScripts: +23%
  • startupPowerUserHome/setupStore: +293%
  • startupPowerUserHome/inp: +23%
  • startupPowerUserHome/fcp: +25%
  • startupPowerUserHome/lcp: +21%

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

  • 🟡 startupPowerUserHome/INP: p75 232ms
  • 🟡 startupPowerUserHome/LCP: p75 3.5s
User Journey Benchmarks · Samples: 5 · real API 🔴 4

⚠️ Missing data: chrome/webpack/userJourneyTransactions

Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 doneButtonToHomeScreen
🔴 total
🔴 [CI log]
🔴 total
onboardingNewWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 total
🔴 [CI log]
🔴 total
assetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
🟡 assetClickToPriceChart
importSrpHome
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
sendTransactions
[Sentry log · main/release]
🟡 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • onboardingImportWallet/srpButtonToSrpForm: +15%
  • onboardingImportWallet/confirmSrpToPwForm: +38%
  • onboardingImportWallet/pwFormToMetricsScreen: +12%
  • onboardingImportWallet/metricsToWalletReadyScreen: +50%
  • onboardingImportWallet/doneButtonToHomeScreen: -36%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: +138%
  • onboardingImportWallet/longTaskCount: +29%
  • onboardingImportWallet/longTaskTotalDuration: +19%
  • onboardingImportWallet/tbt: +18%
  • onboardingNewWallet/skipBackupToMetricsScreen: -14%
  • onboardingNewWallet/tbt: +27%
  • solanaAssetDetails/assetClickToPriceChart: -65%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: -65%
  • importSrpHome/inp: -22%
  • importSrpHome/lcp: +74%
  • importSrpHome/cls: +1599%

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

  • 🟡 importSrpHome/INP: p75 240ms
  • 🟡 solanaAssetDetails/FCP: p75 2.1s
  • 🟡 solanaAssetDetails/LCP: p75 2.8s
  • 🟡 sendTransactions/FCP: p75 2.2s
  • 🟡 sendTransactions/LCP: p75 2.7s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • dappPageLoad/pageLoadTime: -28%
  • dappPageLoad/domContentLoaded: -22%
  • dappPageLoad/firstPaint: -14%
  • dappPageLoad/firstContentfulPaint: -14%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 4.25 KiB (0.03%)
  • ui: 34.03 KiB (0.19%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 476 Bytes (0.02%)
  • zip: 47.71 KiB (0.22%)

🍒 What's in this RC

Cherry-picks (9 commits)
Commit Description
a694e1ef9b Cherry-picking commits from cherry-pick-13-43-0-3cad329 to release/13.43.0 for PR #45158 (#45244)
18b0642e48 release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45216)
3b2076081e release(runway): cherry-pick feat(ci): derive orchestrator version from release branch (#45224)
024c9a632a release(runway): cherry-pick fix(ci): bind AMO package EXIT trap path before set -u can fail (#45225)
f576b8f4ac release(runway): cherry-pick fix: patch smart-transactions-controller to add the tx-sentinel robinhood URL (#45214)
400f264212 release(runway): cherry-pick chore: audit brace-expansion, postcss, fast-uri, undici, and socket.io-parser (#45188)
f1e31952b6 release(runway): cherry-pick feat(perps): add order book to order entry page (#45151)
1ea90deff7 release(runway): cherry-pick chore: bump snap-account-service (report migration error) (#45102)
75ea9568be Merge branch 'stable' into release/13.43.0

Changelog (159 commits since v13.42.0)
Commit Description
a694e1ef9b Cherry-picking commits from cherry-pick-13-43-0-3cad329 to release/13.43.0 for PR #45158 (#45244)
18b0642e48 release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45216)
3b2076081e release(runway): cherry-pick feat(ci): derive orchestrator version from release branch (#45224)
024c9a632a release(runway): cherry-pick fix(ci): bind AMO package EXIT trap path before set -u can fail (#45225)
f576b8f4ac release(runway): cherry-pick fix: patch smart-transactions-controller to add the tx-sentinel robinhood URL (#45214)
400f264212 release(runway): cherry-pick chore: audit brace-expansion, postcss, fast-uri, undici, and socket.io-parser (#45188)
f1e31952b6 release(runway): cherry-pick feat(perps): add order book to order entry page (#45151)
1ea90deff7 release(runway): cherry-pick chore: bump snap-account-service (report migration error) (#45102)
76657f7a3c release: release-changelog/13.43.0 (#45056)
9da0748ed3 Merge release/13.42.0 into release/13.43.0
d90d1e76b8 fix(hardware-wallets): bound stuck account-creation spinner with device-read timeout cp-13.42.0 (#45048)
0311ca5fc9 feat: add trust security signals tdp (#44761)
3114315a0e fix: consume stx enabled flag for batch sell from selected chain (#45032)
3ae0ce34cc chore: clean up TextFieldSearch styles after MMDS package update (#45030)
51cff5563f test: fix flaky test Smart Transactions should send transaction using USDC to pay fee (#45036)
0610a607c7 feat(perps): wire dedicated aggregated order-book socket per UI connection (#45035)
d67a05b8aa ci(slsa): publish attestation bundles and pin run-build actions (INFRA-3786) (#44955)
666b247f3a test: fix flaky custom-token import E2E by waiting for the Add Custom Token network picker to settle TimeoutError: Waiting for element to be located By(css selector, [data-testid="custom-token-import-submit-button"]:not([disabled])) (#45025)
9afac38fe7 feat: new segment schema support (#43132)
bfdb62afa3 test: fix flaky test BTC Account - Activity Receive transaction is rendered with Received label and confirmed status (#45022)
0fdbade0f4 test: MMQA - 1916 - Refactor multiple-provider-connections.spec.ts to good practices (#44941)
33bef9f690 test: fix flaky perps watchlist explore TimeoutError: Waiting for element to be located By(css selector, [data-testid="market-list-filter-sort-row"]) (#44936)
6d53060f6b test: replace driver.waitForSelector with page object methods (#44898)
ed7b8fbd53 fix: patch for missing slip44 entries in core client-utils cp-13.42.0 (#45006)
7e9653a51f feat: added metrics for custom network page (#45031)
5a94f11f60 feat(activity): contact names in activity rows (#45013)
5f842c6082 test: fix flaky Add wallet Import wallet using SRP during onboardingand MetaMask onboarding should not prevent network requests to advanced... (#45034)
c36df0ec1a fix: vertically center contact copy button (#45020)
e3abdc3e78 feat: added timer for balance loading cp-13.42.0 (#45033)
b424876ab6 chore: update assets controllers for defi fix (#45003)
adec2ed351 refactor(wpc-1066): migrate pending-approval HW methods to LegacyBackgroundApiService (#44937)
20bf478a91 feat(confirmations): add Money Account Deposit developer option (#44945)
48ad866df4 bump(perps): upgrade @metamask/perps-controller to v10 (#45024)
239006e967 fix(notifications): add bottom padding to marketing consent text (#45021)
9158172d8a refactor(wpc-1067): migrate network enablement methods to LegacyBackgroundApiService (#44938)
62aaaa4923 test: order selectors and methods in all page objects (#44987)
45505c9910 chore: wire stellar asset component with stellar asset selector (#44979)
ce134bc060 feat: defi positions v2 controller (#44392)
b50797d25a chore: pass Firefox system access via geckodriver and pin 0.36.0 (#45014)
0c7372db98 fix(pure-black): use bg-default on back up SRP page (#44983)
e47424b771 fix(perps): show wallet-confirmed deposits immediately in Perps Activity (#44736)
9b623cccf7 ci: turn on the Triage and Retry System by default (no retry-ci label needed) (#44956)
778bafe559 feat(ramps): wire Buy Continue with background checkout watch (#44689)
10b5de87df test: lavamoat e2e (#44925)
c1a5d29ffd fix: swaps stale dest exchange rates cp-13.42.0 (#44968)
0fa0c88cf3 chore: fix lint:changed script (#45010)
fa5c57e727 fix: navigate to homepage after users close popup from batch sell (#44991)
7dce891afb feat(ramps): send Portfolio-connected wallets to Portfolio on Buy (#44804)
3739101671 fix(pure-black): refine SRP input empty vs filled styling (#45004)
1ec648fa36 chore: update swap consumers to use and display partial QuoteMetadata (#44630)
0660a05750 refactor(wpc-1068): migrate requestSafeReload & openUpdateTabAndReload to LegacyBackgroundApiService (#44940)
d2fdd13169 perf(6570): bump react-hooks to v7 and remove react-compiler plugin (#44495)
cf719e0334 fix(pure-black): stop inverting bridge transaction settings tooltip theme (#44964)
10fabf3ed6 chore: New Crowdin Translations by GitHub Action cp-13.42.0 (#44746)
806f4bf8b6 fix(pure-black): use BackgroundDefault for markets row skeleton (#44984)
da76cb3edb fix(pure-black): use bg-default on Snap install screen (#45002)
c20d7eb736 fix(pure-black): set send network filter button background to transparent (#44882)
04b53836a4 chore(STX): add Robinhood Chain to smart transactions supported networks (#44926)
284f97705e chore: popover for failed transaction status (#44961)
2668c42734 fix(pure-black): remove border from page footer cancel buttons (#44981)
d0efdd7df1 chore(storybook): add Pure Black toolbar toggle and component stories (#44963)
fadc943601 feat: assets unify balance and traces (#44978)
bad91a67e9 chore: replaced deprecated Tag component with MMDS tag (#44785)
dd2075062d fix(confirmations): refetch MetaMask Pay required token price when it is missing (#44950)
66b8f875e3 fix(pure-black): fix Menu background specificity with bg-section (#44966)
00f32ff73c fix: qr camera permission throwing e.isUnlocked is not a function (#44701)
b5ed10c4c2 feat(hardware-wallets): enable shared signing flow (#43947)
1695992b6f feat: migrate Infura IPFS users to dweb.link and block Infura IPFS gateway entry (#44982)
0ad8940da9 feat: use new snap keyring v2/v1 split (#44289)
b7f13b1a4c test: refactor transaction details page and consolidate selectors (#44694)
61ff089628 test(e2e): add Tron assets E2E cluster (#44852)
540d2a65b1 feat: bump transaction-pay-controller to 26.0.0 (#44782)
df415e426e test: skip ERC20 max balance WS update test (ASSETS-3385) (#44952)
f87e3bc8db fix(pure-black): remove custom background color from InfoPopoverTooltip (#44933)
634b46cfed fix(pure-black): remove border-l and bg-alternative from drawer in popup/compact sidepanel (#44960)
57da315640 test: pom lint rule supporting groups (selectors, constructor, actions) (#44789)
7e641c6203 chore: bump @types/chrome and drop custom chrome typings (#44888)
cbd1c50aaf perf(7466): add memoization to network/asset modal components (Batch D) (#44296)
75e09ed50f fix(pure-black): settings sidebar uses bg-alternative in pure black mode (#44883)
c164a38416 fix: clear the postcss advisories cp-13.42.0 (#44865)
3f6a9050c3 test: cover Token Detection Enabled identify trait (#44915)
91ed59bb42 chore: replace local gator permission detail schemas with @metamask/7715-permission-types (#44415)
a73805093a fix: excempt batch sell routes from ConfirmationRouter (#44951)
87d0cf9c0a fix(pure-black): set main action button dropdown to bg-alternative (#44881)
17731f5111 fix(pure-black): fix account address popover background and refactor row hover to Tailwind (#44880)
b8ee5bb2eb fix(pure-black): correct tooltip background and arrow colors in dark and pure black themes (#44879)
7b6dde7630 fix(pure-black): add bg-alternative and border to asset explorer view (#44878)
cfdbb033e8 bump: brace-expansion to 5.0.8 (#44924)
00ebfcf32e feat: updated import NFT flow Modal (#44899)
a5f18a53c5 fix: Allow QR singing in side panel on brave (#44934)
bdbe8f29c1 chore(6922): bump @testing-library/react to v14 (#42635)
b35834378b chore: upgrade design system packages (v57.0.0) (#44931)
58b697a400 fix: remove deprecated METAMASK_ENVIRONMENT=test in favor of testing (#44944)
4e37811629 chore: remove copy-to-clipboard dependency (#44890)
4d2065f6a5 test: add coverage for Notification Clicked metrics event (#44920)
da23672992 feat(analytics): migrate pre-consent queue to AnalyticsController (#43869)
5201492b01 feat: refactor non-zero native custom networks (#44161)
9e0cbd2538 fix: allow Firefox WebDriver system access for about:debugging (#44946)
992ff087e7 test(e2e): refactor tokens tab page object for assets coverage (#44778)
b8ad63da79 ci(amo): allow release-team manual dispatch of AMO production (INFRA-3769) (#44519)
bd65eccfdb chore: remove defi v2 fetching from getApi (#44939)
3cb496ea9a chore: migrate markNotificationPopupAsAutomaticallyClosed to LegacyBackgroundApiService (#44249)
f835f69039 feat: initialize DeFiPositionsControllerV2 (#44772)
171ed202b7 feat: add UAT env on bridge (#44895)
ca508307ef feat: bump phishing controller 17.3.0 (#44841)
56ffb74681 refactor(ui): use Arrow2UpRight for Send action icons (#44929)
9c8c6bcb8b fix(pure-black): set perps balance dropdown to bg-alternative (#44875)
cd32d2d252 chore: remove component-library README.mdx docs (#44886)
bab3498f9c chore: remove deprecated textfieldsearch components (#44918)
2bbf04046f ci: fixed labels from forks (#44022)
199066c701 fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44919)
d53496f910 chore: swap position of network picker and search bar on swaps asset picker (#44911)
9d573278ab chore(6927): upgrade redux to v8 (#44445)
2f528e3470 build: no more PNGs inside SVGs allowed, delete unused images (#44832)
4011ce9d91 Merge origin/main into stable-main-13.41.0
72ba3533f4 chore: bump assets controller to v11.2.1 (#44903)
cba9e41d31 chore: fix ESLint ignore config (#44914)
5bb1c5e23d feat: update HeaderSearch and asset picker modal search bars to use TextFieldSearch (#44910)
2be47e1c8d fix: handle missing account for cross-chain asset deeplinks cp-13.42.0 (#44904)
7fac1b56cb test(e2e): stabilize network filter open before switch-network click (#44692)
ba9268b8c7 test: fix flaky test error page support consent TimeoutError: Waiting element to become stale (#44850)
60e4cd1b48 test: fix flaky unstable Continue button in Send page (#44837)
c4d2caae67 feat: migrate swap asset picker search to DSR TextFieldSearch (#44905)
fba4cb3aa7 refactor: simplify sponsored fee row; cleanup dead code (#44872)
ff4fd4dbb8 chore: rename SettingsHeader to PageHeaderWithSearch (#44902)
b072b88aef fix: updated checkbox and permissions page width cp-13.42.0 (#44896)
4045b69287 chore: remove dead app header props (#44900)
15db15fe5b feat: align search bar UIs (#44430)
67db57c82a fix(transactions): avoid inflated fees from failed container estimates (#44308)
75e46239ee feat(ci): add CWS rollout adjustment workflow (INFRA-3651) (#44060)
a03a82855f refactor: cleanup activity selectors (#44864)
7d8a31630f test(e2e): add Tron network E2E cluster (#44164)
e7a6a5e59f fix: local-enriched bridge label when switching networks (#44858)
42146f2fa5 fix(activity): apply text color token to native dialog for dark theme cp-13.42.0 (#44863)
55ad54b09e fix: retry persistence writes once (#44003)
c08a8bb748 bump: tar to 7.5.22, ignore react-router advisories cp-13.41.0 (#44862)
cdddd817a4 fix(deep-links): restore interstitial protection cp-13.42.0 (#44830)
b6619a9fb8 fix(activity): transaction details width (#44853)
5d2cff8067 feat: keep the balance left aligned for lower viewport cp-13.42.0 (#44791)
fddbd0cf34 chore: remove swaps approval text (#44794)
71272d9cd3 test: cover Wallet Imported event (#44747)
47bb810f81 test(e2e): extend Tron fixtures for assets E2E coverage (#44784)
01588c978d chore(assets-controller): bump to 11.2.0 (#44847)
c8df352c4c fix(confirmations): use getAssetImageUrl for gas fee token icon (#44769)
eca1e7ed3f feat: defer password confirm mismatch error until minimum length. (#44790)
e40d3d1af9 ci: pass AI analyzer gate for medium Runway cherry-picks into release branches (#44779)
5147646d2f test(e2e): refactor tokens tab page object for assets coverage (#44777)
81508e447a feat(onboarding): update Google sign-in icon to new brand logo (#44755)
545dd73434 fix: gas sponsorship being shown for hw accounts when the user has selected a nonevm network (#44706)
4ed04ec772 fix: restored old behavior to show Paid by MetaMask label in sponsored transactions from activity page cp-13.41.0 (#44780)
ca4d467800 refactor: migrate Core UX secondary buttons to MMDS (#44767)
197093a62a test: cover Wallet Setup Started Segment event (#44668)
5c6ffe848d fix(ci): post RC Slack when Builds ready, not only green main (#44831)
8011cc033a fix: eliminate dark-mode background flash for pure black mode (#44743)
d667c1f177 feat: enable pure black dark mode by default (#44806)
c42c6cbe77 ci: update cla.yml with more Cursor names (#44815)
88e20cf90c fix(assets): include tokens with large balances and few decimals in aggregated balance cp-13.41.0 (#44796)
1e2f17bea8 feat: upgrade bridge packages to latest versions (#44722)
5fb686386e release: Bump main version to 13.43.0 (#44799)

AI Test Plan

Risk Score High Risk Medium Risk Files Changed Commits
54/100 6 5 1354 162
Cherry-Pick Scenarios (2)

High Risk Scenarios (1)

1. Smart Transactions: Tx Sentinel URL change (monitoring and status updates)

Risk Level: HIGH

Why This Matters: Cherry-pick 45214 fixes Smart Transactions monitoring by updating the tx-sentinel URL; incorrect wiring can cause missing status updates, user confusion, or stuck transactions.

Test Steps:

  1. Enable Smart Transactions on a supported network (e.g., Ethereum mainnet) and initiate a simple send or swap using Smart Transactions.
  2. Monitor the transaction status through submission to confirmation; verify status updates are timely and accurate.
  3. Temporarily block the new tx-sentinel robinhood URL to simulate outage; confirm graceful fallback (clear error or retry) without hanging the UI.
  4. Compare against a standard (non-smart) transaction to ensure only Smart Transactions are affected by sentinel behavior.

Medium Risk Scenarios (1)

1. Perpetuals: Order book added to order entry page

Risk Level: MEDIUM

Why This Matters: Cherry-pick 45151 adds critical UI to the perps trading flow; rendering or data-binding issues can block trading or display misleading liquidity.

Test Steps:

  1. Open the Perps order entry page (enable any required feature flag) and select a market (e.g., ETH-PERP).
  2. Verify the order book renders and updates in real time without blocking order entry inputs.
  3. Change markets and network; confirm the order book rebinds correctly and no stale data is shown.
  4. Place a small test order on a test environment if available; confirm the order book and position data remain consistent.

Release Scenarios (9)

High Risk Scenarios (5)

1. State Migrations: 220 - core wallet/state preservation

Risk Level: HIGH

Why This Matters: New state migrations can inadvertently drop or corrupt persisted wallet data. Validating preservation of accounts, networks, tokens, and connections prevents critical data loss for users after upgrade.

Test Steps:

  1. On 13.42.x (or previous), set up a profile with: 2 HD accounts, 1 imported private-key account, at least 1 connected site, 1 custom network, and at least 2 custom tokens (fungible + NFT).
  2. Upgrade to 13.43.0 and unlock the wallet.
  3. Verify all accounts, connected sites, custom tokens/NFTs, and custom network entries are present and functional (balances load, tokens visible).
  4. Switch between networks and accounts; confirm no missing data or resets (e.g., token lists, address book, preferences).
  5. Confirm Snaps (if any were installed previously) remain installed and usable.

2. State Migrations: 221 - analytics/metametrics and preferences

Risk Level: HIGH

Why This Matters: Migrations adjusting analytics/metametrics state can silently flip consent or break event gating, leading to privacy violations or missing telemetry.

Test Steps:

  1. On 13.42.x, set MetaMetrics/analytics consent to Opt-out, then upgrade to 13.43.0 and unlock.
  2. With network tab open in DevTools, connect to a test dapp and perform a simple action (e.g., switch accounts); confirm no analytics network calls are sent while opted out.
  3. Toggle analytics to Opt-in in Settings and repeat the action; confirm analytics events now appear in network logs.
  4. Lock and unlock the wallet; ensure the consent state persists and behavior remains consistent.
  5. Verify no UI regressions (e.g., consent banners or settings pages load correctly without errors).

3. Assets/Home: Asset List Control Bar and Network Filter

Risk Level: HIGH

Why This Matters: Significant UI logic changes in filtering and totals can cause incorrect balances, missing assets, or confusing UX in the most-used screen.

Test Steps:

  1. Open the Assets tab with holdings across at least two networks (e.g., Ethereum and Polygon) and several tokens.
  2. Use the control bar to open the Home Network Filter modal; select a subset of networks and apply.
  3. Verify the asset list updates to only show assets from the selected networks and that total balances reflect the filtered view.
  4. Use search and asset-type toggles (if present) with the filter applied; confirm results remain consistent and totals update correctly.
  5. Clear the filter and confirm the list and totals return to the default view.

4. Network Management: Invalid Custom Network Alert

Risk Level: HIGH

Why This Matters: Preventing users from using misconfigured networks avoids failed transactions, fund loss risks, and confusing network behaviors.

Test Steps:

  1. Add a custom network where the entered chain ID intentionally mismatches the chain ID reported by the RPC endpoint.
  2. Attempt to switch to this network; confirm the 'Invalid custom network' alert appears with correct guidance.
  3. Try normal actions (e.g., opening a dapp, viewing assets) and confirm the alert persists and risky actions are blocked or clearly warned.
  4. Edit the network to correct the mismatch and save; confirm the alert disappears and switching works.
  5. Repeat with a flaky RPC that intermittently reports errors; ensure the alert behavior is stable and not overly aggressive.

5. Analytics/Metametrics Controller: Consent gating and event flow

Risk Level: HIGH

Why This Matters: Large refactors in the analytics controller risk privacy regressions or loss of telemetry needed to monitor product health.

Test Steps:

  1. In Settings, toggle analytics consent Off and perform key flows (connect to a dapp, send a testnet transaction up to the confirmation screen, switch networks).
  2. Monitor the network panel to confirm no analytics calls are sent while opted out.
  3. Toggle analytics consent On and repeat the flows; confirm events are sent and no UI errors appear.
  4. Rapidly toggle consent and retry an action; ensure no crashes, duplicate events, or stale consent state.
  5. Confirm analytics setting is persistent after extension reload.

Medium Risk Scenarios (4)

1. Balances: Account Group Balance accuracy across filters

Risk Level: MEDIUM

Why This Matters: Incorrect total balances undermine user trust and can impact financial decisions within the wallet.

Test Steps:

  1. With assets on multiple networks, open the account balance/group totals section on Home.
  2. Toggle the network filter to a single network and verify group totals match the sum of visible assets for that network.
  3. Switch accounts and networks quickly; verify totals update correctly without stale values.
  4. Include zero-balance tokens and verify they don’t inflate totals when filters change.

2. Site Connections: Unconnected Account Alert

Risk Level: MEDIUM

Why This Matters: Clear, accurate connection status prevents signing with the wrong account and reduces phishing/privilege confusion.

Test Steps:

  1. Connect a site with Account 1 only; then switch to Account 2 and revisit the site.
  2. Open the extension and verify the 'Unconnected account' alert appears with clear actions.
  3. Use the alert’s CTA to connect Account 2; ensure the banner dismisses and site shows the correct account.
  4. Disconnect the site from Settings, revisit, and confirm the alert returns appropriately.

3. App State Controller: Lock/Unlock and rapid state transitions

Risk Level: MEDIUM

Why This Matters: Changes in app-state logic can lead to race conditions that freeze the UI or show stale data during common actions.

Test Steps:

  1. Rapidly lock and unlock the wallet several times and monitor for stuck loading states or UI freezes.
  2. While balances are refreshing, rapidly switch accounts and networks; confirm the UI remains responsive and shows correct data.
  3. Trigger an onboarding banner or similar app-state-driven banner, then lock/unlock; ensure banner state persists or resolves correctly.
  4. Reload the extension and confirm state restores properly without transient errors.

4. Error Handling: API error surfaces without blocking core flows

Risk Level: MEDIUM

Why This Matters: Graceful error handling avoids user confusion and ensures the wallet remains usable during transient API issues.

Test Steps:

  1. Simulate a temporary network outage or block price/token APIs (e.g., via DevTools).
  2. Navigate to Assets and activity views; confirm non-blocking error messaging appears (no infinite spinners).
  3. Restore connectivity and use a Retry or refresh action; verify data loads and errors clear.
  4. Ensure no toasts or banners persist incorrectly after recovery.

Teams Sign-off Status

Signed off: None yet

Awaiting sign-off (5):
Accounts, Assets, Networks, Transactions, Wallet


Generated by AI Test Plan Analyzer (gpt-5) at 2026-08-05T19:19:54.591Z

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

…yarn audit (#45252)

- fix: resolve ip-address to >=10.3.1 for yarn audit cp-13.43.0 (#45243)

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


Adds resolution for `ip-address@^10.3.1` to fix 3 yarn audit advisories:
- GHSA-mwp4-54f8-5fhr (HIGH)
- GHSA-4xrf-jv44-h6hh (MODERATE)
  - GHSA-22jq-vg5j-6vgg (MODERATE)        

Failure:

https://github.com/MetaMask/metamask-extension/actions/runs/30963484287/job/92172879892
[Slack thread

](https://consensys.slack.com/archives/C0BLWRC2TRB/p1785924452227219?thread_ts=1785892716.329899&cid=C0BLWRC2TRB)
Dependency chain: `socks` → `ip-address@10.2.0` (vulnerable)
  Cherry-pick to `release/13.43.0` required.

## **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: #45163

## **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. -->
N/A
### **Before**

<!-- [screenshots/recordings] -->
N/A
### **After**

<!-- [screenshots/recordings] -->
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
- [ ] 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**

- [ ] 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**
> Lockfile-only security bump with no runtime code changes; risk is
limited to behavior differences in the patched `ip-address` library used
by SOCKS-related tooling.
> 
> **Overview**
> Adds a Yarn **`resolutions`** entry for **`ip-address@^10.3.1`**,
forcing the lockfile from **10.2.0** to **10.4.0** so **`yarn audit`**
clears three advisories on the transitive copy pulled in via
**`socks`**.
> 
> No application or extension source changes—only **`package.json`** and
**`yarn.lock`**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
81ecc01. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
[9c34c81](9c34c81)

---------

Co-authored-by: sleepytanya <104780023+sleepytanya@users.noreply.github.com>
Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
@metamask-ci

metamask-ci Bot commented Aug 5, 2026

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

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

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

Regressions (🔴 4 failures)

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

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: +18%
  • loadNewAccount/total: +18%
  • loadNewAccount/inp: +14%
  • confirmTx/tbt: +14%
  • confirmTx/inp: +21%
  • bridgeUserActions/bridge_load_page: +12%
  • bridgeUserActions/longTaskCount: +11%
  • bridgeUserActions/longTaskTotalDuration: +19%
  • bridgeUserActions/longTaskMaxDuration: +22%
  • bridgeUserActions/tbt: +36%
  • bridgeUserActions/inp: +15%
  • loadNewAccount/load_new_account: +23%
  • loadNewAccount/total: +23%
  • loadNewAccount/inp: -24%
  • loadNewAccount/lcp: +1221%
  • confirmTx/confirm_tx: +10%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +10%
  • confirmTx/fcp: -45%
  • confirmTx/lcp: +1157%
  • bridgeUserActions/bridge_load_page: +207%
  • bridgeUserActions/bridge_load_asset_picker: +1246%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +186%
  • bridgeUserActions/inp: -23%
  • bridgeUserActions/fcp: -47%
  • bridgeUserActions/lcp: +1125%

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

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

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/numNetworkReqs: -14%
  • startupStandardHome/domInteractive: -17%
  • startupStandardHome/firstReactRender: +12%
  • startupStandardHome/setupStore: +13%
  • startupStandardHome/numNetworkReqs: -13%
  • startupStandardHome/fcp: -19%
  • startupPowerUserHome/uiStartup: +12%
  • startupPowerUserHome/load: +11%
  • startupPowerUserHome/domContentLoaded: +11%
  • startupPowerUserHome/domInteractive: +14%
  • startupPowerUserHome/backgroundConnect: +20%
  • startupPowerUserHome/firstReactRender: +17%
  • startupPowerUserHome/initialActions: +11%
  • startupPowerUserHome/loadScripts: +11%
  • startupPowerUserHome/setupStore: +268%
  • startupPowerUserHome/inp: +14%
  • startupPowerUserHome/fcp: +11%
  • startupPowerUserHome/lcp: +17%

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

  • 🟡 startupPowerUserHome/INP: p75 216ms
  • 🟡 startupPowerUserHome/LCP: p75 3.4s
User Journey Benchmarks · Samples: 5 · real API 🔴 4

⚠️ Missing data: chrome/webpack/userJourneyAssets, chrome/webpack/userJourneyTransactions

Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 doneButtonToHomeScreen
🔴 total
🔴 [CI log]
🔴 total
onboardingNewWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 total
🔴 [CI log]
🔴 total
importSrpHome
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
assetDetails
[Sentry log · main/release]
🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟡 [CI log]
sendTransactions
[Sentry log · main/release]
🟡 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • onboardingImportWallet/confirmSrpToPwForm: +11%
  • onboardingImportWallet/pwFormToMetricsScreen: +14%
  • onboardingImportWallet/metricsToWalletReadyScreen: +33%
  • onboardingImportWallet/doneButtonToHomeScreen: -33%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: +46%
  • onboardingImportWallet/longTaskCount: +43%
  • onboardingImportWallet/total: -13%
  • onboardingNewWallet/skipBackupToMetricsScreen: -13%
  • onboardingNewWallet/doneButtonToAssetList: +13%
  • onboardingNewWallet/longTaskTotalDuration: +15%
  • onboardingNewWallet/total: +13%
  • importSrpHome/loginToHomeScreen: +14%
  • importSrpHome/homeAfterImportWithNewWallet: +18%
  • importSrpHome/longTaskCount: +20%
  • importSrpHome/longTaskTotalDuration: +11%
  • importSrpHome/longTaskMaxDuration: +22%
  • importSrpHome/total: +17%
  • importSrpHome/lcp: -14%
  • importSrpHome/cls: +899%

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

  • 🟡 importSrpHome/INP: p75 320ms
  • 🟡 solanaAssetDetails/FCP: p75 2.2s
  • 🟡 solanaAssetDetails/LCP: p75 2.7s
  • 🟡 sendTransactions/FCP: p75 2.0s
  • 🟡 sendTransactions/LCP: p75 2.6s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 4.25 KiB (0.03%)
  • ui: 34.03 KiB (0.19%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 476 Bytes (0.02%)
  • zip: 47.71 KiB (0.22%)

🍒 What's in this RC

Cherry-picks (10 commits)
Commit Description
cb83da7da8 release(runway): cherry-pick fix: resolve ip-address to >=10.3.1 for yarn audit (#45252)
a694e1ef9b Cherry-picking commits from cherry-pick-13-43-0-3cad329 to release/13.43.0 for PR #45158 (#45244)
18b0642e48 release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45216)
3b2076081e release(runway): cherry-pick feat(ci): derive orchestrator version from release branch (#45224)
024c9a632a release(runway): cherry-pick fix(ci): bind AMO package EXIT trap path before set -u can fail (#45225)
f576b8f4ac release(runway): cherry-pick fix: patch smart-transactions-controller to add the tx-sentinel robinhood URL (#45214)
400f264212 release(runway): cherry-pick chore: audit brace-expansion, postcss, fast-uri, undici, and socket.io-parser (#45188)
f1e31952b6 release(runway): cherry-pick feat(perps): add order book to order entry page (#45151)
1ea90deff7 release(runway): cherry-pick chore: bump snap-account-service (report migration error) (#45102)
75ea9568be Merge branch 'stable' into release/13.43.0

Changelog (160 commits since v13.42.0)
Commit Description
cb83da7da8 release(runway): cherry-pick fix: resolve ip-address to >=10.3.1 for yarn audit (#45252)
a694e1ef9b Cherry-picking commits from cherry-pick-13-43-0-3cad329 to release/13.43.0 for PR #45158 (#45244)
18b0642e48 release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45216)
3b2076081e release(runway): cherry-pick feat(ci): derive orchestrator version from release branch (#45224)
024c9a632a release(runway): cherry-pick fix(ci): bind AMO package EXIT trap path before set -u can fail (#45225)
f576b8f4ac release(runway): cherry-pick fix: patch smart-transactions-controller to add the tx-sentinel robinhood URL (#45214)
400f264212 release(runway): cherry-pick chore: audit brace-expansion, postcss, fast-uri, undici, and socket.io-parser (#45188)
f1e31952b6 release(runway): cherry-pick feat(perps): add order book to order entry page (#45151)
1ea90deff7 release(runway): cherry-pick chore: bump snap-account-service (report migration error) (#45102)
76657f7a3c release: release-changelog/13.43.0 (#45056)
9da0748ed3 Merge release/13.42.0 into release/13.43.0
d90d1e76b8 fix(hardware-wallets): bound stuck account-creation spinner with device-read timeout cp-13.42.0 (#45048)
0311ca5fc9 feat: add trust security signals tdp (#44761)
3114315a0e fix: consume stx enabled flag for batch sell from selected chain (#45032)
3ae0ce34cc chore: clean up TextFieldSearch styles after MMDS package update (#45030)
51cff5563f test: fix flaky test Smart Transactions should send transaction using USDC to pay fee (#45036)
0610a607c7 feat(perps): wire dedicated aggregated order-book socket per UI connection (#45035)
d67a05b8aa ci(slsa): publish attestation bundles and pin run-build actions (INFRA-3786) (#44955)
666b247f3a test: fix flaky custom-token import E2E by waiting for the Add Custom Token network picker to settle TimeoutError: Waiting for element to be located By(css selector, [data-testid="custom-token-import-submit-button"]:not([disabled])) (#45025)
9afac38fe7 feat: new segment schema support (#43132)
bfdb62afa3 test: fix flaky test BTC Account - Activity Receive transaction is rendered with Received label and confirmed status (#45022)
0fdbade0f4 test: MMQA - 1916 - Refactor multiple-provider-connections.spec.ts to good practices (#44941)
33bef9f690 test: fix flaky perps watchlist explore TimeoutError: Waiting for element to be located By(css selector, [data-testid="market-list-filter-sort-row"]) (#44936)
6d53060f6b test: replace driver.waitForSelector with page object methods (#44898)
ed7b8fbd53 fix: patch for missing slip44 entries in core client-utils cp-13.42.0 (#45006)
7e9653a51f feat: added metrics for custom network page (#45031)
5a94f11f60 feat(activity): contact names in activity rows (#45013)
5f842c6082 test: fix flaky Add wallet Import wallet using SRP during onboardingand MetaMask onboarding should not prevent network requests to advanced... (#45034)
c36df0ec1a fix: vertically center contact copy button (#45020)
e3abdc3e78 feat: added timer for balance loading cp-13.42.0 (#45033)
b424876ab6 chore: update assets controllers for defi fix (#45003)
adec2ed351 refactor(wpc-1066): migrate pending-approval HW methods to LegacyBackgroundApiService (#44937)
20bf478a91 feat(confirmations): add Money Account Deposit developer option (#44945)
48ad866df4 bump(perps): upgrade @metamask/perps-controller to v10 (#45024)
239006e967 fix(notifications): add bottom padding to marketing consent text (#45021)
9158172d8a refactor(wpc-1067): migrate network enablement methods to LegacyBackgroundApiService (#44938)
62aaaa4923 test: order selectors and methods in all page objects (#44987)
45505c9910 chore: wire stellar asset component with stellar asset selector (#44979)
ce134bc060 feat: defi positions v2 controller (#44392)
b50797d25a chore: pass Firefox system access via geckodriver and pin 0.36.0 (#45014)
0c7372db98 fix(pure-black): use bg-default on back up SRP page (#44983)
e47424b771 fix(perps): show wallet-confirmed deposits immediately in Perps Activity (#44736)
9b623cccf7 ci: turn on the Triage and Retry System by default (no retry-ci label needed) (#44956)
778bafe559 feat(ramps): wire Buy Continue with background checkout watch (#44689)
10b5de87df test: lavamoat e2e (#44925)
c1a5d29ffd fix: swaps stale dest exchange rates cp-13.42.0 (#44968)
0fa0c88cf3 chore: fix lint:changed script (#45010)
fa5c57e727 fix: navigate to homepage after users close popup from batch sell (#44991)
7dce891afb feat(ramps): send Portfolio-connected wallets to Portfolio on Buy (#44804)
3739101671 fix(pure-black): refine SRP input empty vs filled styling (#45004)
1ec648fa36 chore: update swap consumers to use and display partial QuoteMetadata (#44630)
0660a05750 refactor(wpc-1068): migrate requestSafeReload & openUpdateTabAndReload to LegacyBackgroundApiService (#44940)
d2fdd13169 perf(6570): bump react-hooks to v7 and remove react-compiler plugin (#44495)
cf719e0334 fix(pure-black): stop inverting bridge transaction settings tooltip theme (#44964)
10fabf3ed6 chore: New Crowdin Translations by GitHub Action cp-13.42.0 (#44746)
806f4bf8b6 fix(pure-black): use BackgroundDefault for markets row skeleton (#44984)
da76cb3edb fix(pure-black): use bg-default on Snap install screen (#45002)
c20d7eb736 fix(pure-black): set send network filter button background to transparent (#44882)
04b53836a4 chore(STX): add Robinhood Chain to smart transactions supported networks (#44926)
284f97705e chore: popover for failed transaction status (#44961)
2668c42734 fix(pure-black): remove border from page footer cancel buttons (#44981)
d0efdd7df1 chore(storybook): add Pure Black toolbar toggle and component stories (#44963)
fadc943601 feat: assets unify balance and traces (#44978)
bad91a67e9 chore: replaced deprecated Tag component with MMDS tag (#44785)
dd2075062d fix(confirmations): refetch MetaMask Pay required token price when it is missing (#44950)
66b8f875e3 fix(pure-black): fix Menu background specificity with bg-section (#44966)
00f32ff73c fix: qr camera permission throwing e.isUnlocked is not a function (#44701)
b5ed10c4c2 feat(hardware-wallets): enable shared signing flow (#43947)
1695992b6f feat: migrate Infura IPFS users to dweb.link and block Infura IPFS gateway entry (#44982)
0ad8940da9 feat: use new snap keyring v2/v1 split (#44289)
b7f13b1a4c test: refactor transaction details page and consolidate selectors (#44694)
61ff089628 test(e2e): add Tron assets E2E cluster (#44852)
540d2a65b1 feat: bump transaction-pay-controller to 26.0.0 (#44782)
df415e426e test: skip ERC20 max balance WS update test (ASSETS-3385) (#44952)
f87e3bc8db fix(pure-black): remove custom background color from InfoPopoverTooltip (#44933)
634b46cfed fix(pure-black): remove border-l and bg-alternative from drawer in popup/compact sidepanel (#44960)
57da315640 test: pom lint rule supporting groups (selectors, constructor, actions) (#44789)
7e641c6203 chore: bump @types/chrome and drop custom chrome typings (#44888)
cbd1c50aaf perf(7466): add memoization to network/asset modal components (Batch D) (#44296)
75e09ed50f fix(pure-black): settings sidebar uses bg-alternative in pure black mode (#44883)
c164a38416 fix: clear the postcss advisories cp-13.42.0 (#44865)
3f6a9050c3 test: cover Token Detection Enabled identify trait (#44915)
91ed59bb42 chore: replace local gator permission detail schemas with @metamask/7715-permission-types (#44415)
a73805093a fix: excempt batch sell routes from ConfirmationRouter (#44951)
87d0cf9c0a fix(pure-black): set main action button dropdown to bg-alternative (#44881)
17731f5111 fix(pure-black): fix account address popover background and refactor row hover to Tailwind (#44880)
b8ee5bb2eb fix(pure-black): correct tooltip background and arrow colors in dark and pure black themes (#44879)
7b6dde7630 fix(pure-black): add bg-alternative and border to asset explorer view (#44878)
cfdbb033e8 bump: brace-expansion to 5.0.8 (#44924)
00ebfcf32e feat: updated import NFT flow Modal (#44899)
a5f18a53c5 fix: Allow QR singing in side panel on brave (#44934)
bdbe8f29c1 chore(6922): bump @testing-library/react to v14 (#42635)
b35834378b chore: upgrade design system packages (v57.0.0) (#44931)
58b697a400 fix: remove deprecated METAMASK_ENVIRONMENT=test in favor of testing (#44944)
4e37811629 chore: remove copy-to-clipboard dependency (#44890)
4d2065f6a5 test: add coverage for Notification Clicked metrics event (#44920)
da23672992 feat(analytics): migrate pre-consent queue to AnalyticsController (#43869)
5201492b01 feat: refactor non-zero native custom networks (#44161)
9e0cbd2538 fix: allow Firefox WebDriver system access for about:debugging (#44946)
992ff087e7 test(e2e): refactor tokens tab page object for assets coverage (#44778)
b8ad63da79 ci(amo): allow release-team manual dispatch of AMO production (INFRA-3769) (#44519)
bd65eccfdb chore: remove defi v2 fetching from getApi (#44939)
3cb496ea9a chore: migrate markNotificationPopupAsAutomaticallyClosed to LegacyBackgroundApiService (#44249)
f835f69039 feat: initialize DeFiPositionsControllerV2 (#44772)
171ed202b7 feat: add UAT env on bridge (#44895)
ca508307ef feat: bump phishing controller 17.3.0 (#44841)
56ffb74681 refactor(ui): use Arrow2UpRight for Send action icons (#44929)
9c8c6bcb8b fix(pure-black): set perps balance dropdown to bg-alternative (#44875)
cd32d2d252 chore: remove component-library README.mdx docs (#44886)
bab3498f9c chore: remove deprecated textfieldsearch components (#44918)
2bbf04046f ci: fixed labels from forks (#44022)
199066c701 fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44919)
d53496f910 chore: swap position of network picker and search bar on swaps asset picker (#44911)
9d573278ab chore(6927): upgrade redux to v8 (#44445)
2f528e3470 build: no more PNGs inside SVGs allowed, delete unused images (#44832)
4011ce9d91 Merge origin/main into stable-main-13.41.0
72ba3533f4 chore: bump assets controller to v11.2.1 (#44903)
cba9e41d31 chore: fix ESLint ignore config (#44914)
5bb1c5e23d feat: update HeaderSearch and asset picker modal search bars to use TextFieldSearch (#44910)
2be47e1c8d fix: handle missing account for cross-chain asset deeplinks cp-13.42.0 (#44904)
7fac1b56cb test(e2e): stabilize network filter open before switch-network click (#44692)
ba9268b8c7 test: fix flaky test error page support consent TimeoutError: Waiting element to become stale (#44850)
60e4cd1b48 test: fix flaky unstable Continue button in Send page (#44837)
c4d2caae67 feat: migrate swap asset picker search to DSR TextFieldSearch (#44905)
fba4cb3aa7 refactor: simplify sponsored fee row; cleanup dead code (#44872)
ff4fd4dbb8 chore: rename SettingsHeader to PageHeaderWithSearch (#44902)
b072b88aef fix: updated checkbox and permissions page width cp-13.42.0 (#44896)
4045b69287 chore: remove dead app header props (#44900)
15db15fe5b feat: align search bar UIs (#44430)
67db57c82a fix(transactions): avoid inflated fees from failed container estimates (#44308)
75e46239ee feat(ci): add CWS rollout adjustment workflow (INFRA-3651) (#44060)
a03a82855f refactor: cleanup activity selectors (#44864)
7d8a31630f test(e2e): add Tron network E2E cluster (#44164)
e7a6a5e59f fix: local-enriched bridge label when switching networks (#44858)
42146f2fa5 fix(activity): apply text color token to native dialog for dark theme cp-13.42.0 (#44863)
55ad54b09e fix: retry persistence writes once (#44003)
c08a8bb748 bump: tar to 7.5.22, ignore react-router advisories cp-13.41.0 (#44862)
cdddd817a4 fix(deep-links): restore interstitial protection cp-13.42.0 (#44830)
b6619a9fb8 fix(activity): transaction details width (#44853)
5d2cff8067 feat: keep the balance left aligned for lower viewport cp-13.42.0 (#44791)
fddbd0cf34 chore: remove swaps approval text (#44794)
71272d9cd3 test: cover Wallet Imported event (#44747)
47bb810f81 test(e2e): extend Tron fixtures for assets E2E coverage (#44784)
01588c978d chore(assets-controller): bump to 11.2.0 (#44847)
c8df352c4c fix(confirmations): use getAssetImageUrl for gas fee token icon (#44769)
eca1e7ed3f feat: defer password confirm mismatch error until minimum length. (#44790)
e40d3d1af9 ci: pass AI analyzer gate for medium Runway cherry-picks into release branches (#44779)
5147646d2f test(e2e): refactor tokens tab page object for assets coverage (#44777)
81508e447a feat(onboarding): update Google sign-in icon to new brand logo (#44755)
545dd73434 fix: gas sponsorship being shown for hw accounts when the user has selected a nonevm network (#44706)
4ed04ec772 fix: restored old behavior to show Paid by MetaMask label in sponsored transactions from activity page cp-13.41.0 (#44780)
ca4d467800 refactor: migrate Core UX secondary buttons to MMDS (#44767)
197093a62a test: cover Wallet Setup Started Segment event (#44668)
5c6ffe848d fix(ci): post RC Slack when Builds ready, not only green main (#44831)
8011cc033a fix: eliminate dark-mode background flash for pure black mode (#44743)
d667c1f177 feat: enable pure black dark mode by default (#44806)
c42c6cbe77 ci: update cla.yml with more Cursor names (#44815)
88e20cf90c fix(assets): include tokens with large balances and few decimals in aggregated balance cp-13.41.0 (#44796)
1e2f17bea8 feat: upgrade bridge packages to latest versions (#44722)
5fb686386e release: Bump main version to 13.43.0 (#44799)

AI Test Plan

Risk Score High Risk Medium Risk Files Changed Commits
59/100 7 7 1354 163
Cherry-Pick Scenarios (2)

High Risk Scenarios (1)

1. Smart Transactions – Sentinel Status/URL Patch

Risk Level: HIGH

Why This Matters: Cherry-pick 45214 fixes sentinel URL coverage; incorrect sentinel endpoints can cause missing or stuck status updates, broken cancels/speed-ups, and user confusion.

Test Steps:

  1. Enable Smart Transactions (if available) and submit a simple token transfer on a supported network.
  2. Observe the Activity item for live status updates (e.g., Submitted → Pending → Confirmed) without getting stuck.
  3. Use speed up/cancel and verify status transitions are reflected promptly and accurately.
  4. Temporarily toggle network connectivity (brief offline/online) and confirm the transaction status recovers and remains accurate.
  5. If STX is unavailable, verify the flow gracefully falls back to legacy sending without errors.

Medium Risk Scenarios (1)

1. Perpetuals – Order Book on Order Entry Page

Risk Level: MEDIUM

Why This Matters: Cherry-pick 45151 adds a new live order book to a trading-critical screen; incorrect interactions or stale data can lead to wrong pricing and failed orders.

Test Steps:

  1. Open the Perpetuals order entry page and verify the order book renders with live updates.
  2. Click a price level in the order book and confirm the price populates in the order form.
  3. Switch trading pairs and verify the order book and form update consistently without stale levels.
  4. Toggle any grouping/precision controls and confirm levels re-aggregate correctly in real time.
  5. Submit a small test order (on supported environment) and confirm the execution respects the selected book price.

Release Scenarios (12)

High Risk Scenarios (6)

1. State Migrations (versions 220 and 221) – Upgrade with complex user state

Risk Level: HIGH

Why This Matters: Migrations can corrupt or drop critical user data (accounts, permissions, tokens) or leave the extension unusable; verifying upgrade preserves state is essential.

Test Steps:

  1. On 13.42.x, create a wallet with: 2+ accounts, at least one connected dapp, one custom RPC network, several tokens (incl. hidden), and enabled/disabled MetaMetrics preference.
  2. Upgrade to 13.43.0 and unlock.
  3. Verify all accounts, balances, NFTs/tokens (including hidden), currency/locale, and connected sites/permissions are intact and usable.
  4. Open a previously connected dapp and confirm it remains connected and can request account/permissions without re-approval.
  5. Confirm Settings > Advanced > State logs show the expected new migration version and no migration error banner/toast appears.

2. Auto-lock and Pending Approval/Transaction Resilience

Risk Level: HIGH

Why This Matters: Recent app-state-controller changes can break approval flows if auto-lock/unlock interrupts them, risking user funds or stuck approvals.

Test Steps:

  1. Set auto-lock timer to 1 minute (Settings > Security & Privacy).
  2. Initiate a transaction or signature request from a dapp and wait for the confirm screen in the extension.
  3. Do not act; allow the auto-lock to trigger and then unlock the wallet.
  4. Verify the pending confirmation is restored correctly and can be submitted or rejected without data loss.
  5. Confirm no duplicate submissions or stuck states appear in Activity.

3. Site Connections – Unconnected Account Alert

Risk Level: HIGH

Why This Matters: The alert guards users from transacting with the wrong account; regressions can cause silent misrouting of transactions or user confusion.

Test Steps:

  1. Connect Account A to a test dapp (ensure the dapp requests accounts).
  2. Switch the active account in the extension to Account B.
  3. Reload the dapp and verify an 'Unconnected account' alert/badge appears in the extension UI.
  4. Use the alert’s action to connect Account B; verify the alert disappears and the dapp now sees Account B.
  5. Switch back to Account A and confirm the alert behavior updates correctly.

4. Network Management – Invalid Custom Network Alert

Risk Level: HIGH

Why This Matters: Misconfigured networks can cause irreversible loss of funds; the alert must reliably detect and prevent risky actions.

Test Steps:

  1. Add a custom network with an RPC URL whose reported chainId does not match the configured chainId.
  2. Switch to this network and open the extension home.
  3. Verify an 'Invalid network' alert appears with clear guidance.
  4. Attempt to initiate a send/swap; verify the flow is blocked or clearly warns until the network is fixed or changed.
  5. Correct the RPC or switch networks and confirm the alert clears and transactions proceed.

5. MetaMetrics Consent and Event Gating (Onboarding and Settings)

Risk Level: HIGH

Why This Matters: Large metametrics-controller changes risk privacy regressions (events sent when opted out) or broken analytics that impair product decisions.

Test Steps:

  1. Create a new wallet and explicitly opt out of MetaMetrics during onboarding.
  2. Navigate across multiple tabs (Home, Activity, Send) and verify the 'Send anonymized data' toggle stays off in Settings.
  3. With DevTools Network open, ensure no telemetry calls are sent to known endpoints when opted out (e.g., Segment/Amplitude domains).
  4. Toggle MetaMetrics on in Settings and perform the same navigation; verify events begin sending without errors.
  5. Lock and unlock to confirm preference persists.

6. Assets List – Network Filter and Control Bar

Risk Level: HIGH

Why This Matters: Recent control bar and filter changes can lead to incorrect balances, missing tokens, or misleading totals, affecting user trust and actions.

Test Steps:

  1. Ensure you have tokens on at least two networks (e.g., Ethereum and Polygon).
  2. On the Assets tab, open the control bar and use the network filter to select one network.
  3. Verify only assets for that network are shown, totals update accordingly, and 'All networks' returns the full list.
  4. Use search and sorting while a filter is active and verify results respect the selected network.
  5. Clear filters and confirm the default view is restored without stale UI states.

Medium Risk Scenarios (6)

1. Account Group Balance – Aggregation Accuracy

Risk Level: MEDIUM

Why This Matters: Incorrect aggregated balances lead to faulty decisions; updates to this component are error-prone and impact user confidence.

Test Steps:

  1. With 2+ accounts holding assets, view any UI showing a grouped or total balance (e.g., account group balance on Home).
  2. Manually sum visible account balances and compare to the displayed total.
  3. Change primary currency (USD -> fiat/crypto) and confirm the total updates consistently.
  4. Hide one asset or account from the list and verify the total reflects the change.
  5. Switch networks and confirm totals remain correct.

2. Activity Feed and Notifications – Action Type Updates

Risk Level: MEDIUM

Why This Matters: Changes to controller method/action types can desynchronize activity labeling, causing duplicates, missing entries, or wrong statuses.

Test Steps:

  1. Perform a send transaction and a signature (e.g., personal_sign) from a dapp.
  2. Verify Activity shows distinct, correctly labeled entries for both operations.
  3. Speed up or cancel the transaction and confirm the feed updates without duplicates or stale entries.
  4. Lock, then unlock and confirm the latest status is preserved.
  5. Check notification badges (if any) clear when viewed.

3. Perpetuals – Streaming Data Stability (baseline)

Risk Level: MEDIUM

Why This Matters: Recent perps streaming code changes can create UI stalls, stale data, or reconnection failures that compromise trading UX.

Test Steps:

  1. Navigate to the Perpetuals/trading area in the extension (if available for your region/account).
  2. Observe live data components (prices/positions) for at least 2 minutes and switch trading pairs.
  3. Verify UI updates smoothly without freezes, disconnect toasts, or stale data after pair switches.
  4. Lock and unlock the wallet; confirm streams reconnect and data resumes updating.
  5. Navigate away and back; ensure no duplicate data or memory-leak-like slowdowns occur.

4. Send/Swap Initiation from Filtered Asset Views

Risk Level: MEDIUM

Why This Matters: Filter and control bar changes can leak or misapply context into transaction flows, causing misrouted or failed transactions.

Test Steps:

  1. From the Assets list, apply a network filter and select a token.
  2. Initiate a Send or Swap from that token’s detail screen.
  3. Verify the preselected network and token flow matches the filtered context.
  4. Remove the filter and start another Send/Swap; confirm defaults are correct and previous context does not leak.
  5. Complete one transaction to ensure the flow is unaffected by prior filtering.

5. Connected Sites Permissions Integrity Post-Migration

Risk Level: MEDIUM

Why This Matters: Migrations can silently alter permission state leading to broken dapp connections or unintended access.

Test Steps:

  1. Before upgrading, connect two dapps with different permission scopes (accounts, permissions like eth_accounts).
  2. Upgrade to 13.43.0 and unlock.
  3. In Settings > Connected sites, verify both sites and their permissions are intact.
  4. From each dapp, request accounts again; confirm no unexpected re-approval prompts unless permissions changed.
  5. Disconnect one site and ensure the dapp loses access immediately.

6. Onboarding – MetaMetrics and First-Run UX

Risk Level: MEDIUM

Why This Matters: Controller and metrics changes can break first-run flows, causing incomplete setup or incorrect privacy defaults.

Test Steps:

  1. Fresh install 13.43.0; create a new wallet.
  2. Proceed through onboarding and choose either opt-in or opt-out for MetaMetrics.
  3. Verify post-onboarding landing renders correctly with no missing banners/alerts and respects the chosen metrics setting.
  4. Close and reopen the popup; confirm onboarding completion persists and no onboarding screens reappear.
  5. Ensure no console errors appear during first-run flow.

Teams Sign-off Status

Signed off: None yet

Awaiting sign-off (9):
Accounts, Assets, Networks, Notifications, Onboarding, Permissions, Settings, Swaps, Transactions


Generated by AI Test Plan Analyzer (gpt-5) at 2026-08-05T20:37:55.244Z

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

@metamask-ci

metamask-ci Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor
Builds ready [cb83da7]
⚡ Performance Benchmarks (Total: 🟢 11 pass · 🟡 9 warn · 🔴 4 fail)

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

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

Regressions (🔴 4 failures)

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

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: +18%
  • loadNewAccount/total: +18%
  • loadNewAccount/inp: +14%
  • confirmTx/tbt: +14%
  • confirmTx/inp: +21%
  • bridgeUserActions/bridge_load_page: +12%
  • bridgeUserActions/longTaskCount: +11%
  • bridgeUserActions/longTaskTotalDuration: +19%
  • bridgeUserActions/longTaskMaxDuration: +22%
  • bridgeUserActions/tbt: +36%
  • bridgeUserActions/inp: +15%
  • loadNewAccount/load_new_account: +23%
  • loadNewAccount/total: +23%
  • loadNewAccount/inp: -24%
  • loadNewAccount/lcp: +1221%
  • confirmTx/confirm_tx: +10%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +10%
  • confirmTx/fcp: -45%
  • confirmTx/lcp: +1157%
  • bridgeUserActions/bridge_load_page: +207%
  • bridgeUserActions/bridge_load_asset_picker: +1246%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +186%
  • bridgeUserActions/inp: -23%
  • bridgeUserActions/fcp: -47%
  • bridgeUserActions/lcp: +1125%

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

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

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/numNetworkReqs: -14%
  • startupStandardHome/domInteractive: -17%
  • startupStandardHome/firstReactRender: +12%
  • startupStandardHome/setupStore: +13%
  • startupStandardHome/numNetworkReqs: -13%
  • startupStandardHome/fcp: -19%
  • startupPowerUserHome/uiStartup: +12%
  • startupPowerUserHome/load: +11%
  • startupPowerUserHome/domContentLoaded: +11%
  • startupPowerUserHome/domInteractive: +14%
  • startupPowerUserHome/backgroundConnect: +20%
  • startupPowerUserHome/firstReactRender: +17%
  • startupPowerUserHome/initialActions: +11%
  • startupPowerUserHome/loadScripts: +11%
  • startupPowerUserHome/setupStore: +268%
  • startupPowerUserHome/inp: +14%
  • startupPowerUserHome/fcp: +11%
  • startupPowerUserHome/lcp: +17%

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

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

📈 Results compared to the previous 5 runs on main

  • onboardingImportWallet/confirmSrpToPwForm: +11%
  • onboardingImportWallet/pwFormToMetricsScreen: +14%
  • onboardingImportWallet/metricsToWalletReadyScreen: +33%
  • onboardingImportWallet/doneButtonToHomeScreen: -33%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: +46%
  • onboardingImportWallet/longTaskCount: +43%
  • onboardingImportWallet/total: -13%
  • onboardingNewWallet/skipBackupToMetricsScreen: -13%
  • onboardingNewWallet/doneButtonToAssetList: +13%
  • onboardingNewWallet/longTaskTotalDuration: +15%
  • onboardingNewWallet/total: +13%
  • solanaAssetDetails/assetClickToPriceChart: +11%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: +11%
  • solanaAssetDetails/inp: +11%
  • solanaAssetDetails/fcp: +13%
  • importSrpHome/loginToHomeScreen: +14%
  • importSrpHome/homeAfterImportWithNewWallet: +18%
  • importSrpHome/longTaskCount: +20%
  • importSrpHome/longTaskTotalDuration: +11%
  • importSrpHome/longTaskMaxDuration: +22%
  • importSrpHome/total: +17%
  • importSrpHome/lcp: -14%
  • importSrpHome/cls: +899%
  • sendTransactions/openSendPageFromHome: -32%
  • sendTransactions/selectTokenToSendFormLoaded: -25%
  • sendTransactions/reviewTransactionToConfirmationPage: -98%
  • sendTransactions/longTaskCount: -100%
  • sendTransactions/longTaskTotalDuration: -100%
  • sendTransactions/longTaskMaxDuration: -100%
  • sendTransactions/tbt: -100%
  • sendTransactions/total: -96%
  • sendTransactions/inp: -30%
  • sendTransactions/fcp: -30%
  • sendTransactions/lcp: -73%
  • sendTransactions/cls: -20%

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

  • 🟡 importSrpHome/INP: p75 320ms
  • 🟡 solanaAssetDetails/FCP: p75 2.2s
  • 🟡 solanaAssetDetails/LCP: p75 2.7s
  • 🟡 sendTransactions/FCP: p75 2.0s
  • 🟡 sendTransactions/LCP: p75 2.6s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 4.25 KiB (0.03%)
  • ui: 34.03 KiB (0.19%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 476 Bytes (0.02%)
  • zip: 47.71 KiB (0.22%)

🍒 What's in this RC

Cherry-picks (10 commits)
Commit Description
cb83da7da8 release(runway): cherry-pick fix: resolve ip-address to >=10.3.1 for yarn audit (#45252)
a694e1ef9b Cherry-picking commits from cherry-pick-13-43-0-3cad329 to release/13.43.0 for PR #45158 (#45244)
18b0642e48 release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45216)
3b2076081e release(runway): cherry-pick feat(ci): derive orchestrator version from release branch (#45224)
024c9a632a release(runway): cherry-pick fix(ci): bind AMO package EXIT trap path before set -u can fail (#45225)
f576b8f4ac release(runway): cherry-pick fix: patch smart-transactions-controller to add the tx-sentinel robinhood URL (#45214)
400f264212 release(runway): cherry-pick chore: audit brace-expansion, postcss, fast-uri, undici, and socket.io-parser (#45188)
f1e31952b6 release(runway): cherry-pick feat(perps): add order book to order entry page (#45151)
1ea90deff7 release(runway): cherry-pick chore: bump snap-account-service (report migration error) (#45102)
75ea9568be Merge branch 'stable' into release/13.43.0

Changelog (160 commits since v13.42.0)
Commit Description
cb83da7da8 release(runway): cherry-pick fix: resolve ip-address to >=10.3.1 for yarn audit (#45252)
a694e1ef9b Cherry-picking commits from cherry-pick-13-43-0-3cad329 to release/13.43.0 for PR #45158 (#45244)
18b0642e48 release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45216)
3b2076081e release(runway): cherry-pick feat(ci): derive orchestrator version from release branch (#45224)
024c9a632a release(runway): cherry-pick fix(ci): bind AMO package EXIT trap path before set -u can fail (#45225)
f576b8f4ac release(runway): cherry-pick fix: patch smart-transactions-controller to add the tx-sentinel robinhood URL (#45214)
400f264212 release(runway): cherry-pick chore: audit brace-expansion, postcss, fast-uri, undici, and socket.io-parser (#45188)
f1e31952b6 release(runway): cherry-pick feat(perps): add order book to order entry page (#45151)
1ea90deff7 release(runway): cherry-pick chore: bump snap-account-service (report migration error) (#45102)
76657f7a3c release: release-changelog/13.43.0 (#45056)
9da0748ed3 Merge release/13.42.0 into release/13.43.0
d90d1e76b8 fix(hardware-wallets): bound stuck account-creation spinner with device-read timeout cp-13.42.0 (#45048)
0311ca5fc9 feat: add trust security signals tdp (#44761)
3114315a0e fix: consume stx enabled flag for batch sell from selected chain (#45032)
3ae0ce34cc chore: clean up TextFieldSearch styles after MMDS package update (#45030)
51cff5563f test: fix flaky test Smart Transactions should send transaction using USDC to pay fee (#45036)
0610a607c7 feat(perps): wire dedicated aggregated order-book socket per UI connection (#45035)
d67a05b8aa ci(slsa): publish attestation bundles and pin run-build actions (INFRA-3786) (#44955)
666b247f3a test: fix flaky custom-token import E2E by waiting for the Add Custom Token network picker to settle TimeoutError: Waiting for element to be located By(css selector, [data-testid="custom-token-import-submit-button"]:not([disabled])) (#45025)
9afac38fe7 feat: new segment schema support (#43132)
bfdb62afa3 test: fix flaky test BTC Account - Activity Receive transaction is rendered with Received label and confirmed status (#45022)
0fdbade0f4 test: MMQA - 1916 - Refactor multiple-provider-connections.spec.ts to good practices (#44941)
33bef9f690 test: fix flaky perps watchlist explore TimeoutError: Waiting for element to be located By(css selector, [data-testid="market-list-filter-sort-row"]) (#44936)
6d53060f6b test: replace driver.waitForSelector with page object methods (#44898)
ed7b8fbd53 fix: patch for missing slip44 entries in core client-utils cp-13.42.0 (#45006)
7e9653a51f feat: added metrics for custom network page (#45031)
5a94f11f60 feat(activity): contact names in activity rows (#45013)
5f842c6082 test: fix flaky Add wallet Import wallet using SRP during onboardingand MetaMask onboarding should not prevent network requests to advanced... (#45034)
c36df0ec1a fix: vertically center contact copy button (#45020)
e3abdc3e78 feat: added timer for balance loading cp-13.42.0 (#45033)
b424876ab6 chore: update assets controllers for defi fix (#45003)
adec2ed351 refactor(wpc-1066): migrate pending-approval HW methods to LegacyBackgroundApiService (#44937)
20bf478a91 feat(confirmations): add Money Account Deposit developer option (#44945)
48ad866df4 bump(perps): upgrade @metamask/perps-controller to v10 (#45024)
239006e967 fix(notifications): add bottom padding to marketing consent text (#45021)
9158172d8a refactor(wpc-1067): migrate network enablement methods to LegacyBackgroundApiService (#44938)
62aaaa4923 test: order selectors and methods in all page objects (#44987)
45505c9910 chore: wire stellar asset component with stellar asset selector (#44979)
ce134bc060 feat: defi positions v2 controller (#44392)
b50797d25a chore: pass Firefox system access via geckodriver and pin 0.36.0 (#45014)
0c7372db98 fix(pure-black): use bg-default on back up SRP page (#44983)
e47424b771 fix(perps): show wallet-confirmed deposits immediately in Perps Activity (#44736)
9b623cccf7 ci: turn on the Triage and Retry System by default (no retry-ci label needed) (#44956)
778bafe559 feat(ramps): wire Buy Continue with background checkout watch (#44689)
10b5de87df test: lavamoat e2e (#44925)
c1a5d29ffd fix: swaps stale dest exchange rates cp-13.42.0 (#44968)
0fa0c88cf3 chore: fix lint:changed script (#45010)
fa5c57e727 fix: navigate to homepage after users close popup from batch sell (#44991)
7dce891afb feat(ramps): send Portfolio-connected wallets to Portfolio on Buy (#44804)
3739101671 fix(pure-black): refine SRP input empty vs filled styling (#45004)
1ec648fa36 chore: update swap consumers to use and display partial QuoteMetadata (#44630)
0660a05750 refactor(wpc-1068): migrate requestSafeReload & openUpdateTabAndReload to LegacyBackgroundApiService (#44940)
d2fdd13169 perf(6570): bump react-hooks to v7 and remove react-compiler plugin (#44495)
cf719e0334 fix(pure-black): stop inverting bridge transaction settings tooltip theme (#44964)
10fabf3ed6 chore: New Crowdin Translations by GitHub Action cp-13.42.0 (#44746)
806f4bf8b6 fix(pure-black): use BackgroundDefault for markets row skeleton (#44984)
da76cb3edb fix(pure-black): use bg-default on Snap install screen (#45002)
c20d7eb736 fix(pure-black): set send network filter button background to transparent (#44882)
04b53836a4 chore(STX): add Robinhood Chain to smart transactions supported networks (#44926)
284f97705e chore: popover for failed transaction status (#44961)
2668c42734 fix(pure-black): remove border from page footer cancel buttons (#44981)
d0efdd7df1 chore(storybook): add Pure Black toolbar toggle and component stories (#44963)
fadc943601 feat: assets unify balance and traces (#44978)
bad91a67e9 chore: replaced deprecated Tag component with MMDS tag (#44785)
dd2075062d fix(confirmations): refetch MetaMask Pay required token price when it is missing (#44950)
66b8f875e3 fix(pure-black): fix Menu background specificity with bg-section (#44966)
00f32ff73c fix: qr camera permission throwing e.isUnlocked is not a function (#44701)
b5ed10c4c2 feat(hardware-wallets): enable shared signing flow (#43947)
1695992b6f feat: migrate Infura IPFS users to dweb.link and block Infura IPFS gateway entry (#44982)
0ad8940da9 feat: use new snap keyring v2/v1 split (#44289)
b7f13b1a4c test: refactor transaction details page and consolidate selectors (#44694)
61ff089628 test(e2e): add Tron assets E2E cluster (#44852)
540d2a65b1 feat: bump transaction-pay-controller to 26.0.0 (#44782)
df415e426e test: skip ERC20 max balance WS update test (ASSETS-3385) (#44952)
f87e3bc8db fix(pure-black): remove custom background color from InfoPopoverTooltip (#44933)
634b46cfed fix(pure-black): remove border-l and bg-alternative from drawer in popup/compact sidepanel (#44960)
57da315640 test: pom lint rule supporting groups (selectors, constructor, actions) (#44789)
7e641c6203 chore: bump @types/chrome and drop custom chrome typings (#44888)
cbd1c50aaf perf(7466): add memoization to network/asset modal components (Batch D) (#44296)
75e09ed50f fix(pure-black): settings sidebar uses bg-alternative in pure black mode (#44883)
c164a38416 fix: clear the postcss advisories cp-13.42.0 (#44865)
3f6a9050c3 test: cover Token Detection Enabled identify trait (#44915)
91ed59bb42 chore: replace local gator permission detail schemas with @metamask/7715-permission-types (#44415)
a73805093a fix: excempt batch sell routes from ConfirmationRouter (#44951)
87d0cf9c0a fix(pure-black): set main action button dropdown to bg-alternative (#44881)
17731f5111 fix(pure-black): fix account address popover background and refactor row hover to Tailwind (#44880)
b8ee5bb2eb fix(pure-black): correct tooltip background and arrow colors in dark and pure black themes (#44879)
7b6dde7630 fix(pure-black): add bg-alternative and border to asset explorer view (#44878)
cfdbb033e8 bump: brace-expansion to 5.0.8 (#44924)
00ebfcf32e feat: updated import NFT flow Modal (#44899)
a5f18a53c5 fix: Allow QR singing in side panel on brave (#44934)
bdbe8f29c1 chore(6922): bump @testing-library/react to v14 (#42635)
b35834378b chore: upgrade design system packages (v57.0.0) (#44931)
58b697a400 fix: remove deprecated METAMASK_ENVIRONMENT=test in favor of testing (#44944)
4e37811629 chore: remove copy-to-clipboard dependency (#44890)
4d2065f6a5 test: add coverage for Notification Clicked metrics event (#44920)
da23672992 feat(analytics): migrate pre-consent queue to AnalyticsController (#43869)
5201492b01 feat: refactor non-zero native custom networks (#44161)
9e0cbd2538 fix: allow Firefox WebDriver system access for about:debugging (#44946)
992ff087e7 test(e2e): refactor tokens tab page object for assets coverage (#44778)
b8ad63da79 ci(amo): allow release-team manual dispatch of AMO production (INFRA-3769) (#44519)
bd65eccfdb chore: remove defi v2 fetching from getApi (#44939)
3cb496ea9a chore: migrate markNotificationPopupAsAutomaticallyClosed to LegacyBackgroundApiService (#44249)
f835f69039 feat: initialize DeFiPositionsControllerV2 (#44772)
171ed202b7 feat: add UAT env on bridge (#44895)
ca508307ef feat: bump phishing controller 17.3.0 (#44841)
56ffb74681 refactor(ui): use Arrow2UpRight for Send action icons (#44929)
9c8c6bcb8b fix(pure-black): set perps balance dropdown to bg-alternative (#44875)
cd32d2d252 chore: remove component-library README.mdx docs (#44886)
bab3498f9c chore: remove deprecated textfieldsearch components (#44918)
2bbf04046f ci: fixed labels from forks (#44022)
199066c701 fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44919)
d53496f910 chore: swap position of network picker and search bar on swaps asset picker (#44911)
9d573278ab chore(6927): upgrade redux to v8 (#44445)
2f528e3470 build: no more PNGs inside SVGs allowed, delete unused images (#44832)
4011ce9d91 Merge origin/main into stable-main-13.41.0
72ba3533f4 chore: bump assets controller to v11.2.1 (#44903)
cba9e41d31 chore: fix ESLint ignore config (#44914)
5bb1c5e23d feat: update HeaderSearch and asset picker modal search bars to use TextFieldSearch (#44910)
2be47e1c8d fix: handle missing account for cross-chain asset deeplinks cp-13.42.0 (#44904)
7fac1b56cb test(e2e): stabilize network filter open before switch-network click (#44692)
ba9268b8c7 test: fix flaky test error page support consent TimeoutError: Waiting element to become stale (#44850)
60e4cd1b48 test: fix flaky unstable Continue button in Send page (#44837)
c4d2caae67 feat: migrate swap asset picker search to DSR TextFieldSearch (#44905)
fba4cb3aa7 refactor: simplify sponsored fee row; cleanup dead code (#44872)
ff4fd4dbb8 chore: rename SettingsHeader to PageHeaderWithSearch (#44902)
b072b88aef fix: updated checkbox and permissions page width cp-13.42.0 (#44896)
4045b69287 chore: remove dead app header props (#44900)
15db15fe5b feat: align search bar UIs (#44430)
67db57c82a fix(transactions): avoid inflated fees from failed container estimates (#44308)
75e46239ee feat(ci): add CWS rollout adjustment workflow (INFRA-3651) (#44060)
a03a82855f refactor: cleanup activity selectors (#44864)
7d8a31630f test(e2e): add Tron network E2E cluster (#44164)
e7a6a5e59f fix: local-enriched bridge label when switching networks (#44858)
42146f2fa5 fix(activity): apply text color token to native dialog for dark theme cp-13.42.0 (#44863)
55ad54b09e fix: retry persistence writes once (#44003)
c08a8bb748 bump: tar to 7.5.22, ignore react-router advisories cp-13.41.0 (#44862)
cdddd817a4 fix(deep-links): restore interstitial protection cp-13.42.0 (#44830)
b6619a9fb8 fix(activity): transaction details width (#44853)
5d2cff8067 feat: keep the balance left aligned for lower viewport cp-13.42.0 (#44791)
fddbd0cf34 chore: remove swaps approval text (#44794)
71272d9cd3 test: cover Wallet Imported event (#44747)
47bb810f81 test(e2e): extend Tron fixtures for assets E2E coverage (#44784)
01588c978d chore(assets-controller): bump to 11.2.0 (#44847)
c8df352c4c fix(confirmations): use getAssetImageUrl for gas fee token icon (#44769)
eca1e7ed3f feat: defer password confirm mismatch error until minimum length. (#44790)
e40d3d1af9 ci: pass AI analyzer gate for medium Runway cherry-picks into release branches (#44779)
5147646d2f test(e2e): refactor tokens tab page object for assets coverage (#44777)
81508e447a feat(onboarding): update Google sign-in icon to new brand logo (#44755)
545dd73434 fix: gas sponsorship being shown for hw accounts when the user has selected a nonevm network (#44706)
4ed04ec772 fix: restored old behavior to show Paid by MetaMask label in sponsored transactions from activity page cp-13.41.0 (#44780)
ca4d467800 refactor: migrate Core UX secondary buttons to MMDS (#44767)
197093a62a test: cover Wallet Setup Started Segment event (#44668)
5c6ffe848d fix(ci): post RC Slack when Builds ready, not only green main (#44831)
8011cc033a fix: eliminate dark-mode background flash for pure black mode (#44743)
d667c1f177 feat: enable pure black dark mode by default (#44806)
c42c6cbe77 ci: update cla.yml with more Cursor names (#44815)
88e20cf90c fix(assets): include tokens with large balances and few decimals in aggregated balance cp-13.41.0 (#44796)
1e2f17bea8 feat: upgrade bridge packages to latest versions (#44722)
5fb686386e release: Bump main version to 13.43.0 (#44799)

AI Test Plan

Risk Score High Risk Medium Risk Files Changed Commits
54/100 5 9 1354 163
Cherry-Pick Scenarios (2)

High Risk Scenarios (1)

1. Smart Transactions — Tx Sentinel routing (robinhood URL)

Risk Level: HIGH

Why This Matters: Cherry-pick 45214 fixes Smart Transactions routing by adding a new sentinel endpoint; incorrect wiring breaks STX preflight/monitoring and can block transactions.

Test Steps:

  1. Enable Smart Transactions in Settings and initiate a send on a supported network.
  2. On the confirmation flow, verify preflight/monitoring calls succeed; if possible, inspect that requests reach the new tx-sentinel robinhood domain.
  3. Simulate a failure to the sentinel domain (block or go offline) and confirm the flow either retries or falls back gracefully; then disable Smart Transactions and verify a normal send still works.

Medium Risk Scenarios (1)

1. Perps — Order book in order entry page

Risk Level: MEDIUM

Why This Matters: Cherry-pick 45151 adds a new order book to trading; bad subscriptions or UI wiring can misprice orders or block order entry.

Test Steps:

  1. Open the Perps trading view (ensure the feature is enabled) and verify an order book renders with live bids/asks.
  2. Click a price level in the order book and confirm the order entry price/size fields populate accordingly.
  3. Switch markets and verify the order book updates instantly without stale rows or UI jitter.
  4. Toggle offline/online and ensure the order book gracefully reconnects and re-populates.

Release Scenarios (12)

High Risk Scenarios (4)

1. State Migrations (220, 221) — Core data integrity

Risk Level: HIGH

Why This Matters: Migrations can corrupt or drop user data (accounts/networks/tokens). Verifying end-to-end persistence prevents loss of funds visibility and broken network setups.

Test Steps:

  1. Install the last stable pre-release (e.g., 13.42.x), create a new wallet, add a second account, and import one account via private key.
  2. Add a custom network (non-default chainId), add at least one ERC-20 on Mainnet and one on the custom network, and label accounts/networks.
  3. Connect Account 1 to a test dapp (Permissions, Accounts) and close the extension.
  4. Upgrade to 13.43.0 and open the extension to trigger migrations.
  5. Verify all accounts, labels, custom networks, and tokens persist correctly per network; ensure no duplicate or missing assets.

2. State Migrations (220, 221) — Permissions, Connected Sites, Snaps

Risk Level: HIGH

Why This Matters: Permission graphs are sensitive to schema changes; corruption here can cause security/privacy regressions or break dapp/Snap functionality.

Test Steps:

  1. On the older version, connect two different dapps using different active accounts; install one Snap and grant required permissions.
  2. Upgrade to 13.43.0 and open Connected Sites to review site-to-account mappings.
  3. Verify each dapp retains the correct connected account and permissions; open the Snap and run a simple permitted method.
  4. Revoke one permission from a site and from the Snap, then reconnect to ensure permissions can still be granted post-migration.

3. State Migrations (220, 221) — Pending transactions and Activity log

Risk Level: HIGH

Why This Matters: Users must not lose visibility or control of pending transactions across migrations; broken histories cause confusion and potential double-spend attempts.

Test Steps:

  1. On the older version, submit a low-gas transaction so it remains pending (or queue a safe pending state).
  2. Upgrade to 13.43.0 and open the Activity/Transactions list.
  3. Verify the pending transaction is still present and can be sped up or canceled without error.
  4. Confirm the Activity log shows a single coherent history entry (no duplicates/missing entries) with correct statuses.

4. Bridge — Route selection, approvals, and execution

Risk Level: HIGH

Why This Matters: Bridge logic or controller changes can silently break routing or approvals; users risk stalled or failed fund transfers.

Test Steps:

  1. Open Bridge, select a source token/network and a destination network, and request quotes.
  2. Verify routes populate correctly; select a route and proceed to Review.
  3. Complete any required token approval and then submit the bridge transaction(s).
  4. Verify step statuses update in-line (approval, transfer, confirmations) and final success/failure is surfaced with actionable errors if applicable.

Medium Risk Scenarios (8)

1. MetaMetrics (analytics) — Opt-in/out gating and event emission

Risk Level: MEDIUM

Why This Matters: A large refactor to the metametrics controller can accidentally over/under-report or re-prompt users, creating privacy and compliance risks.

Test Steps:

  1. In Settings > Security & Privacy, opt out of MetaMetrics; then switch networks, open Swap, and reject a send to generate typical UI flows.
  2. Confirm no analytics calls are made (e.g., network inspector shows no metrics endpoint hits) and no analytics errors occur.
  3. Opt in to MetaMetrics and repeat actions; confirm expected events are sent once per action and session identifiers persist across a browser restart.
  4. Ensure onboarding does not re-prompt metrics if the prior choice was set, and toggling the setting takes effect immediately.

2. Assets — Network filter and control bar

Risk Level: MEDIUM

Why This Matters: Changes in filtering can hide assets, misstate balances, or confuse users switching networks.

Test Steps:

  1. Open the Assets/Home view; use the control bar to filter by a specific network and verify only assets from that network display with correct counts.
  2. Switch the active network using the network picker; ensure the 'Home network' filter/modal updates correctly and the asset list refreshes.
  3. Clear filters and verify the default view returns; ensure watchlisted and hidden tokens remain correctly categorized.
  4. Use search within the filtered view and verify results remain scoped to the selected network.

3. Balances — Account group balance calculations

Risk Level: MEDIUM

Why This Matters: Incorrect aggregation or currency conversion misrepresents portfolio value and can drive poor user decisions.

Test Steps:

  1. Hold different tokens across two or more accounts and at least two networks.
  2. Open the group balance component and manually verify total fiat value equals the sum of visible holdings.
  3. Change fiat currency in Settings (e.g., USD to EUR) and confirm totals re-calc correctly.
  4. Hide one token and verify group totals update immediately and accurately.

4. Alerts — Unconnected account and invalid custom network

Risk Level: MEDIUM

Why This Matters: Connection and network mismatch alerts guide safe interaction with dapps; regressions can lead to failed transactions or using the wrong account/network.

Test Steps:

  1. Visit a previously connected dapp and switch the active account in the extension to one that is not connected; verify the Unconnected Account alert appears.
  2. Use the alert's action to connect the account and confirm the dapp reflects the new account.
  3. Switch to a custom network not supported by the site and verify the Invalid Custom Network alert appears with a switch/recommend action.
  4. Use the alert’s action to switch back to a supported network and ensure the alert dismisses automatically.
  5. Confirm no alert reappears after navigation or reload once resolved.

5. Perps — Market data stream resilience (baseline)

Risk Level: MEDIUM

Why This Matters: Real-time data streams must recover from disconnects and market switches; failures degrade trading accuracy and user trust.

Test Steps:

  1. Open the Perps trading view and verify live price/market data updates within the order entry area.
  2. Switch markets and confirm updates switch to the selected market without stale data from the previous market.
  3. Simulate offline mode, then restore connectivity; verify the stream reconnects and resumes without requiring a manual refresh.
  4. Ensure UI does not freeze or duplicate rows during stream transitions.

6. App State — Lock/unlock and session restoration

Risk Level: MEDIUM

Why This Matters: App-state controller changes can cause lost context or stuck spinners after authentication and restarts.

Test Steps:

  1. With the Home view open and a secondary panel (e.g., Activity or Settings) visible, lock the wallet from the Account menu.
  2. Unlock and verify you return to the same view with correct state (no spinner hangs or blank screens).
  3. Close the browser, reopen, and confirm the last visited tab/view and network selection are restored.

7. Send — Custom network transaction and activity visibility

Risk Level: MEDIUM

Why This Matters: Network-aware UI changes can desync send/confirm flows and activity visibility, leading to user confusion about transaction status.

Test Steps:

  1. On a custom network, send the native token to a known address and review gas details for correct chain parameters.
  2. After submission, open Activity and confirm the new transaction appears under the correct network filter.
  3. Switch the Assets network filter and verify the transaction visibility changes appropriately (not hidden unexpectedly).
  4. Confirm status updates (pending/confirmed) are reflected without requiring manual refresh.

8. Onboarding UX — Account icon tour

Risk Level: MEDIUM

Why This Matters: A misbehaving tour can block key controls or become a recurring annoyance, harming first-run UX.

Test Steps:

  1. Create a new wallet and land on Home; verify the account icon tour tooltip appears once.
  2. Dismiss the tooltip and navigate between tabs (Assets/Activity/Settings).
  3. Confirm the tooltip does not reappear after navigation or browser restart.

Teams Sign-off Status

Signed off: None yet

Awaiting sign-off (8):
Accounts, Assets, Networks, Onboarding, Permissions, Snaps, Swaps and Bridge, Transactions


Generated by AI Test Plan Analyzer (gpt-5) at 2026-08-05T22:04:14.070Z

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

…o release/*; block flask dispatch (#45326)

- fix(ci): restrict AMO flask/production to release/*; block flask
dispatch (#45302)

## **Description**

Align AMO **production** and **flask** to **`release/*` only** (not
`main`) so uploads use the same workflow version as the cut.

Flask remains orchestrator-only: `flask` is removed from
`workflow_dispatch` target options, and the sender check rejects any
human/non-Runway flask dispatch. Do **not** gate on `github.event_name`
— in a reusable workflow that value is the caller's trigger, so a Runway
orchestrator `workflow_call` (itself `workflow_dispatch`) would falsely
fail. Keep `workflow_call` for Runway Phase 3.

**Companion:** [infra PR

#19](https://github.com/consensys-vertical-apps/va-mmc-extension-submission-infra/pull/19)
(`amo-submission-flask` + `amo-submission-production` OIDC `release/*`
only). Docs:
[releases#32](https://github.com/MetaMask/releases/pull/32).

**GitHub Environment config (done):**
- [x] Remove required reviewers on `amo-flask`
- [x] Set `amo-flask` and `amo-production` deployment branches to
**`release/*` only** (remove `main`)

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes: INFRA-3769

## **Manual testing steps**

1. On `release/X.Y.Z`, Actions → Upload extension to Firefox AMO —
targets are `production` and `dev` only (`flask` not offered).
2. `target=production` on `release/*` passes the branch guard (then
waits on `amo-production` approval).
3. `target=production` on `main` fails the branch guard.
4. Orchestrator `workflow_call` with `target=flask` still succeeds
(sender = Runway; no env reviewers on `amo-flask`).
5. Human attempt at flask (API/`workflow_call` from a user) fails the
sender check before AWS creds.

## **Screenshots/Recordings**

N/A

### **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: Cursor <cursoragent@cursor.com>
[bc18c5c](bc18c5c)

Co-authored-by: Borislav Grigorov <11405770+bsgrigorov@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@metamask-ci

metamask-ci Bot commented Aug 7, 2026

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

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

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

Regressions (🔴 4 failures)

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

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: +18%
  • loadNewAccount/total: +18%
  • bridgeUserActions/bridge_load_asset_picker: +11%
  • bridgeUserActions/longTaskCount: +11%
  • bridgeUserActions/longTaskTotalDuration: +11%
  • bridgeUserActions/tbt: +14%
  • loadNewAccount/inp: -32%
  • loadNewAccount/fcp: -61%
  • loadNewAccount/lcp: +934%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/inp: +105%
  • confirmTx/fcp: -55%
  • confirmTx/lcp: +1028%
  • bridgeUserActions/bridge_load_page: +1589%
  • bridgeUserActions/bridge_load_asset_picker: +27%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +158%
  • bridgeUserActions/fcp: -11%
  • bridgeUserActions/lcp: +1066%

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

  • 🟡 confirmTx/INP: p75 216ms
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
startupPowerUserHome
[Sentry log · main/release]
🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/firstPaint: +12%
  • startupStandardHome/backgroundConnect: +10%
  • startupStandardHome/numNetworkReqs: -14%
  • startupStandardHome/domInteractive: -17%
  • startupStandardHome/numNetworkReqs: -13%
  • startupStandardHome/fcp: -13%
  • startupPowerUserHome/uiStartup: +30%
  • startupPowerUserHome/load: +28%
  • startupPowerUserHome/domContentLoaded: +27%
  • startupPowerUserHome/domInteractive: +40%
  • startupPowerUserHome/backgroundConnect: +98%
  • startupPowerUserHome/firstReactRender: +37%
  • startupPowerUserHome/initialActions: +11%
  • startupPowerUserHome/loadScripts: +26%
  • startupPowerUserHome/setupStore: +297%
  • startupPowerUserHome/inp: +14%
  • startupPowerUserHome/fcp: +37%
  • startupPowerUserHome/lcp: +27%

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

  • 🟡 startupPowerUserHome/INP: p75 216ms
  • 🟡 startupPowerUserHome/LCP: p75 3.7s
User Journey Benchmarks · Samples: 5 · real API 🔴 4

⚠️ Missing data: chrome/webpack/userJourneyTransactions

Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 doneButtonToHomeScreen
🔴 total
🔴 [CI log]
🔴 total
onboardingNewWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 total
🔴 [CI log]
🔴 total
assetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
importSrpHome
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
sendTransactions
[Sentry log · main/release]
🟡 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • onboardingImportWallet/doneButtonToHomeScreen: -34%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: +213%
  • onboardingImportWallet/longTaskCount: +43%
  • onboardingImportWallet/longTaskTotalDuration: +25%
  • onboardingImportWallet/tbt: +19%
  • onboardingImportWallet/total: +30%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: +69%
  • onboardingNewWallet/doneButtonToAssetList: +16%
  • onboardingNewWallet/tbt: +40%
  • onboardingNewWallet/total: +15%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/lcp: +15%
  • importSrpHome/homeAfterImportWithNewWallet: +18%
  • importSrpHome/longTaskCount: +13%
  • importSrpHome/total: +16%
  • importSrpHome/cls: -13%

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

  • 🟡 importSrpHome/INP: p75 336ms
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 sendTransactions/FCP: p75 2.2s
  • 🟡 sendTransactions/LCP: p75 2.6s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 4.25 KiB (0.03%)
  • ui: 34.03 KiB (0.19%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 476 Bytes (0.02%)
  • zip: 47.71 KiB (0.22%)

🍒 What's in this RC

Cherry-picks (11 commits)
Commit Description
eab409745b release(runway): cherry-pick fix(ci): restrict AMO flask/production to release/*; block flask dispatch (#45326)
cb83da7da8 release(runway): cherry-pick fix: resolve ip-address to >=10.3.1 for yarn audit (#45252)
a694e1ef9b Cherry-picking commits from cherry-pick-13-43-0-3cad329 to release/13.43.0 for PR #45158 (#45244)
18b0642e48 release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45216)
3b2076081e release(runway): cherry-pick feat(ci): derive orchestrator version from release branch (#45224)
024c9a632a release(runway): cherry-pick fix(ci): bind AMO package EXIT trap path before set -u can fail (#45225)
f576b8f4ac release(runway): cherry-pick fix: patch smart-transactions-controller to add the tx-sentinel robinhood URL (#45214)
400f264212 release(runway): cherry-pick chore: audit brace-expansion, postcss, fast-uri, undici, and socket.io-parser (#45188)
f1e31952b6 release(runway): cherry-pick feat(perps): add order book to order entry page (#45151)
1ea90deff7 release(runway): cherry-pick chore: bump snap-account-service (report migration error) (#45102)
75ea9568be Merge branch 'stable' into release/13.43.0

Changelog (161 commits since v13.42.0)
Commit Description
eab409745b release(runway): cherry-pick fix(ci): restrict AMO flask/production to release/*; block flask dispatch (#45326)
cb83da7da8 release(runway): cherry-pick fix: resolve ip-address to >=10.3.1 for yarn audit (#45252)
a694e1ef9b Cherry-picking commits from cherry-pick-13-43-0-3cad329 to release/13.43.0 for PR #45158 (#45244)
18b0642e48 release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45216)
3b2076081e release(runway): cherry-pick feat(ci): derive orchestrator version from release branch (#45224)
024c9a632a release(runway): cherry-pick fix(ci): bind AMO package EXIT trap path before set -u can fail (#45225)
f576b8f4ac release(runway): cherry-pick fix: patch smart-transactions-controller to add the tx-sentinel robinhood URL (#45214)
400f264212 release(runway): cherry-pick chore: audit brace-expansion, postcss, fast-uri, undici, and socket.io-parser (#45188)
f1e31952b6 release(runway): cherry-pick feat(perps): add order book to order entry page (#45151)
1ea90deff7 release(runway): cherry-pick chore: bump snap-account-service (report migration error) (#45102)
76657f7a3c release: release-changelog/13.43.0 (#45056)
9da0748ed3 Merge release/13.42.0 into release/13.43.0
d90d1e76b8 fix(hardware-wallets): bound stuck account-creation spinner with device-read timeout cp-13.42.0 (#45048)
0311ca5fc9 feat: add trust security signals tdp (#44761)
3114315a0e fix: consume stx enabled flag for batch sell from selected chain (#45032)
3ae0ce34cc chore: clean up TextFieldSearch styles after MMDS package update (#45030)
51cff5563f test: fix flaky test Smart Transactions should send transaction using USDC to pay fee (#45036)
0610a607c7 feat(perps): wire dedicated aggregated order-book socket per UI connection (#45035)
d67a05b8aa ci(slsa): publish attestation bundles and pin run-build actions (INFRA-3786) (#44955)
666b247f3a test: fix flaky custom-token import E2E by waiting for the Add Custom Token network picker to settle TimeoutError: Waiting for element to be located By(css selector, [data-testid="custom-token-import-submit-button"]:not([disabled])) (#45025)
9afac38fe7 feat: new segment schema support (#43132)
bfdb62afa3 test: fix flaky test BTC Account - Activity Receive transaction is rendered with Received label and confirmed status (#45022)
0fdbade0f4 test: MMQA - 1916 - Refactor multiple-provider-connections.spec.ts to good practices (#44941)
33bef9f690 test: fix flaky perps watchlist explore TimeoutError: Waiting for element to be located By(css selector, [data-testid="market-list-filter-sort-row"]) (#44936)
6d53060f6b test: replace driver.waitForSelector with page object methods (#44898)
ed7b8fbd53 fix: patch for missing slip44 entries in core client-utils cp-13.42.0 (#45006)
7e9653a51f feat: added metrics for custom network page (#45031)
5a94f11f60 feat(activity): contact names in activity rows (#45013)
5f842c6082 test: fix flaky Add wallet Import wallet using SRP during onboardingand MetaMask onboarding should not prevent network requests to advanced... (#45034)
c36df0ec1a fix: vertically center contact copy button (#45020)
e3abdc3e78 feat: added timer for balance loading cp-13.42.0 (#45033)
b424876ab6 chore: update assets controllers for defi fix (#45003)
adec2ed351 refactor(wpc-1066): migrate pending-approval HW methods to LegacyBackgroundApiService (#44937)
20bf478a91 feat(confirmations): add Money Account Deposit developer option (#44945)
48ad866df4 bump(perps): upgrade @metamask/perps-controller to v10 (#45024)
239006e967 fix(notifications): add bottom padding to marketing consent text (#45021)
9158172d8a refactor(wpc-1067): migrate network enablement methods to LegacyBackgroundApiService (#44938)
62aaaa4923 test: order selectors and methods in all page objects (#44987)
45505c9910 chore: wire stellar asset component with stellar asset selector (#44979)
ce134bc060 feat: defi positions v2 controller (#44392)
b50797d25a chore: pass Firefox system access via geckodriver and pin 0.36.0 (#45014)
0c7372db98 fix(pure-black): use bg-default on back up SRP page (#44983)
e47424b771 fix(perps): show wallet-confirmed deposits immediately in Perps Activity (#44736)
9b623cccf7 ci: turn on the Triage and Retry System by default (no retry-ci label needed) (#44956)
778bafe559 feat(ramps): wire Buy Continue with background checkout watch (#44689)
10b5de87df test: lavamoat e2e (#44925)
c1a5d29ffd fix: swaps stale dest exchange rates cp-13.42.0 (#44968)
0fa0c88cf3 chore: fix lint:changed script (#45010)
fa5c57e727 fix: navigate to homepage after users close popup from batch sell (#44991)
7dce891afb feat(ramps): send Portfolio-connected wallets to Portfolio on Buy (#44804)
3739101671 fix(pure-black): refine SRP input empty vs filled styling (#45004)
1ec648fa36 chore: update swap consumers to use and display partial QuoteMetadata (#44630)
0660a05750 refactor(wpc-1068): migrate requestSafeReload & openUpdateTabAndReload to LegacyBackgroundApiService (#44940)
d2fdd13169 perf(6570): bump react-hooks to v7 and remove react-compiler plugin (#44495)
cf719e0334 fix(pure-black): stop inverting bridge transaction settings tooltip theme (#44964)
10fabf3ed6 chore: New Crowdin Translations by GitHub Action cp-13.42.0 (#44746)
806f4bf8b6 fix(pure-black): use BackgroundDefault for markets row skeleton (#44984)
da76cb3edb fix(pure-black): use bg-default on Snap install screen (#45002)
c20d7eb736 fix(pure-black): set send network filter button background to transparent (#44882)
04b53836a4 chore(STX): add Robinhood Chain to smart transactions supported networks (#44926)
284f97705e chore: popover for failed transaction status (#44961)
2668c42734 fix(pure-black): remove border from page footer cancel buttons (#44981)
d0efdd7df1 chore(storybook): add Pure Black toolbar toggle and component stories (#44963)
fadc943601 feat: assets unify balance and traces (#44978)
bad91a67e9 chore: replaced deprecated Tag component with MMDS tag (#44785)
dd2075062d fix(confirmations): refetch MetaMask Pay required token price when it is missing (#44950)
66b8f875e3 fix(pure-black): fix Menu background specificity with bg-section (#44966)
00f32ff73c fix: qr camera permission throwing e.isUnlocked is not a function (#44701)
b5ed10c4c2 feat(hardware-wallets): enable shared signing flow (#43947)
1695992b6f feat: migrate Infura IPFS users to dweb.link and block Infura IPFS gateway entry (#44982)
0ad8940da9 feat: use new snap keyring v2/v1 split (#44289)
b7f13b1a4c test: refactor transaction details page and consolidate selectors (#44694)
61ff089628 test(e2e): add Tron assets E2E cluster (#44852)
540d2a65b1 feat: bump transaction-pay-controller to 26.0.0 (#44782)
df415e426e test: skip ERC20 max balance WS update test (ASSETS-3385) (#44952)
f87e3bc8db fix(pure-black): remove custom background color from InfoPopoverTooltip (#44933)
634b46cfed fix(pure-black): remove border-l and bg-alternative from drawer in popup/compact sidepanel (#44960)
57da315640 test: pom lint rule supporting groups (selectors, constructor, actions) (#44789)
7e641c6203 chore: bump @types/chrome and drop custom chrome typings (#44888)
cbd1c50aaf perf(7466): add memoization to network/asset modal components (Batch D) (#44296)
75e09ed50f fix(pure-black): settings sidebar uses bg-alternative in pure black mode (#44883)
c164a38416 fix: clear the postcss advisories cp-13.42.0 (#44865)
3f6a9050c3 test: cover Token Detection Enabled identify trait (#44915)
91ed59bb42 chore: replace local gator permission detail schemas with @metamask/7715-permission-types (#44415)
a73805093a fix: excempt batch sell routes from ConfirmationRouter (#44951)
87d0cf9c0a fix(pure-black): set main action button dropdown to bg-alternative (#44881)
17731f5111 fix(pure-black): fix account address popover background and refactor row hover to Tailwind (#44880)
b8ee5bb2eb fix(pure-black): correct tooltip background and arrow colors in dark and pure black themes (#44879)
7b6dde7630 fix(pure-black): add bg-alternative and border to asset explorer view (#44878)
cfdbb033e8 bump: brace-expansion to 5.0.8 (#44924)
00ebfcf32e feat: updated import NFT flow Modal (#44899)
a5f18a53c5 fix: Allow QR singing in side panel on brave (#44934)
bdbe8f29c1 chore(6922): bump @testing-library/react to v14 (#42635)
b35834378b chore: upgrade design system packages (v57.0.0) (#44931)
58b697a400 fix: remove deprecated METAMASK_ENVIRONMENT=test in favor of testing (#44944)
4e37811629 chore: remove copy-to-clipboard dependency (#44890)
4d2065f6a5 test: add coverage for Notification Clicked metrics event (#44920)
da23672992 feat(analytics): migrate pre-consent queue to AnalyticsController (#43869)
5201492b01 feat: refactor non-zero native custom networks (#44161)
9e0cbd2538 fix: allow Firefox WebDriver system access for about:debugging (#44946)
992ff087e7 test(e2e): refactor tokens tab page object for assets coverage (#44778)
b8ad63da79 ci(amo): allow release-team manual dispatch of AMO production (INFRA-3769) (#44519)
bd65eccfdb chore: remove defi v2 fetching from getApi (#44939)
3cb496ea9a chore: migrate markNotificationPopupAsAutomaticallyClosed to LegacyBackgroundApiService (#44249)
f835f69039 feat: initialize DeFiPositionsControllerV2 (#44772)
171ed202b7 feat: add UAT env on bridge (#44895)
ca508307ef feat: bump phishing controller 17.3.0 (#44841)
56ffb74681 refactor(ui): use Arrow2UpRight for Send action icons (#44929)
9c8c6bcb8b fix(pure-black): set perps balance dropdown to bg-alternative (#44875)
cd32d2d252 chore: remove component-library README.mdx docs (#44886)
bab3498f9c chore: remove deprecated textfieldsearch components (#44918)
2bbf04046f ci: fixed labels from forks (#44022)
199066c701 fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44919)
d53496f910 chore: swap position of network picker and search bar on swaps asset picker (#44911)
9d573278ab chore(6927): upgrade redux to v8 (#44445)
2f528e3470 build: no more PNGs inside SVGs allowed, delete unused images (#44832)
4011ce9d91 Merge origin/main into stable-main-13.41.0
72ba3533f4 chore: bump assets controller to v11.2.1 (#44903)
cba9e41d31 chore: fix ESLint ignore config (#44914)
5bb1c5e23d feat: update HeaderSearch and asset picker modal search bars to use TextFieldSearch (#44910)
2be47e1c8d fix: handle missing account for cross-chain asset deeplinks cp-13.42.0 (#44904)
7fac1b56cb test(e2e): stabilize network filter open before switch-network click (#44692)
ba9268b8c7 test: fix flaky test error page support consent TimeoutError: Waiting element to become stale (#44850)
60e4cd1b48 test: fix flaky unstable Continue button in Send page (#44837)
c4d2caae67 feat: migrate swap asset picker search to DSR TextFieldSearch (#44905)
fba4cb3aa7 refactor: simplify sponsored fee row; cleanup dead code (#44872)
ff4fd4dbb8 chore: rename SettingsHeader to PageHeaderWithSearch (#44902)
b072b88aef fix: updated checkbox and permissions page width cp-13.42.0 (#44896)
4045b69287 chore: remove dead app header props (#44900)
15db15fe5b feat: align search bar UIs (#44430)
67db57c82a fix(transactions): avoid inflated fees from failed container estimates (#44308)
75e46239ee feat(ci): add CWS rollout adjustment workflow (INFRA-3651) (#44060)
a03a82855f refactor: cleanup activity selectors (#44864)
7d8a31630f test(e2e): add Tron network E2E cluster (#44164)
e7a6a5e59f fix: local-enriched bridge label when switching networks (#44858)
42146f2fa5 fix(activity): apply text color token to native dialog for dark theme cp-13.42.0 (#44863)
55ad54b09e fix: retry persistence writes once (#44003)
c08a8bb748 bump: tar to 7.5.22, ignore react-router advisories cp-13.41.0 (#44862)
cdddd817a4 fix(deep-links): restore interstitial protection cp-13.42.0 (#44830)
b6619a9fb8 fix(activity): transaction details width (#44853)
5d2cff8067 feat: keep the balance left aligned for lower viewport cp-13.42.0 (#44791)
fddbd0cf34 chore: remove swaps approval text (#44794)
71272d9cd3 test: cover Wallet Imported event (#44747)
47bb810f81 test(e2e): extend Tron fixtures for assets E2E coverage (#44784)
01588c978d chore(assets-controller): bump to 11.2.0 (#44847)
c8df352c4c fix(confirmations): use getAssetImageUrl for gas fee token icon (#44769)
eca1e7ed3f feat: defer password confirm mismatch error until minimum length. (#44790)
e40d3d1af9 ci: pass AI analyzer gate for medium Runway cherry-picks into release branches (#44779)
5147646d2f test(e2e): refactor tokens tab page object for assets coverage (#44777)
81508e447a feat(onboarding): update Google sign-in icon to new brand logo (#44755)
545dd73434 fix: gas sponsorship being shown for hw accounts when the user has selected a nonevm network (#44706)
4ed04ec772 fix: restored old behavior to show Paid by MetaMask label in sponsored transactions from activity page cp-13.41.0 (#44780)
ca4d467800 refactor: migrate Core UX secondary buttons to MMDS (#44767)
197093a62a test: cover Wallet Setup Started Segment event (#44668)
5c6ffe848d fix(ci): post RC Slack when Builds ready, not only green main (#44831)
8011cc033a fix: eliminate dark-mode background flash for pure black mode (#44743)
d667c1f177 feat: enable pure black dark mode by default (#44806)
c42c6cbe77 ci: update cla.yml with more Cursor names (#44815)
88e20cf90c fix(assets): include tokens with large balances and few decimals in aggregated balance cp-13.41.0 (#44796)
1e2f17bea8 feat: upgrade bridge packages to latest versions (#44722)
5fb686386e release: Bump main version to 13.43.0 (#44799)

AI Test Plan

Risk Score High Risk Medium Risk Files Changed Commits
52/100 5 7 1354 164
Cherry-Pick Scenarios (2)

High Risk Scenarios (1)

1. Smart Transactions – Tx Sentinel (Robinhood) Routing

Risk Level: HIGH

Why This Matters: Cherry-pick 45214 fixes Smart Transactions controller endpoint routing to the tx-sentinel Robinhood URL; incorrect routing can break submissions or status updates and strand user transactions.

Test Steps:

  1. Enable Smart Transactions on a supported chain and initiate a send or swap.
  2. In the background console/network panel, verify requests are sent to the new tx-sentinel Robinhood URL during submission/status polling.
  3. Temporarily block the sentinel domain (e.g., via hosts or proxy) and retry; confirm the UI reports a clear error or falls back gracefully without leaving stuck pending transactions.
  4. Send a legacy (non-ST) transaction and verify it is unaffected.

Medium Risk Scenarios (1)

1. Perps – Order Entry Page Order Book

Risk Level: MEDIUM

Why This Matters: Cherry-pick 45151 adds a new order book on the order entry page; visual correctness and real-time updates are critical for trading accuracy and user trust.

Test Steps:

  1. Open the Perps order entry page and verify the order book renders with correct bid/ask sides, best price highlighting, and aggregated sizes.
  2. Switch market pairs and ensure the order book updates immediately without errors or stale data.
  3. Place a small market/limit order (if available) and verify the order book updates accordingly after fill/cancel.
  4. If a feature flag exists, toggle it Off and confirm the page gracefully hides the order book without breaking order entry.

Release Scenarios (10)

High Risk Scenarios (4)

1. State Migrations (versions 220 and 221)

Risk Level: HIGH

Why This Matters: Migrations can corrupt or drop user data; verifying persistence across upgrade prevents loss of funds access, incorrect privacy settings, or broken networks.

Test Steps:

  1. Install the previous stable extension version (e.g., 13.42.x), create a wallet, opt out of MetaMetrics, add a custom RPC network, connect a site, and add a few tokens and NFTs.
  2. Upgrade to 13.43.0 and open the extension; wait for all loading to complete.
  3. Verify accounts, assets, NFTs, connected sites, and custom networks are intact and usable (no missing data or errors).
  4. Go to Settings > Security & Privacy and confirm the MetaMetrics toggle retains the previous choice and there is no duplicate consent prompt.
  5. Perform a basic send on each previously added network to ensure no corrupted state blocks transactions.

2. Smart Transactions (send/swap flows, speed up/cancel)

Risk Level: HIGH

Why This Matters: Controller logic and patches around Smart Transactions directly impact transaction reliability, fees, and recoverability (speed up/cancel).

Test Steps:

  1. Enable Smart Transactions (Settings/Experimental or supported networks) and ensure you are on a supported chain (e.g., Mainnet).
  2. Send an ETH transfer and confirm the confirmation screen indicates Smart Transactions; submit and verify status progression (Submitted → Sent → Confirmed) without getting stuck.
  3. While pending, use Speed up and then test Cancel on a new pending tx; verify outcomes, fees charged, and that history reflects the final status correctly.
  4. Execute a token swap; confirm gas estimates and that ST falls back to legacy path gracefully if ineligible, without UI errors.
  5. Induce a failure (e.g., insufficient funds or revert) and ensure clear error messaging and no orphaned pending transactions.

3. Assets List Control Bar and Network Filter

Risk Level: HIGH

Why This Matters: Substantial UI changes to filtering and totals can misrepresent balances or hide assets, causing user confusion and potential transaction mistakes.

Test Steps:

  1. Open Home > Assets and open the control bar; apply a network filter (e.g., Home network only vs All networks).
  2. Verify the visible tokens/NFTs and total fiat balance update to reflect only the selected networks.
  3. Switch to another account and back; confirm whether the filter selection persists appropriately (per-account or global) and totals remain correct.
  4. Clear the filter and confirm the full asset list and total balance restore immediately without visual glitches.

4. MetaMetrics Consent and Tracking (Metametrics Controller refactor)

Risk Level: HIGH

Why This Matters: Refactors to telemetry can accidentally re-prompt users, flip consent, or leak events contrary to user privacy choices.

Test Steps:

  1. Fresh install and during onboarding select “No thanks” on the MetaMetrics prompt.
  2. In Settings > Security & Privacy, verify “Participate in MetaMetrics” is Off; lock/unlock or restart and confirm it persists and no new prompts appear.
  3. Toggle it On, restart the extension, and confirm it remains On and no duplicate consent prompts are shown during dapp interactions.
  4. Connect to a site and sign a message; ensure no additional privacy prompts appear and no console errors in the background page.

Medium Risk Scenarios (6)

1. Invalid Custom Network Alert

Risk Level: MEDIUM

Why This Matters: Users can be blocked from transacting or misled to wrong chains if chainId/RPC mismatches aren’t handled clearly and safely.

Test Steps:

  1. Add a custom RPC network with a chainId that does not match the RPC's reported chainId.
  2. Switch to that network and verify the Invalid Custom Network alert appears with clear guidance.
  3. Use the alert action to edit the network and correct the chainId or RPC URL.
  4. Confirm the alert disappears and you can successfully send a small test transaction.

2. Unconnected Account Alert (Dapp permissions vs active account)

Risk Level: MEDIUM

Why This Matters: Prevents accidental transactions from the wrong account and ensures clear, safe user decisions with connected sites.

Test Steps:

  1. Connect a site to Account 1 only.
  2. Switch the active account in the extension to Account 2.
  3. From the connected site, initiate a transaction and verify the Unconnected account alert appears in the confirmation.
  4. Choose “Switch to connected account” and verify the tx uses Account 1; repeat and choose to continue with current account and confirm the permission state/tx behavior is correct.

3. Account Group Balance Accuracy

Risk Level: MEDIUM

Why This Matters: Incorrect aggregation or currency conversion can misrepresent portfolio value and lead to poor user decisions.

Test Steps:

  1. With multiple accounts holding assets across multiple networks, view the Account Group Balance summary.
  2. Manually sum individual balances and compare to the displayed group total (fiat).
  3. Change primary currency (e.g., USD → EUR) and adjust any network filters; verify totals recalculate accurately.
  4. Add or remove a token and confirm the group balance updates immediately without stale or duplicated values.

4. Perps Streaming Data (Perps Stream Bridge)

Risk Level: MEDIUM

Why This Matters: Live data reliability is essential for trading UIs; stream reconnect failures or stale data can lead to incorrect actions.

Test Steps:

  1. Open the Perps page/order entry and observe live market data updates.
  2. Switch between markets and verify the UI updates quickly without stale prices or flicker.
  3. Disable network connectivity briefly and restore; confirm the stream reconnects automatically and resumes updates.
  4. Place a small test order (if available) and verify the UI reflects order status/fill in near real time.

5. Account Icon Tour (Onboarding Hints via App State Controller)

Risk Level: MEDIUM

Why This Matters: App-state changes can cause onboarding tips to reappear or never show, degrading UX accessibility and guidance.

Test Steps:

  1. Complete onboarding and land on Home; verify the account icon tour tooltip appears once.
  2. Dismiss the tooltip, then lock/unlock or restart the extension.
  3. Confirm the tour does not reappear; if there is a 'reset tips' option, trigger it and verify the tour shows again.
  4. Ensure the tooltip is dismissible via keyboard and does not trap focus.

6. API Error Handling (User-facing error surfaces)

Risk Level: MEDIUM

Why This Matters: Clear, non-blocking error handling avoids user confusion and ensures recovery from transient failures.

Test Steps:

  1. Go offline and trigger a data fetch (e.g., open Assets or request quotes).
  2. Verify an error banner/dialog appears with a clear message and a Retry action.
  3. Restore connectivity and click Retry; confirm data loads and the error clears.
  4. Navigate to other tabs while the error is visible and ensure it does not block unrelated actions.

Teams Sign-off Status

Signed off: None yet

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


Generated by AI Test Plan Analyzer (gpt-5) at 2026-08-07T18:20:51.052Z

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

…attestations permissions they request (#45336)

- fix(ci): grant orchestrator callees the attestations permissions they
request (#45330)

## **Description**

The Runway release orchestrator
(`runway-extension-release-and-submit.yml`) fails at run creation,
before any job starts:

```
Error calling workflow '.../publish-release-from-release-head.yml@eab4097'.
The nested job 'publish-release' is requesting 'attestations: write',
but is only allowed 'attestations: none'.
```

A called workflow can never hold more permission than the job that calls
it. The orchestrator's calling jobs inherited only
`contents/statuses/actions: read` + `id-token: write`, but two callees
ask for attestation scopes:

| Callee | Needs | Why |
| --- | --- | --- |
| `publish-release-from-release-head.yml` | `attestations: write` |
`actions/attest-build-provenance` (INFRA-2665) |
| `upload-extension-to-cws.yml` | `attestations: read` | `gh attestation
verify` (INFRA-3661) |

This grants those scopes on the calling jobs rather than workflow-wide,
so `validate` and the AMO phase keep the narrower set. Because a
job-level `permissions:` block replaces the workflow-level one, each
block lists the full union the callee needs.

Also removes a reference to a `version` input from the recovery text in
the orchestrator summary. There is no `version` input; the version is
derived from the `release/X.Y.Z` branch the workflow runs on.

Not addressed here: `actionlint` and `zizmor` lint one file at a time
and do not inspect the reusable-workflow call graph, so no linter
catches this class of error. It only surfaces on dispatch.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes: INFRA-3735 follow-up (orchestrator was never dispatched
end-to-end before 13.43.0)

## **Manual testing steps**

1. Dispatch **Runway extension release and store submit** on a
`release/*` branch with `execute_store_phases=false` (validation-only
run).
2. Confirm the run is created, i.e. no `The workflow is not valid ...
attestations: none` error. On `main` today, run creation fails at this
point.
3. Confirm Phase 0 validation passes and Phases 1 to 3 are skipped.
4. Open the orchestrator summary and confirm the recovery line reads
"re-dispatch from the same release branch with the same `release_sha`".

<!--
## **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>
[0040e9f](0040e9f)

Co-authored-by: Borislav Grigorov <11405770+bsgrigorov@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@metamask-ci

metamask-ci Bot commented Aug 8, 2026

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

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

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

Regressions (🔴 4 failures)

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

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: +18%
  • loadNewAccount/total: +18%
  • confirmTx/longTaskMaxDuration: +11%
  • confirmTx/tbt: +10%
  • bridgeUserActions/bridge_load_asset_picker: +33%
  • bridgeUserActions/longTaskCount: +11%
  • bridgeUserActions/longTaskTotalDuration: +19%
  • bridgeUserActions/tbt: +36%
  • loadNewAccount/load_new_account: +21%
  • loadNewAccount/total: +21%
  • loadNewAccount/inp: -24%
  • loadNewAccount/fcp: -46%
  • loadNewAccount/lcp: +1140%
  • confirmTx/confirm_tx: +11%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +11%
  • confirmTx/inp: +142%
  • confirmTx/fcp: -49%
  • confirmTx/lcp: +1213%
  • bridgeUserActions/bridge_load_page: +254%
  • bridgeUserActions/bridge_load_asset_picker: +73%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +17%
  • bridgeUserActions/inp: -15%
  • bridgeUserActions/lcp: +1126%

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

  • 🟡 confirmTx/INP: p75 256ms
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
startupPowerUserHome
[Sentry log · main/release]
🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/numNetworkReqs: -14%
  • startupStandardHome/domInteractive: -16%
  • startupStandardHome/numNetworkReqs: -13%
  • startupPowerUserHome/uiStartup: +12%
  • startupPowerUserHome/domInteractive: +15%
  • startupPowerUserHome/backgroundConnect: +11%
  • startupPowerUserHome/initialActions: +11%
  • startupPowerUserHome/setupStore: +266%
  • startupPowerUserHome/inp: +10%
  • startupPowerUserHome/fcp: +13%
  • startupPowerUserHome/lcp: +12%

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

  • 🟡 startupPowerUserHome/INP: p75 208ms
  • 🟡 startupPowerUserHome/LCP: p75 3.2s
User Journey Benchmarks · Samples: 5 · real API 🔴 4

⚠️ Missing data: chrome/webpack/userJourneyTransactions

Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 doneButtonToHomeScreen
🔴 total
🔴 [CI log]
🔴 total
onboardingNewWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 total
🔴 [CI log]
🔴 total
assetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
🟡 assetClickToPriceChart
importSrpHome
[Sentry log · main/release]
🟡 [CI log]
🟡 total
🟢 [CI log]
sendTransactions
[Sentry log · main/release]
🟡 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • onboardingImportWallet/srpButtonToSrpForm: +18%
  • onboardingImportWallet/confirmSrpToPwForm: +16%
  • onboardingImportWallet/pwFormToMetricsScreen: +13%
  • onboardingImportWallet/doneButtonToHomeScreen: -37%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: +115%
  • onboardingImportWallet/longTaskCount: +29%
  • onboardingImportWallet/longTaskTotalDuration: +26%
  • onboardingImportWallet/longTaskMaxDuration: +10%
  • onboardingImportWallet/tbt: +30%
  • onboardingNewWallet/srpButtonToPwForm: -10%
  • onboardingNewWallet/createPwToRecoveryScreen: -12%
  • onboardingNewWallet/skipBackupToMetricsScreen: -22%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: -15%
  • onboardingNewWallet/doneButtonToAssetList: -19%
  • onboardingNewWallet/longTaskCount: +25%
  • onboardingNewWallet/longTaskTotalDuration: -17%
  • onboardingNewWallet/tbt: -30%
  • onboardingNewWallet/total: -18%
  • solanaAssetDetails/assetClickToPriceChart: +22%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: +22%
  • solanaAssetDetails/inp: +11%
  • solanaAssetDetails/fcp: +11%
  • importSrpHome/loginToHomeScreen: +15%
  • importSrpHome/openAccountMenuAfterLogin: +15%
  • importSrpHome/homeAfterImportWithNewWallet: +34%
  • importSrpHome/longTaskCount: +41%
  • importSrpHome/longTaskTotalDuration: +18%
  • importSrpHome/total: +32%
  • importSrpHome/cls: -14%

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

  • 🟡 importSrpHome/INP: p75 312ms
  • 🟡 solanaAssetDetails/FCP: p75 2.0s
  • 🟡 solanaAssetDetails/LCP: p75 2.5s
  • 🟡 sendTransactions/FCP: p75 2.1s
  • 🟡 sendTransactions/LCP: p75 2.6s
Dapp Page Load Benchmarks · Samples: 100

⚠️ Missing data: chrome/webpack/pageLoadBenchmark

✅ No regressions detected

Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 4.25 KiB (0.03%)
  • ui: 34.03 KiB (0.19%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 476 Bytes (0.02%)
  • zip: 47.71 KiB (0.22%)

🍒 What's in this RC

Cherry-picks (12 commits)
Commit Description
dfc2567194 release(runway): cherry-pick fix(ci): grant orchestrator callees the attestations permissions they request (#45336)
eab409745b release(runway): cherry-pick fix(ci): restrict AMO flask/production to release/*; block flask dispatch (#45326)
cb83da7da8 release(runway): cherry-pick fix: resolve ip-address to >=10.3.1 for yarn audit (#45252)
a694e1ef9b Cherry-picking commits from cherry-pick-13-43-0-3cad329 to release/13.43.0 for PR #45158 (#45244)
18b0642e48 release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45216)
3b2076081e release(runway): cherry-pick feat(ci): derive orchestrator version from release branch (#45224)
024c9a632a release(runway): cherry-pick fix(ci): bind AMO package EXIT trap path before set -u can fail (#45225)
f576b8f4ac release(runway): cherry-pick fix: patch smart-transactions-controller to add the tx-sentinel robinhood URL (#45214)
400f264212 release(runway): cherry-pick chore: audit brace-expansion, postcss, fast-uri, undici, and socket.io-parser (#45188)
f1e31952b6 release(runway): cherry-pick feat(perps): add order book to order entry page (#45151)
1ea90deff7 release(runway): cherry-pick chore: bump snap-account-service (report migration error) (#45102)
75ea9568be Merge branch 'stable' into release/13.43.0

Changelog (162 commits since v13.42.0)
Commit Description
dfc2567194 release(runway): cherry-pick fix(ci): grant orchestrator callees the attestations permissions they request (#45336)
eab409745b release(runway): cherry-pick fix(ci): restrict AMO flask/production to release/*; block flask dispatch (#45326)
cb83da7da8 release(runway): cherry-pick fix: resolve ip-address to >=10.3.1 for yarn audit (#45252)
a694e1ef9b Cherry-picking commits from cherry-pick-13-43-0-3cad329 to release/13.43.0 for PR #45158 (#45244)
18b0642e48 release(runway): cherry-pick chore: New Crowdin Translations by GitHub Action (#45216)
3b2076081e release(runway): cherry-pick feat(ci): derive orchestrator version from release branch (#45224)
024c9a632a release(runway): cherry-pick fix(ci): bind AMO package EXIT trap path before set -u can fail (#45225)
f576b8f4ac release(runway): cherry-pick fix: patch smart-transactions-controller to add the tx-sentinel robinhood URL (#45214)
400f264212 release(runway): cherry-pick chore: audit brace-expansion, postcss, fast-uri, undici, and socket.io-parser (#45188)
f1e31952b6 release(runway): cherry-pick feat(perps): add order book to order entry page (#45151)
1ea90deff7 release(runway): cherry-pick chore: bump snap-account-service (report migration error) (#45102)
76657f7a3c release: release-changelog/13.43.0 (#45056)
9da0748ed3 Merge release/13.42.0 into release/13.43.0
d90d1e76b8 fix(hardware-wallets): bound stuck account-creation spinner with device-read timeout cp-13.42.0 (#45048)
0311ca5fc9 feat: add trust security signals tdp (#44761)
3114315a0e fix: consume stx enabled flag for batch sell from selected chain (#45032)
3ae0ce34cc chore: clean up TextFieldSearch styles after MMDS package update (#45030)
51cff5563f test: fix flaky test Smart Transactions should send transaction using USDC to pay fee (#45036)
0610a607c7 feat(perps): wire dedicated aggregated order-book socket per UI connection (#45035)
d67a05b8aa ci(slsa): publish attestation bundles and pin run-build actions (INFRA-3786) (#44955)
666b247f3a test: fix flaky custom-token import E2E by waiting for the Add Custom Token network picker to settle TimeoutError: Waiting for element to be located By(css selector, [data-testid="custom-token-import-submit-button"]:not([disabled])) (#45025)
9afac38fe7 feat: new segment schema support (#43132)
bfdb62afa3 test: fix flaky test BTC Account - Activity Receive transaction is rendered with Received label and confirmed status (#45022)
0fdbade0f4 test: MMQA - 1916 - Refactor multiple-provider-connections.spec.ts to good practices (#44941)
33bef9f690 test: fix flaky perps watchlist explore TimeoutError: Waiting for element to be located By(css selector, [data-testid="market-list-filter-sort-row"]) (#44936)
6d53060f6b test: replace driver.waitForSelector with page object methods (#44898)
ed7b8fbd53 fix: patch for missing slip44 entries in core client-utils cp-13.42.0 (#45006)
7e9653a51f feat: added metrics for custom network page (#45031)
5a94f11f60 feat(activity): contact names in activity rows (#45013)
5f842c6082 test: fix flaky Add wallet Import wallet using SRP during onboardingand MetaMask onboarding should not prevent network requests to advanced... (#45034)
c36df0ec1a fix: vertically center contact copy button (#45020)
e3abdc3e78 feat: added timer for balance loading cp-13.42.0 (#45033)
b424876ab6 chore: update assets controllers for defi fix (#45003)
adec2ed351 refactor(wpc-1066): migrate pending-approval HW methods to LegacyBackgroundApiService (#44937)
20bf478a91 feat(confirmations): add Money Account Deposit developer option (#44945)
48ad866df4 bump(perps): upgrade @metamask/perps-controller to v10 (#45024)
239006e967 fix(notifications): add bottom padding to marketing consent text (#45021)
9158172d8a refactor(wpc-1067): migrate network enablement methods to LegacyBackgroundApiService (#44938)
62aaaa4923 test: order selectors and methods in all page objects (#44987)
45505c9910 chore: wire stellar asset component with stellar asset selector (#44979)
ce134bc060 feat: defi positions v2 controller (#44392)
b50797d25a chore: pass Firefox system access via geckodriver and pin 0.36.0 (#45014)
0c7372db98 fix(pure-black): use bg-default on back up SRP page (#44983)
e47424b771 fix(perps): show wallet-confirmed deposits immediately in Perps Activity (#44736)
9b623cccf7 ci: turn on the Triage and Retry System by default (no retry-ci label needed) (#44956)
778bafe559 feat(ramps): wire Buy Continue with background checkout watch (#44689)
10b5de87df test: lavamoat e2e (#44925)
c1a5d29ffd fix: swaps stale dest exchange rates cp-13.42.0 (#44968)
0fa0c88cf3 chore: fix lint:changed script (#45010)
fa5c57e727 fix: navigate to homepage after users close popup from batch sell (#44991)
7dce891afb feat(ramps): send Portfolio-connected wallets to Portfolio on Buy (#44804)
3739101671 fix(pure-black): refine SRP input empty vs filled styling (#45004)
1ec648fa36 chore: update swap consumers to use and display partial QuoteMetadata (#44630)
0660a05750 refactor(wpc-1068): migrate requestSafeReload & openUpdateTabAndReload to LegacyBackgroundApiService (#44940)
d2fdd13169 perf(6570): bump react-hooks to v7 and remove react-compiler plugin (#44495)
cf719e0334 fix(pure-black): stop inverting bridge transaction settings tooltip theme (#44964)
10fabf3ed6 chore: New Crowdin Translations by GitHub Action cp-13.42.0 (#44746)
806f4bf8b6 fix(pure-black): use BackgroundDefault for markets row skeleton (#44984)
da76cb3edb fix(pure-black): use bg-default on Snap install screen (#45002)
c20d7eb736 fix(pure-black): set send network filter button background to transparent (#44882)
04b53836a4 chore(STX): add Robinhood Chain to smart transactions supported networks (#44926)
284f97705e chore: popover for failed transaction status (#44961)
2668c42734 fix(pure-black): remove border from page footer cancel buttons (#44981)
d0efdd7df1 chore(storybook): add Pure Black toolbar toggle and component stories (#44963)
fadc943601 feat: assets unify balance and traces (#44978)
bad91a67e9 chore: replaced deprecated Tag component with MMDS tag (#44785)
dd2075062d fix(confirmations): refetch MetaMask Pay required token price when it is missing (#44950)
66b8f875e3 fix(pure-black): fix Menu background specificity with bg-section (#44966)
00f32ff73c fix: qr camera permission throwing e.isUnlocked is not a function (#44701)
b5ed10c4c2 feat(hardware-wallets): enable shared signing flow (#43947)
1695992b6f feat: migrate Infura IPFS users to dweb.link and block Infura IPFS gateway entry (#44982)
0ad8940da9 feat: use new snap keyring v2/v1 split (#44289)
b7f13b1a4c test: refactor transaction details page and consolidate selectors (#44694)
61ff089628 test(e2e): add Tron assets E2E cluster (#44852)
540d2a65b1 feat: bump transaction-pay-controller to 26.0.0 (#44782)
df415e426e test: skip ERC20 max balance WS update test (ASSETS-3385) (#44952)
f87e3bc8db fix(pure-black): remove custom background color from InfoPopoverTooltip (#44933)
634b46cfed fix(pure-black): remove border-l and bg-alternative from drawer in popup/compact sidepanel (#44960)
57da315640 test: pom lint rule supporting groups (selectors, constructor, actions) (#44789)
7e641c6203 chore: bump @types/chrome and drop custom chrome typings (#44888)
cbd1c50aaf perf(7466): add memoization to network/asset modal components (Batch D) (#44296)
75e09ed50f fix(pure-black): settings sidebar uses bg-alternative in pure black mode (#44883)
c164a38416 fix: clear the postcss advisories cp-13.42.0 (#44865)
3f6a9050c3 test: cover Token Detection Enabled identify trait (#44915)
91ed59bb42 chore: replace local gator permission detail schemas with @metamask/7715-permission-types (#44415)
a73805093a fix: excempt batch sell routes from ConfirmationRouter (#44951)
87d0cf9c0a fix(pure-black): set main action button dropdown to bg-alternative (#44881)
17731f5111 fix(pure-black): fix account address popover background and refactor row hover to Tailwind (#44880)
b8ee5bb2eb fix(pure-black): correct tooltip background and arrow colors in dark and pure black themes (#44879)
7b6dde7630 fix(pure-black): add bg-alternative and border to asset explorer view (#44878)
cfdbb033e8 bump: brace-expansion to 5.0.8 (#44924)
00ebfcf32e feat: updated import NFT flow Modal (#44899)
a5f18a53c5 fix: Allow QR singing in side panel on brave (#44934)
bdbe8f29c1 chore(6922): bump @testing-library/react to v14 (#42635)
b35834378b chore: upgrade design system packages (v57.0.0) (#44931)
58b697a400 fix: remove deprecated METAMASK_ENVIRONMENT=test in favor of testing (#44944)
4e37811629 chore: remove copy-to-clipboard dependency (#44890)
4d2065f6a5 test: add coverage for Notification Clicked metrics event (#44920)
da23672992 feat(analytics): migrate pre-consent queue to AnalyticsController (#43869)
5201492b01 feat: refactor non-zero native custom networks (#44161)
9e0cbd2538 fix: allow Firefox WebDriver system access for about:debugging (#44946)
992ff087e7 test(e2e): refactor tokens tab page object for assets coverage (#44778)
b8ad63da79 ci(amo): allow release-team manual dispatch of AMO production (INFRA-3769) (#44519)
bd65eccfdb chore: remove defi v2 fetching from getApi (#44939)
3cb496ea9a chore: migrate markNotificationPopupAsAutomaticallyClosed to LegacyBackgroundApiService (#44249)
f835f69039 feat: initialize DeFiPositionsControllerV2 (#44772)
171ed202b7 feat: add UAT env on bridge (#44895)
ca508307ef feat: bump phishing controller 17.3.0 (#44841)
56ffb74681 refactor(ui): use Arrow2UpRight for Send action icons (#44929)
9c8c6bcb8b fix(pure-black): set perps balance dropdown to bg-alternative (#44875)
cd32d2d252 chore: remove component-library README.mdx docs (#44886)
bab3498f9c chore: remove deprecated textfieldsearch components (#44918)
2bbf04046f ci: fixed labels from forks (#44022)
199066c701 fix: add missing events to bottom nav bar experiment config cp-13.42.0 (#44919)
d53496f910 chore: swap position of network picker and search bar on swaps asset picker (#44911)
9d573278ab chore(6927): upgrade redux to v8 (#44445)
2f528e3470 build: no more PNGs inside SVGs allowed, delete unused images (#44832)
4011ce9d91 Merge origin/main into stable-main-13.41.0
72ba3533f4 chore: bump assets controller to v11.2.1 (#44903)
cba9e41d31 chore: fix ESLint ignore config (#44914)
5bb1c5e23d feat: update HeaderSearch and asset picker modal search bars to use TextFieldSearch (#44910)
2be47e1c8d fix: handle missing account for cross-chain asset deeplinks cp-13.42.0 (#44904)
7fac1b56cb test(e2e): stabilize network filter open before switch-network click (#44692)
ba9268b8c7 test: fix flaky test error page support consent TimeoutError: Waiting element to become stale (#44850)
60e4cd1b48 test: fix flaky unstable Continue button in Send page (#44837)
c4d2caae67 feat: migrate swap asset picker search to DSR TextFieldSearch (#44905)
fba4cb3aa7 refactor: simplify sponsored fee row; cleanup dead code (#44872)
ff4fd4dbb8 chore: rename SettingsHeader to PageHeaderWithSearch (#44902)
b072b88aef fix: updated checkbox and permissions page width cp-13.42.0 (#44896)
4045b69287 chore: remove dead app header props (#44900)
15db15fe5b feat: align search bar UIs (#44430)
67db57c82a fix(transactions): avoid inflated fees from failed container estimates (#44308)
75e46239ee feat(ci): add CWS rollout adjustment workflow (INFRA-3651) (#44060)
a03a82855f refactor: cleanup activity selectors (#44864)
7d8a31630f test(e2e): add Tron network E2E cluster (#44164)
e7a6a5e59f fix: local-enriched bridge label when switching networks (#44858)
42146f2fa5 fix(activity): apply text color token to native dialog for dark theme cp-13.42.0 (#44863)
55ad54b09e fix: retry persistence writes once (#44003)
c08a8bb748 bump: tar to 7.5.22, ignore react-router advisories cp-13.41.0 (#44862)
cdddd817a4 fix(deep-links): restore interstitial protection cp-13.42.0 (#44830)
b6619a9fb8 fix(activity): transaction details width (#44853)
5d2cff8067 feat: keep the balance left aligned for lower viewport cp-13.42.0 (#44791)
fddbd0cf34 chore: remove swaps approval text (#44794)
71272d9cd3 test: cover Wallet Imported event (#44747)
47bb810f81 test(e2e): extend Tron fixtures for assets E2E coverage (#44784)
01588c978d chore(assets-controller): bump to 11.2.0 (#44847)
c8df352c4c fix(confirmations): use getAssetImageUrl for gas fee token icon (#44769)
eca1e7ed3f feat: defer password confirm mismatch error until minimum length. (#44790)
e40d3d1af9 ci: pass AI analyzer gate for medium Runway cherry-picks into release branches (#44779)
5147646d2f test(e2e): refactor tokens tab page object for assets coverage (#44777)
81508e447a feat(onboarding): update Google sign-in icon to new brand logo (#44755)
545dd73434 fix: gas sponsorship being shown for hw accounts when the user has selected a nonevm network (#44706)
4ed04ec772 fix: restored old behavior to show Paid by MetaMask label in sponsored transactions from activity page cp-13.41.0 (#44780)
ca4d467800 refactor: migrate Core UX secondary buttons to MMDS (#44767)
197093a62a test: cover Wallet Setup Started Segment event (#44668)
5c6ffe848d fix(ci): post RC Slack when Builds ready, not only green main (#44831)
8011cc033a fix: eliminate dark-mode background flash for pure black mode (#44743)
d667c1f177 feat: enable pure black dark mode by default (#44806)
c42c6cbe77 ci: update cla.yml with more Cursor names (#44815)
88e20cf90c fix(assets): include tokens with large balances and few decimals in aggregated balance cp-13.41.0 (#44796)
1e2f17bea8 feat: upgrade bridge packages to latest versions (#44722)
5fb686386e release: Bump main version to 13.43.0 (#44799)

AI Test Plan

Risk Score High Risk Medium Risk Files Changed Commits
55/100 6 6 1354 165
Cherry-Pick Scenarios (2)

High Risk Scenarios (1)

1. Smart Transactions - Sentinel endpoint routing

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

  1. Enable Smart Transactions and prepare a small native transfer on a supported network.
  2. In devtools Network, monitor outgoing STX calls during quote and submit; verify requests target the new tx-sentinel Robinhood URL.
  3. Temporarily block the Robinhood URL (simulate outage) and confirm the flow fails gracefully or falls back to legacy send without trapping the user.
  4. Complete at least one STX successfully and verify Activity status updates through finalization.

Medium Risk Scenarios (1)

1. Perps - Order book on order entry page

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

  1. Open the Perps order entry page and verify the order book renders with bids/asks and updates live.
  2. Click a price level to auto-populate the order entry price; verify correct precision and side.
  3. Change markets and confirm the order book and selected price update accordingly.
  4. Validate empty/error states (unsupported network or no liquidity) are handled gracefully without console errors.

Release Scenarios (10)

High Risk Scenarios (5)

1. State Migrations 220/221 - Persistent state integrity

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

  1. On 13.41/13.42, create a wallet with 3+ accounts, add at least one custom RPC network, import tokens, and add an address book entry.
  2. Start a dapp connection and initiate (but do not confirm) a transaction so there is a pending approval.
  3. Upgrade to 13.43.0, unlock, and verify accounts, selected account, custom networks, tokens, and address book entries are intact.
  4. Open Activity/Notifications and ensure the pending approval still exists and can be approved or rejected successfully.
  5. Switch across added networks and confirm balances and token lists render without errors.

2. State Migrations 220/221 - Metametrics consent and defaults

Risk Level: HIGH

Why This Matters: Metametrics-controller changes can mistakenly flip consent or leak PII, creating privacy regressions post-migration.

Test Steps:

  1. On 13.41/13.42, set Analytics to Opt-out in Settings > Security & Privacy (or during onboarding).
  2. Upgrade to 13.43.0 and unlock.
  3. Trigger common actions (open portfolio, switch network, open Send) and inspect devtools Network for analytics calls; verify none are sent while Opt-out.
  4. Toggle to Opt-in, repeat actions, and verify analytics events now send without exposing account addresses or secrets.
  5. Lock and unlock the wallet and verify the consent state persists.

3. Smart Transactions - submit and fallback

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

  1. Enable Smart Transactions in Settings (where available) and switch to a supported network (e.g., Mainnet).
  2. Send a small native transfer; confirm the flow shows Smart Transaction routing/quoting and allows submission.
  3. Verify the transaction submits and status updates (queued/relayed) until finalized in Activity.
  4. Simulate unsupported/failed STX (e.g., switch to an unsupported network or disable network) and ensure the flow cleanly falls back to a legacy transaction.
  5. Confirm gas customization and fee display remain consistent across STX and fallback paths.

4. Dapp Permissions - Unconnected account alert

Risk Level: HIGH

Why This Matters: Incorrect unconnected-account gating can silently block dapp flows or allow unintended account access.

Test Steps:

  1. Connect a dapp to Account A, then switch the active account in the extension to Account B.
  2. From the dapp, attempt an action requiring permissions (request accounts or send).
  3. Verify the 'Unconnected account' alert appears in the extension and offers to connect the current account.
  4. Use the alert action to connect Account B and verify the original dapp action can proceed.
  5. Switch back to Account A and confirm the alert no longer appears for Account A.

5. Balances - Account group balance accuracy

Risk Level: HIGH

Why This Matters: Incorrect aggregation or stale state can misrepresent user funds, eroding trust in balances shown.

Test Steps:

  1. Use 3+ accounts with varied holdings (native and tokens) across 2+ networks.
  2. Open the Accounts/Assets view and note the total group balance.
  3. Hide one token and verify the group total updates correctly.
  4. Switch the primary network and confirm the group total and per-account balances recalculate without stale values.
  5. Toggle fiat currency display (if available) and verify the conversions and totals remain correct.

Medium Risk Scenarios (5)

1. Perps - Live market data stream resilience

Risk Level: MEDIUM

Why This Matters: Perps stream bridge changes can cause stalls or memory leaks, breaking real-time trading UX.

Test Steps:

  1. Open the Perps trading page and verify live market data populates (prices/tickers).
  2. Switch networks (supported to unsupported and back) and confirm the stream unsubscribes/re-subscribes without errors.
  3. Lock and then unlock the wallet; verify the stream resumes and UI updates continue.
  4. Simulate a brief offline period (toggle network offline) and confirm the client recovers and updates after reconnection.

2. Network Management - Invalid custom network alert

Risk Level: MEDIUM

Why This Matters: Incorrect or noisy network validation interrupts normal use and may mislead users about network safety.

Test Steps:

  1. Add a custom RPC with a mismatched chain ID or wrong RPC endpoint.
  2. Switch to that network and verify the 'Invalid custom network' alert appears.
  3. Use alert actions (e.g., Edit network) to correct RPC/chain ID and confirm the alert resolves.
  4. Switch away and back to confirm no false-positive alert on a valid configuration.

3. Assets - Network filter and control bar behaviors

Risk Level: MEDIUM

Why This Matters: Filter logic regressions can hide assets or confuse totals, leading to missed funds or actions.

Test Steps:

  1. In Assets, use the control bar to filter by a specific network and verify only tokens for that network are displayed.
  2. Switch to 'All networks' and confirm consolidated listing with correct per-network badges/labels.
  3. Use search and sorting, then close and reopen the extension; verify filter state persistence (or expected reset).
  4. Switch accounts and confirm filters apply consistently without resetting inadvertently.

4. App State - Route and UI state persistence

Risk Level: MEDIUM

Why This Matters: App-state-controller changes can create jarring resets or stuck UI flows after lock/unlock or reload.

Test Steps:

  1. Navigate to a non-default screen (e.g., Activity or Settings) and start a UI tour if available (e.g., Account icon tour).
  2. Lock the wallet, close the popup, and reopen; unlock.
  3. Verify the last route and relevant UI/tour state persist or reset as intended (e.g., tour step continuity).
  4. Reload the extension and confirm no unexpected resets or errors in the UI.

5. Analytics Events - Emission and redaction

Risk Level: MEDIUM

Why This Matters: Refactors in the metametrics controller may alter event names or redaction, risking broken dashboards or privacy leaks.

Test Steps:

  1. Set Analytics to Opt-in.
  2. Perform key actions: add network, connect dapp, send transaction, and reject a request.
  3. Inspect devtools Network for analytics payloads and verify expected event names/properties while ensuring account addresses and secrets are not sent in clear.
  4. Toggle to Opt-out and confirm subsequent actions no longer send analytics.

Teams Sign-off Status

Signed off: None yet

Awaiting sign-off (6):
Accounts, Assets, Networks, Permissions, Transactions, Wallet Integrations


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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.