Skip to content

feat: defi positions v2 controller - #44392

Merged
bergarces merged 84 commits into
mainfrom
defi-positions-v2
Jul 30, 2026
Merged

feat: defi positions v2 controller#44392
bergarces merged 84 commits into
mainfrom
defi-positions-v2

Conversation

@bergarces

@bergarces bergarces commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Description

A new set of UI pages, components and hooks have been created, all under the same folder, to fetch and display the contents of the new DeFi response in accounts-api.

All these changes are behind a feature flag, currently only enabled in dev.

Changelog

CHANGELOG entry: Changed DeFi tab to use new controller when the flag is enabled

Related issues

Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-3601
Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-3602
Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-3603

Manual testing steps

  1. Go to the DeFi tab
  2. A fetch to accounts api v6 for defi positions should trigger and positions for that account should load
  3. Moving again to the tab won't trigger another fetch (the stale time is defined in core-backend)
  4. Selecting the refresh option should trigger a new refetch (although it is possible that account-api are caching at their end)

Screenshots/Recordings

Before

After

feat_.defi.positions.v2.controller.by.bergarces.Pull.Request.44392.MetaMask_metamask-extension.-.28.July.2026.mp4

Pre-merge author checklist

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.

Note

Medium Risk
Touches home DeFi UX and background fetch via messenger with nuanced loading/error/account-group behavior, but changes are gated by a remote flag and V1 remains the default path.

Overview
Adds a DeFi Controller V2 experience (behind defiControllerV2) that loads protocol groups from DeFiPositionsControllerV2 via route messenger fetchDeFiPositions, with new tab list, protocol details, and mapping from V2 underlying positions into existing token cells.

When the flag is on, the DeFi tab and details route use useDeFiPositionsV2 (store-driven loading, group-scoped errors, forceRefresh on user refresh) and RouteWithMessenger with DEFI_ROUTE_ALLOWED_CAPABILITIES. When off, legacy V1 tab/details behavior is unchanged. DeFi tab implementation moves under ui/pages/defi/; the assets defi-tab entry re-exports the page module.

Asset list control bar gains optional onRefresh: with showImportTokenButton={false}, users get a more-options menu with Refresh list only (wired on the V2 DeFi tab). getImageForChainId now resolves EVM CAIP chain IDs for badges/icons.

Tests cover V2 hooks, pages, mappers, control bar refresh UX, and integration tests pin V2 off so they stay on V1 UI.

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

@bergarces
bergarces requested a review from a team as a code owner July 13, 2026 12:21
@github-actions

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.

@metamask-ci

metamask-ci Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

✨ Files requiring CODEOWNER review ✨

💎 @MetaMask/metamask-assets (5 files, +103 -21)
  • 📁 ui/
    • 📁 components/
      • 📁 app/
        • 📁 assets/
          • 📁 asset-list/
            • 📁 asset-list-control-bar/
              • 📄 asset-list-control-bar.test.tsx +40 -0
              • 📄 asset-list-control-bar.tsx +62 -0
          • 📁 defi-list/
            • 📄 defi-tab.ts +1 -0
            • 📄 defi-tab.tsx +0 -20
            • 📄 index.ts +0 -1

Comment thread shared/lib/defi-controller-v2/remote-feature-flag.ts Outdated
Comment thread ui/components/app/assets/defi-list/defi-list-v2.tsx Outdated
Comment thread ui/components/app/assets/defi-list/defi-list.tsx Outdated
@metamask-ci

metamask-ci Bot commented Jul 13, 2026

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

Baseline (latest main): 1716549 | Date: 6/29/2026 | Pipeline: 29249617158 | 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: -25%
  • loadNewAccount/total: -25%
  • loadNewAccount/inp: -18%
  • loadNewAccount/fcp: -11%
  • bridgeUserActions/bridge_load_page: -35%
  • bridgeUserActions/longTaskCount: +67%
  • bridgeUserActions/longTaskTotalDuration: +30%
  • bridgeUserActions/tbt: +11%
  • bridgeUserActions/inp: -14%
  • loadNewAccount/load_new_account: +55%
  • loadNewAccount/total: +55%
  • loadNewAccount/lcp: +1087%
  • confirmTx/confirm_tx: +15%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +15%
  • confirmTx/inp: +84%
  • confirmTx/lcp: +1156%
  • bridgeUserActions/bridge_load_page: +94%
  • bridgeUserActions/bridge_load_asset_picker: +46%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +32%
  • bridgeUserActions/inp: -14%
  • bridgeUserActions/lcp: +1246%

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

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

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/uiStartup: +25%
  • startupStandardHome/backgroundConnect: +17%
  • startupStandardHome/firstReactRender: +223%
  • startupStandardHome/numNetworkReqs: +50%
  • startupStandardHome/tbt: +12%
  • startupStandardHome/domInteractive: +64%
  • startupStandardHome/firstReactRender: +314%
  • startupStandardHome/setupStore: +45%
  • startupStandardHome/fcp: +61%
  • startupPowerUserHome/uiStartup: +13%
  • startupPowerUserHome/domInteractive: -29%
  • startupPowerUserHome/backgroundConnect: -14%
  • startupPowerUserHome/firstReactRender: +613%
  • startupPowerUserHome/inp: -16%
  • startupPowerUserHome/fcp: -30%

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

  • 🟡 startupPowerUserHome/LCP: p75 3.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]
🟡 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: -14%
  • onboardingImportWallet/pwFormToMetricsScreen: -16%
  • onboardingImportWallet/metricsToWalletReadyScreen: -38%
  • onboardingImportWallet/doneButtonToHomeScreen: -86%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -97%
  • onboardingImportWallet/longTaskCount: -100%
  • onboardingImportWallet/longTaskTotalDuration: -100%
  • onboardingImportWallet/longTaskMaxDuration: -100%
  • onboardingImportWallet/tbt: -100%
  • onboardingImportWallet/total: -86%
  • onboardingNewWallet/longTaskCount: -50%
  • onboardingNewWallet/longTaskTotalDuration: -70%
  • onboardingNewWallet/longTaskMaxDuration: -47%
  • onboardingNewWallet/tbt: -92%
  • solanaAssetDetails/assetClickToPriceChart: -58%
  • solanaAssetDetails/total: -58%
  • solanaAssetDetails/inp: -31%
  • importSrpHome/loginToHomeScreen: -14%
  • importSrpHome/homeAfterImportWithNewWallet: -28%
  • importSrpHome/longTaskCount: -44%
  • importSrpHome/longTaskTotalDuration: -43%
  • importSrpHome/longTaskMaxDuration: +24%
  • importSrpHome/tbt: -38%
  • importSrpHome/total: -27%
  • importSrpHome/inp: +15%
  • importSrpHome/lcp: -54%
  • importSrpHome/cls: -47%
  • sendTransactions/openSendPageFromHome: -34%
  • sendTransactions/selectTokenToSendFormLoaded: -40%
  • sendTransactions/longTaskCount: -20%
  • sendTransactions/longTaskTotalDuration: -25%
  • sendTransactions/tbt: -47%
  • sendTransactions/inp: -19%
  • sendTransactions/cls: -40%
  • swap/openSwapPageFromHome: -29%
  • swap/fetchAndDisplaySwapQuotes: +138%
  • swap/longTaskTotalDuration: -19%
  • swap/tbt: -73%
  • swap/total: +136%
  • swap/cls: -63%

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

  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 importSrpHome/INP: p75 304ms
  • 🟡 sendTransactions/FCP: p75 1.9s
  • 🟡 assetDetails/FCP: p75 2.0s
  • 🟡 solanaAssetDetails/FCP: p75 1.8s
  • 🔴 swap/INP: p75 720ms
  • 🟡 swap/FCP: p75 1.9s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle sizes
  • background: 14.22 MiB
  • ui: 17.08 MiB
  • common: 0 Bytes
  • other: 998.07 KiB
  • contentScripts: 1.87 MiB
  • zip: 27.04 MiB
No matching bundle-size baseline was found in the history data, so diff values are omitted.

@bergarces
bergarces requested review from a team as code owners July 13, 2026 13:20
Comment thread ui/pages/defi/components/defi-details-page-v2.tsx Outdated
Comment thread ui/pages/defi/pages/defi-details-page-v2.tsx
Comment thread ui/components/app/assets/defi-list/utils/group-defi-protocol-details.ts Outdated
Comment thread ui/components/app/assets/defi-list/hooks/useMultiAccountDefiBalances.ts Outdated
Comment thread ui/components/app/assets/defi-list/cells/defi-details-position-cell-v2.tsx Outdated
@metamask-ci

metamask-ci Bot commented Jul 13, 2026

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

Baseline (latest main): 1716549 | Date: 6/29/2026 | Pipeline: 29254573832 | 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: +40%
  • loadNewAccount/total: +40%
  • loadNewAccount/lcp: -12%
  • bridgeUserActions/bridge_load_page: -28%
  • bridgeUserActions/bridge_load_asset_picker: -13%
  • bridgeUserActions/longTaskCount: -17%
  • bridgeUserActions/longTaskTotalDuration: -14%
  • bridgeUserActions/inp: -14%
  • loadNewAccount/load_new_account: +52%
  • loadNewAccount/total: +52%
  • loadNewAccount/fcp: -46%
  • loadNewAccount/lcp: +1135%
  • confirmTx/confirm_tx: +12%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +12%
  • confirmTx/lcp: +1188%
  • bridgeUserActions/bridge_load_page: +134%
  • bridgeUserActions/bridge_load_asset_picker: +112%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +196%
  • bridgeUserActions/inp: -14%
  • bridgeUserActions/fcp: +11%
  • bridgeUserActions/lcp: +1263%

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

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

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/uiStartup: +27%
  • startupStandardHome/backgroundConnect: +10%
  • startupStandardHome/firstReactRender: +234%
  • startupStandardHome/numNetworkReqs: +50%
  • startupStandardHome/longTaskTotalDuration: +11%
  • startupStandardHome/tbt: +15%
  • startupStandardHome/firstReactRender: +321%
  • startupStandardHome/setupStore: +45%
  • startupPowerUserHome/uiStartup: +14%
  • startupPowerUserHome/domInteractive: -38%
  • startupPowerUserHome/backgroundConnect: -22%
  • startupPowerUserHome/firstReactRender: +632%
  • startupPowerUserHome/inp: -20%
  • startupPowerUserHome/fcp: -37%

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

  • 🟡 startupPowerUserHome/LCP: p75 3.8s
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]
🟡 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/metricsToWalletReadyScreen: -33%
  • onboardingImportWallet/doneButtonToHomeScreen: -86%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -63%
  • onboardingImportWallet/longTaskCount: -80%
  • onboardingImportWallet/longTaskTotalDuration: -94%
  • onboardingImportWallet/longTaskMaxDuration: -91%
  • onboardingImportWallet/tbt: -100%
  • onboardingImportWallet/total: -84%
  • onboardingNewWallet/longTaskCount: -50%
  • onboardingNewWallet/longTaskTotalDuration: -61%
  • onboardingNewWallet/longTaskMaxDuration: -37%
  • onboardingNewWallet/tbt: -79%
  • solanaAssetDetails/assetClickToPriceChart: -59%
  • solanaAssetDetails/total: -59%
  • solanaAssetDetails/inp: -31%
  • importSrpHome/loginToHomeScreen: -23%
  • importSrpHome/openAccountMenuAfterLogin: +134%
  • importSrpHome/homeAfterImportWithNewWallet: -23%
  • importSrpHome/longTaskCount: -44%
  • importSrpHome/longTaskTotalDuration: -38%
  • importSrpHome/tbt: -43%
  • importSrpHome/total: -21%
  • importSrpHome/lcp: -52%
  • importSrpHome/cls: -47%
  • sendTransactions/openSendPageFromHome: -25%
  • sendTransactions/selectTokenToSendFormLoaded: -50%
  • sendTransactions/reviewTransactionToConfirmationPage: -32%
  • sendTransactions/longTaskCount: -20%
  • sendTransactions/longTaskTotalDuration: -31%
  • sendTransactions/longTaskMaxDuration: -17%
  • sendTransactions/tbt: -85%
  • sendTransactions/total: -32%
  • sendTransactions/inp: -19%
  • sendTransactions/fcp: -12%
  • sendTransactions/lcp: -16%
  • sendTransactions/cls: -40%
  • swap/openSwapPageFromHome: -32%
  • swap/fetchAndDisplaySwapQuotes: +142%
  • swap/longTaskTotalDuration: -23%
  • swap/longTaskMaxDuration: -11%
  • swap/tbt: -89%
  • swap/total: +139%
  • swap/cls: -63%

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

  • 🟡 importSrpHome/INP: p75 272ms
  • 🟡 assetDetails/FCP: p75 1.8s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 importSrpHome/FCP: p75 1.8s
  • 🟡 sendTransactions/FCP: p75 2.0s
  • 🟡 swap/FCP: p75 1.9s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle sizes
  • background: 14.22 MiB
  • ui: 17.09 MiB
  • common: 0 Bytes
  • other: 998.07 KiB
  • contentScripts: 1.87 MiB
  • zip: 27.04 MiB
No matching bundle-size baseline was found in the history data, so diff values are omitted.

@bergarces
bergarces marked this pull request as draft July 13, 2026 15:18
@bergarces
bergarces marked this pull request as ready for review July 13, 2026 15:20
@bergarces
bergarces marked this pull request as draft July 13, 2026 15:20
Comment thread ui/pages/defi/pages/defi-list-v2.tsx
@metamask-ci

metamask-ci Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
Builds ready [2d05fde] [reused from 4757a65]
⚡ Performance Benchmarks (Total: 🟢 0 pass · 🟡 0 warn · 🔴 0 fail)

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

Interaction Benchmarks · Samples: 5

⚠️ Missing data: chrome/webpack/interactionUserActions, firefox/webpack/interactionUserActions

✅ No regressions detected

Startup Benchmarks · Samples: 100

⚠️ Missing data: chrome/webpack/startupStandardHome, chrome/webpack/startupPowerUserHome, firefox/webpack/startupStandardHome, firefox/webpack/startupPowerUserHome

✅ No regressions detected

User Journey Benchmarks · Samples: 5 · mock API

⚠️ Missing data: chrome/webpack/userJourneyOnboardingImport, chrome/webpack/userJourneyOnboardingNew, chrome/webpack/userJourneyAssets, chrome/webpack/userJourneyAccountManagement, chrome/webpack/userJourneyTransactions, firefox/webpack/userJourneyOnboardingImport, firefox/webpack/userJourneyOnboardingNew, firefox/webpack/userJourneyAssets, firefox/webpack/userJourneyAccountManagement, firefox/webpack/userJourneyTransactions

✅ No regressions detected

Dapp Page Load Benchmarks · Samples: 100

⚠️ Missing data: chrome/webpack/pageLoadBenchmark

✅ No regressions detected

Bundle size diffs: data not available.

Comment thread ui/pages/defi/hooks/useDeFiPositionsV2.ts
@metamask-ci

metamask-ci Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
Builds ready [3c1fc12]
⚡ Performance Benchmarks (Total: 🟢 16 pass · 🟡 8 warn · 🔴 0 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30373416162 | 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/inp: +14%
  • bridgeUserActions/bridge_load_page: +91%
  • bridgeUserActions/bridge_load_asset_picker: -12%
  • bridgeUserActions/longTaskCount: +11%
  • bridgeUserActions/tbt: +14%
  • loadNewAccount/inp: -24%
  • loadNewAccount/fcp: -41%
  • loadNewAccount/lcp: +1143%
  • confirmTx/confirm_tx: +11%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +11%
  • confirmTx/inp: -24%
  • confirmTx/fcp: -46%
  • confirmTx/lcp: +1233%
  • bridgeUserActions/bridge_load_page: +450%
  • bridgeUserActions/bridge_load_asset_picker: +117%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +38%
  • bridgeUserActions/inp: -15%
  • bridgeUserActions/fcp: -44%
  • bridgeUserActions/lcp: +1122%
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
startupPowerUserHome
[Sentry log · main/release]
🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • startupPowerUserHome/uiStartup: -12%
  • startupPowerUserHome/backgroundConnect: -23%
  • startupPowerUserHome/initialActions: +11%
  • startupPowerUserHome/setupStore: -77%
  • startupPowerUserHome/inp: -11%
  • startupPowerUserHome/lcp: -11%

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

  • 🟡 startupPowerUserHome/LCP: p75 2.5s
User Journey Benchmarks · Samples: 5 · mock API
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🟡 [CI log]
🟡 total
🟢 [CI log]
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: +12%
  • onboardingImportWallet/pwFormToMetricsScreen: +16%
  • onboardingImportWallet/metricsToWalletReadyScreen: -10%
  • onboardingImportWallet/doneButtonToHomeScreen: -79%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -51%
  • onboardingImportWallet/longTaskCount: -57%
  • onboardingImportWallet/longTaskTotalDuration: -94%
  • onboardingImportWallet/longTaskMaxDuration: -91%
  • onboardingImportWallet/tbt: -98%
  • onboardingImportWallet/total: -81%
  • onboardingNewWallet/srpButtonToPwForm: -28%
  • onboardingNewWallet/createPwToRecoveryScreen: -23%
  • onboardingNewWallet/skipBackupToMetricsScreen: -25%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: -31%
  • onboardingNewWallet/doneButtonToAssetList: -83%
  • onboardingNewWallet/longTaskCount: -100%
  • onboardingNewWallet/longTaskTotalDuration: -100%
  • onboardingNewWallet/longTaskMaxDuration: -100%
  • onboardingNewWallet/tbt: -100%
  • onboardingNewWallet/total: -80%
  • solanaAssetDetails/assetClickToPriceChart: -64%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: -64%
  • solanaAssetDetails/fcp: +11%
  • importSrpHome/loginToHomeScreen: -11%
  • importSrpHome/homeAfterImportWithNewWallet: -11%
  • importSrpHome/longTaskCount: -37%
  • importSrpHome/longTaskTotalDuration: -36%
  • importSrpHome/tbt: -36%
  • importSrpHome/total: -11%
  • importSrpHome/inp: -27%
  • importSrpHome/cls: +457%
  • sendTransactions/openSendPageFromHome: -31%
  • sendTransactions/reviewTransactionToConfirmationPage: -98%
  • sendTransactions/longTaskCount: -100%
  • sendTransactions/longTaskTotalDuration: -100%
  • sendTransactions/longTaskMaxDuration: -100%
  • sendTransactions/tbt: -100%
  • sendTransactions/total: -96%
  • sendTransactions/inp: -30%
  • sendTransactions/lcp: +275%
  • sendTransactions/cls: +171%

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

  • 🟡 importSrpHome/INP: p75 224ms
  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 importSrpHome/FCP: p75 2.1s
  • 🟡 sendTransactions/FCP: p75 1.9s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 246 Bytes (0%)
  • ui: 27.79 KiB (0.16%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 272 Bytes (0.01%)
  • zip: 7.58 KiB (0.04%)

@metamask-ci

metamask-ci Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
Builds ready [455b2cb]
⚡ Performance Benchmarks (Total: 🟢 15 pass · 🟡 8 warn · 🔴 1 fail)

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

Metricschrome-webpackfirefox-webpack
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]

Regressions (🔴 1 failure)

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]
🔴 bridge_load_page

📈 Results compared to the previous 5 runs on main

  • bridgeUserActions/bridge_load_page: +18%
  • bridgeUserActions/bridge_load_asset_picker: +24%
  • bridgeUserActions/longTaskCount: +11%
  • bridgeUserActions/longTaskTotalDuration: +10%
  • bridgeUserActions/tbt: +20%
  • loadNewAccount/inp: -24%
  • loadNewAccount/lcp: +1191%
  • confirmTx/confirm_tx: +10%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +10%
  • confirmTx/inp: -24%
  • confirmTx/fcp: +12%
  • confirmTx/lcp: +1207%
  • bridgeUserActions/bridge_load_page: +1991%
  • bridgeUserActions/bridge_load_asset_picker: +103%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +196%
  • bridgeUserActions/inp: -15%
  • bridgeUserActions/fcp: -46%
  • bridgeUserActions/lcp: +1180%

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

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

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/domInteractive: -29%
  • startupStandardHome/fcp: -26%
  • startupPowerUserHome/uiStartup: -12%
  • startupPowerUserHome/load: -12%
  • startupPowerUserHome/domContentLoaded: -12%
  • startupPowerUserHome/domInteractive: -14%
  • startupPowerUserHome/backgroundConnect: -12%
  • startupPowerUserHome/initialActions: +11%
  • startupPowerUserHome/loadScripts: -12%
  • startupPowerUserHome/setupStore: -77%
  • startupPowerUserHome/inp: -15%
  • startupPowerUserHome/fcp: -11%
  • startupPowerUserHome/lcp: -11%

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

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

📈 Results compared to the previous 5 runs on main

  • onboardingImportWallet/srpButtonToSrpForm: -17%
  • onboardingImportWallet/confirmSrpToPwForm: -16%
  • onboardingImportWallet/pwFormToMetricsScreen: -15%
  • onboardingImportWallet/doneButtonToHomeScreen: -81%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -64%
  • onboardingImportWallet/longTaskCount: -100%
  • onboardingImportWallet/longTaskTotalDuration: -100%
  • onboardingImportWallet/longTaskMaxDuration: -100%
  • onboardingImportWallet/tbt: -100%
  • onboardingImportWallet/total: -83%
  • onboardingNewWallet/srpButtonToPwForm: -11%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: -11%
  • onboardingNewWallet/longTaskCount: -100%
  • onboardingNewWallet/longTaskTotalDuration: -100%
  • onboardingNewWallet/longTaskMaxDuration: -100%
  • onboardingNewWallet/tbt: -100%
  • solanaAssetDetails/assetClickToPriceChart: -71%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: -71%
  • solanaAssetDetails/inp: -21%
  • solanaAssetDetails/lcp: -11%
  • importSrpHome/homeAfterImportWithNewWallet: -14%
  • importSrpHome/longTaskCount: -37%
  • importSrpHome/longTaskTotalDuration: -38%
  • importSrpHome/tbt: -44%
  • importSrpHome/total: -14%
  • importSrpHome/inp: -12%
  • importSrpHome/cls: +464%
  • sendTransactions/openSendPageFromHome: -23%
  • sendTransactions/selectTokenToSendFormLoaded: -14%
  • sendTransactions/reviewTransactionToConfirmationPage: -98%
  • sendTransactions/longTaskCount: -100%
  • sendTransactions/longTaskTotalDuration: -100%
  • sendTransactions/longTaskMaxDuration: -100%
  • sendTransactions/tbt: -100%
  • sendTransactions/total: -96%
  • sendTransactions/inp: -19%
  • sendTransactions/lcp: -65%
  • sendTransactions/cls: +171%

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

  • 🟡 importSrpHome/INP: p75 272ms
  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 sendTransactions/FCP: p75 2.0s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 238 Bytes (0%)
  • ui: 27.76 KiB (0.16%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 272 Bytes (0.01%)
  • zip: 7.56 KiB (0.04%)

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit eca0b90. Configure here.

Comment thread ui/pages/defi/components/defi-details-position-cell-v2.tsx Outdated
@metamask-ci

metamask-ci Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
Builds ready [93b6499]
⚡ Performance Benchmarks (Total: 🟢 12 pass · 🟡 11 warn · 🔴 1 fail)

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

Metricschrome-webpackfirefox-webpack
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]

Regressions (🔴 1 failure)

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/inp: +14%
  • confirmTx/inp: +21%
  • bridgeUserActions/longTaskCount: +11%
  • bridgeUserActions/inp: +15%
  • loadNewAccount/inp: -24%
  • loadNewAccount/fcp: +10%
  • loadNewAccount/lcp: +1191%
  • confirmTx/confirm_tx: +12%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +12%
  • confirmTx/inp: +21%
  • confirmTx/fcp: -49%
  • confirmTx/lcp: +1217%
  • bridgeUserActions/bridge_load_page: +291%
  • bridgeUserActions/bridge_load_asset_picker: +63%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +26%
  • bridgeUserActions/inp: +146%
  • bridgeUserActions/fcp: -45%
  • bridgeUserActions/lcp: +1142%

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

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

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/domInteractive: +19%
  • startupStandardHome/fcp: +23%
  • startupPowerUserHome/firstReactRender: -11%
  • startupPowerUserHome/initialActions: +11%
  • startupPowerUserHome/setupStore: -74%

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

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

📈 Results compared to the previous 5 runs on main

  • onboardingImportWallet/srpButtonToSrpForm: +13%
  • onboardingImportWallet/metricsToWalletReadyScreen: -10%
  • onboardingImportWallet/doneButtonToHomeScreen: -92%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -45%
  • onboardingImportWallet/longTaskCount: -86%
  • onboardingImportWallet/longTaskTotalDuration: -94%
  • onboardingImportWallet/longTaskMaxDuration: -88%
  • onboardingImportWallet/tbt: -96%
  • onboardingImportWallet/total: -80%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: -20%
  • onboardingNewWallet/longTaskCount: -69%
  • onboardingNewWallet/longTaskTotalDuration: -73%
  • onboardingNewWallet/longTaskMaxDuration: -37%
  • onboardingNewWallet/tbt: -82%
  • solanaAssetDetails/assetClickToPriceChart: -62%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: -62%
  • importSrpHome/longTaskCount: -37%
  • importSrpHome/longTaskTotalDuration: -43%
  • importSrpHome/tbt: -42%
  • importSrpHome/inp: -30%
  • importSrpHome/cls: +502%
  • sendTransactions/openSendPageFromHome: -13%
  • sendTransactions/selectTokenToSendFormLoaded: +13%
  • sendTransactions/reviewTransactionToConfirmationPage: -98%
  • sendTransactions/longTaskCount: -100%
  • sendTransactions/longTaskTotalDuration: -100%
  • sendTransactions/longTaskMaxDuration: -100%
  • sendTransactions/tbt: -100%
  • sendTransactions/total: -95%
  • sendTransactions/inp: -19%
  • sendTransactions/lcp: -60%
  • sendTransactions/cls: +171%

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

  • 🟡 importSrpHome/INP: p75 216ms
  • 🟡 assetDetails/FCP: p75 2.0s
  • 🟡 solanaAssetDetails/FCP: p75 2.0s
  • 🟡 importSrpHome/FCP: p75 2.1s
  • 🟡 sendTransactions/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: -18%
  • dappPageLoad/domContentLoaded: -12%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 246 Bytes (0%)
  • ui: 27.83 KiB (0.16%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 272 Bytes (0.01%)
  • zip: 7.63 KiB (0.04%)

showSortControl = true,
onNetworkSelect,
onRefresh,
}: AssetListControlBarProps) => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is fair, we have ticketed an overhaul to build the TDP from ground up (removing debt, cleaning surfaces, and improving DX)

@juanmigdr juanmigdr left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, just two minor

Comment on lines +52 to +58
const hasPositions = accountIds.some(
(id) => positionsByAccount[id] !== undefined,
);
const positions = useMemo(
() => mergePositionsForAccounts(positionsByAccount, accountIds),
[positionsByAccount, accountIds],
);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

One from cursor (marked as HIGH):

 false-positive error state on cold start
failedAccountGroup starts null; isError = failedAccountGroup === selectedAccountGroup. If selectedAccountGroup itself hasn't loaded yet (also null), null === null evaluates true on mount — before any fetch has failed. Since isLoading = !hasPositions && !isError, this can suppress the loading spinner and briefly show the error/redirect UI instead. Fix: track "not ready" separately from "errored" (e.g. a ref/flag) instead of comparing against the group id.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Added a null check to avoid that potential issue during cold starts.

return assetReference as TokenWithFiatAmount['address'];
}

return toChecksumHexAddress(assetReference) as TokenWithFiatAmount['address'];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Unguarded cast can crash the page... toChecksumHexAddress(assetReference) throws on a malformed CAIP asset id, and this mapper has no try/catch. It's called from useMemo in defi-details-position-cell-v2.tsx:23, so one malformed position from the controller would crash the whole details page with no visible error boundary

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Good catch, fixing now.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The function is now a bit more conscious about the different address types. I think we ought to create utils to move between assetId -> address and viceversa in assets-controller though.

@sonarqubecloud

Copy link
Copy Markdown

@metamask-ci

metamask-ci Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor
Builds ready [9f13bce]
⚡ Performance Benchmarks (Total: 🟢 17 pass · 🟡 6 warn · 🔴 1 fail)

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

Metricschrome-webpackfirefox-webpack
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]

Regressions (🔴 1 failure)

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/lcp: -11%
  • bridgeUserActions/bridge_load_asset_picker: +17%
  • bridgeUserActions/longTaskCount: +11%
  • loadNewAccount/inp: -17%
  • loadNewAccount/fcp: -65%
  • loadNewAccount/lcp: +888%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/inp: -32%
  • confirmTx/fcp: -67%
  • confirmTx/lcp: +967%
  • bridgeUserActions/bridge_load_page: +118%
  • bridgeUserActions/bridge_load_asset_picker: +28%
  • bridgeUserActions/bridge_search_token: -15%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/inp: -31%
  • bridgeUserActions/fcp: -69%
  • bridgeUserActions/lcp: +895%
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
startupPowerUserHome
[Sentry log · main/release]
🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/domInteractive: +44%
  • startupPowerUserHome/uiStartup: +10%
  • startupPowerUserHome/backgroundConnect: +23%
  • startupPowerUserHome/initialActions: +11%
  • startupPowerUserHome/setupStore: -67%

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

  • 🟡 startupPowerUserHome/LCP: p75 3.1s
User Journey Benchmarks · Samples: 5 · mock API 🔴 1
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🟡 [CI log]
🟡 total
🟢 [CI log]
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/metricsToWalletReadyScreen: -14%
  • onboardingImportWallet/doneButtonToHomeScreen: -79%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -52%
  • onboardingImportWallet/longTaskCount: -71%
  • onboardingImportWallet/longTaskTotalDuration: -92%
  • onboardingImportWallet/longTaskMaxDuration: -91%
  • onboardingImportWallet/tbt: -98%
  • onboardingImportWallet/total: -81%
  • onboardingNewWallet/doneButtonToAssetList: -80%
  • onboardingNewWallet/longTaskCount: -69%
  • onboardingNewWallet/longTaskTotalDuration: -77%
  • onboardingNewWallet/longTaskMaxDuration: -47%
  • onboardingNewWallet/tbt: -95%
  • onboardingNewWallet/total: -76%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/inp: +19%
  • solanaAssetDetails/fcp: +14%
  • importSrpHome/loginToHomeScreen: -11%
  • importSrpHome/homeAfterImportWithNewWallet: -17%
  • importSrpHome/longTaskCount: -30%
  • importSrpHome/longTaskTotalDuration: -28%
  • importSrpHome/tbt: -34%
  • importSrpHome/total: -16%
  • importSrpHome/inp: -12%
  • importSrpHome/cls: +586%
  • sendTransactions/openSendPageFromHome: -24%
  • sendTransactions/selectTokenToSendFormLoaded: +13%
  • sendTransactions/reviewTransactionToConfirmationPage: -98%
  • sendTransactions/longTaskCount: -100%
  • sendTransactions/longTaskTotalDuration: -100%
  • sendTransactions/longTaskMaxDuration: -100%
  • sendTransactions/tbt: -100%
  • sendTransactions/total: -95%
  • sendTransactions/inp: -19%
  • sendTransactions/lcp: -62%
  • sendTransactions/cls: +171%

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

  • 🟡 importSrpHome/INP: p75 272ms
  • 🟡 importSrpHome/FCP: p75 1.8s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 importSrpHome/FCP: p75 1.9s
  • 🟡 sendTransactions/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: -25%
  • dappPageLoad/domContentLoaded: -19%
  • dappPageLoad/firstPaint: -14%
  • dappPageLoad/firstContentfulPaint: -14%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 384 Bytes (0%)
  • ui: 30.53 KiB (0.17%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 552 Bytes (0.03%)
  • zip: 9.22 KiB (0.04%)

@MajorLift

MajorLift commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

🧪 Validation Run

Verdict: ⚠️ six renders where one would do, while the slice is unset — Claim: getDeFiPositionsV2 is a plain read needing no memoization. head ce134bc060c · 2026-08-02 · render-count check

Note

Trial run of the MetaMask evidence skills
feedback welcome, on the finding or on whether this format is useful to a reviewer.
Not a review verdict; nothing here blocks the PR.

A counting consumer under six unrelated store writes, run in CI twice: as committed, and with the empty case returning a stable reference. The arm-B edit is applied by the runner and reverted after.

Consumer render count

Verdict: delta measured: 6 → 1 renders with a stable empty-object constant

Arm Change consumer renders
A — as committed none 6
B — a stable empty-object constant ui/selectors/defi-controller-v2/positions.ts:18 1
$ yarn jest ui/selectors/defi-controller-v2/__render_probe__.test.tsx
RENDER_COUNT consumer=6 parentRenders=6
$ sed -i '18s|.*|  return state?.metamask?.allDeFiPositionsV2 ?? (globalThis.__EMPTY_DEFI ??= {});|' ui/selectors/defi-controller-v2/positions.ts && yarn jest ui/selectors/defi-controller-v2/__render_probe__.test.tsx
RENDER_COUNT consumer=1 parentRenders=6

This counts renders of one named consumer across a defined interaction. It is not a count
of consumers, and a larger consumer count does not imply a larger effect.

Produced by render-count.sh; the arm-B edit is reverted after the run. head ce134bc060ccd93d36c7587fca1b444a5adbc61a · 0 tracked changes · node v24.13.1. Run: https://github.com/MajorLift/metamask-skills/actions/runs/30749592308 — logs and artifacts attached there.

Follows from the arms above

  • positions.ts:18 returns state?.metamask?.allDeFiPositionsV2 ?? {}. Set: the stored reference, stable. Unset: a fresh object per call, so useSelector's reference check fires on every dispatch.
  • useDeFiPositionsV2 calls that state "not yet written to the UI store (still loading)" and passes the value into a useMemo dependency array, so mergePositionsForAccounts recomputes with the render.

Open for review: how much of a session sits in the unset state — cold start, account-group switch, an account with no positions. Arm B is an attribution control, not a proposed patch; it counts renders, not whether the output is equivalent.

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

Labels

release-13.43.0 Issue or pull request that will be included in release 13.43.0 risk:medium size-XL team-assets

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants