Skip to content

Conversation

@metamaskbot
Copy link
Collaborator

@metamaskbot metamaskbot commented Nov 14, 2025

🚀 v13.10.0 Testing & Release Quality Process

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


📋 Key Processes

Testing Strategy

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

GitHub Signoff

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

Issue Resolution

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

Cherry-Picking Criteria

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

🗓️ Timeline and Milestones

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

✅ Signoff Checklist

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

Team sign-off checklist

  • Accounts Framework
  • Assets
  • Bots Team
  • Confirmations
  • Core Extension UX
  • Core Platform
  • Delegation
  • Extension Platform
  • Mobile Platform
  • New Networks
  • 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


Note

Adds Tron send support, enhances Shield claims and metrics, refactors notifications to new payload API, and migrates routing/unlock to v5-compat with swap, gasless, and stability improvements.

  • Multichain/Send:
    • Add Tron chain support across send flow (type detection, validation, recipients) and selectors (balances, isTron, last-selected Tron account).
    • Include native assets with zero balance; minor fiat display tweak.
  • Swaps/Confirmations:
    • Add QuoteSwapSimulationDetails UI; improve dapp swap comparison parsing, error handling, metrics, and original tx param usage; add useSwapCheck.
    • Simplify gasless support hook (remove 7702 atomic batch checks); update tests.
  • Shield:
    • Expand coverage alert (paused state, metrics fragments, navigation) and tests.
    • Implement claims form with signature/configs, supported networks/days selectors, list updates, and metrics; add cancel/paused copy; selector utilities.
    • Enhance subscription page (animations, payment error flows, test clocks, default options) and settings entry modal logic.
  • Notifications:
    • Migrate components to INotification with payload structure; add Platform notifications; update details/footer/stories.
  • Routing/Unlock/Layouts:
    • Introduce v5-compat navigation wrappers, new layouts, and sidepanel handling; refresh unlock page UI and tests.
  • Misc:
    • Pass smart tx status to SimulationDetails; settings UI tweaks; dependency bumps (controllers/snaps/subscription).

Written by Cursor Bugbot for commit 115187a. This will update automatically on new commits. Configure here.

metamaskbot and others added 30 commits November 6, 2025 21:59
## Version Bump After Release

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

---
*This PR was automatically created by the
`create-platform-release-pr.sh` script.*

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Bumps `package.json` version from `13.9.0` to `13.10.0`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
d3799bf. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

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

## **Description**

Allow user to select quoted swap.

## **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: MetaMask/MetaMask-planning#6108

## **Manual testing steps**

1. Submit a swap
2. Check swap selection option on confirmation page
3. Confirmation should update as user selects different swap options

## **Screenshots/Recordings**
TODO

## **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 swap selection on the confirmation screen to switch between
dapp’s current swap and a MetaMask-quoted swap, updating txParams/batch
via remote-flagged UI, with quote detection, metric fixes, tests, and
minor styling.
> 
> - **Confirmations UI**:
> - `ui/pages/.../dapp-swap-comparison-banner.tsx`: Add "Current" vs
"Save + Earn" selection; dispatch `updateTransaction` to swap between
original dapp tx and selected quote (`txParams`, `batchTransactions`,
`txParamsOriginal`); auto-select MetaMask when it’s a quoted swap; gate
with remote flag `dappSwapUi.enabled/threshold`; allow test origin;
minor style token update in `index.scss`.
> - **Hooks**:
> - New `useSwapCheck` to detect quoted swaps (diffs `txParamsOriginal`
vs `txParams`).
> - `useDappSwapComparisonInfo`: now returns `selectedQuote`; reads from
`txParamsOriginal` when present; refines quote timing; no-op safety
tweaks; metric capture ordering updates.
> - `useDappSwapComparisonLatencyMetrics`: fix quote request latency
calculation.
> - **Gas UI**:
> - `EditGasFeesRow`: hide edit-gas button when `isQuotedSwap` is true;
tests added.
> - **Tests**:
> - Add/expand tests for banner interactions (button clicks dispatch),
swap check, comparison info (selected quote and metrics).
> - **Config**:
>   - Remove `DAPP_SWAP_SHIELD_ENABLED` from `builds.yml` and test env.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
933ebfb. 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?
-->

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]
> Persists Rive animation completion to skip replays, switches welcome
flow to context-based skipping, and syncs login option visibility via
the `?login` query param; updates navigation and tests.
> 
> - **Onboarding animations**:
> - Add `animationCompleted` map and `setIsAnimationCompleted` to
`RiveWasmContext` (`ui/contexts/rive-wasm/index.tsx`).
> - `MetamaskWordMarkAnimation` sets completion on unmount and consumes
the new setter; updates effect deps
(`ui/pages/onboarding-flow/welcome/metamask-wordmark-animation.tsx`).
> - `welcome` uses `animationCompleted.MetamaskWordMarkAnimation` to
decide `shouldSkipAnimation` (replaces URL-based check)
(`ui/pages/onboarding-flow/welcome/welcome.js`).
> - **Login flow URL syncing**:
> - `WelcomeLogin` reads `?login=` to control option view and writes it
on selection via `navigate`
(`ui/pages/onboarding-flow/welcome/welcome-login.tsx`).
> - **Navigation adjustments**:
> - `AccountExist` returns to `ONBOARDING_WELCOME_ROUTE` without
`?from=...`; tests updated accordingly
(`ui/pages/onboarding-flow/account-exist/*`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
709317b. 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**
Show Priority Tag on Menu > Support when shield subscription is active
or paused

<!--
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/37590?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: Show Priority Tag on Menu > Support when shield
subscription is active or paused

## **Related issues** Add shield icon with animation

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]
> Displays a Priority tag on Global Menu > Support when Shield
subscription is active or paused, using a memoized `showPriorityTag`
condition.
> 
> - **UI (Global Menu)**
(`ui/components/multichain/global-menu/global-menu.tsx`):
> - Show `Tag` with `priority` label on Support when
`getIsShieldSubscriptionActive` or `getIsShieldSubscriptionPaused` and
`basicFunctionality` are true.
> - Add `getIsShieldSubscriptionPaused` import and introduce
`useMemo`-based `showPriorityTag`.
> - Replace inline condition with `showPriorityTag` for rendering the
Priority tag.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
51991c0. 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**
- Updated copywriting for `Shield plan` page and `Subscription
confirmation` page
- Removed `Shield plan` footer note


https://www.figma.com/design/HTAO1SrmixV4ppv7qIvLoa/Metamask-Transaction-Shield?node-id=12769-126948&t=dpj6EeZul3sgHFVg-4
<!--
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/37595?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: Shield plan copywriting update and removed footer note

## **Related issues**

Fixes:

## **Manual testing steps**

1. Login to an account without shield subscription but has enough token
for subscription
2. Go to Menu > Settings > Transaction Shield
3. You will be redirected to Shield plan page
4. Toggle Payment methods and Payment terms and observe changes

## **Screenshots/Recordings**

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

### **Before**
**Crypto payment monthly and yearly**
<img width="412" height="614" alt="Screenshot 2025-11-07 at 2 51 47 AM"
src="https://github.com/user-attachments/assets/91485b4e-789f-482c-9a0d-0999a76fb0fc"
/>
<img width="414" height="614" alt="Screenshot 2025-11-07 at 2 51 36 AM"
src="https://github.com/user-attachments/assets/9a7ac4e4-9f59-4212-a11a-a07bec9273ce"
/>


**Card payment monthly and yearly**
<img width="413" height="614" alt="Screenshot 2025-11-07 at 2 52 17 AM"
src="https://github.com/user-attachments/assets/7ffc10b0-b828-4377-b511-399a2ea575f9"
/>
<img width="411" height="614" alt="Screenshot 2025-11-07 at 2 52 06 AM"
src="https://github.com/user-attachments/assets/9fc5c95f-3932-4e80-baea-27c3959e9b1e"
/>


**14 days free trial**
<img width="514" height="723" alt="Screenshot 2025-11-07 at 2 53 01 AM"
src="https://github.com/user-attachments/assets/2fb92c8a-d319-4c05-9049-c632c0ba06fc"
/>
<!-- [screenshots/recordings] -->

### **After**
**Crypto payment monthly and yearly**
<img width="411" height="612" alt="Screenshot 2025-11-07 at 2 49 26 AM"
src="https://github.com/user-attachments/assets/0b485c60-bd1e-489b-99c7-bb1bfdbeb216"
/>
<img width="410" height="611" alt="Screenshot 2025-11-07 at 2 48 29 AM"
src="https://github.com/user-attachments/assets/408a20db-60b4-44de-8bf9-1ec0e97a6480"
/>


**Card payment monthly and yearly**
<img width="409" height="609" alt="Screenshot 2025-11-07 at 2 49 48 AM"
src="https://github.com/user-attachments/assets/b682e747-cc91-4ee3-9ae8-297159253c7e"
/>
<img width="409" height="611" alt="Screenshot 2025-11-07 at 2 49 38 AM"
src="https://github.com/user-attachments/assets/d067aa9c-e57b-49a8-bc45-2af2e3487dc2"
/>


**Free 14-day trial**
<img width="514" height="723" alt="Screenshot 2025-11-07 at 2 56 09 AM"
src="https://github.com/user-attachments/assets/a28c572c-2011-4974-a0cd-69b4db7e4e04"
/>

<!-- [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 Shield Plan copy and dynamic plan details (card/crypto,
month/year), removes footer auto‑renew note, and aligns i18n strings.
> 
> - **Shield Plan UI (`ui/pages/shield-plan/shield-plan.tsx`)**:
>   - Refactors `planDetails` to show context-aware copy:
>     - Card: `shieldPlanDetails2Card`.
> - Crypto: Uses `shieldPlanDetails2CryptoMonth` or
`shieldPlanDetails2CryptoYear` based on plan; adds `shieldPlanDetails3`
only for monthly.
>   - Removes footer auto-renew note under the Continue button.
>   - Cleans up unused var and updates hook deps.
> - **Localization (`app/_locales/*/messages.json`)**:
>   - Updates trial copy to `"Free $1-day trial"` with descriptions.
> - Replaces/introduces Shield Plan detail keys:
`shieldPlanDetails2Card`, new `shieldPlanDetails2CryptoMonth`/`Year`,
and sets `shieldPlanDetails3` to "Billed monthly, cancel anytime".
> - Removes deprecated `shieldPlanAutoRenew` and old
`shieldPlanDetails2` (en/en_GB); aligns en/GB; minor additions in `ga`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
98b3609. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…t "Premature close" errors (#37400)

## **Description**

This PR is an AI-generated fix aiming to fix the #1 error in Sentry
(3.8M occurrences/month) by adding graceful shutdown handlers to
extension context streams, preventing "ERR_STREAM_PREMATURE_CLOSE"
errors.

The error was initially discussed in this [Slack
thread](https://consensys.slack.com/archives/CTQAGKY5V/p1761904147325279?thread_ts=1761646886.397379&cid=CTQAGKY5V).

#### Disclaimer

Since we haven't found a reliable way to manually reproduce these
"Premature close" errors, there's no "before/after proof" that this PR
fixes it.

### Problem

When underlying transport streams (e.g., `WindowPostMessageStream`,
`ExtensionPortStream`) close or end abruptly—during page navigation, tab
closure, or extension disconnection—the `ObjectMultiplex` instances in
**extension context** do not gracefully shut down. This results in
"Premature close" errors being thrown by the stream pipeline.

### Solution

Added graceful shutdown handlers to **extension context** streams that:

1. **Listen for transport termination**: Attach `once('close')` and
`once('end')` listeners to underlying transport streams
2. **Proactively close muxes**: When transport terminates, check if mux
is still open (`!destroyed && !writableEnded`) and call `mux.end()`
before pipeline error detection kicks in
3. **Prevent error propagation**: By closing gracefully, we avoid
"ERR_STREAM_PREMATURE_CLOSE" errors in the pipeline

### Key Design Decision: Page Context vs Extension Context

**Why handlers are ONLY in extension context streams:**

| Context | Files | Needs Handlers? | Reason |
|---------|-------|-----------------|--------|
| **Page Context** | `inpage.js` | ❌ **NO** | Browser automatically
destroys the entire script execution context on navigation. Adding
handlers can actually CAUSE disconnection errors during rapid
navigation. |
| **Extension Context** |
`provider-stream.ts`<br>`phishing-stream.ts`<br>`cookie-handler-stream.ts`
| ✅ **YES** | Extension context persists across page navigations. Muxes
remain active when transports disconnect, causing "Premature close"
errors without explicit cleanup. |

This approach mirrors the solution in
[#33470](#33470) for
CAIP streams.

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

## **Changelog**

CHANGELOG entry: Fixed "Premature close" stream errors in extension
context by adding graceful shutdown handlers

## **Related issues**

Fixes: #26337
Fixes: #35241
Fixes: #21078

## **Manual testing steps**

(disclaimer: the error is hard to reproduce, even with these manual
testing steps)

1. Open a dapp page connected to MetaMask (e.g.,
https://metamask.github.io/test-dapp/)
2. Rapidly navigate between pages multiple times or close/reopen tabs
3. Open DevTools Console and check for errors
4. Open Extension Background Console: `chrome://extensions` → MetaMask →
"service worker"
5. Verify no "Premature close" errors appear during page navigation
6. Test deep link navigation: Navigate to
`chrome-extension://{extension-id}/home.html#link?u=/buy` and verify it
redirects cleanly without errors

**Expected**: Clean shutdowns with no "Premature close" errors in
console

## **Screenshots/Recordings**

### **Before**
- "Premature close" errors appear in extension background console during
page navigation
- Sentry reports 3.8M occurrences per month

### **After**
- Extension context streams shut down gracefully
- No "Premature close" errors during normal operations
- E2E tests pass (including deep-link tests that navigate rapidly)

## **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 graceful shutdown handlers to extension-context multiplexers for
provider, phishing, and cookie-handler streams, plus tests; clarify no
handlers in page-context in inpage.
> 
> - **Streams (extension context)**:
> - **Graceful shutdown handlers**: End muxes on underlying transport
`close`/`end` to avoid `ERR_STREAM_PREMATURE_CLOSE` in:
> - `app/scripts/streams/provider-stream.ts` (`pageMux`, `extensionMux`)
> - `app/scripts/streams/phishing-stream.ts` (`phishingPageMux`,
`phishingExtMux`)
> - `app/scripts/streams/cookie-handler-stream.ts`
(`cookieHandlerPageMux`, `cookieHandlerMux`)
> - **Logging/notifications**: Preserve existing pipeline callbacks;
continue logging via `logStreamDisconnectWarning` and sending
`METAMASK_STREAM_FAILURE` where applicable.
> - **Inpage (page context)**:
> - `app/scripts/inpage.js`: Add documentation explaining why graceful
shutdown handlers are not added in page context.
> - **Tests**:
> - Add filter tests to assert unconditional logging on pipeline
completion/error:
>     - `provider-stream.filter.test.ts`
>     - `phishing-stream.filter.test.ts`
>     - `cookie-handler-stream.filter.test.ts`
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e72ec5e. 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**

We recently changed it so `onActive` fires once the client has been
unlocked. This PR adjusts the hook that provides the `active` flag to
the same behavior.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37607?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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Updates client activity to require both UI open and wallet unlocked,
and adjusts Snap client-status E2E test expectations.
> 
> - **Snaps / Controller**:
> - Update `getIsActive` in `app/scripts/metamask-controller.js` to
return `this._isClientOpen && isUnlocked` (was only
`this._isClientOpen`).
> - **Tests**:
> - Adjust `test/e2e/snaps/test-snap-clientstatus.spec.ts` to expect
`active: false` when `locked: true`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
29c0bf4. 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**

This bumps the Snaps packages, which mainly contain some bug fixes, and
the addition of client and platform versions in `snap_getClientStatus`.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37582?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: Include client version and platform version in
`snap_getClientStatus` response.

## **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]
> Upgrade Snaps packages and iframe env, add client/platform versions to
client status, skip network switching for Snap origins, remove Snap
`dynamicPermissions`, and update related E2E tests.
> 
> - **Snaps/Controllers**:
> - Remove `dynamicPermissions` from `SnapControllerInit` and its test.
> - In `metamask-controller`, skip `NetworkController.setActiveNetwork`
when origin is a Snap (`isSnapId`).
> - Expose `getVersion` to Snaps (returns
`process.env.METAMASK_VERSION`).
> - **Build/Dependencies**:
> - Bump `@metamask/snaps-controllers` → `^16.1.0`,
`@metamask/snaps-execution-environments` → `^10.2.3`,
`@metamask/snaps-rpc-methods` → `^14.1.0`, `@metamask/snaps-sdk` →
`^10.1.0`, and `@metamask/preinstalled-example-snap` → `^0.7.2`.
> - Update `IFRAME_EXECUTION_ENVIRONMENT_URL` to
`.../iframe/10.2.3/index.html` across build types.
> - **Tests/E2E**:
> - Client status tests now validate JSON `{ locked, active,
clientVersion, platformVersion }`; page object parses and compares
values (clientVersion prefix match).
> - Clean up preinstalled example test (remove extra delays) and minor
imports.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6a22656. 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 #36228

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/36229?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: smart transaction send and receive copy

## **Related issues**

Fixes:

## **Manual testing steps**

1. In extension, send an erc20. after sending, see this screen
2. Make sure the copy is in the past tense once the send is completed
"You're sending" then "You sent"
3. Unwrap BNB by using "deposit":
https://bscscan.com/token/0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c#writeContract
4. Make sure the copy is in the past tense once the wrap is completed:
"You've sent" / "You've received"

## **Screenshots/Recordings**

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

### **Before**

<!-- [screenshots/recordings] -->
<img width="788" height="1194" alt="image"
src="https://github.com/user-attachments/assets/297f0dc1-8b92-47b3-bd5a-0fd9b2f3de26"
/>

<img width="802" height="1170" alt="image"
src="https://github.com/user-attachments/assets/589bb903-9d10-4c38-9e50-d4757f2b7c56"
/>


### **After**

<!-- [screenshots/recordings] -->
<img width="370" height="544" alt="Screenshot 2025-09-23 at 12 02 44"
src="https://github.com/user-attachments/assets/28c9aa0f-7740-4a46-8b63-7d710173bd29"
/>


https://github.com/user-attachments/assets/1e426196-67db-4b22-b2a4-a91a0258306b

<img width="390" height="617" alt="Screenshot 2025-10-01 at 14 49 37"
src="https://github.com/user-attachments/assets/b2e6f6e8-6822-42f3-9d60-cc851fd4bc76"
/>


## **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]
> Simulation details now display sending/sent and receiving/received
copy based on transaction and Smart Transaction status, with new i18n
strings and tests.
> 
> - **UI – Simulation Details
(`ui/pages/confirmations/components/simulation-details`)**:
> - Add `smartTransactionStatus` prop and use it to determine headings,
prioritizing Smart Transaction status over `TransactionStatus`.
> - Dynamic headings for outgoing/incoming: `You send` → `You're
sending`/`You sent`; `You receive` → `You're receiving`/`You've
received`.
> - Import `TransactionStatus` and centralize heading selection helpers.
> - **Smart Transactions Status Page
(`ui/pages/smart-transactions/.../smart-transaction-status-page.tsx`)**:
>   - Pass `smartTransactionStatus` to `SimulationDetails`.
> - **Localization (`app/_locales/en*/messages.json`)**:
> - Add keys: `simulationDetailsOutgoingHeadingSending`,
`simulationDetailsOutgoingHeadingSent`,
`simulationDetailsIncomingHeadingReceiving`,
`simulationDetailsIncomingHeadingReceived`.
> - **Tests (`simulation-details.test.tsx`)**:
> - Update to include `TransactionStatus` and new prop; add cases
verifying heading logic and Smart Transaction status precedence for
outgoing/incoming.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
19f91eb. 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 feature to hide tokens is available for EVM assets but not for
non-EVM assets. This is crucial for improving user experience by
allowing users to hide unwanted tokens, especially in light of spam and
malicious token issues.

The problem is that having the possibility of hiding tokens is not great
if you cannot add tokens back. Therefore I have implemented the whole
logic to add non-EVM tokens to your wallet.

In order to get this done the following PR has been merged into Core:
- Support for adding non-evm tokens
[here](MetaMask/core#7016)

Furthermore, this PR improves the UI experience for importing tokens and
aligns with the current implementation design on mobile

**NOTE**: to keep this PR as small as possible the token hiding feature
will be aded in
[this](#37423)
upcoming PR

<!--
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/37501?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: support importing non-evm tokens

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-1425

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


https://github.com/user-attachments/assets/9eb0a52e-1e20-433a-ae6d-2f52cec47866

### **After**


https://github.com/user-attachments/assets/da64d359-894d-4cd0-b781-7f7e89ca6f1a

## **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 non‑EVM token import support via multichain assets, revamps the
Import Tokens modal, and updates tests and mocks accordingly.
> 
> - **Multichain/Backend**:
> - Add `multichainAddAssets(assetIds, accountId)` action and wire
through `metamask-controller` to `multichainAssetsController.addAssets`.
> - **Import Tokens UI/Logic**:
> - Rework `ImportTokensModal` to support EVM and non‑EVM chains
(network selection, loading/unsupported states, tab visibility, exchange
rates fetch by selected network).
> - Use `useTokensWithFiltering` for token search; pass explicit
`chainId` to `TokenSearch`.
>   - Enable tokens link on non‑EVM account overview.
> - **Token List**:
> - Update `TokenList` to detect already‑added non‑EVM assets via
`accountsAssets` and `toAssetId`; remove reliance on current-network
badge logic.
> - Update container to supply `accountsAssets` (instead of selected
account address).
> - **E2E/Unit Tests**:
> - Add/adjust tests for non‑EVM flows, modal states, and token list;
update page objects and mocks (Bridge API endpoints for multiple
networks); minor wait stability tweaks.
> - **Localization**:
> - Remove deprecated warning/setting strings across locales (e.g.,
`customTokenWarningInNonTokenDetectionNetwork`, `inYourSettings`,
`tokenScamSecurityRisk`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4b25aae. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Bernardo Garces Chapero <[email protected]>
<!--
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 the token list selector to avoid brittle tests

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37623?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]
> Switches the token name click selector in
`AssetListPage.checkTokenAmountInTokenDetailsModal` to a stable
`data-testid`-based selector.
> 
> - **E2E Tests**:
>   - Update `test/e2e/page-objects/pages/home/asset-list.ts`:
> - In `checkTokenAmountInTokenDetailsModal`, click token by `testId:
'multichain-token-list-item-token-name'` instead of tag-based selector.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
58962a2. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

This PR adds a deep link handler for the Predict page, enabling
redirection from `https://link.metamask.io/predict` to
`https://metamask.io/predict` with query parameter preservation.

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

## **Changelog**

CHANGELOG entry: Add Predict deeplink handler

## **Related issues**

Fixes: 

## **Manual testing steps**

1. Go to `https://link.metamask.io/predict`
2. Should be routed to `https://metamask.io/predict`
3. Test with query parameters:
`https://link.metamask.io/predict?param=value`
4. Verify parameters are preserved in the redirect

## **Screenshots/Recordings**


https://github.com/user-attachments/assets/31f480eb-ee37-4149-a0bd-19581332e5ee

## **Pre-merge author checklist**

- [x] I've followed MetaMask Contributor Docs and MetaMask Extension
Coding Standards.
- [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 format if applicable
- [x] I've applied the right labels on the PR (see labeling guidelines).
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 deep link support for `/predict`, redirecting to
`metamask.io/predict` with query params preserved, plus i18n strings and
e2e tests.
> 
> - **Deep Links**:
> - Add new route `shared/lib/deep-links/routes/predict.ts` that
redirects `/predict` to `BaseUrl.MetaMask/predict`, preserving query
params.
> - Register route in `shared/lib/deep-links/routes/index.ts` via
`addRoute(predict)`.
> - **Localization**:
> - Add `deepLink_thePredictPage` message key to
`app/_locales/en/messages.json` and `app/_locales/en_GB/messages.json`.
> - **Tests**:
> - Extend `test/e2e/tests/deep-link/deep-link.spec.ts` with a case
verifying signed/unsigned `/predict` redirects to
`${BaseUrl.MetaMask}/predict`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
57a885d. 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 the destToken symbol to the HW approval warning

<!--
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/37629?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: show dest token symbol in HW approval label

## **Related issues**

Fixes: N/A

## **Manual testing steps**

1. Request a bridge using HW wallet
2. verify that dest token is indicated in the warning

## **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]
> Displays the destination token symbol in the hardware wallet bridge
approval tooltip by updating i18n placeholders and passing the third
argument from the UI.
> 
> - **UI (Bridge)**:
> - Update `ui/pages/bridge/prepare/bridge-cta-info-text.tsx` to pass
`destAsset.symbol` as the 3rd param to
`t('bridgeApprovalWarningForHardware', [...])`.
> - **i18n**:
> - Adjust `bridgeApprovalWarningForHardware` message placeholder from
`$2` to `$3` in `app/_locales/en/messages.json`,
`app/_locales/en_GB/messages.json`, and `app/_locales/ga/messages.json`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
683abda. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ges (#37627)

## **Description**

The test suite` change-language` has been updated to be resilient to
changes to localized message changes.

A pending update to various locales is currently blocked because there
is an update to a message that was hard-coded in this test.

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

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Unblocks #36713.

## **Manual testing steps**

N/A

## **Screenshots/Recordings**

N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [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 hard-coded UI text in change-language e2e tests with values
from locale JSON and updates selectors/assertions accordingly.
> 
> - **Tests (e2e)**:
> - Import locale message JSONs
(`app/_locales/{ar,da,de,en,hu,es,hi}/messages.json`).
> - Replace hard-coded selector texts with locale-driven values (e.g.,
`currentLanguage*`, `advanced`, `search` placeholder, `settings`,
`save`).
> - New selectors: `advanceTextDansk`, `waterTextDansk`,
`buttonTextDansk`, `dialogTextDeutsch`, `discoverTextवर्तमान`,
`headerTextAr`.
> - Update assertions and element interactions across test cases to use
the new selectors and localized strings (Spanish/English toggle, Danish
navigation, German error dialog, Hindi discover, Arabic header).
> - Scope limited to `test/e2e/tests/settings/change-language.spec.ts`;
no production code changes.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
43f0db7. 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?
-->
Add notifications for Transaction Shield service

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37624?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: https://consensyssoftware.atlassian.net/browse/SUBS-297

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

- [ ] 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 locale strings and wiring for Transaction Shield subscription
created/paused push notifications and integrates them into the
notifications message map.
> 
> - **Notifications controller
(`app/scripts/controllers/push-notifications/get-notification-message.ts`)**:
> - Add `shieldTranslations` (created/payment-failed title + short
description) and merge into `translations`.
> - **Localization (`app/_locales/*/messages.json`)**:
>   - Add new keys for Transaction Shield subscription notifications:
> - `pushNotificationShieldSubscriptionCreatedTitle`,
`...CreatedDescriptionShort`
> - `pushNotificationShieldSubscriptionPaymentFailedTitle`,
`...PaymentFailedDescriptionShort`
>   - Updated for `en`, `en_GB`, and `ga` locales.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
376c01f. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…7585)

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

Previously in shield plan screen, when user change plan, the selected
token approval amount didn't get updated hence user will see outdated
approval amount in the confirmation screen
This PR reset the selected token when plan change to get correct latest
approval amount

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37585?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 incorrect token approval amount when change shield
plan

## **Related issues**

Fixes:

## **Manual testing steps**

1. shield plan page
2. select a plan and go to confirm page
3. go back and select a different plan
4. go to confirm page should reflect the new approval amount

## **Screenshots/Recordings**

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

### **Before**

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

### **After**

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

## **Pre-merge author checklist**

- [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]
> Prevents stale approval amounts by resetting the selected token when
the plan changes and refactors `useAvailableTokenBalances` to return
`{availableTokenBalances, pending, error}` via `useAsyncResult`.
> 
> - **Hooks**:
>   - **`useAvailableTokenBalances`**:
> - Returns `{ availableTokenBalances, pending, error }` instead of an
array; leverages `useAsyncResult` (removes local `useState/useEffect`).
> - Adds early return when missing `price` or chain map; logs when token
payment info missing.
> - Computes approval amounts and filters tokens with sufficient
balance; keeps polling balances for payment chains.
> - **Shield Plan Page (`ui/pages/shield-plan/shield-plan.tsx`)**:
> - Consumes new hook shape; uses `pending` to defer token selection
until data ready.
> - Resets `selectedToken` when `selectedPlan` changes; only restores
last-used token if it matches current plan.
>   - Defaults payment method to crypto when a token is selected.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4ab428c. 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?
-->

In this PR, it immediately validates the pasted SRP by invoking it on
paste.

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

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37611?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: validate seedphrase when user paste the data.

## **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/e371ccb1-2573-4334-b7e4-a50ef93f1147



## **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]
> Immediately validates pasted SRP words by refactoring the invalid-word
checker to accept an SRP list and invoking it on paste.
> 
> - **SRP Import
(`ui/components/app/srp-input-import/srp-input-import.tsx`)**:
> - Refactor `checkForInvalidWords` to accept an optional `srp` array,
defaulting to current `draftSrp`.
> - Invoke `checkForInvalidWords(newDraftSrp)` during paste handling to
flag invalid words immediately after parsing input.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1b6ee4e. 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 integrates `@metamask/claims-controller` into extension and
added SIWE signature generation for the claim.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37597?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: Added `@metamask/claims-controller` for shield claims
CHANGELOG entry: Added Claim Signature Generation.

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

- [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]
> Integrates @metamask/claims-controller and service, wiring
messengers/init and background methods, refactors UI/actions to use new
types and SIWE claim signature, and updates configs, policies, tests,
and deps.
> 
> - **Backend/Controllers**:
> - Add `ClaimsControllerInit` and `ClaimsServiceInit` with dedicated
messengers (`controller-init/claims/*`, `messengers/claims/*`).
> - Wire `ClaimsController` and `ClaimsService` into
`controller-list.ts` types/state and `metamask-controller` init and
instance mapping.
> - Expose background methods: `getSubmitClaimConfig`,
`generateClaimSignature`, `getClaims`.
> - **UI**:
> - Migrate claims types to `@metamask/claims-controller` (`Claim`,
`ClaimStatusEnum`, attachments), update contexts/hooks/components.
> - Generate claim SIWE signature in `useClaimState` and submit with
claim; refactor form constants/utils into separate files.
> - Update claims list rendering (use `shortId`, new status enum and
attachment props).
> - **Actions**:
> - `submitShieldClaim` now uses background-provided `SubmitClaimConfig`
and real `signature`; `getShieldClaims` delegates to background; add
`generateClaimSignature` action.
> - **Config**:
> - Extend Shield config/types with `claimsEnv`; load it for service
init.
> - **Security/Policies**:
>   - Update LavaMoat policies to allow `@metamask/claims-controller`.
> - **Tests**:
>   - Add unit tests for claims controller/service initialization.
> - **Dependencies**:
>   - Add `@metamask/claims-controller` to `package.json` and lockfile.
> - **E2E State Snapshots**:
>   - Include `ClaimsController` state and `claims` slice references.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
19e1f38. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: MetaMask Bot <[email protected]>
<!--
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 fixes bridging when using a QR-based hardware device like Keystone
3 Pro. Without it, bridging was stuck after the approval.

<!--
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/37549?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 bridging with qr-based wallets

## **Related issues**

Fixes:

## **Manual testing steps**

1. Bridge some ERC20 token from BSC to Linea for example, using a
Keystone wallet
2. Make sure the Bridge works

## **Screenshots/Recordings**

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

### **Before**


https://github.com/user-attachments/assets/ceac8327-b557-45fe-a1a2-180d041914ff

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

### **After**


https://github.com/user-attachments/assets/150d2f57-6bff-4274-bfbb-ab0386c89ff1


<!-- [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]
> Resets the QR hardware sign flow to `play` when a new request arrives
by adding a `useEffect` tied to `request.requestId`.
> 
> - **UI**
> -
**`ui/components/app/qr-hardware-popover/qr-hardware-sign-request/qr-hardware-sign-request.component.js`**:
> - Add `useEffect` to reset `status` to `play` when `request.requestId`
changes.
>     - Import `useEffect` to support the new behavior.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7cc4861. 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?
-->

In this PR, Downgrades Rive file load errors to warnings and removes
redundant error logging in social backup restore, adding a new
@rive-app/canvas patch reference.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37649?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**

- [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]
> Downgrades Rive file load errors to warnings and removes redundant
error logging in social backup restore, adding a new @rive-app/canvas
patch reference.
> 
> - **Animations (@rive-app/canvas patch)**:
> - Suppress hard failures in `rive.js` by commenting out
`fireLoadError`/`throw` paths and using `console.warn`; add early return
when missing source.
> - **Error Logging**:
> - Remove `log.error` lines in `restoreSocialBackupAndGetSeedPhrase`
(background and UI) to reduce noisy reports.
> - **Dependencies**:
> - Add new yarn patch `@rive-app-canvas-patch-03752f0c3b.patch` and
update `package.json`/`yarn.lock` to chain patches for
`@rive-app/[email protected]`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1f9a476. 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**

Upgrading bitcoin to `1.4.5`

* https://github.com/MetaMask/snap-bitcoin-wallet/releases/tag/v1.4.5

<!--
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/37657?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: #37616

## **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]
> Upgrade `@metamask/bitcoin-wallet-snap` from `1.4.4` to `1.4.5` in
`package.json` and `yarn.lock`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9bb76cf. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…#37660)

<!--
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**
Fix sentry error saying alIgnoredTokens is undefined. I could not repro
but believe this is the fix
<!--
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/37660?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 cannot read properties of undefined
(allIgnoredTokens)

## **Related issues**

Fixes: #37659

## **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]
> Defaults `getAllIgnoredAssets` to `EMPTY_OBJECT` to prevent undefined
access errors.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
0230527. 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/37658?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: #37645

## **Manual testing steps**

1. In firefox, start new onboarding with social login.
2. Before completing the social login, close the window.
3. User should not see Login Error modal

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

- [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 cross-browser detection of user-cancelled OAuth login (including
Firefox) and updates flows to treat it as a non-error.
> 
> - **Shared Errors**:
>   - Add `OAuthErrorMessages.USER_CANCELLED_LOGIN_ERROR_FIREFOX`.
> - Introduce `isUserCancelledLoginError(error)` helper for
cross-browser detection.
> - **OAuth Service (`app/scripts/services/oauth/oauth-service.ts`)**:
> - Replace `#isUserCancelledLoginError()` with
`#getUserCancelledLoginError()` returning the actual `Error` when cancel
is detected via `checkForLastError()` and `isUserCancelledLoginError`.
> - When no `responseUrl`, reject with user-cancelled error if present;
otherwise default to `OAuthErrorMessages.NO_REDIRECT_URL_FOUND_ERROR`.
> - **Onboarding UI (`ui/pages/onboarding-flow/welcome/welcome.js`)**:
> - Use `isUserCancelledLoginError` in login error handlers to suppress
UI errors when the user cancels.
>   - Map remaining OAuth errors to existing UI error states as before.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f3ff026. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…on alerts (#37542)

## **Description**
Disables default "Alert" text and the arrow for inline Confirmation
alerts.

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

## **Changelog**

CHANGELOG entry: fix: Disable default "Alert" text and the arrow for
inline Confirmation alerts

## **Related issues**

Fixes: #37362

## **Manual testing steps**

1. Go to the test dapp (https://metamask.github.io/test-dapp/)
2. Connect your wallet
3. Click on "SEND LEGACY TRANSACTION"
4. See that we don't show the "Error" text and the arrow anymore

## **Screenshots/Recordings**

### **Before**
<img width="388" height="214" alt="image"
src="https://github.com/user-attachments/assets/419bf910-99f1-466a-9a02-82bac9b6af65"
/>


### **After**
<img width="385" height="219" alt="image"
src="https://github.com/user-attachments/assets/9ea51aec-ed59-4f26-bab2-e03dcb62f4fe"
/>

<img width="391" height="327" alt="image"
src="https://github.com/user-attachments/assets/8a97a265-1ff2-4bcf-8a77-36e7a2b7f63e"
/>

<img width="347" height="49" alt="image"
src="https://github.com/user-attachments/assets/575afd7b-7c4f-47fd-85f3-55a4acdce87a"
/>

<img width="395" height="416" alt="image"
src="https://github.com/user-attachments/assets/56d9caa8-3df2-43cc-b846-368efb0d8968"
/>


## **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 default inline alert label and arrow, only showing an arrow
when custom text exists and forcing no arrow/empty text in simulation
alerts.
> 
> - **UI**
>   - **`ui/components/app/confirm/info/row/alert-row/alert-row.tsx`**:
> - `InlineAlert` now sets `showArrow` only if both `showArrow` and
`inlineAlertText` are truthy, and defaults `textOverride` to an empty
string.
> -
**`ui/pages/confirmations/components/simulation-details/simulation-details.tsx`**:
> - Simulation inline alerts explicitly set `showArrow={false}` and
`textOverride={''}` to hide the default label and arrow.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6035091. 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 feature to hide tokens is available for EVM assets but not for
non-EVM assets. This task involves implementing a similar token hiding
feature for non-EVM assets. This is crucial for improving user
experience by allowing users to hide unwanted tokens, especially in
light of spam and malicious token issues. The implementation should be
prioritized to align with upcoming Solana campaigns.

In order to get this done the following PRs have been merged:
- Support for ignoring non-evm tokens in core
[here](MetaMask/core#6981)
- Support for importing non-evm tokens in Extension
[here](#37501)

<!--
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/37423?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: support ignoring non-evm tokens

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-1425

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


https://github.com/user-attachments/assets/acdaf634-dee2-418a-bf8f-23c5832b9d53

### **After**


https://github.com/user-attachments/assets/512bcae8-d326-4987-8345-577207c69375

<!-- [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 support to hide/ignore non‑EVM assets via multichain API, passes
chainId for EVM token hides, removes isEvm prop from asset options, and
bumps assets controller.
> 
> - **Multichain/Background**:
> - Add `getApi()` method `multichainIgnoreAssets(assetIds, accountId)`
delegating to `MultichainAssetsController.ignoreAssets`.
> - **UI**:
>   - Update `HideTokenConfirmationModal` to:
> - Detect non‑EVM chains and dispatch
`multichainIgnoreAssets([address], accountId)`.
> - For EVM, dispatch `ignoreTokens` with `networkClientId` and
`chainId`.
> - Use selector `getInternalAccountBySelectedAccountGroupAndCaip` to
resolve account for non‑EVM.
>   - Simplify `AssetOptions`:
> - Remove `isEvm` prop and logic; show Hide option whenever
`!isNativeAsset`.
> - Adjust `native-asset.tsx` and `token-asset.tsx` to stop passing
`isEvm` to `AssetOptions`.
> - **Store/Actions**:
> - Add thunk `multichainIgnoreAssets(assetIds, accountId)`; keep
`ignoreTokens` flow for EVM, now provided `chainId` from UI.
> - **Tests**:
> - Update `hide-token-confirmation-modal` tests to assert `chainId`
passed to `ignoreTokens` and existing flows.
> - **Dependencies**:
>   - Bump `@metamask/assets-controllers` to `^87.1.1`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
731f870. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Bernardo Garces Chapero <[email protected]>
…ata (#37662)

## **Description**

This PR makes it so that when:

- if we've determined that a user has opted in rewards
- if we can't determine the season status because of an API error
- there's no cached season status state

we show a distinct state for this edge case instead of showing 0 points.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/RWDS-772

## **Screenshots/Recordings**

### **After**

<img width="247" height="75" alt="image"
src="https://github.com/user-attachments/assets/3d3ab2bc-888f-4282-bf90-a510861c3e80"
/>

## **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]
> Display a "Couldn't load" error state for Rewards points when season
status fetch errors and no balance is available; adds i18n strings and
tests.
> 
> - **Rewards UI**:
> - Update `ui/components/app/rewards/RewardsPointsBalance.tsx` to
render an error badge ("Couldn't load") when `seasonStatusError` exists
and no `seasonStatus.balance`.
> - Integrate `useI18nContext` and adjust styles
(`bg-background-transparent`, `text-alternative`, alternative icon
color) for the error state.
> - **Localization**:
> - Add `rewardsPointsBalance_couldntLoad` to
`app/_locales/en/messages.json` and `app/_locales/en_GB/messages.json`.
> - **Tests**:
> - Expand `RewardsPointsBalance.test.tsx` with cases for error vs
loading states and mock the new i18n key; verify classes and rendered
text.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
93914fc. 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**

Add support for the Tron network through a preinstalled Tron Wallet Snap

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/35984?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: Added support for Tron

## **Related issues**

n/a

## **Manual testing steps**

1. Checkout this branch locally
2. Disable BIP44 changes using the `enableMultichainAccountsState2` flag
on the `.manifest-overrides.json`
3. After onboarding, "Create Tron account"

## **Screenshots/Recordings**

### **Before**

n/a

### **After**

<img width="1547" height="859" alt="Screenshot 2025-09-30 at 18 44 50"
src="https://github.com/user-attachments/assets/2e7439b5-d508-400d-8ad9-f05db9519396"
/>


## **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]
> Adds Tron network/account support powered by a preinstalled Tron
Wallet Snap, with address validation, UI flows, controllers, build
flags, and policies.
> 
> - **Multichain/Networks & Assets**
> - Introduces Tron networks (`TrxScope.{Mainnet,Nile,Shasta}`) with
nicknames, icons, block explorers, and native asset mappings (`TRX`,
CAIP19) in `shared/constants/multichain/{networks,assets}.ts` and
`shared/constants/network.ts`.
> - Extends network ordering and enablement to include Tron
(`TrxScope.Mainnet`).
> - **Snaps & Build**
> - Preinstalls `@metamask/tron-wallet-snap` in
`shared/lib/snaps/snaps.ts`, `app/scripts/constants/snaps.ts`, and
`builds.yml` (feature flag `tron`, assets copy rule).
> - Exposes Tron Snap IDs/names via
`shared/lib/accounts/tron-wallet-snap.ts`; whitelists in
`shared/lib/accounts/snaps.ts`.
> - **Accounts/Controllers**
> - Adds Tron provider to `MultichainAccountService` with enable/disable
via remote feature flags (`tronAccounts`) in
`app/scripts/controller-init/multichain/...`.
> - Updates network enablement init to include Tron and auto-enable EVM
mainnet when only a Tron/SOL/BTC network is enabled.
> - `metamask-controller`: counts/discovers/creates Tron accounts;
integrates Tron Snap client and types; updates tests accordingly.
> - **Validation & Utilities**
> - Implements Tron address validation (Base58/hex) in
`shared/lib/multichain/addresses/tron.ts` with tests; adds
`isTronAddress`, `isTronChainId` and recipient validations.
> - Maps Tron account types to snaps/names in
`shared/constants/multichain/accounts.ts`.
> - **UI**
> - Adds Tron to account creation flows, menus, wallet details, account
overview/details (`ui/components/...`, `ui/pages/...`); supports Tron in
send flow (type detection, recipients, validation, loader).
>   - Network manager shows Tron where applicable.
> - **Selectors**
> - Extends selectors for Tron enablement, detection, balances,
last-selected account, and multichain configs (`ui/selectors/...`).
> - **Localization & Assets**
> - Adds `networkNameTron` and `addNewTronAccountLabel` strings
(`app/_locales/*`); adds `app/images/tron-logo.svg`.
> - **Policies/Deps**
> - Adds dependency `@metamask/tron-wallet-snap` and `@scure/base` bump;
updates LavaMoat policies to reference `@scure/base` directly.
> - Updates `.depcheckrc.yml`, `.github/CODEOWNERS` (new networks path).
> - **Tests**
> - Adds unit tests for Tron address validation and multichain
selectors; updates controller tests for discovery counts.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f1c81bd. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: OGPoyraz <[email protected]>
Co-authored-by: MetaMask Bot <[email protected]>
Co-authored-by: Alejandro Garcia <[email protected]>
)

## **Description**

Upgrades @metamask/gator-permissions-snap from `^0.6.0` to `^0.6.1`
- Corrects Accounts API URL, which caused permission requests on Mainnet
to fail

https://github.com/MetaMask/snap-7715-permissions/releases/tag/v10.0.0

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37675?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 a bug causing advanced permissions requests on
mainnet to fail before showing the permission picker

## **Related issues**

Fixes:
MetaMask/delegator-readable-permissions#471

## **Manual testing steps**

1. Open Gator Permissions test page
2. Select Mainnet 
3. Request Permission

Expect permission picker to appear

## **Screenshots/Recordings**

<img width="512" height="732" alt="image"
src="https://github.com/user-attachments/assets/24973492-10d6-4de8-b504-18815ebf311f"
/>

## **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]
> Upgrades `@metamask/gator-permissions-snap` from `^0.6.0` to `^0.6.1`.
> 
> - **Dependencies**:
> - Bump `@metamask/gator-permissions-snap` from `^0.6.0` to `^0.6.1` in
`package.json`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9b4aacb. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…om-v5-compat (#37586)

<!--
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 migrate unlock, deeplink, defi page and MetaMetricsContext to
`react-router-dom-v5-compat`

<!--
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/37586?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: part of MetaMask/MetaMask-planning#3261

## **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 unlock, deep link, DeFi details, reveal-seed, and lock flows
to react-router-dom-v5-compat with a v5→v5-compat routing bridge; update
MetaMetrics page matching and tests accordingly.
> 
> - **Router / Navigation**:
> - Introduce `createV5CompatRoute` helper and use it across routes to
pass `navigate`, `location`, `params`, and wrappers.
> - Switch several routes to render v5-compat components (`UnlockPage`,
`DeepLink`, `DeFiPage`, `RevealSeedConfirmation`, swaps/bridge variants)
and wrap with `AuthenticatedV5Compat`/`InitializedV5Compat` where
needed.
> - Replace history pushes with `navigate` usage; update `ToastMaster`
instantiation to accept `location`.
> - **Components migrated to v5-compat props**:
> - `unlock-page`: accept `navigate`, read redirect from
`location.state` or `navState`; container injects `navState` and uses
`withRouterHooks`.
>   - `deep-link`: accept `location` prop from v5-compat.
> - `defi-details-page`: accept `navigate` and `params`; use `Navigate`
for redirects.
> - `reveal-seed`: accept `navigate` and optional `keyringId`; replace
history calls with `navigate`.
>   - `lock`: accept `navigate` and replace history with `navigate`.
> - **New / Updated HOCs & Context**:
> - Add `InitializedV5Compat` to gate routes by onboarding completion
(uses v5-compat `Navigate`).
> - MetaMetrics: use `react-router-dom-v5-compat` `matchPath` (v6-style)
with manual loop over `getPaths()` and normalize default route; update
effect deps and path comparisons to `match.pattern.path`.
> - **Tests / Stories / Docs**:
> - Update tests to `render-helpers-navigate`, v5-compat hooks
(`useNavigate`, `useParams`), and new props; snapshot updates.
>   - Update Unlock README and Story to use `navigate`/`location` props.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
3fcd4e9. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**


1. What is the reason for the change?
- Properties within segment events are just as important as the events
themselves these days. Properties are used to deduplicate events with
more details and are often more difficult to test than the mere event.
- Printing the properties by default will make event testing much easier
to debug.
- This server also did not support logging Identify events which are
fired when updating the user properties, logging these make it easier to
debug when these properties are updated.
3. What is the improvement/solution?
- Pretty print event properties that are fired with the events.
- This is a developer facing change and will have no impact on users.
- Add support for event type === identify

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37635?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**
- checkout this branch
- follow these exact steps:
https://github.com/MetaMask/metamask-extension/blob/main/development/README.md#segment
- Notice that there are now properties being logged with each event.


## **Screenshots/Recordings**

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

### **Before**

// Identify event (not supported)
```
[mock-segment]: Events received: [Unrecognized event type: identify]
[mock-segment]: POST /v1/batch
```

```
[mock-segment]: Events received: Account Menu Opened
[mock-segment]: POST /v1/batch
[mock-segment]: Events received: Account List Page
[mock-segment]: POST /v1/batch
[mock-segment]: Events received: Import Secret Recovery Phrase Page
[mock-segment]: POST /v1/batch
[mock-segment]: Events received: Home
[mock-segment]: POST /v1/batch
[mock-segment]: Events received: DeFi Stats
[mock-segment]: POST /v1/batch
[mock-segment]: Events received: [Unrecognized event type: identify]
...

[mock-segment]: Events received: [Unrecognized event type: identify]
[mock-segment]: POST /v1/batch
[mock-segment]: Events received: Port Stream Chunked
[mock-segment]: POST /v1/batch
[mock-segment]: Events received: Import Secret Recovery Phrase Completed
```

### **After**


// Identify event

```
[mock-segment]: Identify event received: 0x51c51cdfc644de86d3df8f612e349787cfd279e485ba472bc59c6a50d18b11f0
{
  "address_book_entries": 12,
  "number_of_accounts": 36,
  "petname_addresses_count": 12
}
```

// Importing a new wallet
```
[mock-segment]: Track event received: Account Menu Opened
{
  "location": "Home",
  "category": "Navigation",
  "locale": "en",
  "chain_id": "0xaa36a7",
  "environment_type": "popup"
}
[mock-segment]: Page event received: Account List Page
{
  "params": {},
  "locale": "en",
  "chain_id": "0xaa36a7",
  "environment_type": "popup"
}
[mock-segment]: Page event received: Import Secret Recovery Phrase Page
{
  "params": {},
  "locale": "en",
  "chain_id": "0xaa36a7",
  "environment_type": "popup"
}
[mock-segment]: Page event received: Home
{
  "params": {},
  "locale": "en",
  "chain_id": "0xaa36a7",
  "environment_type": "popup"
}
[mock-segment]: Identify event received: 0x51c51cdfc644de86d3df8f612e349787cfd279e485ba472bc59c6a50d18b11f0
{
  "address_book_entries": 2,
  "number_of_accounts": 4,
  "number_of_hd_entropies": 2,
  "petname_addresses_count": 2
}
[mock-segment]: Track event received: DeFi Stats
{
  "totalMarketValueUSD": 0,
  "totalPositions": 0,
  "breakdown": [],
  "category": "DeFi",
  "locale": "en",
  "chain_id": "0xaa36a7",
  "environment_type": "background"
}
[mock-segment]: Track event received: Profile Activity Updated
{
  "event": {
    "feature_name": "Multichain Account Syncing",
    "action": "group_added",
    "profile_id": "4796375c-f5f1-4868-a761-6ff84eab8bad"
  },
  "category": "Backup And Sync",
  "locale": "en",
  "chain_id": "0xaa36a7",
  "environment_type": "background"
}

.....

[mock-segment]: Track event received: Import Secret Recovery Phrase Completed
{
  "hd_entropy_index": 1,
  "number_of_solana_accounts_discovered": 0,
  "number_of_bitcoin_accounts_discovered": 0,
  "locale": "en",
  "chain_id": "0xaa36a7",
  "environment_type": "background"
}
```

## **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]
> Improves `development/mock-segment.js` to log each Segment event with
type, name/id, and pretty-printed properties, adding support for
`identify` events.
> 
> - **Mock Segment Server (`development/mock-segment.js`)**:
> - Logs each event individually with type labels (`Track`, `Page`,
`Identify`) and name/id.
> - Pretty-prints event data: uses `event.properties` for non-identify
and `event.traits` for `identify`.
> - Adds support for `identify` events and handles unknown types
gracefully.
> - Simplifies output by removing request URL/method and aggregate
"Events received" summary.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a3d1061. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@metamaskbot
Copy link
Collaborator Author

Builds ready [ec2a0e6]
UI Startup Metrics (1258 ± 95 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1258109415049513271415
load109192113179011711225
domContentLoaded108491312828911621219
domInteractive231588161873
firstPaint69679132044711321220
backgroundConnect23722029410239259
firstReactRender3019132123146
getState23869112648
initialActions105112
loadScripts854679103488935985
setupStore1162231218
numNetworkReqs1367719670
BrowserifyPower User HomeuiStartup20651719323940223843239
load1121943177225014181772
domContentLoaded1108934176224913971762
domInteractive511815148123151
firstPaint673190150348710951503
backgroundConnect25122929317262293
firstReactRender604699136699
getState22515733761289337
initialActions108218
loadScripts874698147623711621476
setupStore19123252132
numNetworkReqs1016819547163195
WebpackStandard HomeuiStartup8677321305958831102
load630568105881629869
domContentLoaded623562102778621847
domInteractive191288151659
firstPaint184601067174197594
backgroundConnect251160122750
firstReactRender32206193842
getState1162031215
initialActions104111
loadScripts620560101675619837
setupStore1264561419
numNetworkReqs1367419670
WebpackPower User HomeuiStartup1000826177327712681773
load599519938128673938
domContentLoaded581509874113640874
domInteractive311387307887
firstPaint26968882258513882
backgroundConnect631124576172245
firstReactRender38374213942
getState1227614323134143
initialActions101011
loadScripts577507867111633867
setupStore13649122549
numNetworkReqs826213529126135
FirefoxBrowserifyStandard HomeuiStartup14751299206812915291723
load1243110815979412941457
domContentLoaded1243110815979412931457
domInteractive58332884354162
firstPaint------
backgroundConnect4224143194779
firstReactRender28226672743
getState1176461120
initialActions113122
loadScripts1217109114958512701414
setupStore13679111335
numNetworkReqs1266214757
BrowserifyPower User HomeuiStartup29102203456383741134563
load14761284184719417661847
domContentLoaded14751283184719417661847
domInteractive20390484144403484
firstPaint------
backgroundConnect3505312444088141244
firstReactRender74521351982135
getState197116605113203605
initialActions214134
loadScripts14231253176817616701768
setupStore1124229071115290
numNetworkReqs1226425778253257
WebpackStandard HomeuiStartup15651428197413615651922
load13231174163910613421587
domContentLoaded13231174163810613411587
domInteractive54302193258135
firstPaint------
backgroundConnect45201282449110
firstReactRender332481103546
getState147124171247
initialActions103122
loadScripts1294115815699513111529
setupStore16693181270
numNetworkReqs1366917762
WebpackPower User HomeuiStartup29202299392443630253924
load16241380205120317902051
domContentLoaded16241380205120317892051
domInteractive1686842499231424
firstPaint------
backgroundConnect295102973237434973
firstReactRender69541081577108
getState14810219829169198
initialActions213123
loadScripts15661347196417816791964
setupStore20252558173384558
numNetworkReqs1236726368212263

…p-13.10.0 (#37986)

- fix: added support link to unlock page (#37967)

<!--
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/37967?quickstart=1)

In this PR, we have enabled the MetaMask Support link in unlock page.

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

Figma Link:

https://www.figma.com/design/pViOUcmjwhEzFsdrwknpNc/Onboarding-Redesign?node-id=18656-27472&m=dev


## **Changelog**

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

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

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

CHANGELOG entry: added the support link back in unlock page.

## **Related issues**

Fixes:

## **Manual testing steps**

1. Open Extension
2. Create Wallet
3. Lock the app
4. Validate changes in unlock page.
5.

## **Screenshots/Recordings**

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

### **Before**

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

<img width="1728" height="1007" alt="Screenshot 2025-11-19 at 1 06
31 PM"

src="https://github.com/user-attachments/assets/9dbf610c-1d7a-4aad-9a9f-de52bc23a71a"
/>


### **After**

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

<img width="385" height="1002" alt="Screenshot 2025-11-19 at 12 51
52 PM"

src="https://github.com/user-attachments/assets/8172d54e-09d1-4eb7-ae85-b0b56fa9f1fc"
/>
<img width="381" height="994" alt="Screenshot 2025-11-19 at 12 52 07 PM"

src="https://github.com/user-attachments/assets/c29c2a40-dc66-402b-9812-63e008d116f2"
/>
<img width="498" height="761" alt="Screenshot 2025-11-19 at 12 52 37 PM"

src="https://github.com/user-attachments/assets/58f4cd6e-89c0-46b1-8b48-44fcf5f90c40"
/>
<img width="494" height="647" alt="Screenshot 2025-11-19 at 12 53 04 PM"

src="https://github.com/user-attachments/assets/69b15d7f-ff87-4d6d-b9cc-02d2f3379ff4"
/>
<img width="1727" height="987" alt="Screenshot 2025-11-19 at 12 53
20 PM"

src="https://github.com/user-attachments/assets/1eeabfae-30c7-4dd0-8090-0701eb8cba88"
/>
<img width="1722" height="1031" alt="Screenshot 2025-11-19 at 12 53
38 PM"

src="https://github.com/user-attachments/assets/e5eea7ee-d609-4956-b397-a29b75e74e93"
/>


## **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]
> Adds a help/support link to the unlock page and tweaks horizontal logo
spacing with a popup-specific style, wiring `isPopup` from container to
component.
> 
> - **Unlock Page UI** (`ui/pages/unlock-page/unlock-page.component.js`)
> - Add persistent "Need help?" text with link to `SUPPORT_LINK` and
tracking.
> - Reduce "Forgot password?" button bottom margin (`marginBottom` 6 →
4).
> - Apply popup-specific class to `MetaFoxHorizontalLogo` when `isPopup`
is true.
>   - Add `isPopup` to `PropTypes`.
> - **Styling** (`ui/pages/unlock-page/index.scss`)
> - Decrease `unlock-page__mascot-container__horizontal-logo`
margin-bottom (60px → 24px) and add `--popup` modifier (margin-bottom:
0).
> - **Container** (`ui/pages/unlock-page/unlock-page.container.js`)
> - Determine `isPopup` via `getEnvironmentType()` and pass to
component; reuse for restore-in-browser logic.
> - **Tests** (`__snapshots__/unlock-page.test.js.snap`)
> - Update snapshot to reflect new help text/link, spacing changes, and
logo class.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
477688e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Lwin <[email protected]>
[355e33f](355e33f)

Co-authored-by: Ganesh Suresh Patra <[email protected]>
Co-authored-by: Lwin <[email protected]>
@metamaskbot
Copy link
Collaborator Author

Builds ready [10ba674]
UI Startup Metrics (1195 ± 101 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup11951011157410112431417
load102286713438910741177
domContentLoaded101486213378910681171
domInteractive231491181973
firstPaint75971134438610491177
backgroundConnect20818826312212228
firstReactRender30195793551
getState24860113444
initialActions106113
loadScripts814675111885870950
setupStore1264151318
numNetworkReqs1367720672
BrowserifyPower User HomeuiStartup20001673301135423123011
load1098916174423013511744
domContentLoaded1087908173423113431734
domInteractive501914646117146
firstPaint46317210323099391032
backgroundConnect24222528114248281
firstReactRender56466976369
getState22816634465314344
initialActions102012
loadScripts856685146222010851462
setupStore19114182141
numNetworkReqs1007118042161180
WebpackStandard HomeuiStartup85071412591118501141
load619563103297609911
domContentLoaded612557100092603893
domInteractive1812125161454
firstPaint221601032251183896
backgroundConnect261281142857
firstReactRender3320127133750
getState1153341217
initialActions101011
loadScripts60955599090600883
setupStore1164651216
numNetworkReqs1367319871
WebpackPower User HomeuiStartup1114903189828314151898
load64354610251317681025
domContentLoaded625535980121742980
domInteractive331398327798
firstPaint34059985284570985
backgroundConnect611119869173198
firstReactRender43394624546
getState1408419931152199
initialActions101011
loadScripts622533972119734972
setupStore1262992629
numNetworkReqs836213428129134
FirefoxBrowserifyStandard HomeuiStartup14441299201512314651735
load1224111416369212601417
domContentLoaded1224111416359212601416
domInteractive52333604248143
firstPaint------
backgroundConnect4026155214485
firstReactRender27225162741
getState127203201021
initialActions203123
loadScripts1200109816148612381381
setupStore13682111248
numNetworkReqs1267015853
BrowserifyPower User HomeuiStartup28252163382751431163827
load15111283200422916492004
domContentLoaded15111283200422916482004
domInteractive20269412110307412
firstPaint------
backgroundConnect27875805236376805
firstReactRender67528797487
getState18381606133171606
initialActions213123
loadScripts14611235194623215641946
setupStore15726551156171551
numNetworkReqs1216825869229258
WebpackStandard HomeuiStartup16091450221515616291983
load13651219173411113841634
domContentLoaded13651219173411113841634
domInteractive58302463866159
firstPaint------
backgroundConnect46251472351104
firstReactRender342583113374
getState137146161134
initialActions103122
loadScripts13361180170210513621576
setupStore166208241249
numNetworkReqs1366816766
WebpackPower User HomeuiStartup28472451411337529604113
load15861397206416316842064
domContentLoaded15851396206416316842064
domInteractive1676335787255357
firstPaint------
backgroundConnect2168111792602651179
firstReactRender72571021485102
getState19010150488205504
initialActions41276327
loadScripts15311371179812116561798
setupStore11828538114128538
numNetworkReqs1236920151174201

<!--
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 13.10.0 changelog based on new cherry-picks

<!--
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/38050?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 Shield eligibility and error-state metrics with UI/flow updates,
refines multichain address UX and deep-linking, and bumps key
dependencies with build/config tweaks.
> 
> - **Shield (metrics + UX)**:
> - Metrics: add `ShieldPrioritySupportClicked`,
`ShieldEligibilityCohort{Assigned,Timeout}`, common tracking props
(`getShieldCommonTrackingProps`), error-state clicked events; refactor
existing events to use common props.
> - Eligibility: cohort assignment/timeout tracking in
`ui/contexts/shield`; e2e mocks include eligibility payload.
> - UI: paused toast now contextual (card/crypto) with tracking; entry
modal uses static image, responsive styles; settings banner/error
actions improved; support link action includes user IDs; CTA text
reflects trial status.
> - Deep link: `/shield` accepts `showShieldEntryModal=true` to open
settings and modal.
> - **Deep Links**:
> - Redirect `/predict` → `/prediction-markets`; export
`SETTINGS_ROUTE`.
> - **Multichain accounts (UI/behavior)**:
> - Network group avatars size/limit and alignment tweaks; hovered list
row renamed/styled; clicking row copies address (tests updated); header
uses `--header-height` CSS var.
> - **Confirmations/Navigation**:
> - Make cancel/submit flows async-safe, navigate appropriately (incl.
addEthereumChain → default route); gasless check null-safe;
sidepanel/popup open-in-browser handling; global menu adds
popup/sidepanel toggle and priority support tracking.
> - **Settings/Unlock UX**:
> - Mobile settings layout scroll fixes; unlock page spacing and
persistent “Need help?” support link; shield plan and claim form
spacing/responsiveness.
> - **Icons/Constants**:
>   - Add `Popup`, `Sidepanel` icons; new Shield enums and constants.
> - **Tests/Mocks**:
> - Update deep-link expectations, Shield entry modal/hovered
list/confirm footer tests; add subscription eligibility mock.
> - **Build/Config**:
> - Enable `METAMASK_SHIELD_ENABLED` by default; adjust build features
(remove `tron` from `main`); sidepanel env var cleanup.
> - **Dependencies**:
> - Bump `@metamask/bitcoin-wallet-snap` to `^1.6.0`,
`@metamask/core-backend` to `^4.1.0`; add `addons-linter/glob@^10.5.0`;
lockfile updates.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
fdcbb3b. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@metamaskbot
Copy link
Collaborator Author

Builds ready [115187a]
UI Startup Metrics (1277 ± 137 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12771085185113713531477
load1109943162212311891292
domContentLoaded1102938161012111831266
domInteractive2515118212181
firstPaint62290153544210921236
backgroundConnect24022032815243260
firstReactRender29206883149
getState23875112748
initialActions109113
loadScripts86970913801189461027
setupStore1172641219
numNetworkReqs1367619671
BrowserifyPower User HomeuiStartup18451529279231720392792
load1009828179325311731793
domContentLoaded998821177425111631774
domInteractive491714245107142
firstPaint67117717794709111779
backgroundConnect19618125317198253
firstReactRender52426255762
getState19114031752219317
initialActions101011
loadScripts81564415382399791538
setupStore1593471634
numNetworkReqs997118142140181
WebpackStandard HomeuiStartup8707281226928771117
load63057496779630842
domContentLoaded62256893875623830
domInteractive191294151659
firstPaint21361942213199800
backgroundConnect271285142864
firstReactRender32205983841
getState1152831319
initialActions102011
loadScripts61956692872620819
setupStore1263751319
numNetworkReqs1367119869
WebpackPower User HomeuiStartup1076918178725511641787
load67958811381577841138
domContentLoaded66157710831437181083
domInteractive34131163672116
firstPaint3366311403507211140
backgroundConnect53112626880262
firstReactRender40384214242
getState1409415621153156
initialActions101011
loadScripts65757510731407081073
setupStore1062661126
numNetworkReqs79631342287134
FirefoxBrowserifyStandard HomeuiStartup14821308203214115261804
load1242112115219012811430
domContentLoaded1242112015209012811429
domInteractive54332023555146
firstPaint------
backgroundConnect4426155234881
firstReactRender28224762943
getState137112151139
initialActions207122
loadScripts1216109714628412571405
setupStore155211221235
numNetworkReqs1267116761
BrowserifyPower User HomeuiStartup31042275463384143634633
load15691344223429119382234
domContentLoaded15691343223429119382234
domInteractive21787532163403532
firstPaint------
backgroundConnect4529714284438511428
firstReactRender83601291691129
getState220116560126232560
initialActions316136
loadScripts15121313201927019042019
setupStore1084730264144302
numNetworkReqs1257025673245256
WebpackStandard HomeuiStartup16751488227515917052067
load14181254190412714631714
domContentLoaded14181253190312714631714
domInteractive58312483364128
firstPaint------
backgroundConnect53271812458105
firstReactRender33258583442
getState147138181222
initialActions203123
loadScripts13841223186412014331649
setupStore14773121346
numNetworkReqs1366818766
WebpackPower User HomeuiStartup29552279414055732884140
load16351427203319718832033
domContentLoaded16351426203319718822033
domInteractive18182431116317431
firstPaint------
backgroundConnect3048910073223481007
firstReactRender79591281884128
getState1618832751162327
initialActions213123
loadScripts15811402193918117611939
setupStore13825550153180550
numNetworkReqs1246926672189266

@gauthierpetetin gauthierpetetin marked this pull request as ready for review November 20, 2025 15:49
@gauthierpetetin gauthierpetetin merged commit 207b2f6 into stable Nov 20, 2025
177 of 179 checks passed
@github-actions github-actions bot locked and limited conversation to collaborators Nov 20, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.