Skip to content

feat: add optimizations to QR code scanning process#43372

Open
david0xd wants to merge 2 commits into
mainfrom
dd/add-qr-scan-optimizations
Open

feat: add optimizations to QR code scanning process#43372
david0xd wants to merge 2 commits into
mainfrom
dd/add-qr-scan-optimizations

Conversation

@david0xd

@david0xd david0xd commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Description

This PR adds optimizations for QR code scanning which we're using in QR hardware wallet flows.

Changelog

CHANGELOG entry: null

Related issues

Fixes: https://consensyssoftware.atlassian.net/browse/MUL-1851

Manual testing steps

  1. Try scanning valid and invalid QR codes within the "Pairing" flow.
  2. Try scanning valid and invalid QR codes within the "Signing" flow.
  3. Make sure everything works as expected.
  4. Make sure that there are no regressions.
  5. Make sure that scanning performance has improved.

Screenshots/Recordings

Before

No UI changes. Nothing to show here.

After

No UI changes. Nothing to show here.

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

Low Risk
Changes are confined to QR reader tuning and scan-loop efficiency in the hardware popover; behavior is covered by updated unit tests with no auth or transaction logic touched.

Overview
Improves QR hardware wallet scanning by tuning the camera reader and reducing redundant UR decoding work.

EnhancedQrReader now starts the stream via decodeFromConstraints with 720p ideal resolution, adds ZXing TRY_HARDER and UTF-8 hints, and uses faster scan intervals (80ms between attempts, 50ms after success). Stream start failures are caught so they do not surface as unhandled rejections, and the preview uses a square aspect ratio with object-fit: cover.

useDecoderLifecycle ignores consecutive identical QR payloads so animated UR frames are not fed to the decoder repeatedly, and it skips progress updates when a scan completes in one frame. Tests cover the new reader settings and decoder behavior.

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

@david0xd david0xd self-assigned this Jun 9, 2026
@mm-token-exchange-service mm-token-exchange-service Bot added the team-extension-platform Extension Platform team label Jun 9, 2026
@david0xd david0xd added the no-changelog no-changelog Indicates no external facing user changes, therefore no changelog documentation needed label Jun 9, 2026
@github-actions github-actions Bot added the size-M label Jun 9, 2026
@david0xd david0xd marked this pull request as ready for review June 9, 2026 14:27

@cursor cursor Bot left a comment

Copy link
Copy Markdown

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 b3a286e. Configure here.

@metamaskbotv2

metamaskbotv2 Bot commented Jun 9, 2026

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

Baseline (latest main): 51036da | Date: 5/2/2026 | Pipeline: 27211664105 | 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: -69%
  • loadNewAccount/total: -69%
  • bridgeUserActions/bridge_load_page: -72%
  • bridgeUserActions/bridge_load_asset_picker: -56%
  • bridgeUserActions/bridge_search_token: -32%
  • bridgeUserActions/total: -43%
  • loadNewAccount/load_new_account: -54%
  • loadNewAccount/total: -54%
  • bridgeUserActions/bridge_load_page: -21%
  • bridgeUserActions/bridge_load_asset_picker: -43%
  • bridgeUserActions/bridge_search_token: -25%
  • bridgeUserActions/total: -31%

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

  • 🟡 confirmTx/FCP: p75 1.8s
  • 🟡 bridgeUserActions/INP: p75 240ms
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: -26%
  • startupStandardHome/load: -28%
  • startupStandardHome/domContentLoaded: -28%
  • startupStandardHome/domInteractive: -42%
  • startupStandardHome/firstPaint: -17%
  • startupStandardHome/backgroundConnect: -24%
  • startupStandardHome/loadScripts: -28%
  • startupStandardHome/setupStore: -21%
  • startupStandardHome/numNetworkReqs: -67%
  • startupPowerUserHome/uiStartup: -33%
  • startupPowerUserHome/load: -16%
  • startupPowerUserHome/domContentLoaded: -15%
  • startupPowerUserHome/domInteractive: -35%
  • startupPowerUserHome/firstPaint: -32%
  • startupPowerUserHome/backgroundConnect: -63%
  • startupPowerUserHome/firstReactRender: +29%
  • startupPowerUserHome/loadScripts: -15%
  • startupPowerUserHome/setupStore: +32%
  • startupPowerUserHome/numNetworkReqs: -71%
  • startupStandardHome/uiStartup: +16%
  • startupStandardHome/load: +16%
  • startupStandardHome/domContentLoaded: +16%
  • startupStandardHome/domInteractive: -36%
  • startupStandardHome/backgroundConnect: +25%
  • startupStandardHome/firstReactRender: +50%
  • startupStandardHome/initialActions: +20%
  • startupStandardHome/loadScripts: +16%
  • startupStandardHome/setupStore: -47%
  • startupStandardHome/numNetworkReqs: -39%
  • startupPowerUserHome/uiStartup: -39%
  • startupPowerUserHome/load: -20%
  • startupPowerUserHome/domContentLoaded: -20%
  • startupPowerUserHome/domInteractive: -64%
  • startupPowerUserHome/backgroundConnect: -83%
  • startupPowerUserHome/loadScripts: -19%
  • startupPowerUserHome/setupStore: +57%
  • startupPowerUserHome/numNetworkReqs: -75%

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

  • 🔴 startupPowerUserHome/INP: p75 520ms
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: -62%
  • onboardingImportWallet/pwFormToMetricsScreen: +573%
  • onboardingImportWallet/metricsToWalletReadyScreen: -33%
  • onboardingImportWallet/doneButtonToHomeScreen: -29%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -98%
  • onboardingImportWallet/total: -45%
  • onboardingNewWallet/srpButtonToPwForm: -80%
  • onboardingNewWallet/createPwToRecoveryScreen: +782%
  • onboardingNewWallet/skipBackupToMetricsScreen: -75%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: -30%
  • onboardingNewWallet/doneButtonToAssetList: -45%
  • onboardingNewWallet/total: -40%
  • assetDetails/assetClickToPriceChart: -58%
  • assetDetails/total: -58%
  • solanaAssetDetails/assetClickToPriceChart: -75%
  • solanaAssetDetails/total: -75%
  • importSrpHome/loginToHomeScreen: -31%
  • importSrpHome/openAccountMenuAfterLogin: -81%
  • importSrpHome/homeAfterImportWithNewWallet: -75%
  • importSrpHome/total: -69%

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

  • 🟡 assetDetails/INP: p75 256ms
  • 🟡 assetDetails/FCP: p75 2.1s
  • 🟡 importSrpHome/FCP: p75 1.8s
  • 🟡 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: +17%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 351 Bytes (0.01%)
  • ui: 114.74 KiB (1.03%)
  • common: 2.08 KiB (0.02%)

@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 [709722f]
Deprecated Browserify fallback builds
⚡ Performance Benchmarks (Total: 🟢 22 pass · 🟡 2 warn · 🔴 0 fail)

Baseline (latest main): 51036da | Date: 5/2/2026 | Pipeline: 27214210938 | 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: -56%
  • loadNewAccount/total: -56%
  • bridgeUserActions/bridge_load_page: -70%
  • bridgeUserActions/bridge_load_asset_picker: -49%
  • bridgeUserActions/bridge_search_token: -26%
  • bridgeUserActions/total: -39%
  • loadNewAccount/load_new_account: -42%
  • loadNewAccount/total: -42%
  • bridgeUserActions/bridge_load_page: -19%
  • bridgeUserActions/bridge_search_token: -19%
  • bridgeUserActions/total: +67%
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: -20%
  • startupStandardHome/load: -22%
  • startupStandardHome/domContentLoaded: -22%
  • startupStandardHome/domInteractive: -38%
  • startupStandardHome/backgroundConnect: -11%
  • startupStandardHome/loadScripts: -22%
  • startupStandardHome/setupStore: -14%
  • startupStandardHome/numNetworkReqs: -67%
  • startupPowerUserHome/uiStartup: -35%
  • startupPowerUserHome/load: -19%
  • startupPowerUserHome/domContentLoaded: -19%
  • startupPowerUserHome/domInteractive: -44%
  • startupPowerUserHome/firstPaint: -33%
  • startupPowerUserHome/backgroundConnect: -65%
  • startupPowerUserHome/firstReactRender: +32%
  • startupPowerUserHome/loadScripts: -19%
  • startupPowerUserHome/setupStore: +32%
  • startupPowerUserHome/numNetworkReqs: -73%
  • startupStandardHome/uiStartup: +12%
  • startupStandardHome/load: +14%
  • startupStandardHome/domContentLoaded: +14%
  • startupStandardHome/domInteractive: -57%
  • startupStandardHome/backgroundConnect: +26%
  • startupStandardHome/firstReactRender: +44%
  • startupStandardHome/initialActions: +20%
  • startupStandardHome/loadScripts: +13%
  • startupStandardHome/setupStore: -51%
  • startupStandardHome/numNetworkReqs: -39%

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

  • 🔴 startupPowerUserHome/INP: p75 528ms
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/importWalletToSocialScreen: +11%
  • onboardingImportWallet/srpButtonToSrpForm: -64%
  • onboardingImportWallet/pwFormToMetricsScreen: +550%
  • onboardingImportWallet/metricsToWalletReadyScreen: -26%
  • onboardingImportWallet/doneButtonToHomeScreen: -28%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -99%
  • onboardingImportWallet/total: -45%
  • onboardingNewWallet/srpButtonToPwForm: -76%
  • onboardingNewWallet/createPwToRecoveryScreen: +1043%
  • onboardingNewWallet/skipBackupToMetricsScreen: -69%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: +11%
  • assetDetails/assetClickToPriceChart: -21%
  • assetDetails/total: -21%
  • solanaAssetDetails/assetClickToPriceChart: -81%
  • solanaAssetDetails/total: -81%
  • importSrpHome/loginToHomeScreen: -33%
  • importSrpHome/openAccountMenuAfterLogin: -79%
  • importSrpHome/homeAfterImportWithNewWallet: -74%
  • importSrpHome/total: -68%
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%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 351 Bytes (0.01%)
  • ui: 114.75 KiB (1.03%)
  • common: 2.08 KiB (0.02%)

@david0xd david0xd force-pushed the dd/add-qr-scan-optimizations branch from 709722f to db86a0b Compare June 9, 2026 16:19
@metamaskbotv2

metamaskbotv2 Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor
Builds ready [db86a0b] [reused from 709722f]
Deprecated Browserify fallback builds
⚡ Performance Benchmarks (Total: 🟢 22 pass · 🟡 2 warn · 🔴 0 fail)

Baseline (latest main): 51036da | Date: 5/2/2026 | Pipeline: 27220060984 | 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: -56%
  • loadNewAccount/total: -56%
  • bridgeUserActions/bridge_load_page: -70%
  • bridgeUserActions/bridge_load_asset_picker: -49%
  • bridgeUserActions/bridge_search_token: -26%
  • bridgeUserActions/total: -39%
  • loadNewAccount/load_new_account: -42%
  • loadNewAccount/total: -42%
  • bridgeUserActions/bridge_load_page: -19%
  • bridgeUserActions/bridge_search_token: -19%
  • bridgeUserActions/total: +67%
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: -20%
  • startupStandardHome/load: -22%
  • startupStandardHome/domContentLoaded: -22%
  • startupStandardHome/domInteractive: -38%
  • startupStandardHome/backgroundConnect: -11%
  • startupStandardHome/loadScripts: -22%
  • startupStandardHome/setupStore: -14%
  • startupStandardHome/numNetworkReqs: -67%
  • startupPowerUserHome/uiStartup: -35%
  • startupPowerUserHome/load: -19%
  • startupPowerUserHome/domContentLoaded: -19%
  • startupPowerUserHome/domInteractive: -44%
  • startupPowerUserHome/firstPaint: -33%
  • startupPowerUserHome/backgroundConnect: -65%
  • startupPowerUserHome/firstReactRender: +32%
  • startupPowerUserHome/loadScripts: -19%
  • startupPowerUserHome/setupStore: +32%
  • startupPowerUserHome/numNetworkReqs: -73%
  • startupStandardHome/uiStartup: +12%
  • startupStandardHome/load: +14%
  • startupStandardHome/domContentLoaded: +14%
  • startupStandardHome/domInteractive: -57%
  • startupStandardHome/backgroundConnect: +26%
  • startupStandardHome/firstReactRender: +44%
  • startupStandardHome/initialActions: +20%
  • startupStandardHome/loadScripts: +13%
  • startupStandardHome/setupStore: -51%
  • startupStandardHome/numNetworkReqs: -39%

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

  • 🔴 startupPowerUserHome/INP: p75 528ms
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/importWalletToSocialScreen: +11%
  • onboardingImportWallet/srpButtonToSrpForm: -64%
  • onboardingImportWallet/pwFormToMetricsScreen: +550%
  • onboardingImportWallet/metricsToWalletReadyScreen: -26%
  • onboardingImportWallet/doneButtonToHomeScreen: -28%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -99%
  • onboardingImportWallet/total: -45%
  • onboardingNewWallet/srpButtonToPwForm: -76%
  • onboardingNewWallet/createPwToRecoveryScreen: +1043%
  • onboardingNewWallet/skipBackupToMetricsScreen: -69%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: +11%
  • assetDetails/assetClickToPriceChart: -21%
  • assetDetails/total: -21%
  • solanaAssetDetails/assetClickToPriceChart: -81%
  • solanaAssetDetails/total: -81%
  • importSrpHome/loginToHomeScreen: -33%
  • importSrpHome/openAccountMenuAfterLogin: -79%
  • importSrpHome/homeAfterImportWithNewWallet: -74%
  • importSrpHome/total: -68%
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%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 351 Bytes (0.01%)
  • ui: 114.75 KiB (1.03%)
  • common: 2.08 KiB (0.02%)

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

Labels

no-changelog no-changelog Indicates no external facing user changes, therefore no changelog documentation needed risk:low size-M skip-release-validation team-accounts-framework Accounts team team-extension-platform Extension Platform team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant