Skip to content

chore(6635): validate TokenBalancesPoller isolation and AssetPollingContext memoization#42707

Open
Copilot wants to merge 3 commits into
mainfrom
copilot/extract-assets-side-effect
Open

chore(6635): validate TokenBalancesPoller isolation and AssetPollingContext memoization#42707
Copilot wants to merge 3 commits into
mainfrom
copilot/extract-assets-side-effect

Conversation

Copilot AI commented May 14, 2026

Copy link
Copy Markdown
Contributor

Two render-performance optimizations for the assets UI lacked test coverage: useTokenBalances isolation via TokenBalancesPoller and AssetPollingContext value memoization.

Fixes: https://github.com/MetaMask/MetaMask-planning/issues/6635
CHANGELOG entry: null

Changes

ui/contexts/assetPolling.test.tsx

  • Imports AssetPollingContext and AssetPollingContextValue (previously unused in tests)
  • Adds a memoization test that captures the context value across two renders and asserts referential identity (toBe), confirming the useMemo guard prevents context consumers from re-rendering on every AssetPollingProvider render

ui/components/multichain/account-overview/account-overview-tabs.test.tsx

  • Mocks useTokenBalances at the module level — previously the hook ran against the real store, relying on completedOnboarding being falsy to silently skip polling
  • Adds a TokenBalancesPoller describe block verifying that useTokenBalances is called with the enabled EVM chain IDs from Redux state:
expect(useTokenBalances).toHaveBeenCalledWith(
  expect.objectContaining({
    chainIds: expect.arrayContaining([CHAIN_IDS.MAINNET, CHAIN_IDS.POLYGON]),
  }),
);

Note

Low Risk
Test-only changes with no production logic modified.

Overview
Adds test-only coverage for two existing assets UI render-performance behaviors.

In account-overview-tabs.test.tsx, useTokenBalances is mocked module-wide with a shared beforeEach default return, and a new TokenBalancesPoller case asserts that rendering AccountOverviewTabs with enabled EVM networks in Redux triggers useTokenBalances with chainIds including mainnet and polygon.

In assetPolling.test.tsx, a context value memoization test re-renders AssetPollingProvider and checks the AssetPollingContext value keeps the same object reference across renders, guarding the useMemo stability behavior.

Reviewed by Cursor Bugbot for commit b5b13e8. Bugbot is set up for automated code reviews on this repo. Configure here.

…Context memoization

Agent-Logs-Url: https://github.com/MetaMask/metamask-extension/sessions/c94cdb5a-1d8d-41e0-b2cc-4060a80f5f24

Co-authored-by: DDDDDanica <12678455+DDDDDanica@users.noreply.github.com>
Copilot AI changed the title [WIP] Extract assets side-effect functionality test: validate TokenBalancesPoller isolation and AssetPollingContext memoization May 14, 2026
Copilot AI requested a review from DDDDDanica May 14, 2026 20:09
@metamaskbotv2

metamaskbotv2 Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

✨ Files requiring CODEOWNER review ✨

🔑 @MetaMask/accounts-engineers (1 files, +46 -4)
  • 📁 ui/
    • 📁 components/
      • 📁 multichain/
        • 📁 account-overview/
          • 📄 account-overview-tabs.test.tsx +46 -4

👨‍🔧 @MetaMask/core-extension-ux (1 files, +46 -4)
  • 📁 ui/
    • 📁 components/
      • 📁 multichain/
        • 📁 account-overview/
          • 📄 account-overview-tabs.test.tsx +46 -4

@sonarqubecloud

Copy link
Copy Markdown

@metamaskbotv2

metamaskbotv2 Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor
Builds ready [12a458a]
Deprecated Browserify fallback builds
⚡ Performance Benchmarks (Total: 🟢 14 pass · 🟡 11 warn · 🔴 0 fail)

Baseline (latest main): 51036da | Date: 5/2/2026 | Pipeline: 25882821219 | Baseline logs

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

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: -70%
  • loadNewAccount/total: -70%
  • bridgeUserActions/bridge_load_page: -39%
  • bridgeUserActions/bridge_load_asset_picker: -61%
  • bridgeUserActions/bridge_search_token: -29%
  • bridgeUserActions/total: -34%
  • loadNewAccount/load_new_account: -74%
  • loadNewAccount/total: -74%
  • bridgeUserActions/bridge_load_page: -18%
  • bridgeUserActions/bridge_load_asset_picker: -52%
  • bridgeUserActions/bridge_search_token: -37%
  • bridgeUserActions/total: -37%

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

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

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/uiStartup: -24%
  • startupStandardHome/load: -19%
  • startupStandardHome/domContentLoaded: -19%
  • startupStandardHome/domInteractive: -13%
  • startupStandardHome/firstPaint: -41%
  • startupStandardHome/backgroundConnect: -41%
  • startupStandardHome/firstReactRender: -30%
  • startupStandardHome/loadScripts: -19%
  • startupStandardHome/setupStore: -14%
  • startupStandardHome/numNetworkReqs: -50%
  • startupPowerUserHome/uiStartup: -32%
  • startupPowerUserHome/load: -13%
  • startupPowerUserHome/domContentLoaded: -13%
  • startupPowerUserHome/domInteractive: -22%
  • startupPowerUserHome/firstPaint: -49%
  • startupPowerUserHome/loadScripts: -13%
  • startupPowerUserHome/numNetworkReqs: -58%
  • startupStandardHome/uiStartup: -15%
  • startupStandardHome/domInteractive: -69%
  • startupStandardHome/backgroundConnect: -10%
  • startupStandardHome/initialActions: -40%
  • startupStandardHome/setupStore: -58%
  • startupStandardHome/numNetworkReqs: -45%
  • startupPowerUserHome/uiStartup: -46%
  • startupPowerUserHome/load: -21%
  • startupPowerUserHome/domContentLoaded: -21%
  • startupPowerUserHome/domInteractive: -43%
  • startupPowerUserHome/backgroundConnect: -51%
  • startupPowerUserHome/firstReactRender: -36%
  • startupPowerUserHome/initialActions: -50%
  • startupPowerUserHome/loadScripts: -19%
  • startupPowerUserHome/setupStore: -66%
  • startupPowerUserHome/numNetworkReqs: -53%

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

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

📈 Results compared to the previous 5 runs on main

  • onboardingImportWallet/srpButtonToSrpForm: -84%
  • onboardingImportWallet/pwFormToMetricsScreen: +580%
  • onboardingImportWallet/doneButtonToHomeScreen: -78%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: +20%
  • onboardingImportWallet/total: -44%
  • onboardingNewWallet/srpButtonToPwForm: -77%
  • onboardingNewWallet/createPwToRecoveryScreen: +1143%
  • onboardingNewWallet/skipBackupToMetricsScreen: -67%
  • onboardingNewWallet/doneButtonToAssetList: -57%
  • onboardingNewWallet/total: -48%
  • assetDetails/assetClickToPriceChart: -50%
  • assetDetails/total: -50%
  • solanaAssetDetails/assetClickToPriceChart: -61%
  • solanaAssetDetails/total: -61%
  • importSrpHome/loginToHomeScreen: -41%
  • importSrpHome/openAccountMenuAfterLogin: -78%
  • importSrpHome/homeAfterImportWithNewWallet: -68%
  • importSrpHome/total: -64%
  • swap/openSwapPageFromHome: -97%
  • swap/fetchAndDisplaySwapQuotes: +36%
  • swap/total: +13%

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

  • 🟡 onboardingNewWallet/INP: p75 216ms
  • 🟡 assetDetails/INP: p75 240ms
  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 importSrpHome/FCP: p75 2.0s
  • 🟡 sendTransactions/INP: p75 208ms
  • 🟡 sendTransactions/FCP: p75 1.9s
  • 🟡 swap/FCP: p75 2.0s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • dappPageLoad/pageLoadTime: +14%
Bundle size diffs
  • background: 58 Bytes (0%)
  • ui: 5 Bytes (0%)
  • common: 20 Bytes (0%)

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
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.

@metamaskbotv2

metamaskbotv2 Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor
Builds ready [b5b13e8] [reused from bfe479c]
Deprecated Browserify fallback builds
⚡ Performance Benchmarks (Total: 🟢 13 pass · 🟡 9 warn · 🔴 3 fail)

Baseline (latest main): bfe479c | Date: 6/9/2026 | Pipeline: 27229263285 | Baseline logs

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

Regressions (🔴 3 failures)

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

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: -49%
  • loadNewAccount/total: -49%
  • bridgeUserActions/bridge_load_page: -62%
  • bridgeUserActions/bridge_load_asset_picker: -48%
  • bridgeUserActions/bridge_search_token: -22%
  • bridgeUserActions/total: -35%
  • loadNewAccount/load_new_account: -38%
  • loadNewAccount/total: -38%
  • loadNewAccount/inp: +10%
  • loadNewAccount/fcp: -49%
  • loadNewAccount/lcp: +1285%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/fcp: -49%
  • confirmTx/lcp: +1263%
  • bridgeUserActions/bridge_load_asset_picker: -21%
  • bridgeUserActions/bridge_search_token: -24%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: -30%
  • bridgeUserActions/inp: +56%
  • bridgeUserActions/fcp: -52%
  • bridgeUserActions/lcp: +1115%
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
startupPowerUserHome
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/uiStartup: -14%
  • startupStandardHome/load: -16%
  • startupStandardHome/domContentLoaded: -16%
  • startupStandardHome/domInteractive: -30%
  • startupStandardHome/loadScripts: -15%
  • startupStandardHome/setupStore: -12%
  • startupStandardHome/numNetworkReqs: -47%
  • startupPowerUserHome/uiStartup: -25%
  • startupPowerUserHome/load: -12%
  • startupPowerUserHome/domContentLoaded: -12%
  • startupPowerUserHome/domInteractive: -29%
  • startupPowerUserHome/firstPaint: -22%
  • startupPowerUserHome/backgroundConnect: -50%
  • startupPowerUserHome/firstReactRender: +19%
  • startupPowerUserHome/loadScripts: -12%
  • startupPowerUserHome/setupStore: +17%
  • startupPowerUserHome/numNetworkReqs: -69%
  • startupStandardHome/load: +10%
  • startupStandardHome/domContentLoaded: +10%
  • startupStandardHome/domInteractive: -33%
  • startupStandardHome/backgroundConnect: +22%
  • startupStandardHome/firstReactRender: +29%
  • startupStandardHome/setupStore: -26%
  • startupStandardHome/numNetworkReqs: -19%
  • startupPowerUserHome/uiStartup: -20%
  • startupPowerUserHome/domInteractive: -49%
  • startupPowerUserHome/backgroundConnect: -65%
  • startupPowerUserHome/firstReactRender: +23%
  • startupPowerUserHome/setupStore: -34%
  • startupPowerUserHome/numNetworkReqs: -66%

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

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

📈 Results compared to the previous 5 runs on main

  • onboardingImportWallet/srpButtonToSrpForm: -50%
  • onboardingImportWallet/pwFormToMetricsScreen: +129%
  • onboardingImportWallet/metricsToWalletReadyScreen: -23%
  • onboardingImportWallet/doneButtonToHomeScreen: +118%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -23%
  • onboardingImportWallet/total: +94%
  • onboardingNewWallet/srpButtonToPwForm: -68%
  • onboardingNewWallet/createPwToRecoveryScreen: +155%
  • onboardingNewWallet/skipBackupToMetricsScreen: -55%
  • onboardingNewWallet/doneButtonToAssetList: +33%
  • onboardingNewWallet/total: +27%
  • assetDetails/assetClickToPriceChart: -62%
  • assetDetails/total: -62%
  • solanaAssetDetails/assetClickToPriceChart: -83%
  • solanaAssetDetails/total: -83%
  • importSrpHome/loginToHomeScreen: -10%
  • importSrpHome/openAccountMenuAfterLogin: -26%
  • importSrpHome/homeAfterImportWithNewWallet: -47%
  • importSrpHome/total: -42%
  • swap/openSwapPageFromHome: -91%
  • swap/fetchAndDisplaySwapQuotes: -33%
  • swap/total: -42%

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

  • 🟡 importSrpHome/INP: p75 304ms
  • 🟡 sendTransactions/INP: p75 240ms
  • 🟡 assetDetails/FCP: p75 2.1s
  • 🟡 solanaAssetDetails/FCP: p75 2.0s
  • 🟡 importSrpHome/FCP: p75 2.0s
  • 🟡 sendTransactions/FCP: p75 1.9s
  • 🟡 swap/FCP: p75 1.9s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • dappPageLoad/pageLoadTime: +10%
Bundle size diffs
  • background: 0 Bytes (0%)
  • ui: 0 Bytes (0%)
  • common: 0 Bytes (0%)

@DDDDDanica DDDDDanica changed the title test: validate TokenBalancesPoller isolation and AssetPollingContext memoization chore(6918): validate TokenBalancesPoller isolation and AssetPollingContext memoization Jun 9, 2026
@DDDDDanica DDDDDanica changed the title chore(6918): validate TokenBalancesPoller isolation and AssetPollingContext memoization chore(6635): validate TokenBalancesPoller isolation and AssetPollingContext memoization Jun 9, 2026
@DDDDDanica DDDDDanica marked this pull request as ready for review June 9, 2026 19:57
@DDDDDanica DDDDDanica requested review from a team as code owners June 9, 2026 19:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants