Skip to content

perf(6594): audit createDeepEqualSelector for confirmation selectors#43606

Draft
Copilot wants to merge 4 commits into
mainfrom
copilot/audit-createdeepequalselector
Draft

perf(6594): audit createDeepEqualSelector for confirmation selectors#43606
Copilot wants to merge 4 commits into
mainfrom
copilot/audit-createdeepequalselector

Conversation

Copilot AI commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

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

This updates the targeted confirmation and transaction selectors to stop using deep-equality memoization where controller-backed state already provides stable references. It also replaces a few per-ID transaction lookups with bounded parameterized selectors to avoid cache thrash across multiple transaction IDs.

  • Transactions: replace deep-equality selectors with standard memoization

    • incomingTxListSelectorAllChains
    • getApprovedAndSignedTransactions
    • incomingTxListSelector

    These now use createSelector directly over stable transaction/account inputs.

  • Approvals and confirmations: remove unnecessary deep memoization

    • selectPendingApprovalsForNavigation now uses createSelector
    • getUnapprovedConfirmations now uses createSelector

    This keeps the existing filtering behavior while removing deep comparison from selectors operating on immer-backed approval state.

  • Per-transaction selectors: switch to bounded parameterized caches

    • getUnapprovedTransactioncreateParameterizedSelector(20)
    • getTransactioncreateParameterizedSelector(50)
    • getFullTxDatacreateParameterizedSelector(20)

    getFullTxData was also adjusted to memoize on primitive override inputs separately instead of bundling them into a fresh object each call.

  • Confirmations account selector: parameterized by account

    • selectAccountGroupNameByInternalAccount now uses createParameterizedSelector(20)

    This keeps lookups scoped by account argument instead of relying on deep-equality over a synthesized input object.

  • Targeted selector coverage

    • Added focused assertions around parameterized transaction selector caching behavior.

Example:

const createTransactionSelector = createParameterizedSelector(50);

export const getTransaction = createTransactionSelector(
  getCurrentNetworkTransactions,
  (_, transactionId) => transactionId,
  (transactions, transactionId) =>
    transactions.find(({ id }) => id === transactionId) || EMPTY_OBJECT,
);

Copilot AI changed the title [WIP] Audit createDeepEqualSelector usages in Confirmations team perf(6594): audit createDeepEqualSelector for confirmation selectors Jun 16, 2026
Copilot AI requested a review from DDDDDanica June 16, 2026 12:16
@mm-token-exchange-service

Copy link
Copy Markdown

✨ Files requiring CODEOWNER review ✨

@MetaMask/confirmations (2 files, +16 -15)
  • 📁 ui/
    • 📁 pages/
      • 📁 confirmations/
        • 📁 selectors/
          • 📄 accounts.test.ts +1 -0
          • 📄 accounts.ts +15 -15

@DDDDDanica DDDDDanica force-pushed the copilot/audit-createdeepequalselector branch from 1496d75 to e2b7882 Compare June 16, 2026 12:45
@mm-token-exchange-service

Copy link
Copy Markdown
Builds ready [e2b7882]
Deprecated Browserify fallback builds
⚡ Performance Benchmarks (Total: 🟢 15 pass · 🟡 8 warn · 🔴 2 fail)

Baseline (latest main): f2d6439 | Date: 6/16/2026 | Pipeline: 27618481996 | Baseline logs

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

Regressions (🔴 2 failures)

