Skip to content

Conversation

@metamaskbot
Copy link
Collaborator

@metamaskbot metamaskbot commented Nov 21, 2025

🚀 v13.10.1 Testing & Release Quality Process

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


📋 Key Processes

Testing Strategy

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

GitHub Signoff

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

Issue Resolution

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

Cherry-Picking Criteria

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

🗓️ Timeline and Milestones

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

✅ Signoff Checklist

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

Team sign-off checklist

  • Extension Platform

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

Bumps to 13.10.1 with fixes to token balance updates and dapp-swap fiat rates, removes an unnecessary permission, and applies an assets-controllers patch.

  • Assets/Controllers:
    • Patch TokenBalancesController to normalize account addresses to lowercase when updating tokenBalances (.yarn/patches/..., dist/TokenBalancesController.*).
    • Pass platform: 'extension' during TokenBalancesController init (app/scripts/controller-init/token-balances-controller-init.*).
  • Balances Update Hook:
    • Update useAssetsUpdateAllAccountBalances to dispatch updateBalancesFoAccounts(enabledChainIds, false); tests adjusted (ui/hooks/useAssetsUpdateAllAccountBalances.*).
  • Dapp Swap Comparison:
    • useDappSwapUSDValues now fetches fiat rates only for non-native tokens and maps Polygon native token rates; tests added/updated (ui/pages/.../useDappSwapUSDValues.*).
  • Permissions:
    • Remove tabs from MV3 permissions (app/manifest/v3/_base.json).
  • Release:
    • Version bump to 13.10.1 and changelog entry; apply yarn patch for @metamask/assets-controllers (package.json, CHANGELOG.md).

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

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

Builds ready [048d784]
UI Startup Metrics (1281 ± 105 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12811084165610513441436
load110493914259611801257
domContentLoaded109793414189511741251
domInteractive2614222262179
firstPaint64481129144111021235
backgroundConnect2372232547241250
firstReactRender30205573447
getState22862102543
initialActions104112
loadScripts8667151174949431027
setupStore1163031217
numNetworkReqs1367520672
BrowserifyPower User HomeuiStartup18961528249425021112494
load1098940153221013771532
domContentLoaded1086930151920813631519
domInteractive471712038101120
firstPaint80812815364529841536
backgroundConnect2422292536247253
firstReactRender55456966069
getState18816227128198271
initialActions102112
loadScripts856709127820411321278
setupStore16123251732
numNetworkReqs976918240160182
WebpackStandard HomeuiStartup87971912721238941195
load6405621039106630952
domContentLoaded6335561016102626931
domInteractive2012100171671
firstPaint206621019222181892
backgroundConnect271283133455
firstReactRender32205483842
getState1163441317
initialActions103111
loadScripts630555100699623920
setupStore1263851317
numNetworkReqs1367519672
WebpackPower User HomeuiStartup1103956183022812871830
load690594997130845997
domContentLoaded673582938122827938
domInteractive441417751105177
firstPaint42381942319831942
backgroundConnect51192295284229
firstReactRender44424924549
getState1449516726162167
initialActions102012
loadScripts669579926118817926
setupStore1172861028
numNetworkReqs816412524120125
FirefoxBrowserifyStandard HomeuiStartup15841419205612616271877
load1331121316029413791530
domContentLoaded1331121216019413781530
domInteractive62351924059158
firstPaint------
backgroundConnect47261762350100
firstReactRender29245853040
getState1287181122
initialActions203123
loadScripts1303119215699013471495
setupStore15793131329
numNetworkReqs1266516759
BrowserifyPower User HomeuiStartup31042332446975142504469
load14971305217823917112178
domContentLoaded14961305217823917102178
domInteractive20676504159452504
firstPaint------
backgroundConnect41672129845310321298
firstReactRender845411415101114
getState20383573124239573
initialActions213133
loadScripts14571269214324016832143
setupStore14926615172154615
numNetworkReqs1257025370229253
WebpackStandard HomeuiStartup16501453234817416492136
load13921250185111014221659
domContentLoaded13911250185011014211659
domInteractive58302033266127
firstPaint------
backgroundConnect51202443152119
firstReactRender33258383444
getState1375291226
initialActions103122
loadScripts13621233182210113891598
setupStore186223271470
numNetworkReqs1366917765
WebpackPower User HomeuiStartup32362544432060041364320
load16341500204213617462042
domContentLoaded16341500204113617452041
domInteractive20090446113320446
firstPaint------
backgroundConnect3766912093908091209
firstReactRender84611291895129
getState299120738195414738
initialActions328238
loadScripts15901460194313017161943
setupStore15145537134190537
numNetworkReqs1226025874238258

@metamaskbot metamaskbot added the release-13.10.1 Issue or pull request that will be included in release 13.10.1 label Nov 21, 2025
…m fetching list of all accounts balances (#38098)

- fix: cp-13.10.1 prevent account list from fetching list of all
accounts balances (#38065)

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

prevent token list from fetching balances for all accounts

<!--
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/38065?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: prevent token list from fetching balances for all
accounts

## **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]
> Pass `platform: 'extension'` to `TokenBalancesController` and switch
the hook’s `updateBalancesFoAccounts` flag to `false`, updating tests
accordingly.
> 
> - **Controllers**:
> - `TokenBalancesControllerInit` now passes `platform: 'extension'`
when constructing `TokenBalancesController`.
>   - Updated test to assert `platform: 'extension'` is provided.
> - **UI Hooks**:
> - `useAssetsUpdateAllAccountBalances` switches
`updateBalancesFoAccounts(enabledChainIds, false)` (from `true`).
> - Updated related tests to expect the new boolean argument and
re-render behavior.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6236adc. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->


[b5eaa85](b5eaa85)

Co-authored-by: Salim TOUBAL <[email protected]>
@metamaskbot
Copy link
Collaborator Author

Builds ready [e377454]
UI Startup Metrics (1222 ± 111 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12221065193611112781360
load106392416609911231202
domContentLoaded105792016539911141193
domInteractive2314214231867
firstPaint67982165642610671173
backgroundConnect2312192607235247
firstReactRender28196462841
getState22872112539
initialActions106112
loadScripts831687141298891965
setupStore1062231115
numNetworkReqs1367719673
BrowserifyPower User HomeuiStartup19151614291834621122918
load1036842174727513881747
domContentLoaded1026835174027513761740
domInteractive521415855133158
firstPaint68216917605059241760
backgroundConnect19518021711207217
firstReactRender54446865868
getState20714827637245276
initialActions104114
loadScripts842658153326611811533
setupStore221084181884
numNetworkReqs976318446165184
WebpackStandard HomeuiStartup8767541294988801132
load638579108986634848
domContentLoaded629574105682627834
domInteractive2013154181658
firstPaint223631060216214780
backgroundConnect271278142961
firstReactRender3520330313840
getState1152831317
initialActions102011
loadScripts626571104680623823
setupStore1254151319
numNetworkReqs1367519870
WebpackPower User HomeuiStartup1073887165828615121658
load65556210581507781058
domContentLoaded64055210401427591040
domInteractive321398328198
firstPaint3176810432975611043
backgroundConnect5191956647195
firstReactRender38364113941
getState1409915820153158
initialActions101011
loadScripts63655010301397491030
setupStore1262782527
numNetworkReqs765612125118121
FirefoxBrowserifyStandard HomeuiStartup15331347220113215591821
load1284115415949013041503
domContentLoaded1284115315939013041503
domInteractive55332293950158
firstPaint------
backgroundConnect4423209214772
firstReactRender28234542938
getState1277381125
initialActions214123
loadScripts1258113714978612791477
setupStore15880121343
numNetworkReqs1267016761
BrowserifyPower User HomeuiStartup29622354428061534674280
load15031280196419015621964
domContentLoaded15031280196419015621964
domInteractive21785508138334508
firstPaint------
backgroundConnect3659313394198581339
firstReactRender79591231787123
getState19790586128208586
initialActions317137
loadScripts14651253192518815251925
setupStore10421561121111561
numNetworkReqs1146224874224248
WebpackStandard HomeuiStartup16611478241315916902020
load14071246184511914581691
domContentLoaded14061246184411914581690
domInteractive61302033475129
firstPaint------
backgroundConnect49252553055106
firstReactRender33268783442
getState147203211150
initialActions103122
loadScripts13751216173610814331627
setupStore157107131346
numNetworkReqs1366918766
WebpackPower User HomeuiStartup29522334458261935694582
load15801349218720717322187
domContentLoaded15791349218720717322187
domInteractive18870397116363397
firstPaint------
backgroundConnect3046212893667061289
firstReactRender72511262081126
getState1849846593212465
initialActions213123
loadScripts15411328207319016942073
setupStore13727709183110709
numNetworkReqs1145925778245257

<!--
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: dapp-swap comparison fiat rate fetching for native tokens

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

## **Manual testing steps**

1. Trigger swap including native tokens
2. Check that fait conversion in metrics is correct

## **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]
> Fetch fiat rates only for non-native tokens in the dapp-swap
comparison hook to correctly handle native assets.
> 
> - **Hooks**:
> - Update
`ui/pages/confirmations/hooks/transactions/dapp-swap-comparison/useDappSwapUSDValues.ts`
to filter out native addresses from `tokenAddresses` before calling
`fetchTokenExchangeRates('usd', ...)`, avoiding fiat rate requests for
native tokens.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7ff0f9b. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@github-actions
Copy link
Contributor

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

@metamaskbot
Copy link
Collaborator Author

metamaskbot commented Nov 21, 2025

✨ Files requiring CODEOWNER review ✨

@MetaMask/confirmations (2 files, +61 -8)
  • 📁 ui/
    • 📁 pages/
      • 📁 confirmations/
        • 📁 hooks/
          • 📁 transactions/
            • 📁 dapp-swap-comparison/
              • 📄 useDappSwapUSDValues.test.ts +41 -3
              • 📄 useDappSwapUSDValues.ts +20 -5

@metamaskbot
Copy link
Collaborator Author

Builds ready [eea4d3d]
UI Startup Metrics (1223 ± 85 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1223106914098512841379
load105692712647811111188
domContentLoaded105092212597811051182
domInteractive221395171870
firstPaint70482122241210741178
backgroundConnect2332182758236245
firstReactRender28205273043
getState22796122842
initialActions106112
loadScripts823688103677883957
setupStore1071931116
numNetworkReqs1367418670
BrowserifyPower User HomeuiStartup19291543309938221543099
load1034840183827612651838
domContentLoaded1019815180127212581801
domInteractive501515049120150
firstPaint72020618424528841842
backgroundConnect20018126619207266
firstReactRender564489116189
getState20714833160257331
initialActions102112
loadScripts833640156425910561564
setupStore17114781747
numNetworkReqs1026719350180193
WebpackStandard HomeuiStartup82569913661118221134
load6095561129101600907
domContentLoaded603551110898595894
domInteractive171177131453
firstPaint226591112239187896
backgroundConnect241275132651
firstReactRender30197993538
getState1041931315
initialActions103111
loadScripts600550109896592884
setupStore1153651220
numNetworkReqs1367720872
WebpackPower User HomeuiStartup1002830164623612111646
load597519787101744787
domContentLoaded57850676290667762
domInteractive311388307588
firstPaint31254765263527765
backgroundConnect61925772111257
firstReactRender38364323943
getState1237615923133159
initialActions101011
loadScripts57550475288659752
setupStore1062561125
numNetworkReqs765512825109128
FirefoxBrowserifyStandard HomeuiStartup15491414212914015661905
load1291119316068513141485
domContentLoaded1290119316058413131485
domInteractive54361733354153
firstPaint------
backgroundConnect50253213850146
firstReactRender29235252944
getState12797101222
initialActions213123
loadScripts1263117015007512881437
setupStore168216221338
numNetworkReqs1267015862
BrowserifyPower User HomeuiStartup29392341428762735844287
load15131316194519317151945
domContentLoaded15121315194419317151944
domInteractive21884549136370549
firstPaint------
backgroundConnect3607212203704771220
firstReactRender78531191786119
getState17897553106184553
initialActions51368336
loadScripts14591282190017915591900
setupStore1163738986165389
numNetworkReqs1146124671222246
WebpackStandard HomeuiStartup16481474228115916791992
load13911231173010814441631
domContentLoaded13901230173010814441631
domInteractive57302053267115
firstPaint------
backgroundConnect5227155246097
firstReactRender342686103550
getState13799111229
initialActions203123
loadScripts13591212165210413861604
setupStore166102181260
numNetworkReqs1366917865
WebpackPower User HomeuiStartup32102565452656237564526
load16941521211020519152110
domContentLoaded16941521211020519152110
domInteractive22694556142379556
firstPaint------
backgroundConnect3056113033296181303
firstReactRender77531251883125
getState287124700187322700
initialActions213133
loadScripts16451475205018618692050
setupStore14440517139150517
numNetworkReqs1156026274188262

…ol native token (#38136)

- fix: cp-13.10.1 dapp swap fix conversion rate for pol native token
(#38102)

<!--
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 conversion rate for POL native token.

## **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://github.com/MetaMask/MetaMask-planning/issues/6327

## **Manual testing steps**

1. Trigger swap including POL native token
2. Check that metrics are recorded correctly and dapp-swap UI shows
correct values

## **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]
> Fixes USD rate lookup for Polygon native token by mapping native
address to `0x0000000000000000000000000000000000001010` and adds tests.
> 
> - **Hooks**:
> - Update
`ui/pages/confirmations/hooks/transactions/dapp-swap-comparison/useDappSwapUSDValues.ts`
to adjust fiat rate fetching:
> - When `chainId === CHAIN_IDS.POLYGON`, map the native asset address
to the rate from `0x0000000000000000000000000000000000001010`.
> - Wrap rate fetching in an async function to inject the
Polygon-specific mapping.
> - **Tests**:
>   - Enhance `useDappSwapUSDValues.test.ts`:
> - Allow `runHook` to accept custom `tokenAddresses` and
`mockConfirmation`.
> - Add Polygon-specific test asserting correct fiat rates for native
POL (`0x...0000`) and `0x0000000000000000000000000000000000001010`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c7fe193. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->


[0aa98dc](0aa98dc)

Co-authored-by: Jyoti Puri <[email protected]>
@metamaskbot
Copy link
Collaborator Author

Builds ready [8f631e6]
UI Startup Metrics (1211 ± 93 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1211107414759312811385
load105693012798611171218
domContentLoaded104992412768611111203
domInteractive231484161972
firstPaint64980123942510641185
backgroundConnect2332182858237247
firstReactRender27185352936
getState2076592336
initialActions102112
loadScripts822685104686885967
setupStore1061821115
numNetworkReqs1367419670
BrowserifyPower User HomeuiStartup23311935324045426973240
load12511018186931717291869
domContentLoaded12341006183731017111837
domInteractive612316755123167
firstPaint816200181358410901813
backgroundConnect28323135631302356
firstReactRender695491107991
getState24217245475296454
initialActions216126
loadScripts974771152829514191528
setupStore221248102848
numNetworkReqs1006619747166197
WebpackStandard HomeuiStartup8327081197958291106
load60855196182604878
domContentLoaded60154794579598855
domInteractive171265121451
firstPaint20959868201198697
backgroundConnect251075152765
firstReactRender311973103546
getState1152231215
initialActions102111
loadScripts59854593277596845
setupStore1163441216
numNetworkReqs1367519871
WebpackPower User HomeuiStartup1066915162419411311624
load659570962112690962
domContentLoaded641559933101686933
domInteractive331399337499
firstPaint19960576131311576
backgroundConnect52101765665176
firstReactRender42376154261
getState1395118335159183
initialActions101011
loadScripts63755792398684923
setupStore96254825
numNetworkReqs775812524108125
FirefoxBrowserifyStandard HomeuiStartup14671303193512915001757
load1238112614708112811442
domContentLoaded1237112614708112811442
domInteractive54331873459156
firstPaint------
backgroundConnect4124115164683
firstReactRender27225262742
getState1073941020
initialActions103122
loadScripts1214110714437612541390
setupStore137139141130
numNetworkReqs1266915756
BrowserifyPower User HomeuiStartup29282162409753935604097
load14871304192819617641928
domContentLoaded14871303192819617641928
domInteractive20866467134395467
firstPaint------
backgroundConnect3577911093727431109
firstReactRender78551201985120
getState24089659189216659
initialActions213133
loadScripts14211268172716016091727
setupStore13630548150120548
numNetworkReqs1155926175224261
WebpackStandard HomeuiStartup16091446227516116132127
load13681212201412313931620
domContentLoaded13681211201412313921619
domInteractive58303464562121
firstPaint------
backgroundConnect47211892751116
firstReactRender33257983542
getState13752101150
initialActions103122
loadScripts13381194185010613671555
setupStore176151211263
numNetworkReqs1266816762
WebpackPower User HomeuiStartup29512367437953231574379
load16941474222224119272222
domContentLoaded16931474222224119272222
domInteractive22588749187332749
firstPaint------
backgroundConnect25646772228507772
firstReactRender75511011385101
getState19342696146243696
initialActions213133
loadScripts16321434209421518522094
setupStore1204745695155456
numNetworkReqs1156125464173254

runway-github bot and others added 2 commits November 21, 2025 19:29
…solve missing balance state (#38140)

- fix: cp-13.10.1 patch TokenBalancesController to resolve missing
balance state (#38126)

## **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/38126?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 missing native token balances in wallet balance

## **Related issues**

Fixes: #38114

## **Manual testing steps**

Onboard or existing user with AccountsAPI enabled
1. Go to a network with native + erc tokens
2. Notice aggregated wallet balance - it should have both native + erc
tokens aggregated together for the balance.

## **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://www.loom.com/share/aeccc8e3cef4479da0e9d44fc5ebf4fa

## **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]
> Patches `TokenBalancesController` to use lowercase account addresses
for balance reads/writes and wires the patched
`@metamask/[email protected]` via Yarn patch.
> 
> - **Assets Controllers Patch
(`@metamask/[email protected]`)**:
> - Normalize `account` to lowercase in `TokenBalancesController` when
reading/updating `d.tokenBalances` (cjs/mjs builds), ensuring balance
updates are applied.
> - **Dependencies**:
> - Switch `@metamask/assets-controllers` in `package.json` to a Yarn
patch source and add patched entry in `yarn.lock`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
75c9d95. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->


[a2fe8c4](a2fe8c4)

Co-authored-by: Prithpal Sooriya <[email protected]>
This PR updates the change log for 13.10.1. (Hotfix - no test plan
generated.)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Updates CHANGELOG with 13.10.1 fixes and adjusts version comparison
links.
> 
> - **Documentation** (`CHANGELOG.md`):
>   - **Add `13.10.1` – Fixed**:
>     - Prevent token list from fetching balances for all accounts.
>     - Correct dapp-swap comparison fiat rate for native tokens.
>     - Fix conversion rate for POL native token in dapp-swap.
>     - Remove unnecessary extension permission.
>     - Restore missing native token balances in wallet balance.
>   - **Links**:
>     - Update `[Unreleased]` compare link to start from `v13.10.1`.
>     - Add `[13.10.1]` compare link to `v13.10.0...v13.10.1`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b15b274. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: metamaskbot <[email protected]>
Co-authored-by: Gauthier Petetin <[email protected]>
@metamaskbot
Copy link
Collaborator Author

Builds ready [e97c9f7]
UI Startup Metrics (1195 ± 93 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1195105415789312481344
load103891913608210961174
domContentLoaded103191113428210821163
domInteractive231499181874
firstPaint668137135141010421199
backgroundConnect23221830813235249
firstReactRender2919175163041
getState20691112236
initialActions103113
loadScripts806686111081861934
setupStore1062631117
numNetworkReqs1367419670
BrowserifyPower User HomeuiStartup19521629274132422072741
load1026857138218312171382
domContentLoaded1015848137518412111375
domInteractive56181604795160
firstPaint58118210323269121032
backgroundConnect20318622912215229
firstReactRender56456886668
getState20214431454257314
initialActions102112
loadScripts829666116617710301166
setupStore17123981739
numNetworkReqs976718547164185
WebpackStandard HomeuiStartup85371112331118471139
load620563100494614897
domContentLoaded61255897489608863
domInteractive181277131554
firstPaint20158978187203594
backgroundConnect261272153165
firstReactRender3419298283647
getState1162531317
initialActions103111
loadScripts60955696386606853
setupStore1254051224
numNetworkReqs1367319871
WebpackPower User HomeuiStartup1077908155221813061552
load666569935125775935
domContentLoaded646559896109742896
domInteractive34131043471104
firstPaint33566899318745899
backgroundConnect59924073149240
firstReactRender40364324143
getState1389316025154160
initialActions101011
loadScripts642557885106732885
setupStore14630102530
numNetworkReqs795913028123130
FirefoxBrowserifyStandard HomeuiStartup14901287186213515501819
load12581102152110013001503
domContentLoaded12571102152110013001503
domInteractive57352183657160
firstPaint------
backgroundConnect45241922945114
firstReactRender26205452738
getState1174351221
initialActions207122
loadScripts1231108414849412731468
setupStore14696131342
numNetworkReqs1467920773
BrowserifyPower User HomeuiStartup29522369420558229724205
load14541309175614615691756
domContentLoaded14541309175514615691755
domInteractive20161491138352491
firstPaint------
backgroundConnect3569112354063521235
firstReactRender72511021279102
getState264111619163451619
initialActions318238
loadScripts14141268172914215271729
setupStore82312144392214
numNetworkReqs1146126876229268
WebpackStandard HomeuiStartup16741460244415316912014
load14071264182410514331670
domContentLoaded14071264182410514331670
domInteractive58312563365124
firstPaint------
backgroundConnect53272403257111
firstReactRender3526100113748
getState147123141351
initialActions203123
loadScripts1375124717399413981594
setupStore187126191455
numNetworkReqs1366717765
WebpackPower User HomeuiStartup32222360461467439344614
load16801491196814918541968
domContentLoaded16791491196714918541967
domInteractive20781574148349574
firstPaint------
backgroundConnect3988112013868571201
firstReactRender90611562595156
getState197100690137208690
initialActions214134
loadScripts16321465193414317841934
setupStore14026605160117605
numNetworkReqs1135525473188254

…ew warnings cp-13.10.1 (#38146)

- fix: Remove `tabs` permission to avoid new warnings cp-13.10.1
(#38075)

## **Description**

The recent addition of the `tabs` permission will result in new
permission warnings upon update, which is extremely disruptive and is
something we'd never do except as a last resort.

The permission wasn't actually needed, and has been removed. This
removal uncovered a bug in our Webpack build (the `tabs` permission was
erroneously only added for MV2 test builds, but we need it for MV3 test
builds as well), which has been fixed.

[![Open in GitHub

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

## **Changelog**

CHANGELOG entry: Remove unnecessary extension permission

## **Related issues**

N/A

## **Manual testing steps**

Test that the sidepanel still works in general. Particularly with dapp
confirmations, and the "Connected status" indicator, and current
selected dapp.

## **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).
- [ ] 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]
> Removes the `tabs` permission from the MV3 base manifest.
> 
> - **Manifest (MV3)**:
> - Update `app/manifest/v3/_base.json` to remove `permissions` entry
`tabs`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7778231. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->


[bba4201](bba4201)

Co-authored-by: Mark Stacey <[email protected]>
@gauthierpetetin gauthierpetetin marked this pull request as ready for review November 21, 2025 19:25
@gauthierpetetin gauthierpetetin requested a review from a team as a code owner November 21, 2025 19:25
if (chainId === CHAIN_IDS.POLYGON) {
const nativeAddress = getNativeAssetForChainId(chainId).address;
exchangeRates[nativeAddress] = exchangeRates[POLYGON_NATIVE_ASSET];
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Missing rate for Polygon native asset

The code copies the exchange rate from POLYGON_NATIVE_ASSET to the native address when on Polygon, but doesn't ensure POLYGON_NATIVE_ASSET is in the tokenAddresses array. Since native addresses are filtered out before fetching rates, if POLYGON_NATIVE_ASSET isn't in the original tokenAddresses, exchangeRates[POLYGON_NATIVE_ASSET] will be undefined, causing the native address to have an undefined rate. This breaks the intended functionality of providing rates for native tokens on Polygon.

Fix in Cursor Fix in Web

@metamaskbot
Copy link
Collaborator Author

Builds ready [fb60f40]
UI Startup Metrics (1309 ± 127 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup13091106172912713881582
load1133947154912212011377
domContentLoaded1127941154112111941371
domInteractive241690182077
firstPaint652100143545310931336
backgroundConnect2412282767244256
firstReactRender31196293451
getState21866112448
initialActions105112
loadScripts89271413081199561139
setupStore1172841220
numNetworkReqs1367619671
BrowserifyPower User HomeuiStartup18531395252030219452520
load996845136118812711361
domContentLoaded984830134718812641347
domInteractive431512441108124
firstPaint66422713703368891370
backgroundConnect20418822010215220
firstReactRender54437985879
getState19514929540217295
initialActions102112
loadScripts797652114418010631144
setupStore211051112651
numNetworkReqs946817238152172
WebpackStandard HomeuiStartup86873713251088701145
load630571109496619887
domContentLoaded622566106391612864
domInteractive2012158201666
firstPaint225621096242181868
backgroundConnect261171132856
firstReactRender332071103743
getState1162131318
initialActions106111
loadScripts619564105289610854
setupStore1264161319
numNetworkReqs1367619871
WebpackPower User HomeuiStartup1068892187628512751876
load67555910481718591048
domContentLoaded66054910241658341024
domInteractive34131183779118
firstPaint3537110273205641027
backgroundConnect50102526541252
firstReactRender39374224042
getState1389315522152155
initialActions102112
loadScripts65654710131618241013
setupStore1264010840
numNetworkReqs775813125107131
FirefoxBrowserifyStandard HomeuiStartup15021338206413015361800
load1263115215898913061470
domContentLoaded1262115215898913051470
domInteractive59353724953169
firstPaint------
backgroundConnect4227100154976
firstReactRender28225362945
getState147190201133
initialActions214123
loadScripts1238113215658612841435
setupStore14770101231
numNetworkReqs1266615757
BrowserifyPower User HomeuiStartup28822264438168935674381
load14931267208725417312087
domContentLoaded14921267208725417312087
domInteractive22981574162458574
firstPaint------
backgroundConnect2906213453792621345
firstReactRender75471051586105
getState20198713138207713
initialActions317137
loadScripts14491215203424416922034
setupStore15042476127199476
numNetworkReqs1155925976230259
WebpackStandard HomeuiStartup15871397218815415951927
load13431197188711813771613
domContentLoaded13421196188711813761612
domInteractive53292303160128
firstPaint------
backgroundConnect4524125195281
firstReactRender332480103445
getState146184191148
initialActions103122
loadScripts13151175179711113461589
setupStore15788141249
numNetworkReqs1367017764
WebpackPower User HomeuiStartup33122621462167837614621
load16981503199813918471998
domContentLoaded16981502199813918461998
domInteractive18889416114327416
firstPaint------
backgroundConnect3948713283898551328
firstReactRender936716027115160
getState245116477114318477
initialActions215125
loadScripts16541475194113618061941
setupStore21937699207445699
numNetworkReqs1186125372199253

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Test expectations don't match implementation parameter

The test expects updateBalancesFoAccounts to be called with true as the second parameter, but the implementation in useAssetsUpdateAllAccountBalances.ts line 40 calls it with false. This test will fail because the expectation doesn't match the actual behavior. The same issue occurs in lines 170 and 174 of this test file.

ui/hooks/useAssetsUpdateAllAccountBalances.test.ts#L72-L77

expect(mockDispatch).toHaveBeenCalledWith(
mockUpdateBalancesFoAccounts(mockChainIds, true),
);
expect(mockUpdateBalancesFoAccounts).toHaveBeenCalledWith(
mockChainIds,
true,

Fix in Cursor Fix in Web


@metamaskbot
Copy link
Collaborator Author

Builds ready [e3a108b]
UI Startup Metrics (1229 ± 95 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1229107714799512921402
load106391412528711231209
domContentLoaded105690912448611161202
domInteractive231499181876
firstPaint65670122043010831204
backgroundConnect2312182587234246
firstReactRender30215583446
getState24792132842
initialActions104113
loadScripts832695102185894974
setupStore1272741421
numNetworkReqs1367719669
BrowserifyPower User HomeuiStartup20061634329040123033290
load1115926192127213831921
domContentLoaded1101915190126913651901
domInteractive511719055109190
firstPaint59210514414299791441
backgroundConnect25022530822257308
firstReactRender574684106284
getState22215936856263368
initialActions103113
loadScripts867688161425311241614
setupStore19133562235
numNetworkReqs966718443157184
WebpackStandard HomeuiStartup84170613131108401163
load618563108497609914
domContentLoaded611556105492605886
domInteractive1912134191563
firstPaint216591083227196835
backgroundConnect251174142864
firstReactRender3119107113641
getState1163231217
initialActions101011
loadScripts608554104090602875
setupStore1164151220
numNetworkReqs1367519871
WebpackPower User HomeuiStartup1069911161023713061610
load680578996152890996
domContentLoaded666574979145851979
domInteractive36131113890111
firstPaint34069982332586982
backgroundConnect44101805146180
firstReactRender40384314143
getState1419516925155169
initialActions101111
loadScripts662572969142841969
setupStore96276827
numNetworkReqs74591242194124
FirefoxBrowserifyStandard HomeuiStartup14551313208613914971709
load1222112614917912711382
domContentLoaded1221112614917912701382
domInteractive52332703749146
firstPaint------
backgroundConnect44212312949118
firstReactRender27214652741
getState1174861123
initialActions203123
loadScripts1196110614067212391349
setupStore137191191225
numNetworkReqs1166214754
BrowserifyPower User HomeuiStartup29082160411555932774115
load14751296195019416751950
domContentLoaded14751295194919416731949
domInteractive20665498132273498
firstPaint------
backgroundConnect3398411443676891144
firstReactRender74561101577110
getState16211722228185222
initialActions41378337
loadScripts14351265188818316031888
setupStore17039541171226541
numNetworkReqs1166225273194252
WebpackStandard HomeuiStartup16631449244815316981974
load14041262174910514401642
domContentLoaded14041262174910514391642
domInteractive60302043266128
firstPaint------
backgroundConnect49261942453104
firstReactRender372693143882
getState156208231251
initialActions203123
loadScripts1374122816789914081583
setupStore167185221356
numNetworkReqs1367117765
WebpackPower User HomeuiStartup29612392446861333494468
load16251457209117017462091
domContentLoaded16241456209117017462091
domInteractive18570487121286487
firstPaint------
backgroundConnect3398410423275941042
firstReactRender80531241884124
getState16810839866193398
initialActions317137
loadScripts15831398201016117262010
setupStore802313031110130
numNetworkReqs1166026868181268

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants