Skip to content

Conversation

@metamaskbot
Copy link
Collaborator

@metamaskbot metamaskbot commented Nov 6, 2025

🚀 v13.9.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

  • Extension Platform
  • Accounts Framework
  • Assets
  • Confirmations
  • Core Extension UX
  • Delegation
  • Network Enablement
  • New Networks
  • Product Safety
  • Rewards
  • Swaps and Bridge
  • Transactions
  • Web3Auth

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

SteP-n-s and others added 30 commits October 30, 2025 21:01
<!--
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**

Update default slippage value for bridge quotes from 0.5 to 2%.
<!--
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?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37367?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: chore: update default bridge slippage to 2%

## **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]
> Sets bridge default slippage to 2% via SlippageValue enum and updates
UI logic and tests accordingly.
> 
> - **Bridge logic**:
> - Replace `BRIDGE_DEFAULT_SLIPPAGE` with `SlippageValue` enum; set
`BridgeDefault = 2` and use in `ui/ducks/bridge/bridge.ts` initial
state.
> - Update slippage calculation to treat cross-chain as `2%` in
`ui/pages/bridge/utils/slippage-service.ts`.
> - **UI**:
> - Use `SlippageValue` in `bridge-transaction-settings-modal.tsx`;
hardcoded options now `[EvmStablecoin(0.5), BridgeDefault(2)]` and
default selection uses `BridgeDefault`.
> - **Tests**:
> - Update unit tests in `ui/ducks/bridge/bridge.test.ts` to expect
`SlippageValue.BridgeDefault`.
> - Adjust e2e analytics assertion in
`test/e2e/tests/metrics/bridge.spec.ts` to expect `18`
`SwapBridgeInputChanged` events.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5bf8097. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37086?quickstart=1)

Adds support for sig_params in deeplinks

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes: MetaMask/MetaMask-planning#6017

## **Manual testing steps**

1. sig_params should work according to the agreed spec

## **Screenshots/Recordings**

Not applicable

## **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]
> Introduce `sig_params` support in deep link canonicalization, parsing,
signing, and tests to allow selectively signed/forwarded query params.
> 
> - **Deep Links**:
> - **Canonicalization**: Enhance `canonicalize` to honor `sig_params` —
keep only listed query params (preserving repeats), append `sig_params`,
sort, and remove `sig`; fallback to previous behavior when `sig_params`
is absent.
> - **Parsing**: Use canonicalized URL, strip `sig_params` before
invoking route handlers, and verify against the original URL.
>   - **Constants**: Add `SIG_PARAMS_PARAM` (`sig_params`).
> - **Tests**:
> - **Unit**: Add cases for `sig_params` filtering, repetition
preservation, non-mutation; adjust `parse` tests to pass empty params to
handlers when only signature present.
> - **E2E**: Expand scenarios for signed-with/without `sig_params` and
unsigned; add assertions that only allowed params flow through; add
`getHashParams` helper; update redirects to ignore query in
expectations.
> - **Helpers**:
> - Update `signDeepLink` to optionally append `sig_params` (derived
from current params) and sign the full URL; add imports and sorting
adjustments.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f889979. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…37390)

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

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

The reason for the test failure is that when calling
`clickFooterConfirmButtonAndAndWaitForWindowToClose`, the window does
not close after clicking the confirm button. This behavior is correct,
because multiple confirmation windows are open, the next test step
checks the display of the next confirmation screen. Therefore, we should
not use `clickFooterConfirmButtonAndAndWaitForWindowToClose`. The fix is
to use `clickFooterConfirmButton` instead.

Why the test was flaky instead of consistently failing? Because in the
test spec, we use `if` conditions to check and confirm the confirmation
screens. Since the send calls are triggered at the same time, the order
in which the confirmation screens appear can vary. The test verifies the
displayed information on confirmation screen regardless the screen
order.
If the flow goes into a different `if` block, the test passes; however,
if it follows this particular `if` block, the test fails.

I also improved the function `checkIsSenderAccountDisplayed` to use
`waitForSelector` to be more stable.

I ran this test 10 times and they all passed.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37390?quickstart=1)

## **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. test should be stable and pass

## **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]
> Stabilizes multichain E2E by avoiding window-close waits during
sequential confirmations and making sender-account checks wait-based.
> 
> - **E2E Tests
(`test/e2e/flask/multichain-api/evm/wallet_invokeMethod.spec.ts`)**
> - For the second confirmation flow, replace
`clickFooterConfirmButtonAndAndWaitForWindowToClose` with
`clickFooterConfirmButton` to proceed without waiting for the window to
close when multiple dialogs are pending.
> - **Page Object
(`test/e2e/page-objects/pages/confirmations/redesign/transaction-confirmation.ts`)**
> - Make `checkIsSenderAccountDisplayed` more robust by using
`waitForSelector` with try/catch, returning a boolean after waiting for
the sender account element.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c92f5cb. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ng onboarding` (#37374)

<!--
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 test fails because sometimes the 10ETH balance is not converted to
fiat. The reason is because the crypto compare request is not being
mocked. Then we see `No conversion rates`.
We sometimes see the fiat value if the network switch happens fast, and
it takes the default mock for 1337, instead of the new custom network
1338

<img width="1910" height="106" alt="image"
src="https://github.com/user-attachments/assets/e2c23373-c711-4f86-9834-36928d351532"
/>


<img width="2050" height="564" alt="image"
src="https://github.com/user-attachments/assets/a29edb70-9f6e-4a2f-a11b-3de0e2156c7c"
/>

<img width="1152" height="785" alt="image"
src="https://github.com/user-attachments/assets/6f69043d-58d5-407c-906a-93772a7d563c"
/>


[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37374?quickstart=1)

## **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. Check ci

## **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]
> Mocks CryptoCompare pricing and updates the onboarding custom network
e2e to assert fiat balance without network switching.
> 
> - **E2E Onboarding Tests**:
> - **Mocks**: Extend `tokensMock` to also mock
`https://min-api.cryptocompare.com/data/pricemulti` for `ELY -> USD`
pricing.
>   - **Custom Network Test (`onboarding.spec.ts`)**:
> - Use `testSpecificMock: tokensMock` in fixtures to provide NFT and
price mocks.
> - Remove `switchToNetworkFromSendFlow` usage and import; directly
assert fiat balance `17,000.00` and verify add-network message.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7c024d6. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Prevents jumpy UI updates when quotes are being streamed
- wait for quote request to finish loading before scrolling to alert
banners
- show loading CTA and disable submit button while quotes load so user
can view any tx warnings before submitting a trade

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

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37336?quickstart=1)

## **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: defer UI actions until swap SSE quotes are fully
loaded

## **Related issues**

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

## **Manual testing steps**

1. Get quotes for <$10 of any ethereum token to sol:USDC
2. Wait 30s for quotes to refresh
3. The Swap button should be disabled while quotes are loading
4. Page should only scroll to the bottom after quotes are finished
loading

## **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]
> Disables submit and warning auto-scroll while quotes load, tweaks
countdown display, switches analytics to use isTxSubmittable, removes an
unused NetworkController action, and bumps bridge-controller to ^56.0.3.
> 
> - **Bridge UI**:
> - **CTA behavior**: `BridgeCTAButton` now disabled during `isLoading`;
adds tests (including parametric cases) and snapshots updated.
> - **Alerts/scrolling**: `prepare-bridge-page` avoids scrolling to
warning banners while quotes are loading.
> - **Countdown**: `useCountdownTimer` initializes with `refreshRate +
STEP` and offsets by `STEP` (snapshots show 0:31/0:06).
> - **Analytics**: `useQuoteFetchEvents` uses `useIsTxSubmittable` for
`can_submit` and keeps other quote metrics.
> - **Controllers/Messaging**:
> - Removes `NetworkController:getState` from `AllowedActions` and
delegated actions in `bridge-controller-messenger`.
> - **Dependencies**:
> - Bumps `@metamask/bridge-controller` to `^56.0.3` (lockfile updated).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a74b6de. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Bryan Fullam <bryan.fullam@consensys.net>
<!--
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**
- Updated font color of upload file list: color is a little dim
- Update accepted files text for claims form: removed `.` and
capitalization
- Skip only invalid files instead of blocking all files being added

https://consensyssoftware.atlassian.net/browse/SUBS-671

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

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37353?quickstart=1)

## **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: UI and functionality improvement for file uploader

## **Related issues**

Fixes:

## **Manual testing steps**

File uploader
1. Can be tested on storybook `Components/ComponentLibrary/FileUploader`
2. Set `maxFileSize` to `1048576` (1MB)
3. Upload multiple files including file with >1MB
4. Only files below 1MB will be added
5. Error message will show
6. Check file list -- font color should be text default color

Claims form
1. Login/Create an account with shield subscription
2. Go to Menu > Settings > Transaction Shield
3. Click on `Submit a claim`
4. Check file upload component
5. Copywriting should be changed (see screenshot)

## **Screenshots/Recordings**

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

### **Before**
Copywriting of the accepted files and font color of file list will be
changed
<img width="756" height="313" alt="Screenshot 2025-10-29 at 6 43 19 PM"
src="https://github.com/user-attachments/assets/ec2838f1-3242-4614-b4d2-abd4c574cdf7"
/>


Blocks all files uploaded if one fails

https://github.com/user-attachments/assets/49a5144a-6b43-4ee8-8c1e-0ca5aed42f13


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

### **After**
<img width="751" height="319" alt="Screenshot 2025-10-29 at 6 53 03 PM"
src="https://github.com/user-attachments/assets/d4e557b1-58e2-48b6-a463-236a8597d201"
/>


Blocks only invalid files

https://github.com/user-attachments/assets/3c47a901-50a4-4922-914f-d07fbb138963


<!-- [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]
> File uploader now adds valid files while skipping invalid ones,
updates file list styling, and the claims form/i18n now show a
parameterized max file size.
> 
> - **File Uploader
(`ui/components/component-library/file-uploader/file-uploader.tsx`)**:
> - Validation now skips only invalid/duplicate files instead of
aborting on first error; still surfaces an error message.
> - Emitted files always combine existing + newly valid files;
refactored to use helper `createFileList` path.
> - UI tweaks: default text color for filenames; removed explicit
icon/text alternative colors.
> - **Claims Form (`ui/pages/.../submit-claim-form.tsx`)**:
> - Introduces `MAX_FILE_SIZE_MB`/`MAX_FILE_SIZE_BYTES`; passes
`maxFileSize` (bytes) to `FileUploader`.
> - Updates `acceptText` to include the max size via i18n placeholder;
keeps accepted types.
> - **i18n (`app/_locales/en*/messages.json`)**:
> - `shieldClaimFileUploaderAcceptText` updated to "PDF, PNG, JPG (Max
$1MB)" with new placeholder description.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e188b3e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## Version Bump After Release

This PR bumps the main branch version from 13.8.0 to 13.9.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.8.0` to `13.9.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.8.0
- Release branch: release/13.8.0
- Platform: extension
- Test mode: false

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Bumps `package.json` version from 13.8.0 to 13.9.0.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e5c08fa. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->
1. References of Transaction Shield are missing in many places in Shield
screens.
2. Update them
- add links in "View full benefits" in Shield settings
- add links in Shield claims
- add links in Shield entry modal

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37380?quickstart=1)

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

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

- [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]
> Adds `TRANSACTION_SHIELD_LINK` and updates Shield UI to open external
learn/benefits pages and navigate users to Activity for TX hash help.
> 
> - **UI/Links**:
>   - Add `TRANSACTION_SHIELD_LINK` in `ui/helpers/constants/common.ts`.
> - `ui/components/app/shield-entry-modal/shield-entry-modal.tsx`:
Replace placeholder learn-more href with `TRANSACTION_SHIELD_LINK`.
> - `ui/pages/settings/transaction-shield-tab/transaction-shield.tsx`:
View benefits opens `TRANSACTION_SHIELD_LINK` in new tab.
> - **Claims form UX**:
> -
`ui/pages/settings/transaction-shield-tab/submit-claim-form/submit-claim-form.tsx`:
> - Update "here" link to `TRANSACTION_SHIELD_LINK` (opens in new tab).
> - Change impacted TX hash help from dummy link to action: dispatch
`setDefaultHomeActiveTabName('activity')` and navigate to
`DEFAULT_ROUTE`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4cc6db5. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…37347)

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

This PR fixes a race condition that prevented approval changes from
being displayed in transaction simulations.
Previously, the UI could render before the static (decoded) changes were
ready, causing missing approval data.
With this update, the component now waits for static changes to finish
decoding before rendering, ensuring approval simulations are displayed
consistently.

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

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37347?quickstart=1)

## **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 issue where approval changes were sometimes
missing in transaction simulations for batch transactions.

## **Related issues**

Fixes: MetaMask/MetaMask-planning#6116

## **Manual testing steps**

1. Trigger a batch request for approve + approve + swap on Uniswap
2. Sometimes you won't see Approve within simulations

## **Screenshots/Recordings**


[save-approve-simulation.webm](https://github.com/user-attachments/assets/e28b9357-9d54-4890-9457-7738fd99a18f)


<!-- 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]
> Defers rendering of batch simulation details and edit modal until
approve balance changes finish loading, and updates tests to mock the
new pending state.
> 
> - **Confirmations UI**:
> - `BatchSimulationDetails`: reads `pending` from
`useBatchApproveBalanceChanges` and hides `SimulationDetails` and
`EditSpendingCapModal` while approvals are loading.
> - **Tests**:
> - Add mocks for `useBatchApproveBalanceChanges` in
`base-transaction-info.test.tsx` and `info.test.tsx`.
> - Extend `batch-simulation-details.test.tsx` with a case ensuring no
UI renders when `pending: true` and adjust existing tests to supply
`pending` flag.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
109aae3. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Currently the `main.yml` workflow only runs once per combination of
workflow and branch.

Usually if a new commit is pushed to a branch, the CI run on the
previous commit is no longer relevant. However that's not true on main.
Getting a full CI run for every commit on main is critical for
investigating CI failures that somehow make their way to main (e.g.
flaky test failures).

The concurrency group ID has been updated to use the SHA as the ID on
just the main branch, ensuring new commits don't cancel CI workflows for
previous commits.

Based on mobile one:
MetaMask/metamask-mobile#21893

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

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37395?quickstart=1)

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

- [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]
> Update GitHub Actions concurrency group to use commit SHA on `main`,
enabling concurrent CI runs per commit on the main branch.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
0ed9612. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Jest is resource hungry and because of that it is advised to fine tune
parallelization config in order to get the most of reliability and speed
of execution.

Not setting it up entirely can lead to random timeout issues, longer run
times, etc.
See the troubleshoot from Jest itself -
https://jestjs.io/docs/troubleshooting#tests-are-extremely-slow-on-docker-andor-continuous-integration-ci-server
Or the performance analysis on jest runners done by Adobe -
https://medium.com/adobetech/improve-jest-runner-performance-a8f56708ba94

This PR is just an initial setup, but we need to fine tune the config
for both local and CI execution.
<!--
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?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37381?quickstart=1)

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

## **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]
> Set Jest integration tests to use maxWorkers '50%' in
`jest.integration.config.js` to limit concurrency.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
ad45ba0. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
… multiple SRPs and sync them` (#37410)

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

A PR which changes the text from Create Account to Add Account was
merged yesterday:
#37288

This introduces flakiness in our e2e, as we had a condition to mitigate
flakiness, which relied on Creating Account message which now has
changed.

This PR updates the copy, so we mitigate the flakiness again.

See in the logs how we waited for Creating account .. and since this
message is never there anymore, we jump into the next step causing the
spec to fail. We should wait until the account creating has completed,
by using the new copy.

<img width="1018" height="195" alt="image"
src="https://github.com/user-attachments/assets/982a32ef-79b7-4d12-8caf-6545f60f0100"
/>

<img width="1152" height="785" alt="image"
src="https://github.com/user-attachments/assets/718bac6e-5fe9-412c-b47f-b3bb475e1a3b"
/>


[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37410?quickstart=1)

## **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. Check ci

## **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]
> Updates e2e selector to check for `Adding account...` instead of
`Creating account...` before opening the multichain account menu.
> 
> - **Tests (e2e)**
>   - In `test/e2e/page-objects/pages/account-list-page.ts`:
> - Replace `creatingAccountMessage` with `addingAccountMessage`
(`'Creating account...'` -> `'Adding account...'`).
> - Update `openMultichainAccountMenu` to assert absence of
`addingAccountMessage` before proceeding.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
2a8f851. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Fixes the icons and the auto selection logic for the gas station modal.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37352?quickstart=1)

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

## **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]
> Improve gas fee token icon rendering and refine auto-selection logic
with expanded async tests; increase e2e toast close timeout.
> 
> - **UI**:
> - `ui/pages/.../gas-fee-token-icon.tsx`: Display ERC-20 token icons
from store (`selectERC20TokensByChain` `iconUrl`) when available;
fallback to `PreferredAvatar`; keep native token rendering via
`AvatarToken`; size mapping via `AvatarAccountSize`.
> - **Logic**:
> - `useAutomaticGasFeeTokenSelect`: Only set `firstCheck` to `false`
after successfully selecting the first eligible token; supports
selection on rerender when eligibility changes (insufficient balance,
gasless support, 7702/native handling).
> - **Tests**:
> - `useAutomaticGasFeeTokenSelect.test.ts`: Convert to async with
`flushPromises`, add assertions for `forceUpdateMetamaskState`, cover
rerender/eligibility and 7702/native scenarios.
> - **E2E**:
> - `transaction-confirmation.ts`: Increase toast close
`clickElementSafe` timeout to `10000` for stability.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1b1e382. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

This PR adds back the connection indicators to the account avatar

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/36423?quickstart=1)

## **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: Re-add connection indicator to bip44 account cell

## **Related issues**

Fixes:
https://consensyssoftware.atlassian.net/browse/MUL-1087?atlOrigin=eyJpIjoiZWZlY2YxNTE3MjA1NDIwODlkOGYwMjdlOTBhNzU0MzUiLCJwIjoiaiJ9

https://consensyssoftware.atlassian.net/browse/TMCU-161

## **Manual testing steps**

1. Open MM and DaPP
2. Connect multiple accounts
3. Go back to Account List
4. Notice the green dots on connection status.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
**Selected connected account**
<img width="399" height="596" alt="Screenshot 2025-10-28 at 10 43 33"
src="https://github.com/user-attachments/assets/8c27b62d-518f-46f1-8dc1-fe83b77e5f5e"
/>

**Selected not connected account**
<img width="401" height="596" alt="Screenshot 2025-10-28 at 10 43 44"
src="https://github.com/user-attachments/assets/bc1f0674-e8b7-4708-94aa-224ec0e35de0"
/>

**Unconnected dapp**
<img width="402" height="596" alt="Screenshot 2025-10-27 at 11 19 23"
src="https://github.com/user-attachments/assets/2e364f07-65df-4b17-af23-05b4be219c36"
/>



### **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]
> Restores and wires connection indicators on multichain account avatars
using current tab permissions, with list/page integration and
comprehensive tests/stories.
> 
> - **Multichain Accounts UI**:
> - `MultichainAccountCell`: Replaces `PreferredAvatar` with
`ConnectedStatus`; adds optional `connectionStatus` prop
(`STATUS_CONNECTED` | `STATUS_CONNECTED_TO_ANOTHER_ACCOUNT`) to control
badge; maintains selection/privacy behavior.
> - `MultichainAccountList`: Adds `showConnectionStatus` prop; derives
permitted addresses from `getAllPermittedAccountsForCurrentTab`, maps to
connected account groups via `getAccountGroupsByAddress`, and passes
computed `connectionStatus` to each `MultichainAccountCell`.
> - `AccountList` page: Enables `showConnectionStatus` when there are
permitted accounts for the active tab.
> - **Connected Status Logic**:
> - `ConnectedStatus`: Updated to support state2 via
`getIsMultichainAccountsState2Enabled` and `getAccountGroupsByAddress`;
determines connected/active vs connected-to-another and sets
badge/tooltip accordingly.
> - **Tests & Stories**:
> - Adds/updates tests for badge presence, color/state, tooltips in
`multichain-account-cell` and `multichain-account-list`; updates
snapshots; injects `activeTab` in stories/tests; minor fixture updates
(e.g., `send.test`, confirmation util).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
127bdf6. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Patryk Lucka <5708018+PatrykLucka@users.noreply.github.com>
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

The network request code within the client makes use of the circuit
breaker pattern. Currently, there must be 28 consecutive failed attempts
to hit an RPC endpoint before the circuit breaks and it is perceived to
be unavailable. At this point, if the endpoint is configured with a
failover, the failover will be activated and all requests will be
automatically diverted to it; otherwise requests are paused for 30
minutes.

There are two problems we are seeing now:

- If Infura is degraded enough to where failing over to QuickNode is
warranted, the failover may be activated too late.
- If the user is attempting to access a custom network and they are
experiencing issues (either due to a local connection issue or an issue
with the endpoint itself), they will be prevented from using that
network for 30 minutes. This is way too long.

To fix these problems, this commit:

- Lowers the "max consecutive failures" (the number of successive
attempts to obtain a successful response from an endpoint before
requests are paused or the failover is triggered) from 28 to 8.
- Lowers the "circuit break duration" (the period during which requests
to an unavailable endpoint will be paused) from 30 minutes to 30
*seconds*.

In summary, if a network starts to become degraded or the user is
experiencing connection issues, the network is more likely to be flagged
as unavailable, but if the situation improves the user may be able to
use the network more quickly.

How quickly does the circuit break now? It depends on whether the user
is using Chrome or Firefox and whether the errors encountered are
retriable or non-retriable:

- Retriable errors (e.g. connection errors, 502/503/504, etc.) will, as
the name implies, be automatically retried. If these errors are
continually produced, the circuit will break very quickly (if the
extension is restarted, then it will break immediately).
- Non-retriable errors (e.g. 4xx errors) do not get automatically
retried, so it takes longer for the circuit to break (if the extension
is restarted, on average it will take about 1 minute).
- Note that Chrome implements "anti-DDoS throttling logic" which means
that some non-retriable errors will turn into retriable errors. In this
situation the circuit breaks faster than it would on Firefox.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37002?quickstart=1)

## **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: Decrease time before activating QuickNode when Infura
is degraded or unavailable; decrease time before allowing users to
interact with a custom network following connection issues

## **Related issues**

- https://consensyssoftware.atlassian.net/browse/WPC-103

## **Manual testing steps**

### Prerequisites

1. Install
[FoxyProxy](https://chromewebstore.google.com/detail/foxyproxy/gcknhkkoolaabfmlnjonogaaifnjlfnp).
Pin it.
2. Open the options for FoxyProxy (click on its icon and go to Options).
3. Click on the Proxies tab, then click on Add. A new box should appear.
4. Under "Hostname", enter `localhost`; under "Port", enter `8080`;
enter some name in "Title".
5. Next to "Proxy by Patterns", click the plus icon. You should see a
new row appear.
6. In the `://example.com` field, enter `https://*.infura.io/*`; in the
"title" field, enter some name, like "Localhost". (This will ensure that
only requests to Infura go through the proxy.)
8. Install
[`mitmproxy`](https://docs.mitmproxy.org/stable/overview/installation/).
10. Create a Python script somewhere on your computer with the following
contents:
https://gist.github.com/mcmire/1d43ce690d3a974217126cd584f79b7d. This
script will cause all requests to Infura RPC endpoints to respond with
500, simulating an outage.
11. Run `mitmproxy -s <path to your script>` in an open terminal
session. This will run the proxy server.
12. Go back to FoxyProxy and enable the proxy you created earlier by
clicking on the icon, then choosing the name of the new proxy (e.g.
Localhost).
13. Check out this branch. Run `yarn`, then `yarn start`.
14. Ensure that you've added the local version of MetaMask to your
browser and no other versions are present.
15. Open MetaMask, and go through onboarding.
16. Open the DevTools for the extension (Chrome: go to Extensions, find
MetaMask, click on "service worker"; in Firefox, go to
`about:debugging`, find MetaMask, click on "Inspect").

### Testing non-retriable errors

1. Ensure that in the `mitmproxy` script, all Infura endpoints return
500.
2. Restart the extension.
3. Switch to DevTools. You should see request errors like "RPC endpoint
not found or unavailable" in the Console view.
5. Open MetaMask and switch to full-screen view so that it stays open.
6. Switch back to DevTools and wait. After about 20 seconds, you should
see errors that say "RPC endpoint returned too many errors".

### Testing retriable errors

1. Stop `mitmproxy`. Modify the script so that all Infura endpoints
return 503 instead of 500. Restart it.
2. Restart the extension.
3. Switch to DevTools. You should see a flurry of messages, and at the
end you should see an error that says "RPC endpoint returned too many
errors".

## **Screenshots/Recordings**

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

### **Before**

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

### **After**

#### Chrome

In this video, the endpoint continually responds with 500 (a
non-retriable error):


https://github.com/user-attachments/assets/fc8956d2-ec43-4ba6-a4c0-8e68b72b90c4

In this video, the endpoint continually responds with 503 (a retriable
error):


https://github.com/user-attachments/assets/d449e404-d755-4d81-be94-0bee44174354

#### Firefox

In this video, the endpoint continually responds with 500 (a
non-retriable error):


https://github.com/user-attachments/assets/6500f3a2-b0e8-459f-86f6-20f15044ecda

In this video, the endpoint continually responds with 503 (a retriable
error):


https://github.com/user-attachments/assets/84361615-e6a9-48a0-aab4-13ca016eec2e

## **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]
> Tightens RPC circuit-breaker settings by using DEFAULT_MAX_RETRIES,
setting a 30s cooldown, and reducing maxConsecutiveFailures for
QuickNode and other endpoints.
> 
> - **Network Controller Init
(`app/scripts/controller-init/network-controller-init.ts`)**
>   - Use `DEFAULT_MAX_RETRIES` for RPC retries.
> - Introduce shared `policyOptions` with `circuitBreakDuration: 30 *
SECOND`.
>   - Adjust `maxConsecutiveFailures`:
>     - QuickNode endpoints: `(maxRetries + 1) * 10`.
>     - Other endpoints: `(maxRetries + 1) * 3`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
bb71a1c. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Fix token name truncation

Long term, we need to handle this in a list item type of component

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37429?quickstart=1)

## **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: token name truncation

## **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**
<img width="625" height="94" alt="BEFORE truncate fix"
src="https://github.com/user-attachments/assets/815f0755-0fdc-4f91-ab0b-d38f8ddca9da"
/>

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

### **After**
<img width="619" height="100" alt="AFTER truncate fix"
src="https://github.com/user-attachments/assets/681cd8bb-fb81-4477-b80a-ead8dc9f2597"
/>

<!-- [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]
> Adds `min-w-0` to token title wrappers to allow proper name ellipsis;
updates affected snapshots.
> 
> - **Frontend**
> - `ui/components/app/assets/token-cell/cells/token-cell-title.tsx`:
Add `className="min-w-0"` to the outer and inner `Box` wrappers around
`AssetCellTitle`/`Tag` to enable token name truncation.
> - **Tests**
>   - Update snapshots reflecting layout changes in:
> -
`ui/components/app/assets/token-cell/__snapshots__/token-cell.test.tsx.snap`
> - `ui/pages/asset/components/__snapshots__/asset-page.test.tsx.snap`
> -
`ui/pages/defi/components/__snapshots__/defi-details-list.test.tsx.snap`
> -
`ui/pages/defi/components/__snapshots__/defi-details-page.test.tsx.snap`
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
db41a4d. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Cleanup the useless fallbacks in spread

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37370?quickstart=1)

## **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]
> Removes unnecessary `?? {}` fallbacks in object spread operations
across controllers, tests, and UI code.
> 
> - **Controllers**
> - `app/scripts/controllers/onboarding.ts`: Replace `{ ...(this.state
?? {}) }` with `{ ...this.state }` in `registerOnboarding`.
> - `app/scripts/controllers/preferences-controller.ts`: Initialize
reducer accumulator with `{ ...lostIdentities }` instead of `{
...(lostIdentities ?? {}) }`.
> - **Tests**
> - Update mock setup to spread `mockRequests` directly (remove `?? {}`)
in multiple files under `test/integration`, including transaction
confirmations, NFTs, DeFi, notifications, and swaps.
> - **UI**
> -
`ui/components/app/modals/new-account-modal/new-account-modal.container.js`:
Spread `state.appState.modal.modalState.props` directly.
> - `ui/components/multichain/app-header/app-header.test.js`: Spread
`stateChanges` directly during store setup.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7ec8907. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
### Handle backend error codes on UI

```
export type SubmitClaimErrorResponse = {
  message: string;
  errorCode: SubmitClaimErrorCode;
  statusCode: number;
  errorsDetails?: {
    field: SubmitClaimField;
    error: string;
    errorCode: SubmitClaimErrorCode;
  }[];
};
```

**General Errors**
- Errors which are not tied to specific form field.
- This errors are show using a toast.

**Field specific errors**
- This errors are found on `errorsDetails` inside error object from
claims post api response. It is shown to specific form field using the
`field` key
- Some errors outside the `errorDetails` maybe shown to a specific field
also and is handled through `ERROR_MESSAGE_MAP` which may contain a
`field` key also, if there is no `field` key on the item then we show it
in a toast

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37391?quickstart=1)

## **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: Handle claims submit backend errors

## **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**
**Generic error**: no internet, backend is down
<video
src='https://github.com/user-attachments/assets/5782b670-1d70-4dd4-9a3f-435c837a10b1'
/>


**Field validation error**: _removed FE validation to demo_
<video
src='https://github.com/user-attachments/assets/98a55ae8-a779-4da1-ba32-8efbea5ae859'
/>


**Non field validation error but tied to a form field**
<video
src='https://github.com/user-attachments/assets/b032c476-daac-4b26-b27d-93d725d1a420'
/>


**General error shown on toast**
<video
src='https://github.com/user-attachments/assets/b22a9e3c-c16f-4ca5-9148-88c70a8643f2'
/>


<!-- [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]
> Implements structured backend error handling for the claim form with
field-level mapping, loading state, and updated i18n (including
parameterized submission window).
> 
> - **UI/Forms**:
> - Refactor `submit-claim-form.tsx` to use typed fields and centralized
error handling via `ERROR_MESSAGE_MAP` and
`SUBMIT_CLAIM_FIELD_ERROR_MESSAGE_MAP`.
> - Add `VALID_SUBMISSION_WINDOW_DAYS` and render it in
`shieldClaimDetails` text.
> - Introduce `handleSubmitClaimError` to route backend errors to field
errors or toast; disable submit during loading and show `LoadingScreen`.
> - Fix error keying for `impactedTxHash` and add same-wallet-address
validation.
> - **Errors/Types**:
>   - Add `SubmitClaimError` class (`claim-error.ts`).
> - Add `SUBMIT_CLAIM_FIELDS`, `SUBMIT_CLAIM_ERROR_CODES`, and
`SubmitClaimErrorResponse` in `types.ts`.
> - **Actions/Networking**:
> - Update `submitClaim` action to parse backend JSON, throw
`SubmitClaimError` with `errorCode`, and handle generic failures.
> - **i18n**:
> - Update `en`/`en_GB` locales: parameterize `shieldClaimDetails`
days/link; add messages for duplicate claim, file errors, max claims
limit, same wallet address, submission window expired; tweak ineligible
TX text.
>   - Remove outdated `shieldClaimDetails` entry from `ga` locale.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e60dbf1. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

- Reduces by 2 the number of reusable workflows called by workflow
`main` ([there's a limit of
20](https://docs.github.com/en/actions/reference/workflows-and-actions/reusing-workflow-configurations#limitations-of-reusable-workflows))
- This also has the effect of making everything run faster, due to fewer
jobs and fewer `action-checkout-and-setup` steps
- Folds the `Page Load Benchmark Results` PR comment into the other
metamaskbot comment for less disruption

## **Changelog**

CHANGELOG entry: null

<!--## **Related issues**
## **Manual testing steps**
## **Screenshots/Recordings**
## **Pre-merge author checklist**
## **Pre-merge reviewer checklist**-->

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Consolidates page-load benchmark into a single workflow with new
artifact/filename, uploads historical data on main, and folds PR comment
generation into the build announce with historical comparisons.
> 
> - **CI/Workflows**:
> - Replace `page-load-benchmark-pr` and remove
`page-load-benchmark-upload`; use unified `page-load-benchmark` workflow
with numeric inputs and required secret.
> - Run benchmarks on PRs and main; upload artifact
`page-load-benchmark-results` and, on `main`, commit stats to
`extension_benchmark_stats`.
> - Update `main.yml` to call
`./.github/workflows/page-load-benchmark.yml` and gate publish on
`page-load-benchmark`.
> - In `publish-prerelease.yml`, download `page-load-benchmark-results`
directly instead of using the deleted action.
> - **Scripts**:
> - Update `.github/scripts/benchmark-stats-commit.sh` to use
`HEAD_COMMIT_HASH`, `OWNER`, and new results path
`test-artifacts/benchmarks/page-load-benchmark-results.json`.
> - **Bot Comment Integration**:
> - Refactor `development/page-load-benchmark-pr-comment.ts` to export
`getPageLoadBenchmarkComment` (no direct posting), wrap output in a
collapsible section, and compare against recent `main` data with
regression warnings.
> - Integrate page-load benchmark comment into
`development/metamaskbot-build-announce.ts` so a single MetaMask bot
comment includes builds, benchmarks, and size diffs.
> - **Artifacts/Paths**:
> - Rename benchmark output file and artifact from
`benchmark-results.json` → `page-load-benchmark-results.json` and update
all references.
> - **Tests/Docs**:
>   - Update Playwright spec and README to use the new results filename.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
424ed39. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Norbert Elter <72046715+itsyoboieltr@users.noreply.github.com>
## **Description**

This PR makes several small optimizations and bug fixes to the way we
capture metrics and display URLs for our phishing page.

- **Improves consistency:** Metrics always uses `hostname` now.
Previously, blockedUrl being set to `details.initiator` would add a
`https://` prefix to our metrics (when it was a c2) whereas only
`hostname` would be tracked otherwise
- **Bug fix:** for c2 domain blocks, we previously would display the c2
itself on the phishing page and as the 'Proceed anyway' link. This PR
changes it to use the actual domain that the request came from, in order
to improve clarity for the user.
- **Bug fix:** Fixes:
MetaMask/MetaMask-planning#6038

## Changelog
CHANGELOG entry: fix: use correct href for phishing page proceed anyway
button

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/36871?quickstart=1)


## **Screenshots/Recordings**

### **Before**

**Website blocked by c2:**

<img width="807" height="746" alt="image"
src="https://github.com/user-attachments/assets/1bc48956-c978-4adf-b499-8c29fb2060ea"
/>


### **After**

**Website blocked by c2:**

<img width="1159" height="796" alt="image"
src="https://github.com/user-attachments/assets/d53f9c9d-01b2-4015-99dd-8ed1b87cb3dd"
/>

## **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]
> Fixes phishing warning redirect params by using full href, deriving
hostname safely, and handling c2-initiated requests.
> 
> - **Phishing detection (app/scripts/background.js)**:
>   - Initialize `blockedUrl` from `href` instead of `hostname`.
> - For c2-detected blocks, set `blockedUrl` to `details.initiator`;
derive `blockedHostname` via `new URL(blockedUrl).hostname` with
fallback to original `hostname`/`href` on parse failure.
> - Build phishing warning redirect hash with `hostname:
blockedHostname` and `href: blockedUrl` to drive page display and
"proceed anyway" link.
>   - Minor: add clarifying comments; no API surface changes.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6eebe10. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

This PR concludes the migration to `AccountsTrackerController` from
core. This is necessary in order to benefit from performance changes
added and planned to the core controller.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/36808?quickstart=1)

## **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/ASSETS-1368

## **Manual testing steps**

## **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]
> Replaces the local AccountTrackerController with the core one, removes
legacy tracker/polling and gas-limit state, and updates state shape,
selectors, metrics, tests, and dependencies accordingly.
> 
> - **Core/Controllers**:
> - Replace local `AccountTrackerController` with
`@metamask/assets-controllers` version; update init, messengers, allowed
actions/events, and wiring.
> - Remove legacy files (`account-tracker-controller*`, `batch-utils*`,
`constants/contracts.ts`, types) and related listeners/APIs (e.g.,
balance-update on tx, account syncing).
> - Drop `accounts` and `currentBlockGasLimit*` from background/UI
state; rely on `accountsByChainId` only; update sentry state and types.
> - Remove account-tracker polling APIs/hook; stop exposing start/stop
polling from background.
> - Bump `@metamask/assets-controllers` to `^86.0.0`; update LavaMoat
policies.
> - Preferences: add `isMultiAccountBalancesEnabled` mirroring
`useMultiAccountBalanceChecker`.
> - **MetaMaskController**:
> - Remove tracker syncing/clearing and tx-balance update; use
checksummed addresses in `getBalance` and metrics.
> - **Transactions/Init**:
>   - Simplify listeners; stop updating balances on tx events.
> - **UI/Selectors & Send Flow**:
> - Normalize `accountsByChainId` address handling (lowercasing in
selectors); remove `getBlockGasLimit` usage; adjust gas estimate logic.
> - Fix `token-search` null guard; update tests/fixtures to checksummed
addresses.
> - **Metrics/Telemetry**:
> - Compute `number_of_accounts` from `accountsByChainId`; update
masked/removed fields.
> - **Tests/Fixtures**:
> - Update mocks to checksummed addresses; remove obsolete
expectations/delays; align with new state shape.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
3cfb04e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

It seems ci conditions got worse in the last week, surfacing more
flakiness in different points.
This spec fails because it waits for events with a given delay but it's
not enough now. Increasing the delay fixes the issue.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37450?quickstart=1)

## **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. Check ci

## **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]
> Replaces `largeDelayMs` with a fixed 5000ms wait in Sentry/Segment
tests to reduce flakiness.
> 
> - **Tests (e2e)**:
>   - In `test/e2e/flask/snaps/preinstalled-example.spec.ts`:
> - Replace `largeDelayMs` with `5000` for `driver.wait` when awaiting
mocked endpoints in:
>       - `snap_trackError` (Sentry error)
>       - `snap_trackEvent` (Segment event)
>       - `snap_startTrace`/`snap_endTrace` (Sentry trace)
>     - Simplify helpers import (remove unused `largeDelayMs`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5bbc0b9. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ock and login successfully` (#37451)

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

This issue should be fixed on the wallet side but until that's not done,
we mitigate the error on the test side by ignoring the error.

#37459

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37451?quickstart=1)

## **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. Check ci

## **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]
> E2E unlock wallet test now ignores the console error 'unable to
proceed, wallet is locked' to reduce flakiness.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4eadccf. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

The timeout in clickElementAndWaitToDisappear has a default max value of
2seconds. This is insufficient in the update modal test, where sometimes
the spec fails as the element didn't disappear yet:

<img width="951" height="146" alt="image"
src="https://github.com/user-attachments/assets/47433113-1793-4c83-ad0e-316bfabeedf0"
/>

This increases the default timeout to 3 seconds at the driver method
level. This won't mean that we will always wait until the full 3 seconds
but that now, we have a bigger window to wait.
I chose to change this at the driver method, to help stabilize all ci in
general, not just for that case, as 3 seconds still seams a reasonable
amount of time (in the case we need to fully wait for them).


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

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37465?quickstart=1)

## **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. Check ci. I edited the spec file to trigger the quality gate and run
the Update Modal spec 5 more times x4 (each build), so it was run 20+4
times and it passed (other specs failed due to existing flakiness, being
fixed in different PRs)


0b857c0


## **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]
> Increase default timeout from 2s to 3s in
`clickElementAndWaitToDisappear` to improve reliability of disappearing
elements.
> 
> - **Tests (E2E)**:
>   - `test/e2e/webdriver/driver.js`:
> - `clickElementAndWaitToDisappear`: default timeout increased `2000ms`
→ `3000ms`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
919feab. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ing accounts during a NFT send` (#37460)

<!--
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**
This test is flaky as we are trying to assert an element has the correct
text. This can lead to a race condition when we do the assert, and the
element hasn't yet being updated:

<img width="1004" height="318" alt="image"
src="https://github.com/user-attachments/assets/ff98d6ae-16c3-4630-a834-edaf184a2c7c"
/>

And you see in the screenshot the asset is correct:

<img width="1050" height="812" alt="image"
src="https://github.com/user-attachments/assets/ab1875dd-6f09-4eda-838b-616b9a6c4954"
/>

<img width="1050" height="812" alt="image"
src="https://github.com/user-attachments/assets/46bce31a-c474-47db-b567-45564584df1a"
/>


[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37460?quickstart=1)

## **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. Check ci

## **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]
> Stabilizes e2e token symbol verification by waiting for the selector
with matching text in the send token asset picker.
> 
> - **Tests (e2e)**:
> - **Send token page object
(`test/e2e/page-objects/pages/send/send-token-page.ts`)**:
> - Update `checkTokenSymbolInAssetPicker` to use `waitForSelector({
css: asset symbol, text })` instead of reading text and asserting
directly, improving synchronization when verifying the token symbol.
> - Retain optional token ID check via `waitForSelector` on `p` with
`#<id>` text.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
12dee59. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…works when adding a network via dapp` (#37456)

<!--
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 spec fails because there's a console error with an RPC error. The
problem is that we are adding Avalanche network, and we start and Anvil
server with that chainId, however, the Avalanche requests are not
redirected to our local server, causing that when the RPC call is made,
that is redirected to the catch all mock, returning an empty response
body and triggering the console error, if the test is slow, and there's
enough time for that to happen.

This PR blocklist the Avalanche Infura calls, so those are redirected to
our anvil local server

<img width="1001" height="574" alt="image"
src="https://github.com/user-attachments/assets/2ea3e508-c9bb-4441-91ab-e4028ea86951"
/>

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

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37456?quickstart=1)

## **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. Check ci

## **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]
> Add `avalanche-mainnet.infura.io` to `blocklistedHosts` in
`test/e2e/mock-e2e.js` so RPC requests are redirected to
`localhost:8545`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7d99aa8. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
#37452)

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

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

This PR aims to activate re-simulation feature when user focus the
active extension window for `batch` transactions.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37452?quickstart=1)

## **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: Batch transaction resimulation 

## **Manual testing steps**

1. Batch transaction simulation network requests (sentinel) should be
visible in the network tab when focused in the active window.

## **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]
> Adds `TransactionType.batch` to `FOCUSABLE_TYPES` to enable batch tx
re-simulation on window focus.
> 
> - **Confirmations UI**
> - Update `ui/pages/confirmations/hooks/useTransactionFocusEffect.ts`:
> - Add `TransactionType.batch` to `FOCUSABLE_TYPES` so batch
transactions toggle active state on window focus.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6d7c6da. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

No need for a nested `if` without `else`

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37433?quickstart=1)

## **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]
> Consolidates nested conditionals and adds minimal guard checks across
background, controllers, services, streams, tests, UI, and selectors
without altering behavior.
> 
> - **Background**
> - Simplify phishing test bypass check in `app/scripts/background.js`
by merging nested conditions.
> - **Controllers**
> - Streamline `addPollingToken` in
`app/scripts/controllers/app-state-controller.ts` (combine checks and
call updater directly).
> - **Services**
> - Tighten success URL match with optional chaining and simplify
listener logic in
`app/scripts/services/subscription/subscription-service.ts`.
> - **Streams**
> - Collapse legacy notification method remap conditional in
`app/scripts/streams/provider-stream.ts`.
> - **Tests**
> - Flatten error-handling call generation logic in
`test/e2e/api-specs/MultichainAuthorizationConfirmationErrors.ts`.
> - **UI**
> - Add `onNetworkChange` guard and merge conditions on multiselect
submit in `ui/components/.../asset-picker.tsx`.
> - **Selectors**
> - Simplify connected-account selection logic in
`ui/selectors/selectors.js` (ensure selected address not already
connected).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
fdc88d2. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Introduces a new optional alert property to hide navigation for this
alert.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37425?quickstart=1)

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



https://github.com/user-attachments/assets/249abb46-f295-4035-b838-5e1843658410



## **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]
> Adds `hideFromAlertNavigation` to alerts and updates hooks/modal to
skip these in navigation, with tests and usage updates.
> 
> - **Alert Model**:
>   - Add optional `hideFromAlertNavigation` to `Alert`.
> - **Hooks (`useAlerts`)**:
> - Return `navigableAlerts`, `navigableFieldAlerts`,
`navigableGeneralAlerts`, and `getNavigableFieldAlerts`, excluding
alerts with `hideFromAlertNavigation`.
>   - Ensure severity sorting is non-mutating.
> - **UI – MultipleAlertModal**:
>   - Drive selection by `alertKey` with robust syncing/fallback logic.
> - Navigate only through `navigable*` alerts; hide nav controls if
current alert sets `hideFromAlertNavigation` or when skipping is
requested.
>   - Acknowledge just triggers `onFinalAcknowledgeClick` (no cycling).
> - **UI – ConfirmInfoAlertRow**:
> - Derive `selectedAlert` once; pass `skipAlertNavigation` based on
`hideFromAlertNavigation`.
> - **Alerts – Shield Coverage**:
>   - Mark shield coverage alert with `hideFromAlertNavigation: true`.
> - **Tests**:
> - Update/extend tests for severity ordering, navigable alert
filtering, modal navigation hiding/skipping, and selection behavior.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
22c7214. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37439?quickstart=1)

Remove selectors from spec page and replace them with page specific
checks.

## **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]
> Replace selector-based confirmation with Activity List page-object
checks in snap account transfer e2e tests.
> 
> - **Tests (e2e)**:
>   - Update `test/e2e/tests/account/snap-account-transfers.spec.ts`:
> - Replace selector-based confirmation
(`.transaction-status-label--confirmed`) with Activity List verification
via `ActivityListPage.checkConfirmedTxNumberDisplayedInActivity(1)` in
both sync and async approve flows.
> - Instantiate `ActivityListPage` to perform confirmation checks after
sending transactions.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
092cd07. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
DDDDDanica and others added 9 commits November 6, 2025 11:08
…37561)

<!--
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**
Migrate swaps component to React Router v6 compatibility.
<!--
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?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37561?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes: MetaMask/MetaMask-planning#5563

## **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]
> Migrate Swaps routing to react-router-dom v5-compat, replacing
history-based navigation with navigate, updating routes/components, and
aligning tests.
> 
> - **Routing migration to v5-compat**:
> - Replace `useHistory`, `Redirect`, `Switch`, and v5 `<Route render>`
with `useNavigate`, `Navigate`, and `Routes` across `ui/pages/swaps/*`.
> - Introduce `FeatureToggledRoute` using v5-compat `Navigate` and
update consumers.
> - Update swaps thunks in `ui/ducks/swaps/swaps.js` to accept/use
`navigate` instead of `history` for redirects.
> - In `routes.component.tsx`, add `createV5CompatNavigate` helper and
wrap Swaps/Cross-chain Swap routes with `AuthenticatedV5Compat`, passing
v5-compatible props.
> - **Swaps pages refactor**:
> - Refactor navigation/redirect logic in `awaiting-*`,
`loading-swaps-quotes`, `notification-page`, `prepare-swap-page`,
`review-quote`, `smart-transaction-status`, and `index` to v5-compat
APIs; minor prop types added/adjusted.
> - `Swap` now uses `useSafeNavigation`, v5-compat `Routes`, and
`FeatureToggledRoute` for maintenance gating.
> - **Tests**:
> - Update tests to use `render-helpers-navigate` and v5-compat
`useNavigate` mocks; remove legacy helpers.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8aecb26. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Adds a quote data fallback for bitcoin transactions so that the 'You
Sent' field does not populate empty.

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

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37525?quickstart=1)

## **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. Bridge from Bitcoin to another chain.
2. In the transaction details, you should see the correct from amount of
Bitcoin.

1. For quotes with a low network fee, like solana, the network fee
should now display even if it's lower than $0.01.

## **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]
> Falls back to quote data to populate the BTC “You Sent” amount and
introduces dynamic network fee formatting to display very small fees
accurately.
> 
> - **Bridge transaction details**:
> -
`ui/components/app/multichain-bridge-transaction-details-modal/multichain-bridge-transaction-details-modal.tsx`:
Fallback to quote (`quote.srcTokenAmount`/`quote.srcAsset`) to render
`You Sent` when `transaction.from` is empty (e.g., BTC), using
`formatDestTokenAmount`.
> - **Quote card and utils**:
> - `ui/pages/bridge/utils/quote.ts`: Add `formatNetworkFee` for dynamic
precision of small fees; allow `undefined` in `formatCurrencyAmount`
input type.
> - `ui/pages/bridge/quotes/multichain-bridge-quote-card.tsx`: Use
`formatNetworkFee` for network fee display (including gas-included case)
so sub-cent fees are shown appropriately.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c463452. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Fixes duplicate items in search modal for tokens

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37568?quickstart=1)

## **Changelog**

CHANGELOG entry: Fixes a bug that makes users see duplicate tokens in
search tokens modal when on popular networks.

## **Related issues**

Fixes: #37424

## **Manual testing steps**

1. Click on import tokens
2. Click on popular networks
3. Search for "Weth"
4. You should not see duplicate items for Weth on base


## **Screenshots/Recordings**

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

### **Before**

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

Uploading Screen Recording 2025-11-06 at 11.06.05.mov…


### **After**

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



https://github.com/user-attachments/assets/fa3a943f-7bdb-447d-bd6f-9a067626c72b


## **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]
> Use a composite unique key for token list items to prevent
duplicate/incorrect rendering in the import token search results.
> 
> - **UI**
> - **Import Token modal**
(`ui/components/app/import-token/token-list/token-list.component.js`):
> - Replace React list key with a composite `uniqueKey` built from
`address`, `chainId`, index, `symbol`, and `name` for each token item,
preventing key collisions and duplicate-render issues in search results.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
70f21d1. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Adds bitcoin-swaps code gate to main builds.yml 
<!--
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?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37587?quickstart=1)

## **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: enables the bitcoin swaps features

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

- [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]
> Enables the `bitcoin-swaps` feature for the `main` build by adding it
to `builds.yml` feature list.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c335eac. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ion (EIP1559) with the right properties in the metric events` (#37573)

<!--
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**
When we assert the Transaction Added event, we expect the advanced
settings to be undefined. Then, right after we trigger the tx then we
click on the advanced settings, so the Transaction Submitted event has
the advanced settings set to true. That is expected.

The issue comes when we assert the Transaction Added event, if the click
settings happens very fast (before the Transaction Added has been fired)
then we get that property set to true.

To avoid this race condition, we wait until that event is fired (which
won't have the advanced settings set to true) and once that event has
happened then we click on the settings.

<img width="809" height="323" alt="image"
src="https://github.com/user-attachments/assets/813cd312-5914-4c7c-a7ee-a7b531eff66a"
/>


[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37573?quickstart=1)

## **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. Check ci

## **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]
> Deflakes the metrics E2E test by typing event payloads and waiting for
initial "Transaction Added" events before opening advanced view.
> 
> - **Tests (E2E)**:
> - Update `test/e2e/tests/confirmations/transactions/metrics.spec.ts`:
>     - Add `MetricsEvent` type for event payloads.
> - Wait for 4 "Transaction Added"/"Transaction Added Anon" events
before enabling advanced view to keep `transaction_advanced_view`
undefined on initial "Added" events, reducing flakiness.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1b68800. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37592?quickstart=1)

## **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]
> Adds v13.8.0 section to CHANGELOG with key additions and fixes, and
updates compare links.
> 
> - **Changelog**:
>   - **v13.8.0 Added**:
> - Bitcoin snap bump to `v1.4.3`; subscription/shield controller and UI
updates; support for buying Bitcoin/non‑EVM via buy flow; improved
error/display for chain IDs; copy icon on network addresses; assorted
UI/copy refinements.
>   - **v13.8.0 Fixed**:
> - Numerous fixes across subscription/shield flows, network nicknames,
non‑EVM historical price ranges, token/NFT display data,
caching/performance, links, and UI consistency.
> - **Links**: Update `[Unreleased]` compare to `v13.8.0...HEAD` and add
`[13.8.0]` compare link.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
dceded1. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: MetaMask Bot <37885440+metamaskbot@users.noreply.github.com>
Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
Co-authored-by: runway-github[bot] <73448015+runway-github[bot]@users.noreply.github.com>
Co-authored-by: Lwin <147362763+lwin-kyaw@users.noreply.github.com>
Co-authored-by: Bernardo Garces Chapero <bernardo.chapero@consensys.net>
Co-authored-by: Prithpal Sooriya <prithpal.sooriya@gmail.com>
Co-authored-by: Jyoti Puri <jyotipuri@gmail.com>
Co-authored-by: OGPoyraz <omergoktugpoyraz@gmail.com>
Co-authored-by: sahar-fehri <sahar.fehri@consensys.net>
<!--
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 @metamask/message-signing-snap to version 1.1.4

## **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: @metamask/message-signing-snap to version 1.1.4

## **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]
> Upgrade @metamask/message-signing-snap from 1.1.3 to 1.1.4 in
package.json and yarn.lock.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e6427a4. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@github-actions
Copy link
Contributor

github-actions bot commented Nov 6, 2025

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@metamaskbot metamaskbot added the team-bots Bot team (for MetaMask Bot, Runway Bot, etc.) label Nov 6, 2025
@metamaskbot
Copy link
Collaborator Author

✨ Files requiring CODEOWNER review ✨

👨‍🔧 @MetaMask/extension-platform (1 files, +4 -0)
  • 📄 .yarnrc.yml +4 -0

@socket-security
Copy link

socket-security bot commented Nov 6, 2025

All alerts resolved. Learn more about Socket for GitHub.

This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored.

Ignoring alerts on:

  • @rive-app/canvas@2.31.5
  • @sentry/cli@2.56.0

View full report

@metamaskbot
Copy link
Collaborator Author

Builds ready [9047f0d]
UI Startup Metrics (1121 ± 90 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup112198414819011581271
load95982712708210051116
domContentLoaded9518181260829991099
domInteractive201394121848
firstPaint6787012973799841105
backgroundConnect19017328016191225
firstReactRender2616145142841
getState21772102639
initialActions001001
loadScripts769627106181816917
setupStore1062331117
numNetworkReqs1367720674
BrowserifyPower User HomeuiStartup19681745267527720602675
load1056932159019412071590
domContentLoaded1047903158419612031584
domInteractive281671174771
firstPaint86227415923619491592
backgroundConnect2412292607246260
firstReactRender28254242942
getState18310825832196258
initialActions001011
loadScripts81568613301899651330
setupStore1493171231
numNetworkReqs1187025962167259
WebpackStandard HomeuiStartup82769713811078221075
load605552119398593831
domContentLoaded598547118494587816
domInteractive1611137151440
firstPaint21356967204198751
backgroundConnect241276142659
firstReactRender29186883342
getState1062931215
initialActions001001
loadScripts595545118193585805
setupStore1253561328
numNetworkReqs1367319870
WebpackPower User HomeuiStartup12741141183617813281836
load67157010031417311003
domContentLoaded655559980134716980
domInteractive29131232846123
firstPaint41467984308608984
backgroundConnect53101995844199
firstReactRender27233022830
getState1417716526157165
initialActions001011
loadScripts651557969131706969
setupStore1162561325
numNetworkReqs1056821647166216
FirefoxBrowserifyStandard HomeuiStartup14311259175112114991658
load1223109315289812931430
domContentLoaded1222109315289812931429
domInteractive1223545064122280
firstPaint------
backgroundConnect4025101154575
firstReactRender25215952537
getState74454611
initialActions001001
loadScripts1200107615039612611413
setupStore13784121131
numNetworkReqs1266715760
BrowserifyPower User HomeuiStartup24882161321930128183219
load13701165188424517011884
domContentLoaded13701165188324517011883
domInteractive21489674175421674
firstPaint------
backgroundConnect12031394131273394
firstReactRender463175105075
getState1387620031150200
initialActions101011
loadScripts13351133177222716411772
setupStore23659163659
numNetworkReqs1336823164210231
WebpackStandard HomeuiStartup15831408213815016191926
load13551191171010513981567
domContentLoaded13551190170910513971567
domInteractive952919332109170
firstPaint------
backgroundConnect46251852749110
firstReactRender302280122970
getState9418719718
initialActions001001
loadScripts1325116016309713741535
setupStore14678131439
numNetworkReqs1367018767
WebpackPower User HomeuiStartup25742232383341028783833
load15031240183418917561834
domContentLoaded15031240183418917561834
domInteractive17344480147346480
firstPaint------
backgroundConnect993231478140314
firstReactRender433177135477
getState1617234874210348
initialActions101111
loadScripts14701222178617917171786
setupStore3192104834210
numNetworkReqs1285531198270311

This PR updates the change log for 13.9.0. (Hotfix - no test plan
generated.)

Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
@metamaskbot
Copy link
Collaborator Author

Builds ready [a8709b0]
UI Startup Metrics (1226 ± 87 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1226109216568712701392
load105593313767710971205
domContentLoaded104892813667510921199
domInteractive211483132053
firstPaint63379140141910541129
backgroundConnect2322182799235252
firstReactRender29185183543
getState21594122537
initialActions005101
loadScripts823712112675862963
setupStore1263851321
numNetworkReqs1367619672
BrowserifyPower User HomeuiStartup19841747273631323782736
load1036900146819513021468
domContentLoaded1028891145119312891451
domInteractive271567174467
firstPaint815148146343813011463
backgroundConnect2372222569242256
firstReactRender27253122731
getState17815720715186207
initialActions001011
loadScripts801664121018810511210
setupStore1693082630
numNetworkReqs1187125875230258
WebpackStandard HomeuiStartup8307041216918321087
load61156098583604858
domContentLoaded60355596679595839
domInteractive171268101442
firstPaint20459974214191820
backgroundConnect241178143056
firstReactRender2918116113436
getState1155151215
initialActions001001
loadScripts60055395677593828
setupStore1264561327
numNetworkReqs1367319871
WebpackPower User HomeuiStartup13211180173116313831731
load680593984117789984
domContentLoaded662585941106759941
domInteractive291377236277
firstPaint36768944299620944
backgroundConnect621817660148176
firstReactRender29254952949
getState1519617026168170
initialActions001011
loadScripts657583930103747930
setupStore86162916
numNetworkReqs1096622754163227
FirefoxBrowserifyStandard HomeuiStartup1413128117499914821604
load1202109514387712561360
domContentLoaded1201109514387712561360
domInteractive1073432848112221
firstPaint------
backgroundConnect402686124963
firstReactRender25214142534
getState74334713
initialActions001001
loadScripts1178107714057612321336
setupStore157211211330
numNetworkReqs1266515754
BrowserifyPower User HomeuiStartup24342160297328428182973
load13611166180520015961805
domContentLoaded13601165180419915961804
domInteractive21447541167462541
firstPaint------
backgroundConnect11130451111127451
firstReactRender423181134681
getState1377819832175198
initialActions001011
loadScripts13181146162717715661627
setupStore2561212932121
numNetworkReqs1316624265217242
WebpackStandard HomeuiStartup16321460199712416941931
load13961230165710614641629
domContentLoaded13951230165710614631629
domInteractive1032534647114160
firstPaint------
backgroundConnect49261232254114
firstReactRender332383143375
getState74596713
initialActions001001
loadScripts13641212162610114181571
setupStore15779121336
numNetworkReqs1366716764
WebpackPower User HomeuiStartup25212300286319126842863
load15311249184817916831848
domContentLoaded15301249184717816831847
domInteractive14840423122297423
firstPaint------
backgroundConnect943527271141272
firstReactRender423097164997
getState1477425350182253
initialActions106116
loadScripts14941229179517016481795
setupStore21981172781
numNetworkReqs1295724663198246

@metamaskbot metamaskbot added the release-13.9.0 Issue or pull request that will be included in release 13.9.0 label Nov 6, 2025
@gauthierpetetin
Copy link
Contributor

@metamaskbot update-attributions

@metamaskbot
Copy link
Collaborator Author

Attributions updated

@metamaskbot
Copy link
Collaborator Author

Builds ready [a99b009]
UI Startup Metrics (1255 ± 108 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12551072172610813081448
load1080933150410111411253
domContentLoaded1074928149110011351245
domInteractive2114110141857
firstPaint56678152744310651268
backgroundConnect23321927910237256
firstReactRender29185583348
getState23779112840
initialActions006101
loadScripts8487061243999121025
setupStore1162741221
numNetworkReqs1367520674
BrowserifyPower User HomeuiStartup19011729238223521362382
load1032900137817412711378
domContentLoaded1024895137117212621371
domInteractive301572185172
firstPaint715149138845210971388
backgroundConnect23922329016245290
firstReactRender28253322933
getState17011620320179203
initialActions001011
loadScripts79666711461669971146
setupStore1191721217
numNetworkReqs1177125768166257
WebpackStandard HomeuiStartup8247001142978281109
load60855793491594906
domContentLoaded60154992188590888
domInteractive161164101441
firstPaint21162912205202582
backgroundConnect241267132556
firstReactRender28175073337
getState1162931215
initialActions001001
loadScripts59854791185588878
setupStore1163051223
numNetworkReqs1367319871
WebpackPower User HomeuiStartup12861127175816913691758
load63756783687716836
domContentLoaded62055780779673807
domInteractive231356154256
firstPaint30472727216571727
backgroundConnect601017565168175
firstReactRender26232812728
getState1387215826155158
initialActions001011
loadScripts61655579776662797
setupStore15738102638
numNetworkReqs1306628668165286
FirefoxBrowserifyStandard HomeuiStartup14291283191611714801663
load1220109114518812881393
domContentLoaded1220109114518812881393
domInteractive1193230355124280
firstPaint------
backgroundConnect4024103154974
firstReactRender25214942532
getState74669616
initialActions001001
loadScripts1196106914348612561362
setupStore1165361224
numNetworkReqs1266214853
BrowserifyPower User HomeuiStartup23532072292022625332920
load13611177182319615611823
domContentLoaded13611176182319615611823
domInteractive21289533167485533
firstPaint------
backgroundConnect1023238791154387
firstReactRender453280115180
getState1128616821116168
initialActions101111
loadScripts13311147179019415331790
setupStore26697294897
numNetworkReqs1317121358191213
WebpackStandard HomeuiStartup16141440207913316411903
load1378122216269214111567
domContentLoaded1378122216259214111567
domInteractive993027932113144
firstPaint------
backgroundConnect51261502859117
firstReactRender3122153163068
getState84477716
initialActions002001
loadScripts1344120015628513831515
setupStore166183221261
numNetworkReqs1366817763
WebpackPower User HomeuiStartup25582233335231026893352
load15491326193318717691933
domContentLoaded15491326193318817691933
domInteractive17047490144333490
firstPaint------
backgroundConnect893127771121277
firstReactRender43315674856
getState1265919838158198
initialActions101011
loadScripts15151291184317817481843
setupStore2951633827163
numNetworkReqs1326631785206317

@gauthierpetetin
Copy link
Contributor

@metamaskbot update-attributions

@metamaskbot
Copy link
Collaborator Author

No attributions changes

…er back option cp-13.9.0 (#37603)

- fix: stop reloading of animation & browser back option cp-13.9.0
(#37581)

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

In this PR, we have added the logic to stop the animation once
completed. Also added a browser back logic for login options.

Jira Link: https://consensyssoftware.atlassian.net/browse/SL-278

[![Open in GitHub

Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37581?quickstart=1)

## **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: stopped reloading of animation once completed

## **Related issues**

Fixes:

## **Manual testing steps**

1. Open Extension
2. validate animation reloading
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] -->




https://github.com/user-attachments/assets/7c01d5bc-2aeb-4591-84e6-c359e73a71c1




https://github.com/user-attachments/assets/1ccacae4-1aec-4fbd-b170-e879e54970b5





## **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]
> Persist animation completion in shared context to prevent replay, and
use URL params for login option state to support browser back; update
navigation and tests accordingly.
> 
> - **Onboarding Animations**:
> - Extend `ui/contexts/rive-wasm` with `animationCompleted` map and
`setIsAnimationCompleted(...)` to persist completion state across views.
> - Update `metamask-wordmark-animation.tsx` to mark completion on
unmount and consume the new context API.
> - **Welcome Flow**:
> - `welcome.js`: derive `shouldSkipAnimation` from
`animationCompleted.MetamaskWordMarkAnimation` (replacing prior `from`
query logic) to avoid replaying the wordmark animation.
> - `welcome-login.tsx`: read/write `?login=<option>` to control
`LoginOptions` visibility/selection and navigate via
`ONBOARDING_WELCOME_ROUTE` to enable browser back restoring state.
> - **Account Exist**:
> - Simplify navigation back to `ONBOARDING_WELCOME_ROUTE` (remove
`?from=account-exist`).
> - **Tests**:
> - Adjust `account-exist.test.tsx` expectations to match new welcome
route navigation without query params.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
29c4558. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->


[4e1f85a](4e1f85a)

---------

Co-authored-by: Ganesh Suresh Patra <ganesh.patra@consensys.net>
Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
Co-authored-by: Gauthier Petetin <gauthierpetetin@hotmail.com>
@metamaskbot
Copy link
Collaborator Author

Builds ready [0ba1352]
UI Startup Metrics (1331 ± 112 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup13311138179811213961509
load1148961156410212261310
domContentLoaded1141952155410112181291
domInteractive241686152260
firstPaint68780135246511421299
backgroundConnect25423934313259275
firstReactRender25184042536
getState21962102437
initialActions001001
loadScripts89369412891009711047
setupStore1164341116
numNetworkReqs1367519672
BrowserifyPower User HomeuiStartup20101799247220021362472
load1087938148918411791489
domContentLoaded1078927148118511731481
domInteractive311772193972
firstPaint68525414733759791473
backgroundConnect24822828315262283
firstReactRender31265873258
getState1769521527194215
initialActions001011
loadScripts84470312061779421206
setupStore141053101353
numNetworkReqs1357433978201339
WebpackStandard HomeuiStartup88573112501019011177
load63957597483629858
domContentLoaded63157095779622826
domInteractive181286121644
firstPaint18758945169191636
backgroundConnect281289153063
firstReactRender3319276263740
getState1263141418
initialActions001001
loadScripts62856894677619815
setupStore1366271524
numNetworkReqs1367319670
WebpackPower User HomeuiStartup12421132189917412311899
load64057294793663947
domContentLoaded62655891087654910
domInteractive28131112735111
firstPaint33669913280626913
backgroundConnect49111684972168
firstReactRender27243122831
getState1397916727155167
initialActions001001
loadScripts62155590084643900
setupStore1262782327
numNetworkReqs1077122246162222
FirefoxBrowserifyStandard HomeuiStartup14631284212514915461737
load1229110616519712831418
domContentLoaded1228110616509712831417
domInteractive1153435454118240
firstPaint------
backgroundConnect4624179235090
firstReactRender27216472742
getState74445714
initialActions001001
loadScripts1201107816279112501389
setupStore197235351443
numNetworkReqs1266716761
BrowserifyPower User HomeuiStartup23352091329531125093295
load12881120169818214761698
domContentLoaded12881120169818214761698
domInteractive17367413125343413
firstPaint------
backgroundConnect11132444116180444
firstReactRender40315374653
getState1196628949124289
initialActions001011
loadScripts12531099165316314521653
setupStore2851003052100
numNetworkReqs1337031373189313
WebpackStandard HomeuiStartup16371421206212716861917
load13941228164810114441595
domContentLoaded13941227164810114441595
domInteractive1013324235116181
firstPaint------
backgroundConnect51261362354115
firstReactRender312181113168
getState84899716
initialActions001001
loadScripts1361119015759314161535
setupStore15781101537
numNetworkReqs1367217765
WebpackPower User HomeuiStartup25522211312931028763129
load15511276197623518361976
domContentLoaded15511274197523518361975
domInteractive19748722201397722
firstPaint------
backgroundConnect963027073114270
firstReactRender43335874958
getState1178221237124212
initialActions102112
loadScripts15161256193723217881937
setupStore3251844647184
numNetworkReqs1336926267203262

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

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37621?quickstart=1)

## **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]
> Updates CHANGELOG for 13.9.0, consolidating entries (removing
Uncategorized) and adding key Added/Fixed items and link refs.
> 
> - **CHANGELOG (13.9.0)**:
>   - **Added**:
>     - Feature flag to hide Monad in “Add Popular Network”.
>     - Bitcoin snap to `1.4.4`; enable Bitcoin swaps.
> - Claims list/view; network/account selector in claims form; handle
submit backend errors.
>     - Reset Wallet for social-login unrecoverable errors.
> - Revocation flow for advanced permissions; trust signals on spender
addresses.
> - Unlock flow animations; wallet ready page updates; Rive animation on
welcome.
>     - Burn/null recipient blocker; points estimate for swaps/bridges.
> - MONAD network (bridge & swap); DeFi positions fetch optimization.
> - UI improvements (file uploader, settings back button, rewards
balance, asset ordering, deep link handling).
> - Move "Discover" to global menu; upgrade permissions snaps to
`0.5.0`.
>   - **Fixed**:
> - Duplicate tokens in search; shield crypto approval calc and flicker;
fox icon styles; NFT lingering after transfer.
> - Bridge-enabled check before nav; padding in simulation details;
default receiving network order.
> - Ledger tutorial link; invalid SRP handling; intermittent
subscription visibility; default BTC pair.
> - Smart tx link; crash on wallet init; sanitize Unicode in signatures;
ENS recipient display; phishing page href.
> - Token name truncation; bip44 connection indicator; missing approval
changes in batch simulations; defer UI until swap SSE quotes load.
> - Bump `@metamask/message-signing-snap` to `1.1.4`; quicker QuickNode
failover; default bridge slippage to 2%.
>   - Structural:
>     - Remove `Uncategorized` section; fold items into Added/Fixed.
>     - Update version link references at footer.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
fdbf818. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@gauthierpetetin
Copy link
Contributor

@SocketSecurity ignore @rive-app/react-canvas @rive-app/canvas@2.31.5 @sentry/cli@2.56.0

@rive-app/react-canvas @rive-app/canvas@2.31.5
This package is used to fetch the canvas that is being used to render the .riv animation file.

@sentry/cli@2.56.0
sentry package update @MajorLift

(this comment was posted by @smgv on this PR)

@metamaskbot
Copy link
Collaborator Author

Builds ready [144c792]
UI Startup Metrics (1259 ± 115 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12591098181511513181482
load1088952158110411471256
domContentLoaded1082949157410311421251
domInteractive231495161971
firstPaint56596136342210451247
backgroundConnect2352192517240247
firstReactRender26175272742
getState23968112644
initialActions002001
loadScripts85372113431039151018
setupStore1173431218
numNetworkReqs1367619672
BrowserifyPower User HomeuiStartup19011541252728021542527
load1017885161220611861612
domContentLoaded1009876160620511801606
domInteractive301584225584
firstPaint56314913693739021369
backgroundConnect23421626615239266
firstReactRender28245062850
getState17314623322194233
initialActions001001
loadScripts78564813461969561346
setupStore1282541425
numNetworkReqs1207325674237256
WebpackStandard HomeuiStartup8156901195948181082
load60154897384588838
domContentLoaded59454294680583805
domInteractive15115181437
firstPaint20963983207187746
backgroundConnect24969142760
firstReactRender28175773335
getState1062831216
initialActions001001
loadScripts59154093677581793
setupStore1154251221
numNetworkReqs1367619869
WebpackPower User HomeuiStartup12921163158713514031587
load660584946108723946
domContentLoaded64257290197692901
domInteractive241366184066
firstPaint35773736248592736
backgroundConnect651123178180231
firstReactRender27243322933
getState14510016723161167
initialActions001011
loadScripts63856989194681891
setupStore1063271032
numNetworkReqs1117017140164171
FirefoxBrowserifyStandard HomeuiStartup14591293190712415041720
load1237112316769212881440
domContentLoaded1236112316769212871440
domInteractive1213537559123259
firstPaint------
backgroundConnect4225134184879
firstReactRender25214232630
getState74607714
initialActions001001
loadScripts1212110816559012621410
setupStore147116121328
numNetworkReqs1266014754
BrowserifyPower User HomeuiStartup24702126341135827243411
load13831181197325516311973
domContentLoaded13831181197125516311971
domInteractive21380678193384678
firstPaint------
backgroundConnect12432462133178462
firstReactRender463478105078
getState1268618928134189
initialActions101011
loadScripts13371139186624316091866
setupStore5453338495333
numNetworkReqs1347122361206223
WebpackStandard HomeuiStartup16071433225414316561916
load13711201172410314241603
domContentLoaded13701200172310314241602
domInteractive993129138110166
firstPaint------
backgroundConnect4724139225199
firstReactRender302278102961
getState9413614724
initialActions001001
loadScripts1340118316959814051539
setupStore177246261435
numNetworkReqs1367517866
WebpackPower User HomeuiStartup25002133336436025403364
load14961237194320217031943
domContentLoaded14951237194320217031943
domInteractive18540588168323588
firstPaint------
backgroundConnect783126757103267
firstReactRender483299194999
getState1396527658184276
initialActions107217
loadScripts14701218190420016771904
setupStore3651885637188
numNetworkReqs1346928778228287

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

Labels

release-13.9.0 Issue or pull request that will be included in release 13.9.0 team-bots Bot team (for MetaMask Bot, Runway Bot, etc.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.