Skip to content

feat(ramps-controller): add getBestProviderForAsset accessor#9029

Open
amitabh94 wants to merge 5 commits into
mainfrom
feat/ramps-best-provider-quote
Open

feat(ramps-controller): add getBestProviderForAsset accessor#9029
amitabh94 wants to merge 5 commits into
mainfrom
feat/ramps-best-provider-quote

Conversation

@amitabh94
Copy link
Copy Markdown
Contributor

@amitabh94 amitabh94 commented Jun 6, 2026

Explanation

Adds a read-only way to resolve the best on-ramp provider for an asset, reusing the provider-selection cascade RampsController already implements internally. MetaMask Pay's money-account fiat deposit (and later Unified Buy v2) needs a provider's static buy limits (provider.limits) to validate the user-entered amount before spending a network quote — which requires knowing which provider. This accessor returns that provider using the controller's own ordering, so the limit check and the eventual quote agree.

Changes

Refactor (no behavior change). The provider-pick cascade (currently-selected → previously-used from order history → native/Transak → first supporting) was extracted from the private quote-resolution method into a shared private helper #resolveBestSupportingProvider. The existing #resolveProviderIdsForQuote now delegates to it, preserving its exact list-level behavior (including the restrictToKnownOrNative gating). All pre-existing tests pass unchanged.

New public accessor. RampsController.getBestProviderForAsset({ assetId, region? }) (async) + the RampsController:getBestProviderForAsset messenger action. It resolves the region from userRegion (GeolocationController-derived), filters to providers supporting the asset, runs the shared cascade, and returns the best Provider (or null). Read-only — it never mutates providers.selected / providerAutoSelected / any state.

Deliberately no getBestQuote — the existing getQuotes is already provider-scoped (via preferredProviderIds / restrictToKnownOrNativeProviders). No other controller is touched.

References

Consumer (mobile): MetaMask Pay money-account fiat deposit amount-limit validation.

Checklist

  • Additive only; no existing method signature / messenger action / state-shape changes
  • Tests added (290 total; 283 prior behavior-preserving + new accessor + refactor coverage)
  • Changelog updated

🤖 Generated with Claude Code


Note

Medium Risk
Refactors getQuotes auto-selection internals; behavior is intended to be preserved but touches headless gating and region-scoped provider resolution.

Overview
Adds a read-only getBestProviderForAsset({ assetId, region? }) API (plus RampsController:getBestProviderForAsset) so callers can resolve which on-ramp Provider would be used for an asset—e.g. to read provider.limits before quoting—using the same cascade as quote auto-selection, without changing providers.selected or other state.

The shared selection logic is extracted into private #resolveBestSupportingProvider (selected → order-history preferred → native → first supporting). #resolveProviderIdsForQuote now delegates to that helper while keeping list-level behavior, including restrictToKnownOrNativeProviders gating. When the selected provider wins, the helper returns the region-resolved entry from the supporting list (not the possibly stale state.providers.selected object), including under an explicit region override.

Messenger action types, package exports, changelog, and focused tests cover null cases, messenger wiring, no state mutation, and region override behavior.

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

@amitabh94 amitabh94 requested review from a team as code owners June 6, 2026 03:04
@amitabh94
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@amitabh94 amitabh94 temporarily deployed to default-branch June 6, 2026 03:04 — with GitHub Actions Inactive
Copy link
Copy Markdown

@cursor cursor Bot left a comment

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

Comment thread packages/ramps-controller/src/RampsController.ts Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 6, 2026

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.1-preview-d04a0a1
@metamask-previews/accounts-controller@39.0.0-preview-d04a0a1
@metamask-previews/address-book-controller@7.1.2-preview-d04a0a1
@metamask-previews/ai-controllers@0.7.0-preview-d04a0a1
@metamask-previews/analytics-controller@1.1.0-preview-d04a0a1
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-d04a0a1
@metamask-previews/announcement-controller@8.1.0-preview-d04a0a1
@metamask-previews/app-metadata-controller@2.0.1-preview-d04a0a1
@metamask-previews/approval-controller@9.0.1-preview-d04a0a1
@metamask-previews/assets-controller@8.3.2-preview-d04a0a1
@metamask-previews/assets-controllers@108.5.0-preview-d04a0a1
@metamask-previews/authenticated-user-storage@2.0.0-preview-d04a0a1
@metamask-previews/base-controller@9.1.0-preview-d04a0a1
@metamask-previews/base-data-service@0.1.3-preview-d04a0a1
@metamask-previews/bridge-controller@73.2.1-preview-d04a0a1
@metamask-previews/bridge-status-controller@72.0.2-preview-d04a0a1
@metamask-previews/build-utils@3.0.4-preview-d04a0a1
@metamask-previews/chain-agnostic-permission@1.6.1-preview-d04a0a1
@metamask-previews/chomp-api-service@3.1.0-preview-d04a0a1
@metamask-previews/claims-controller@0.5.2-preview-d04a0a1
@metamask-previews/client-controller@1.0.1-preview-d04a0a1
@metamask-previews/compliance-controller@2.1.0-preview-d04a0a1
@metamask-previews/composable-controller@12.0.1-preview-d04a0a1
@metamask-previews/config-registry-controller@0.4.0-preview-d04a0a1
@metamask-previews/connectivity-controller@0.2.0-preview-d04a0a1
@metamask-previews/controller-utils@12.1.0-preview-d04a0a1
@metamask-previews/core-backend@6.3.2-preview-d04a0a1
@metamask-previews/delegation-controller@3.0.1-preview-d04a0a1
@metamask-previews/earn-controller@12.2.0-preview-d04a0a1
@metamask-previews/eip-5792-middleware@3.0.4-preview-d04a0a1
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-d04a0a1
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-d04a0a1
@metamask-previews/ens-controller@19.1.3-preview-d04a0a1
@metamask-previews/eth-block-tracker@15.0.1-preview-d04a0a1
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-d04a0a1
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-d04a0a1
@metamask-previews/foundryup@1.0.1-preview-d04a0a1
@metamask-previews/gas-fee-controller@26.2.2-preview-d04a0a1
@metamask-previews/gator-permissions-controller@4.2.0-preview-d04a0a1
@metamask-previews/geolocation-controller@0.1.3-preview-d04a0a1
@metamask-previews/json-rpc-engine@10.5.0-preview-d04a0a1
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-d04a0a1
@metamask-previews/keyring-controller@26.0.0-preview-d04a0a1
@metamask-previews/logging-controller@8.0.2-preview-d04a0a1
@metamask-previews/message-manager@14.1.2-preview-d04a0a1
@metamask-previews/messenger@1.2.0-preview-d04a0a1
@metamask-previews/messenger-cli@0.2.0-preview-d04a0a1
@metamask-previews/money-account-balance-service@1.0.2-preview-d04a0a1
@metamask-previews/money-account-controller@0.3.2-preview-d04a0a1
@metamask-previews/money-account-upgrade-controller@2.0.3-preview-d04a0a1
@metamask-previews/multichain-account-service@10.0.2-preview-d04a0a1
@metamask-previews/multichain-api-middleware@3.1.3-preview-d04a0a1
@metamask-previews/multichain-network-controller@3.1.3-preview-d04a0a1
@metamask-previews/multichain-transactions-controller@7.1.1-preview-d04a0a1
@metamask-previews/name-controller@9.1.2-preview-d04a0a1
@metamask-previews/network-controller@32.0.0-preview-d04a0a1
@metamask-previews/network-enablement-controller@5.3.0-preview-d04a0a1
@metamask-previews/notification-services-controller@24.1.2-preview-d04a0a1
@metamask-previews/passkey-controller@2.0.1-preview-d04a0a1
@metamask-previews/permission-controller@13.1.1-preview-d04a0a1
@metamask-previews/permission-log-controller@5.1.0-preview-d04a0a1
@metamask-previews/perps-controller@7.0.0-preview-d04a0a1
@metamask-previews/phishing-controller@17.2.0-preview-d04a0a1
@metamask-previews/polling-controller@16.0.6-preview-d04a0a1
@metamask-previews/preferences-controller@23.1.0-preview-d04a0a1
@metamask-previews/profile-metrics-controller@3.1.6-preview-d04a0a1
@metamask-previews/profile-sync-controller@28.1.1-preview-d04a0a1
@metamask-previews/ramps-controller@14.1.1-preview-d04a0a1
@metamask-previews/rate-limit-controller@7.0.1-preview-d04a0a1
@metamask-previews/react-data-query@0.2.1-preview-d04a0a1
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-d04a0a1
@metamask-previews/sample-controllers@5.0.1-preview-d04a0a1
@metamask-previews/seedless-onboarding-controller@10.0.0-preview-d04a0a1
@metamask-previews/selected-network-controller@26.1.3-preview-d04a0a1
@metamask-previews/shield-controller@5.1.2-preview-d04a0a1
@metamask-previews/signature-controller@39.2.4-preview-d04a0a1
@metamask-previews/snap-account-service@0.3.0-preview-d04a0a1
@metamask-previews/social-controllers@2.2.1-preview-d04a0a1
@metamask-previews/storage-service@1.0.1-preview-d04a0a1
@metamask-previews/subscription-controller@6.1.3-preview-d04a0a1
@metamask-previews/transaction-controller@67.0.0-preview-d04a0a1
@metamask-previews/transaction-pay-controller@23.2.0-preview-d04a0a1
@metamask-previews/user-operation-controller@41.2.3-preview-d04a0a1
@metamask-previews/wallet@2.0.0-preview-d04a0a1

…iderForAsset selected-step

The selected-provider branch returned state.providers.selected, whose
region-specific fields (e.g. limits) may describe a different region than the
one resolved here (notably under a region override). Return the matching entry
from the region-resolved supporting list instead. Quote path unaffected (uses
only .id). Adds a region-override regression test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@amitabh94
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 6, 2026

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.1-preview-a607973
@metamask-previews/accounts-controller@39.0.0-preview-a607973
@metamask-previews/address-book-controller@7.1.2-preview-a607973
@metamask-previews/ai-controllers@0.7.0-preview-a607973
@metamask-previews/analytics-controller@1.1.0-preview-a607973
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-a607973
@metamask-previews/announcement-controller@8.1.0-preview-a607973
@metamask-previews/app-metadata-controller@2.0.1-preview-a607973
@metamask-previews/approval-controller@9.0.1-preview-a607973
@metamask-previews/assets-controller@8.3.2-preview-a607973
@metamask-previews/assets-controllers@108.5.0-preview-a607973
@metamask-previews/authenticated-user-storage@2.0.0-preview-a607973
@metamask-previews/base-controller@9.1.0-preview-a607973
@metamask-previews/base-data-service@0.1.3-preview-a607973
@metamask-previews/bridge-controller@73.2.1-preview-a607973
@metamask-previews/bridge-status-controller@72.0.2-preview-a607973
@metamask-previews/build-utils@3.0.4-preview-a607973
@metamask-previews/chain-agnostic-permission@1.6.1-preview-a607973
@metamask-previews/chomp-api-service@3.1.0-preview-a607973
@metamask-previews/claims-controller@0.5.2-preview-a607973
@metamask-previews/client-controller@1.0.1-preview-a607973
@metamask-previews/compliance-controller@2.1.0-preview-a607973
@metamask-previews/composable-controller@12.0.1-preview-a607973
@metamask-previews/config-registry-controller@0.4.0-preview-a607973
@metamask-previews/connectivity-controller@0.2.0-preview-a607973
@metamask-previews/controller-utils@12.1.0-preview-a607973
@metamask-previews/core-backend@6.3.2-preview-a607973
@metamask-previews/delegation-controller@3.0.1-preview-a607973
@metamask-previews/earn-controller@12.2.0-preview-a607973
@metamask-previews/eip-5792-middleware@3.0.4-preview-a607973
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-a607973
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-a607973
@metamask-previews/ens-controller@19.1.3-preview-a607973
@metamask-previews/eth-block-tracker@15.0.1-preview-a607973
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-a607973
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-a607973
@metamask-previews/foundryup@1.0.1-preview-a607973
@metamask-previews/gas-fee-controller@26.2.2-preview-a607973
@metamask-previews/gator-permissions-controller@4.2.0-preview-a607973
@metamask-previews/geolocation-controller@0.1.3-preview-a607973
@metamask-previews/json-rpc-engine@10.5.0-preview-a607973
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-a607973
@metamask-previews/keyring-controller@26.0.0-preview-a607973
@metamask-previews/logging-controller@8.0.2-preview-a607973
@metamask-previews/message-manager@14.1.2-preview-a607973
@metamask-previews/messenger@1.2.0-preview-a607973
@metamask-previews/messenger-cli@0.2.0-preview-a607973
@metamask-previews/money-account-balance-service@1.0.2-preview-a607973
@metamask-previews/money-account-controller@0.3.2-preview-a607973
@metamask-previews/money-account-upgrade-controller@2.0.3-preview-a607973
@metamask-previews/multichain-account-service@10.0.2-preview-a607973
@metamask-previews/multichain-api-middleware@3.1.3-preview-a607973
@metamask-previews/multichain-network-controller@3.1.3-preview-a607973
@metamask-previews/multichain-transactions-controller@7.1.1-preview-a607973
@metamask-previews/name-controller@9.1.2-preview-a607973
@metamask-previews/network-controller@32.0.0-preview-a607973
@metamask-previews/network-enablement-controller@5.3.0-preview-a607973
@metamask-previews/notification-services-controller@24.1.2-preview-a607973
@metamask-previews/passkey-controller@2.0.1-preview-a607973
@metamask-previews/permission-controller@13.1.1-preview-a607973
@metamask-previews/permission-log-controller@5.1.0-preview-a607973
@metamask-previews/perps-controller@7.0.0-preview-a607973
@metamask-previews/phishing-controller@17.2.0-preview-a607973
@metamask-previews/polling-controller@16.0.6-preview-a607973
@metamask-previews/preferences-controller@23.1.0-preview-a607973
@metamask-previews/profile-metrics-controller@3.1.6-preview-a607973
@metamask-previews/profile-sync-controller@28.1.1-preview-a607973
@metamask-previews/ramps-controller@14.1.1-preview-a607973
@metamask-previews/rate-limit-controller@7.0.1-preview-a607973
@metamask-previews/react-data-query@0.2.1-preview-a607973
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-a607973
@metamask-previews/sample-controllers@5.0.1-preview-a607973
@metamask-previews/seedless-onboarding-controller@10.0.0-preview-a607973
@metamask-previews/selected-network-controller@26.1.3-preview-a607973
@metamask-previews/shield-controller@5.1.2-preview-a607973
@metamask-previews/signature-controller@39.2.4-preview-a607973
@metamask-previews/snap-account-service@0.3.0-preview-a607973
@metamask-previews/social-controllers@2.2.1-preview-a607973
@metamask-previews/storage-service@1.0.1-preview-a607973
@metamask-previews/subscription-controller@6.1.3-preview-a607973
@metamask-previews/transaction-controller@67.0.0-preview-a607973
@metamask-previews/transaction-pay-controller@23.2.0-preview-a607973
@metamask-previews/user-operation-controller@41.2.3-preview-a607973
@metamask-previews/wallet@2.0.0-preview-a607973

…sort

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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