Interaction Benchmarks · Samples: 5 🔴 1
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]
🔴 load_new_account
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

  • confirmTx/longTaskCount: +33%
  • confirmTx/longTaskTotalDuration: +15%
  • confirmTx/inp: -15%
  • bridgeUserActions/bridge_load_asset_picker: -19%
  • bridgeUserActions/longTaskTotalDuration: +18%
  • bridgeUserActions/longTaskMaxDuration: +16%
  • bridgeUserActions/tbt: +36%
  • bridgeUserActions/inp: -15%
  • loadNewAccount/load_new_account: +576%
  • loadNewAccount/total: +576%
  • loadNewAccount/fcp: -48%
  • loadNewAccount/lcp: +1135%
  • confirmTx/confirm_tx: +12%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +12%
  • confirmTx/lcp: +1189%
  • bridgeUserActions/bridge_load_page: +63%
  • bridgeUserActions/bridge_load_asset_picker: +65%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +11%
  • bridgeUserActions/inp: -15%
  • bridgeUserActions/lcp: +1203%

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

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

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/firstPaint: -10%
  • startupStandardHome/lcp: -11%
  • startupStandardHome/cls: -100%
  • startupPowerUserHome/numNetworkReqs: -17%
  • startupStandardHome/uiStartup: +12%
  • startupStandardHome/load: +11%
  • startupStandardHome/domContentLoaded: +11%
  • startupStandardHome/domInteractive: +19%
  • startupStandardHome/backgroundConnect: +19%
  • startupStandardHome/firstReactRender: +17%
  • startupStandardHome/initialActions: +11%
  • startupStandardHome/loadScripts: +11%
  • startupStandardHome/setupStore: +23%
  • startupStandardHome/inp: +15%
  • startupStandardHome/fcp: +16%
  • startupStandardHome/lcp: +11%
  • startupPowerUserHome/backgroundConnect: -29%

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

  • 🔴 startupPowerUserHome/INP: p75 576ms
  • 🟡 startupPowerUserHome/LCP: p75 2.8s
User Journey Benchmarks · Samples: 5 · mock API 🔴 1
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/doneButtonToHomeScreen: -88%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -98%
  • onboardingImportWallet/longTaskCount: -52%
  • onboardingImportWallet/longTaskTotalDuration: -87%
  • onboardingImportWallet/longTaskMaxDuration: -90%
  • onboardingImportWallet/tbt: -97%
  • onboardingImportWallet/total: -87%
  • onboardingNewWallet/longTaskTotalDuration: -32%
  • onboardingNewWallet/longTaskMaxDuration: -27%
  • onboardingNewWallet/tbt: -55%
  • solanaAssetDetails/assetClickToPriceChart: +38%
  • solanaAssetDetails/longTaskCount: +150%
  • solanaAssetDetails/longTaskTotalDuration: +165%
  • solanaAssetDetails/longTaskMaxDuration: +165%
  • solanaAssetDetails/tbt: +178%
  • solanaAssetDetails/total: +38%
  • solanaAssetDetails/inp: +23%
  • solanaAssetDetails/cls: -91%
  • importSrpHome/loginToHomeScreen: -11%
  • importSrpHome/openAccountMenuAfterLogin: +11%
  • importSrpHome/homeAfterImportWithNewWallet: -38%
  • importSrpHome/longTaskCount: -22%
  • importSrpHome/longTaskTotalDuration: -29%
  • importSrpHome/longTaskMaxDuration: -19%
  • importSrpHome/tbt: -33%
  • importSrpHome/total: -32%
  • importSrpHome/inp: -33%
  • sendTransactions/openSendPageFromHome: -28%
  • sendTransactions/selectTokenToSendFormLoaded: -29%
  • sendTransactions/tbt: +13%
  • sendTransactions/inp: -37%
  • sendTransactions/cls: -89%

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

  • 🟡 assetDetails/FCP: p75 2.0s
  • 🟡 solanaAssetDetails/FCP: p75 2.0s
  • 🟡 importSrpHome/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: 58 Bytes (0%)
  • ui: 2.61 KiB (0.02%)
  • common: -1.01 KiB (-0.01%)

@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.

@mm-token-exchange-service

Copy link
Copy Markdown
Builds ready [617e860]
Deprecated Browserify fallback builds
⚡ Performance Benchmarks (Total: 🟢 18 pass · 🟡 7 warn · 🔴 0 fail)

Baseline (latest main): 0d3dc67 | Date: 6/16/2026 | Pipeline: 27639348141 | 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]
🔴 bridge_search_token

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/inp: +40%
  • confirmTx/longTaskCount: +33%
  • confirmTx/longTaskTotalDuration: +15%
  • confirmTx/inp: -18%
  • bridgeUserActions/bridge_load_asset_picker: -13%
  • bridgeUserActions/longTaskCount: -29%
  • bridgeUserActions/longTaskTotalDuration: -17%
  • bridgeUserActions/inp: +17%
  • loadNewAccount/load_new_account: +42%
  • loadNewAccount/total: +42%
  • loadNewAccount/inp: -21%
  • loadNewAccount/fcp: -50%
  • loadNewAccount/lcp: +1050%
  • confirmTx/confirm_tx: +14%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +14%
  • confirmTx/inp: -18%
  • confirmTx/lcp: +1092%
  • bridgeUserActions/bridge_load_page: +93%
  • bridgeUserActions/bridge_load_asset_picker: +66%
  • bridgeUserActions/bridge_search_token: +272%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +220%
  • bridgeUserActions/inp: -30%
  • bridgeUserActions/fcp: -47%
  • bridgeUserActions/lcp: +1116%

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

  • 🟡 loadNewAccount/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/domInteractive: +10%
  • startupStandardHome/initialActions: +15%
  • startupStandardHome/longTaskCount: +15%
  • startupStandardHome/longTaskTotalDuration: +15%
  • startupStandardHome/longTaskMaxDuration: +12%
  • startupStandardHome/tbt: +13%
  • startupStandardHome/lcp: -30%
  • startupPowerUserHome/initialActions: +25%
  • startupPowerUserHome/cls: -100%
  • startupStandardHome/domInteractive: -11%
  • startupStandardHome/fcp: -10%
  • startupPowerUserHome/domInteractive: -17%
  • startupPowerUserHome/backgroundConnect: +27%
  • startupPowerUserHome/fcp: -18%

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

  • 🟡 startupPowerUserHome/INP: p75 480ms
  • 🟡 startupPowerUserHome/INP: p75 208ms
  • 🟡 startupPowerUserHome/LCP: p75 2.9s
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: +16%
  • onboardingImportWallet/confirmSrpToPwForm: +11%
  • onboardingImportWallet/pwFormToMetricsScreen: +10%
  • onboardingImportWallet/doneButtonToHomeScreen: -90%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -98%
  • onboardingImportWallet/longTaskCount: -72%
  • onboardingImportWallet/longTaskTotalDuration: -90%
  • onboardingImportWallet/longTaskMaxDuration: -91%
  • onboardingImportWallet/tbt: -98%
  • onboardingImportWallet/total: -89%
  • onboardingNewWallet/skipBackupToMetricsScreen: +14%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: +22%
  • onboardingNewWallet/doneButtonToAssetList: -29%
  • onboardingNewWallet/longTaskCount: -58%
  • onboardingNewWallet/longTaskTotalDuration: -51%
  • onboardingNewWallet/longTaskMaxDuration: -13%
  • onboardingNewWallet/tbt: -39%
  • onboardingNewWallet/total: -25%
  • solanaAssetDetails/assetClickToPriceChart: -60%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: -60%
  • solanaAssetDetails/lcp: +14%
  • solanaAssetDetails/cls: -93%
  • importSrpHome/loginToHomeScreen: -29%
  • importSrpHome/openAccountMenuAfterLogin: +25%
  • importSrpHome/homeAfterImportWithNewWallet: -38%
  • importSrpHome/longTaskCount: -25%
  • importSrpHome/longTaskTotalDuration: -40%
  • importSrpHome/longTaskMaxDuration: -29%
  • importSrpHome/tbt: -47%
  • importSrpHome/total: -37%
  • importSrpHome/inp: -25%
  • sendTransactions/openSendPageFromHome: -27%
  • sendTransactions/selectTokenToSendFormLoaded: +55%
  • sendTransactions/cls: -88%

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

  • 🟡 importSrpHome/INP: p75 208ms
  • 🟡 sendTransactions/INP: p75 216ms
  • 🟡 solanaAssetDetails/FCP: p75 1.8s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs
  • background: 58 Bytes (0%)
  • ui: -10 Bytes (0%)
  • common: -216 Bytes (0%)

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