Skip to content

feat(ramps-controller): resolveFiatDepositRoute for buy-ETH-convert-to-mUSD#9428

Draft
saustrie-consensys wants to merge 3 commits into
saustrie/ramps-controller-phase2-selectionfrom
saustrie/ramps-controller-eth-musd-deposit-route
Draft

feat(ramps-controller): resolveFiatDepositRoute for buy-ETH-convert-to-mUSD#9428
saustrie-consensys wants to merge 3 commits into
saustrie/ramps-controller-phase2-selectionfrom
saustrie/ramps-controller-eth-musd-deposit-route

Conversation

@saustrie-consensys

Copy link
Copy Markdown
Contributor

Explanation

Headless Buy / Money Account follow-on to Phase 2, stacked on #9414 (base branch saustrie/ramps-controller-phase2-selection, not main).

Today a Money Account (mUSD) fiat deposit can only be offered in a region that has an on-ramp provider serving mUSD directly. In regions that have no mUSD provider but do have a provider selling ETH (e.g. New York), the flow shows nothing, even though the existing "buy ETH on mainnet, then Relay to mUSD on Monad" pipeline can deliver mUSD. Deciding "buy mUSD directly, else buy a convertible asset like ETH" is a provider-availability decision that belongs in the controller, next to the other shared, provider-agnostic gates, so mobile stays a dumb consumer.

What changed:

  • New pure resolveFiatDepositRoute helper (and FiatDepositRoute type) in providerAvailability.ts. Given the region's providers, a preferredAssetId (the target deposit asset, e.g. mUSD), an ordered list of fallbackAssetIds (convertible assets, e.g. native ETH), and the effective scope, it returns { assetId, isFallback }:
    • the preferred asset when a provider serves it (isFallback: false),
    • else the first fallback asset with a serving provider (isFallback: true),
    • else undefined (caller shows no providers).
  • It reuses the existing regionHasProviderForAsset, so it obeys the same scope semantics: under scope off only a native provider counts, so an aggregator-only fallback asset is unreachable until scope is widened to in-app/all.
  • Exported from the package index alongside the other availability helpers.

The conversion itself (ETH to mUSD via Relay + vault/CHOMP) stays entirely in the consumer (@metamask/transaction-pay-controller + mobile); this only picks the purchasable asset. getQuotes is unchanged (already asset-agnostic); the caller passes the resolved assetId.

Tests: new resolveFiatDepositRoute cases in providerAvailability.test.ts (prefer target, fall back in order, none, scope-off native-only, native fallback under off). Package providerAvailability suite green (20 tests); changelog validates; lint clean.

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Made with Cursor

…o-mUSD

Add a pure, provider-agnostic resolveFiatDepositRoute helper (and
FiatDepositRoute type) that picks which on-ramp asset a region should buy
for a fiat deposit: the preferred target asset (e.g. mUSD) when a provider
serves it, otherwise the first convertible fallback asset (e.g. native ETH)
with a serving provider, or undefined when none is purchasable.

It reuses regionHasProviderForAsset so it obeys the same scope semantics
(an aggregator-only fallback is unreachable under scope 'off'). This enables
depositing to a mUSD Money Account in regions without a direct mUSD provider
by buying ETH and letting a downstream step convert it.

Pure and provider-agnostic; the conversion itself stays with the consumer.
@saustrie-consensys

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.5.3-preview-aa4ef4666
@metamask-previews/accounts-controller@39.0.4-preview-aa4ef4666
@metamask-previews/address-book-controller@7.1.2-preview-aa4ef4666
@metamask-previews/ai-controllers@0.7.0-preview-aa4ef4666
@metamask-previews/analytics-controller@1.2.1-preview-aa4ef4666
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-aa4ef4666
@metamask-previews/announcement-controller@8.1.0-preview-aa4ef4666
@metamask-previews/app-metadata-controller@2.0.1-preview-aa4ef4666
@metamask-previews/approval-controller@9.0.2-preview-aa4ef4666
@metamask-previews/assets-controller@10.0.1-preview-aa4ef4666
@metamask-previews/assets-controllers@109.3.0-preview-aa4ef4666
@metamask-previews/authenticated-user-storage@3.0.0-preview-aa4ef4666
@metamask-previews/base-controller@9.1.0-preview-aa4ef4666
@metamask-previews/base-data-service@0.1.3-preview-aa4ef4666
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-aa4ef4666
@metamask-previews/bridge-controller@77.3.2-preview-aa4ef4666
@metamask-previews/bridge-status-controller@74.0.2-preview-aa4ef4666
@metamask-previews/build-utils@3.0.4-preview-aa4ef4666
@metamask-previews/chain-agnostic-permission@1.7.0-preview-aa4ef4666
@metamask-previews/chomp-api-service@3.1.0-preview-aa4ef4666
@metamask-previews/claims-controller@0.5.3-preview-aa4ef4666
@metamask-previews/client-controller@1.0.1-preview-aa4ef4666
@metamask-previews/client-utils@0.0.0-preview-aa4ef4666
@metamask-previews/compliance-controller@2.1.0-preview-aa4ef4666
@metamask-previews/composable-controller@12.0.1-preview-aa4ef4666
@metamask-previews/config-registry-controller@0.4.1-preview-aa4ef4666
@metamask-previews/connectivity-controller@0.2.0-preview-aa4ef4666
@metamask-previews/controller-utils@12.3.0-preview-aa4ef4666
@metamask-previews/core-backend@6.5.0-preview-aa4ef4666
@metamask-previews/delegation-controller@3.0.2-preview-aa4ef4666
@metamask-previews/earn-controller@12.2.2-preview-aa4ef4666
@metamask-previews/eip-5792-middleware@3.0.4-preview-aa4ef4666
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-aa4ef4666
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-aa4ef4666
@metamask-previews/ens-controller@19.1.5-preview-aa4ef4666
@metamask-previews/eth-block-tracker@15.0.1-preview-aa4ef4666
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-aa4ef4666
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-aa4ef4666
@metamask-previews/foundryup@1.0.1-preview-aa4ef4666
@metamask-previews/gas-fee-controller@26.2.4-preview-aa4ef4666
@metamask-previews/gator-permissions-controller@4.2.2-preview-aa4ef4666
@metamask-previews/geolocation-controller@0.1.3-preview-aa4ef4666
@metamask-previews/java-tron-up@1.0.0-preview-aa4ef4666
@metamask-previews/json-rpc-engine@10.5.0-preview-aa4ef4666
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-aa4ef4666
@metamask-previews/keyring-controller@27.1.0-preview-aa4ef4666
@metamask-previews/local-node-utils@1.0.0-preview-aa4ef4666
@metamask-previews/logging-controller@8.0.2-preview-aa4ef4666
@metamask-previews/message-manager@14.1.2-preview-aa4ef4666
@metamask-previews/messenger@2.0.0-preview-aa4ef4666
@metamask-previews/messenger-cli@0.2.0-preview-aa4ef4666
@metamask-previews/money-account-api-data-service@0.0.0-preview-aa4ef4666
@metamask-previews/money-account-balance-service@2.1.2-preview-aa4ef4666
@metamask-previews/money-account-controller@0.3.3-preview-aa4ef4666
@metamask-previews/money-account-upgrade-controller@2.2.1-preview-aa4ef4666
@metamask-previews/multichain-account-service@11.1.0-preview-aa4ef4666
@metamask-previews/multichain-api-middleware@4.0.1-preview-aa4ef4666
@metamask-previews/multichain-network-controller@3.2.1-preview-aa4ef4666
@metamask-previews/multichain-transactions-controller@7.1.1-preview-aa4ef4666
@metamask-previews/name-controller@9.1.2-preview-aa4ef4666
@metamask-previews/network-controller@34.0.0-preview-aa4ef4666
@metamask-previews/network-enablement-controller@5.4.1-preview-aa4ef4666
@metamask-previews/notification-services-controller@25.0.0-preview-aa4ef4666
@metamask-previews/passkey-controller@2.0.1-preview-aa4ef4666
@metamask-previews/permission-controller@13.1.1-preview-aa4ef4666
@metamask-previews/permission-log-controller@5.1.0-preview-aa4ef4666
@metamask-previews/perps-controller@9.2.1-preview-aa4ef4666
@metamask-previews/phishing-controller@17.2.0-preview-aa4ef4666
@metamask-previews/platform-api-docs@0.0.0-preview-aa4ef4666
@metamask-previews/polling-controller@16.0.8-preview-aa4ef4666
@metamask-previews/preferences-controller@23.1.0-preview-aa4ef4666
@metamask-previews/profile-metrics-controller@4.0.1-preview-aa4ef4666
@metamask-previews/profile-sync-controller@28.2.0-preview-aa4ef4666
@metamask-previews/ramps-controller@15.1.0-preview-aa4ef4666
@metamask-previews/rate-limit-controller@7.0.1-preview-aa4ef4666
@metamask-previews/react-data-query@0.2.1-preview-aa4ef4666
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-aa4ef4666
@metamask-previews/sample-controllers@5.0.3-preview-aa4ef4666
@metamask-previews/seedless-onboarding-controller@10.0.3-preview-aa4ef4666
@metamask-previews/selected-network-controller@26.1.5-preview-aa4ef4666
@metamask-previews/shield-controller@5.1.2-preview-aa4ef4666
@metamask-previews/signature-controller@39.2.7-preview-aa4ef4666
@metamask-previews/smart-transactions-controller@24.2.4-preview-aa4ef4666
@metamask-previews/snap-account-service@1.0.0-preview-aa4ef4666
@metamask-previews/social-controllers@2.3.1-preview-aa4ef4666
@metamask-previews/solana-test-validator-up@1.0.0-preview-aa4ef4666
@metamask-previews/stellar-quickstart-up@0.0.0-preview-aa4ef4666
@metamask-previews/storage-service@1.0.2-preview-aa4ef4666
@metamask-previews/subscription-controller@6.2.0-preview-aa4ef4666
@metamask-previews/transaction-controller@68.2.2-preview-aa4ef4666
@metamask-previews/transaction-pay-controller@23.17.4-preview-aa4ef4666
@metamask-previews/user-operation-controller@41.2.6-preview-aa4ef4666
@metamask-previews/wallet@7.0.0-preview-aa4ef4666
@metamask-previews/wallet-cli@0.0.0-preview-aa4ef4666

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant