Skip to content

refactor(confirmations): use approval callbacks instead of prep mutations - #46060

Draft
pedronfigueiredo wants to merge 3 commits into
mainfrom
pnf/canonical-transaction-approval-preparation-handoff-implementation
Draft

refactor(confirmations): use approval callbacks instead of prep mutations#46060
pedronfigueiredo wants to merge 3 commits into
mainfrom
pnf/canonical-transaction-approval-preparation-handoff-implementation

Conversation

@pedronfigueiredo

@pedronfigueiredo pedronfigueiredo commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Related pull requests

Description

Extension now relies on TransactionController approval-time callbacks (isSponsored and shouldSign) instead of imperatively preparing approval metadata in the confirmation screen.

The confirmation UI still owns capability discovery and all client-specific behavior: Money Account withdrawal preparation, custom nonces, swap enrichment, Shield navigation, hardware signing navigation, gas-fee-token batch construction, and updateAndApproveTx dispatch. The controller now derives external signing internally, so the client no longer needs to mutate isExternalSign before approval.

Characterization coverage was updated for sponsored Smart Transactions, gas-fee-token flows, hardware sendBundle routing, and Money Account withdrawal.

Validation

  • npx jest --no-watchman ui/pages/confirmations/hooks/transactions/useTransactionConfirm.test.ts app/scripts/lib/transaction/hooks/index.test.ts

@github-actions

github-actions Bot commented Sep 4, 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.

@metamask-ci

metamask-ci Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

✨ Files requiring CODEOWNER review ✨

@MetaMask/confirmations (4 files, +202 -103)
  • 📁 app/
    • 📁 scripts/
      • 📁 lib/
        • 📁 transaction/
          • 📁 hooks/
            • 📄 index.test.ts +29 -1
            • 📄 index.ts +87 -0
  • 📁 ui/
    • 📁 pages/
      • 📁 confirmations/
        • 📁 hooks/
          • 📁 transactions/
            • 📄 useTransactionConfirm.test.ts +85 -33
            • 📄 useTransactionConfirm.ts +1 -69

@metamask-ci metamask-ci Bot added the team-confirmations Push issues to confirmations team label Sep 4, 2026
@github-actions github-actions Bot added the size-M label Sep 4, 2026
@pedronfigueiredo pedronfigueiredo changed the title refactor(confirmations): use canonical transaction approval preparation refactor(confirmations): use approval callbacks instead of prep mutations Sep 9, 2026
@metamask-ci

metamask-ci Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor
Builds ready [216c2d2]
⚡ Performance Benchmarks (Total: 🟢 12 pass · 🟡 9 warn · 🔴 4 fail)

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

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

Regressions (🔴 4 failures)

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

  • loadNewAccount/load_new_account: +188%
  • loadNewAccount/total: +188%
  • loadNewAccount/fcp: -15%
  • confirmTx/longTaskTotalDuration: +10%
  • confirmTx/longTaskMaxDuration: +29%
  • confirmTx/tbt: +18%
  • confirmTx/inp: -24%
  • confirmTx/fcp: -19%
  • confirmTx/lcp: -10%
  • bridgeUserActions/bridge_load_page: +12%
  • bridgeUserActions/bridge_load_asset_picker: +36%
  • bridgeUserActions/longTaskCount: +11%
  • bridgeUserActions/longTaskTotalDuration: -17%
  • bridgeUserActions/longTaskMaxDuration: -32%
  • bridgeUserActions/tbt: -75%
  • bridgeUserActions/fcp: -19%
  • bridgeUserActions/lcp: -16%
  • loadNewAccount/load_new_account: +193%
  • loadNewAccount/total: +193%
  • loadNewAccount/inp: -17%
  • loadNewAccount/fcp: -44%
  • loadNewAccount/lcp: +1207%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/inp: -24%
  • confirmTx/fcp: -39%
  • confirmTx/lcp: +1223%
  • bridgeUserActions/bridge_load_page: +212%
  • bridgeUserActions/bridge_load_asset_picker: +197%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +39%
  • bridgeUserActions/inp: +23%
  • bridgeUserActions/fcp: -58%
  • bridgeUserActions/lcp: +1214%
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/firstReactRender: -99%
  • startupStandardHome/initialActions: -33%
  • startupStandardHome/setupStore: +29%
  • startupStandardHome/longTaskCount: -33%
  • startupStandardHome/domInteractive: -27%
  • startupStandardHome/firstReactRender: -98%
  • startupStandardHome/initialActions: -50%
  • startupStandardHome/setupStore: +18%
  • startupStandardHome/fcp: -22%
  • startupPowerUserHome/uiStartup: -13%
  • startupPowerUserHome/domInteractive: -33%
  • startupPowerUserHome/backgroundConnect: -21%
  • startupPowerUserHome/firstReactRender: -99%
  • startupPowerUserHome/initialActions: -44%
  • startupPowerUserHome/setupStore: -79%
  • startupPowerUserHome/numNetworkReqs: -38%
  • startupPowerUserHome/fcp: -27%

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

  • 🟡 startupPowerUserHome/INP: p75 336ms
  • 🟡 startupPowerUserHome/LCP: p75 2.7s
User Journey Benchmarks · Samples: 5 · mock API 🔴 2
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🟢 [CI log]🟢 [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: +44%
  • onboardingImportWallet/confirmSrpToPwForm: +44%
  • onboardingImportWallet/pwFormToMetricsScreen: +29%
  • onboardingImportWallet/metricsToWalletReadyScreen: +31%
  • onboardingImportWallet/doneButtonToHomeScreen: -92%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -94%
  • onboardingImportWallet/longTaskCount: -100%
  • onboardingImportWallet/longTaskTotalDuration: -100%
  • onboardingImportWallet/longTaskMaxDuration: -100%
  • onboardingImportWallet/tbt: -100%
  • onboardingImportWallet/total: -91%
  • onboardingNewWallet/srpButtonToPwForm: -26%
  • onboardingNewWallet/createPwToRecoveryScreen: -32%
  • onboardingNewWallet/skipBackupToMetricsScreen: -26%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: -22%
  • onboardingNewWallet/doneButtonToAssetList: -45%
  • onboardingNewWallet/longTaskCount: -100%
  • onboardingNewWallet/longTaskTotalDuration: -100%
  • onboardingNewWallet/longTaskMaxDuration: -100%
  • onboardingNewWallet/tbt: -100%
  • onboardingNewWallet/total: -43%
  • solanaAssetDetails/assetClickToPriceChart: +303%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: +303%
  • solanaAssetDetails/inp: +11%
  • solanaAssetDetails/fcp: +20%
  • solanaAssetDetails/lcp: +12%
  • importSrpHome/loginToHomeScreen: -21%
  • importSrpHome/longTaskCount: -23%
  • importSrpHome/longTaskTotalDuration: -46%
  • importSrpHome/longTaskMaxDuration: -62%
  • importSrpHome/tbt: -70%
  • importSrpHome/inp: -61%
  • importSrpHome/cls: +474%
  • sendTransactions/openSendPageFromHome: +41%
  • sendTransactions/selectTokenToSendFormLoaded: -15%
  • sendTransactions/reviewTransactionToConfirmationPage: -98%
  • sendTransactions/longTaskCount: -100%
  • sendTransactions/longTaskTotalDuration: -100%
  • sendTransactions/longTaskMaxDuration: -100%
  • sendTransactions/tbt: -100%
  • sendTransactions/total: -95%
  • sendTransactions/inp: -37%
  • sendTransactions/lcp: -58%
  • sendTransactions/cls: +171%
  • swap/openSwapPageFromHome: +210%
  • swap/fetchAndDisplaySwapQuotes: +85%
  • swap/longTaskCount: -100%
  • swap/longTaskTotalDuration: -100%
  • swap/longTaskMaxDuration: -100%
  • swap/tbt: -100%
  • swap/total: +88%
  • swap/fcp: +11%
  • swap/lcp: -50%
  • swap/cls: -92%

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

  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 importSrpHome/FCP: p75 1.8s
  • 🟡 swap/FCP: p75 2.0s
  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.8s
  • 🟡 importSrpHome/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: -67%
  • dappPageLoad/domContentLoaded: -24%
  • dappPageLoad/firstPaint: -55%
  • dappPageLoad/firstContentfulPaint: -55%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 51.2 KiB (0.34%)
  • ui: -78.17 KiB (-0.41%)
  • common: 0 Bytes (0%)
  • other: 1.97 KiB (0.1%)
  • contentScripts: 592 Bytes (0.03%)
  • zip: -1.93 KiB (-0.01%)

@sonarqubecloud

sonarqubecloud Bot commented Sep 9, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
68.2% Coverage on New Code (required ≥ 80%)

See analysis details on SonarQube Cloud

@metamask-ci

metamask-ci Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor
Builds ready [4a25d8d]
⚡ Performance Benchmarks (Total: 🟢 18 pass · 🟡 4 warn · 🔴 3 fail)

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

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

Regressions (🔴 3 failures)

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

  • loadNewAccount/load_new_account: +188%
  • loadNewAccount/total: +188%
  • loadNewAccount/fcp: -15%
  • loadNewAccount/lcp: -20%
  • confirmTx/longTaskTotalDuration: +14%
  • confirmTx/longTaskMaxDuration: +31%
  • confirmTx/tbt: +24%
  • confirmTx/inp: -17%
  • confirmTx/fcp: -17%
  • confirmTx/lcp: -17%
  • bridgeUserActions/bridge_load_page: +20%
  • bridgeUserActions/bridge_load_asset_picker: -14%
  • bridgeUserActions/longTaskCount: +67%
  • bridgeUserActions/longTaskTotalDuration: +57%
  • bridgeUserActions/tbt: +41%
  • bridgeUserActions/fcp: -14%
  • bridgeUserActions/lcp: -13%
  • loadNewAccount/load_new_account: +192%
  • loadNewAccount/total: +192%
  • loadNewAccount/lcp: +1162%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/inp: -24%
  • confirmTx/fcp: -44%
  • confirmTx/lcp: +1167%
  • bridgeUserActions/bridge_load_page: +209%
  • bridgeUserActions/bridge_load_asset_picker: +204%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +39%
  • bridgeUserActions/inp: +31%
  • bridgeUserActions/fcp: -64%
  • bridgeUserActions/lcp: +1235%

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

  • 🟡 loadNewAccount/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]🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/firstReactRender: -99%
  • startupStandardHome/initialActions: -33%
  • startupStandardHome/setupStore: +29%
  • startupStandardHome/longTaskCount: -33%
  • startupStandardHome/uiStartup: -32%
  • startupStandardHome/load: -26%
  • startupStandardHome/domContentLoaded: -26%
  • startupStandardHome/domInteractive: -50%
  • startupStandardHome/backgroundConnect: -19%
  • startupStandardHome/firstReactRender: -99%
  • startupStandardHome/initialActions: -50%
  • startupStandardHome/loadScripts: -26%
  • startupStandardHome/setupStore: -14%
  • startupStandardHome/fcp: -39%
  • startupStandardHome/lcp: -25%
  • startupPowerUserHome/load: +10%
  • startupPowerUserHome/domInteractive: -27%
  • startupPowerUserHome/backgroundConnect: -11%
  • startupPowerUserHome/firstReactRender: -99%
  • startupPowerUserHome/initialActions: -44%
  • startupPowerUserHome/loadScripts: +10%
  • startupPowerUserHome/setupStore: -76%
  • startupPowerUserHome/numNetworkReqs: -49%
  • startupPowerUserHome/inp: +19%
  • startupPowerUserHome/fcp: -23%

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

  • 🟡 startupPowerUserHome/INP: p75 224ms
  • 🟡 startupPowerUserHome/LCP: p75 3.0s
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/srpButtonToSrpForm: +29%
  • onboardingImportWallet/confirmSrpToPwForm: +32%
  • onboardingImportWallet/doneButtonToHomeScreen: -92%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -94%
  • onboardingImportWallet/longTaskCount: -100%
  • onboardingImportWallet/longTaskTotalDuration: -100%
  • onboardingImportWallet/longTaskMaxDuration: -100%
  • onboardingImportWallet/tbt: -100%
  • onboardingImportWallet/total: -92%
  • onboardingNewWallet/srpButtonToPwForm: +23%
  • onboardingNewWallet/skipBackupToMetricsScreen: +18%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: +19%
  • onboardingNewWallet/doneButtonToAssetList: -81%
  • onboardingNewWallet/longTaskCount: -100%
  • onboardingNewWallet/longTaskTotalDuration: -100%
  • onboardingNewWallet/longTaskMaxDuration: -100%
  • onboardingNewWallet/tbt: -100%
  • onboardingNewWallet/total: -77%
  • solanaAssetDetails/assetClickToPriceChart: +217%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: +217%
  • solanaAssetDetails/inp: -29%
  • solanaAssetDetails/fcp: -13%
  • solanaAssetDetails/lcp: -15%
  • importSrpHome/loginToHomeScreen: -24%
  • importSrpHome/homeAfterImportWithNewWallet: +11%
  • importSrpHome/longTaskCount: -30%
  • importSrpHome/longTaskTotalDuration: -49%
  • importSrpHome/longTaskMaxDuration: -63%
  • importSrpHome/tbt: -66%
  • importSrpHome/inp: -61%
  • importSrpHome/cls: +477%
  • sendTransactions/openSendPageFromHome: +38%
  • sendTransactions/selectTokenToSendFormLoaded: -17%
  • sendTransactions/reviewTransactionToConfirmationPage: -98%
  • sendTransactions/longTaskCount: -100%
  • sendTransactions/longTaskTotalDuration: -100%
  • sendTransactions/longTaskMaxDuration: -100%
  • sendTransactions/tbt: -100%
  • sendTransactions/total: -95%
  • sendTransactions/inp: -33%
  • sendTransactions/lcp: -63%
  • sendTransactions/cls: +171%
  • swap/openSwapPageFromHome: +71%
  • swap/fetchAndDisplaySwapQuotes: +84%
  • swap/longTaskCount: +33%
  • swap/tbt: -53%
  • swap/total: +86%
  • swap/lcp: -74%
  • swap/cls: -92%

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

  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 importSrpHome/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: -59%
  • dappPageLoad/firstPaint: -37%
  • dappPageLoad/firstContentfulPaint: -37%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 51.5 KiB (0.35%)
  • ui: -58.99 KiB (-0.31%)
  • common: 0 Bytes (0%)
  • other: 1.97 KiB (0.1%)
  • contentScripts: 784 Bytes (0.04%)
  • zip: 3.58 KiB (0.02%)

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

Labels

size-M team-confirmations Push issues to confirmations team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant