Skip to content

feat(ramps): use synced orders in the buy flow - #46046

Draft
georgeweiler wants to merge 1 commit into
feat/portfolio-buy-order-migrationfrom
feat/ramps-synced-order-buy-flow
Draft

feat(ramps): use synced orders in the buy flow#46046
georgeweiler wants to merge 1 commit into
feat/portfolio-buy-order-migrationfrom
feat/ramps-synced-order-buy-flow

Conversation

@georgeweiler

@georgeweiler georgeweiler commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Description

Part 5 of 5 replacing #44367. Stacked on #46045.

Activates Portfolio migration when a previously connected wallet enters Buy with Backup & Sync and ramps syncing enabled, then keeps the user in the in-extension Buy flow. The external Portfolio tab remains the fallback only when in-extension ramps are disabled.

Preferred-provider selection now consumes completed synced orders, normalizes /providers/... identifiers, and re-evaluates an automatically selected default when newer order history arrives. Explicit user selections remain unchanged.

Ownership is limited to @MetaMask/money-movement.

Changelog

CHANGELOG entry: Updated Buy to prefer the provider from the latest completed order

Related issues

Depends on #46045.
Works with consensys-vertical-apps/metamask-portfolio#2053.
Replaces the final part of #44367.

Manual testing steps

  1. Use a wallet that previously connected to Portfolio and has a completed order there.
  2. Enable Backup & Sync and Buy & sell orders in the extension.
  3. Open Buy and confirm the migration runs in a background tab while the in-extension Buy flow opens.
  4. Confirm the provider from the latest completed synced order is selected instead of the default provider.
  5. Select a different provider manually, re-enter Buy, and confirm the explicit selection is preserved.
  6. Disable Buy & sell orders and confirm entering Buy does not run the Portfolio migration.
  7. Disable in-extension ramps and confirm Buy opens Portfolio as the fallback.

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.

Stack: #46042#46043#46044#46045#46046

@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/money-movement (5 files, +98 -25)
  • 📁 ui/
    • 📁 hooks/
      • 📁 ramps/
        • 📁 useRampsNavigation/
          • 📄 useRampsNavigation.test.tsx +34 -5
          • 📄 useRampsNavigation.ts +22 -16
        • 📁 utils/
          • 📄 determinePreferredProvider.test.ts +13 -0
          • 📄 determinePreferredProvider.ts +14 -2
          • 📄 useRampsProviders.ts +15 -2

@metamask-ci

metamask-ci Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor
Builds ready [92d91b7]
⚡ Performance Benchmarks (Total: 🟢 15 pass · 🟡 7 warn · 🔴 3 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 33829778421 | 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: -11%
  • loadNewAccount/lcp: -11%
  • confirmTx/longTaskTotalDuration: -27%
  • confirmTx/tbt: -40%
  • confirmTx/inp: -32%
  • bridgeUserActions/longTaskCount: -44%
  • bridgeUserActions/longTaskTotalDuration: -58%
  • bridgeUserActions/longTaskMaxDuration: -35%
  • bridgeUserActions/tbt: -93%
  • bridgeUserActions/inp: -23%
  • bridgeUserActions/fcp: -16%
  • loadNewAccount/load_new_account: +195%
  • loadNewAccount/total: +195%
  • loadNewAccount/inp: +74%
  • loadNewAccount/fcp: -45%
  • loadNewAccount/lcp: +1450%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/inp: -24%
  • confirmTx/fcp: -45%
  • confirmTx/lcp: +1262%
  • bridgeUserActions/bridge_load_page: +69%
  • bridgeUserActions/bridge_load_asset_picker: +41%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +18%
  • bridgeUserActions/fcp: -47%
  • bridgeUserActions/lcp: +1128%

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

  • 🟡 loadNewAccount/LCP: p75 2.7s
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/uiStartup: -32%
  • startupStandardHome/load: -26%
  • startupStandardHome/domContentLoaded: -26%
  • startupStandardHome/domInteractive: -42%
  • startupStandardHome/backgroundConnect: -20%
  • startupStandardHome/firstReactRender: -99%
  • startupStandardHome/initialActions: -50%
  • startupStandardHome/loadScripts: -26%
  • startupStandardHome/fcp: -39%
  • startupStandardHome/lcp: -25%
  • startupPowerUserHome/domInteractive: -53%
  • startupPowerUserHome/backgroundConnect: -21%
  • startupPowerUserHome/firstReactRender: -99%
  • startupPowerUserHome/initialActions: -44%
  • startupPowerUserHome/setupStore: -73%
  • startupPowerUserHome/numNetworkReqs: -48%
  • startupPowerUserHome/inp: +14%
  • startupPowerUserHome/fcp: -50%

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

  • 🟡 startupPowerUserHome/INP: p75 216ms
  • 🟡 startupPowerUserHome/LCP: p75 2.9s
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: +41%
  • onboardingImportWallet/confirmSrpToPwForm: +48%
  • onboardingImportWallet/pwFormToMetricsScreen: +22%
  • onboardingImportWallet/metricsToWalletReadyScreen: +35%
  • onboardingImportWallet/doneButtonToHomeScreen: -92%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -94%
  • onboardingImportWallet/longTaskCount: -100%
  • onboardingImportWallet/longTaskTotalDuration: -100%
  • onboardingImportWallet/longTaskMaxDuration: -100%
  • onboardingImportWallet/tbt: -100%
  • onboardingImportWallet/total: -91%
  • onboardingNewWallet/srpButtonToPwForm: +23%
  • onboardingNewWallet/skipBackupToMetricsScreen: +25%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: +31%
  • onboardingNewWallet/doneButtonToAssetList: -81%
  • onboardingNewWallet/longTaskCount: -69%
  • onboardingNewWallet/longTaskTotalDuration: -79%
  • onboardingNewWallet/longTaskMaxDuration: -51%
  • onboardingNewWallet/tbt: -100%
  • onboardingNewWallet/total: -77%
  • solanaAssetDetails/assetClickToPriceChart: +228%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: +228%
  • importSrpHome/loginToHomeScreen: -14%
  • importSrpHome/homeAfterImportWithNewWallet: -13%
  • importSrpHome/longTaskCount: -30%
  • importSrpHome/longTaskTotalDuration: -49%
  • importSrpHome/longTaskMaxDuration: -54%
  • importSrpHome/tbt: -67%
  • importSrpHome/total: -12%
  • importSrpHome/inp: -56%
  • importSrpHome/cls: +510%
  • sendTransactions/openSendPageFromHome: +84%
  • sendTransactions/reviewTransactionToConfirmationPage: -98%
  • sendTransactions/longTaskCount: -100%
  • sendTransactions/longTaskTotalDuration: -100%
  • sendTransactions/longTaskMaxDuration: -100%
  • sendTransactions/tbt: -100%
  • sendTransactions/total: -93%
  • sendTransactions/inp: -30%
  • sendTransactions/fcp: +18%
  • sendTransactions/lcp: -62%
  • sendTransactions/cls: +171%
  • swap/openSwapPageFromHome: +883%
  • swap/fetchAndDisplaySwapQuotes: +87%
  • swap/longTaskCount: -100%
  • swap/longTaskTotalDuration: -100%
  • swap/longTaskMaxDuration: -100%
  • swap/tbt: -100%
  • swap/total: +103%
  • swap/inp: +13%
  • swap/lcp: -71%
  • swap/cls: -92%

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

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

📈 Results compared to the previous 5 runs on main

  • dappPageLoad/pageLoadTime: -58%
  • dappPageLoad/firstPaint: -46%
  • dappPageLoad/firstContentfulPaint: -46%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 31.4 KiB (0.21%)
  • ui: 18.59 KiB (0.1%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 1.88 KiB (0.1%)
  • zip: 14.26 KiB (0.06%)

Co-authored-by: Cursor <cursoragent@cursor.com>
@sonarqubecloud

sonarqubecloud Bot commented Sep 9, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
78.6% 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 [a98c014]
⚡ Performance Benchmarks (Total: 🟢 13 pass · 🟡 8 warn · 🔴 4 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 34334214156 | 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: +189%
  • loadNewAccount/total: +189%
  • loadNewAccount/inp: -24%
  • loadNewAccount/fcp: -15%
  • loadNewAccount/lcp: -13%
  • confirmTx/longTaskCount: -33%
  • confirmTx/longTaskTotalDuration: -42%
  • confirmTx/tbt: -49%
  • confirmTx/fcp: -16%
  • confirmTx/lcp: -14%
  • bridgeUserActions/longTaskCount: -44%
  • bridgeUserActions/longTaskTotalDuration: -44%
  • bridgeUserActions/longTaskMaxDuration: -13%
  • bridgeUserActions/tbt: -41%
  • bridgeUserActions/inp: -15%
  • bridgeUserActions/fcp: -13%
  • bridgeUserActions/lcp: -16%
  • loadNewAccount/load_new_account: +189%
  • loadNewAccount/total: +189%
  • loadNewAccount/inp: -39%
  • loadNewAccount/fcp: -79%
  • loadNewAccount/lcp: +1180%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/inp: -32%
  • confirmTx/fcp: -58%
  • confirmTx/lcp: +977%
  • bridgeUserActions/bridge_load_page: +49%
  • bridgeUserActions/bridge_load_asset_picker: +35%
  • bridgeUserActions/bridge_search_token: -12%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +16%
  • bridgeUserActions/inp: +131%
  • bridgeUserActions/fcp: -76%
  • bridgeUserActions/lcp: +951%

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

  • 🟡 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/backgroundConnect: +11%
  • startupStandardHome/firstReactRender: -99%
  • startupStandardHome/initialActions: -33%
  • startupStandardHome/setupStore: +14%
  • startupStandardHome/uiStartup: -29%
  • startupStandardHome/load: -24%
  • startupStandardHome/domContentLoaded: -24%
  • startupStandardHome/domInteractive: -47%
  • startupStandardHome/backgroundConnect: -20%
  • startupStandardHome/firstReactRender: -99%
  • startupStandardHome/initialActions: -50%
  • startupStandardHome/loadScripts: -24%
  • startupStandardHome/fcp: -39%
  • startupStandardHome/lcp: -23%
  • startupPowerUserHome/domInteractive: -50%
  • startupPowerUserHome/backgroundConnect: -18%
  • startupPowerUserHome/firstReactRender: -99%
  • startupPowerUserHome/initialActions: -44%
  • startupPowerUserHome/setupStore: -64%
  • startupPowerUserHome/numNetworkReqs: -49%
  • startupPowerUserHome/inp: +19%
  • startupPowerUserHome/fcp: -49%

🌐 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 🔴 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: +36%
  • onboardingImportWallet/confirmSrpToPwForm: +42%
  • onboardingImportWallet/pwFormToMetricsScreen: +16%
  • onboardingImportWallet/metricsToWalletReadyScreen: +26%
  • onboardingImportWallet/doneButtonToHomeScreen: -92%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: -94%
  • onboardingImportWallet/longTaskCount: -100%
  • onboardingImportWallet/longTaskTotalDuration: -100%
  • onboardingImportWallet/longTaskMaxDuration: -100%
  • onboardingImportWallet/tbt: -100%
  • onboardingImportWallet/total: -91%
  • onboardingNewWallet/createPwToRecoveryScreen: -15%
  • onboardingNewWallet/doneButtonToAssetList: -43%
  • onboardingNewWallet/longTaskCount: -100%
  • onboardingNewWallet/longTaskTotalDuration: -100%
  • onboardingNewWallet/longTaskMaxDuration: -100%
  • onboardingNewWallet/tbt: -100%
  • onboardingNewWallet/total: -41%
  • solanaAssetDetails/assetClickToPriceChart: +266%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: +266%
  • solanaAssetDetails/inp: +19%
  • solanaAssetDetails/fcp: +14%
  • solanaAssetDetails/lcp: +10%
  • importSrpHome/loginToHomeScreen: -12%
  • importSrpHome/longTaskCount: -37%
  • importSrpHome/longTaskTotalDuration: -51%
  • importSrpHome/longTaskMaxDuration: -56%
  • importSrpHome/tbt: -63%
  • importSrpHome/inp: -64%
  • importSrpHome/cls: +510%
  • sendTransactions/openSendPageFromHome: +53%
  • sendTransactions/selectTokenToSendFormLoaded: +114%
  • sendTransactions/reviewTransactionToConfirmationPage: -98%
  • sendTransactions/longTaskCount: -100%
  • sendTransactions/longTaskTotalDuration: -100%
  • sendTransactions/longTaskMaxDuration: -100%
  • sendTransactions/tbt: -100%
  • sendTransactions/total: -93%
  • sendTransactions/inp: -37%
  • sendTransactions/fcp: +12%
  • sendTransactions/lcp: -62%
  • sendTransactions/cls: +171%
  • swap/openSwapPageFromHome: +861%
  • swap/fetchAndDisplaySwapQuotes: +87%
  • swap/longTaskCount: +33%
  • swap/tbt: -100%
  • swap/total: +103%
  • swap/lcp: -71%
  • swap/cls: -92%

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

  • 🟡 sendTransactions/FCP: p75 1.8s
  • 🟡 swap/FCP: p75 1.9s
  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 importSrpHome/FCP: p75 1.9s
  • 🔴 swap/INP: p75 560ms
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: -58%
  • dappPageLoad/firstPaint: -46%
  • dappPageLoad/firstContentfulPaint: -46%
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 30.9 KiB (0.21%)
  • ui: 21.04 KiB (0.11%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 1.92 KiB (0.1%)
  • zip: 14.71 KiB (0.06%)

@georgeweiler
georgeweiler added this pull request to stack #46179 September 9, 2026 10:03
pull Bot pushed a commit to Reality2byte/metamask-extension that referenced this pull request Sep 9, 2026
## **Description**

Part 1 of 5 replacing MetaMask#44367.

Local development sometimes needs DEV Profile Sync (for example staging
ramps). Identity JWTs are shared by many `getBearerToken` consumers, so
flipping every `yarn start` to DEV by default would mint DEV tokens
against services that still talk to PRD.

This follows the Mobile pattern:

1. Opt in with `MM_DEV_API_ENV=dev` in `.metamaskrc` (default remains
prod). Restart `yarn start` after changing it.
2. A single source (`devApiEnv` / `loadAuthenticationConfig`) is used by
AuthenticationController, User Storage, Profile Metrics, Config
Registry, and Authenticated User Storage so those backends agree.
3. Settings → Debug → Backup and sync shows the current identity env and
can clear the persisted auth session via `performSignOut` after you flip
the flag.

`FORCE_AUTH_MATCH_BUILD` is unchanged for beta/UAT. Notifications,
shield, money-account, bridge, and perps stay on PRD in this PR.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Replaces part of MetaMask#44367.

## **Manual testing steps**

1. Leave `MM_DEV_API_ENV` unset and confirm Profile Sync still uses
production (`oidc.api.cx.metamask.io`).
2. Set `MM_DEV_API_ENV=dev` in `.metamaskrc` and restart `yarn start`.
3. Open Settings → Debug → Backup and sync, confirm the identity env
shows `dev`, and click Clear auth session.
4. Unlock / sign in to Backup & Sync and confirm Network requests go to
`oidc.dev-api.cx.metamask.io`.
5. Unset the flag, restart, clear the session again, and confirm
production identity is restored.

<!--
## **Screenshots/Recordings**
### **Before**
### **After**
-->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **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.

---

Stack: MetaMask#46042MetaMask#46043MetaMask#46044MetaMask#46045MetaMask#46046

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes authentication environment selection and JWT/backend alignment
for Backup & Sync and related identity services; misconfiguration could
break sign-in until the session is cleared.
> 
> **Overview**
> Adds an **opt-in local dev switch** (`MM_DEV_API_ENV=dev` in
`.metamaskrc`) so Profile Sync identity stays on **prod by default**
during `yarn start`, avoiding DEV JWTs against services that still use
PRD.
> 
> **`devApiEnv()`** and updated **`loadAuthenticationConfig()`**
centralize env selection: DEV only when development build + explicit
flag; **`FORCE_AUTH_MATCH_BUILD`** still maps beta/uat to UAT; non-local
builds ignore the flag. **Authenticated User Storage** init now maps
**`Env.DEV`** → `dev` so it stays aligned with auth JWT env.
> 
> **Settings → Debug → Backup and sync** shows the active identity env
and adds **Clear auth session** (`performSignOut`) for after flipping
the flag. Docs/build defaults (`builds.yml`, `.metamaskrc.dist`) and
unit tests cover the new behavior.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
e68779f. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
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.

1 participant