Skip to content

Conversation

@georgeweiler
Copy link
Contributor

@georgeweiler georgeweiler commented Jan 27, 2026

Explanation

This PR refactors the RampsController to improve naming consistency and add token selection support.

Breaking Changes

  • Rename preferredProvider to selectedProvider: Aligns naming with the new selectedToken state for consistency across selected entities
  • Update getPaymentMethods signature: Changed from getPaymentMethods(options) to getPaymentMethods(region, options) to match the pattern used by getTokens and getProviders

New Features

  • Add selectedToken state: Stores the user's selected token with setSelectedToken() method. When a token is selected, payment methods are automatically fetched for that token
  • Add RampsEnvironment.Local: New environment option for RampsService that points to localhost:3000 for local development

References

Mobile PR that adopts breaking changes: MetaMask/metamask-mobile#25296

Jira Ticket: https://consensyssoftware.atlassian.net/browse/TRAM-3232

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

Note

Medium Risk
Medium risk due to breaking API changes (preferredProviderselectedProvider, getPaymentMethods signature change) and new selection-driven side effects that auto-fetch/reset payment methods, which could affect client integrations and UI state transitions.

Overview
Adds selectedProvider and selectedToken to RampsController with new setSelectedProvider(id)/setSelectedToken(assetId) APIs; changing either now clears payment methods/selection and triggers a fresh getPaymentMethods fetch.

Introduces breaking changes: renames preferredProviderselectedProvider (and setter), changes getPaymentMethods/triggerGetPaymentMethods to getPaymentMethods(region, options), and updates setSelectedPaymentMethod to accept a payment-method ID (with validation).

Updates payment-methods behavior to default assetId/provider from controller state, auto-select the first returned payment method when the previous selection is invalid, and guard against stale updates when token/provider changes mid-request.

Enhances RampsService with RampsEnvironment.Local, optional baseUrlOverride, provider support metadata fields, and switches payment-methods API calls to GET /v2/regions/{region}/payments using crypto query param (plus test updates).

Written by Cursor Bugbot for commit 904405b. This will update automatically on new commits. Configure here.

@georgeweiler georgeweiler marked this pull request as ready for review January 27, 2026 16:00
@georgeweiler georgeweiler requested review from a team as code owners January 27, 2026 16:00
@georgeweiler
Copy link
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "4.0.0-preview-3fd5e61f",
  "@metamask-previews/accounts-controller": "35.0.2-preview-3fd5e61f",
  "@metamask-previews/address-book-controller": "7.0.1-preview-3fd5e61f",
  "@metamask-previews/ai-controllers": "0.0.0-preview-3fd5e61f",
  "@metamask-previews/analytics-controller": "1.0.0-preview-3fd5e61f",
  "@metamask-previews/announcement-controller": "8.0.0-preview-3fd5e61f",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-3fd5e61f",
  "@metamask-previews/approval-controller": "8.0.0-preview-3fd5e61f",
  "@metamask-previews/assets-controller": "0.0.0-preview-3fd5e61f",
  "@metamask-previews/assets-controllers": "98.0.0-preview-3fd5e61f",
  "@metamask-previews/base-controller": "9.0.0-preview-3fd5e61f",
  "@metamask-previews/bridge-controller": "65.0.0-preview-3fd5e61f",
  "@metamask-previews/bridge-status-controller": "65.0.0-preview-3fd5e61f",
  "@metamask-previews/build-utils": "3.0.4-preview-3fd5e61f",
  "@metamask-previews/chain-agnostic-permission": "1.4.0-preview-3fd5e61f",
  "@metamask-previews/claims-controller": "0.4.1-preview-3fd5e61f",
  "@metamask-previews/composable-controller": "12.0.0-preview-3fd5e61f",
  "@metamask-previews/connectivity-controller": "0.1.0-preview-3fd5e61f",
  "@metamask-previews/controller-utils": "11.18.0-preview-3fd5e61f",
  "@metamask-previews/core-backend": "5.0.0-preview-3fd5e61f",
  "@metamask-previews/delegation-controller": "2.0.0-preview-3fd5e61f",
  "@metamask-previews/earn-controller": "11.1.0-preview-3fd5e61f",
  "@metamask-previews/eip-5792-middleware": "2.1.0-preview-3fd5e61f",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-3fd5e61f",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-3fd5e61f",
  "@metamask-previews/ens-controller": "19.0.2-preview-3fd5e61f",
  "@metamask-previews/error-reporting-service": "3.0.1-preview-3fd5e61f",
  "@metamask-previews/eth-block-tracker": "15.0.1-preview-3fd5e61f",
  "@metamask-previews/eth-json-rpc-middleware": "23.0.0-preview-3fd5e61f",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-3fd5e61f",
  "@metamask-previews/foundryup": "1.0.1-preview-3fd5e61f",
  "@metamask-previews/gas-fee-controller": "26.0.2-preview-3fd5e61f",
  "@metamask-previews/gator-permissions-controller": "1.1.0-preview-3fd5e61f",
  "@metamask-previews/json-rpc-engine": "10.2.1-preview-3fd5e61f",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-3fd5e61f",
  "@metamask-previews/keyring-controller": "25.1.0-preview-3fd5e61f",
  "@metamask-previews/logging-controller": "7.0.1-preview-3fd5e61f",
  "@metamask-previews/message-manager": "14.1.0-preview-3fd5e61f",
  "@metamask-previews/messenger": "0.3.0-preview-3fd5e61f",
  "@metamask-previews/multichain-account-service": "5.1.0-preview-3fd5e61f",
  "@metamask-previews/multichain-api-middleware": "1.2.6-preview-3fd5e61f",
  "@metamask-previews/multichain-network-controller": "3.0.2-preview-3fd5e61f",
  "@metamask-previews/multichain-transactions-controller": "7.0.0-preview-3fd5e61f",
  "@metamask-previews/name-controller": "9.0.0-preview-3fd5e61f",
  "@metamask-previews/network-controller": "29.0.0-preview-3fd5e61f",
  "@metamask-previews/network-enablement-controller": "4.1.0-preview-3fd5e61f",
  "@metamask-previews/notification-services-controller": "21.0.0-preview-3fd5e61f",
  "@metamask-previews/permission-controller": "12.2.0-preview-3fd5e61f",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-3fd5e61f",
  "@metamask-previews/perps-controller": "0.0.0-preview-3fd5e61f",
  "@metamask-previews/phishing-controller": "16.1.0-preview-3fd5e61f",
  "@metamask-previews/polling-controller": "16.0.2-preview-3fd5e61f",
  "@metamask-previews/preferences-controller": "22.0.0-preview-3fd5e61f",
  "@metamask-previews/profile-metrics-controller": "3.0.0-preview-3fd5e61f",
  "@metamask-previews/profile-sync-controller": "27.0.0-preview-3fd5e61f",
  "@metamask-previews/ramps-controller": "4.1.0-preview-3fd5e61f",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-3fd5e61f",
  "@metamask-previews/remote-feature-flag-controller": "4.0.0-preview-3fd5e61f",
  "@metamask-previews/sample-controllers": "4.0.2-preview-3fd5e61f",
  "@metamask-previews/seedless-onboarding-controller": "7.1.0-preview-3fd5e61f",
  "@metamask-previews/selected-network-controller": "26.0.2-preview-3fd5e61f",
  "@metamask-previews/shield-controller": "5.0.0-preview-3fd5e61f",
  "@metamask-previews/signature-controller": "39.0.1-preview-3fd5e61f",
  "@metamask-previews/storage-service": "0.0.1-preview-3fd5e61f",
  "@metamask-previews/subscription-controller": "5.4.0-preview-3fd5e61f",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-3fd5e61f",
  "@metamask-previews/transaction-controller": "62.9.2-preview-3fd5e61f",
  "@metamask-previews/transaction-pay-controller": "12.0.0-preview-3fd5e61f",
  "@metamask-previews/user-operation-controller": "41.0.2-preview-3fd5e61f"
}

@georgeweiler georgeweiler changed the title refactor: update RampsController with selectedProvider and selectedToken feat: update RampsController with selectedProvider and selectedToken Jan 28, 2026
state.selectedToken = token;
});

this.triggerGetPaymentMethods(regionCode, {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think we can use the following instead of writing wrapper functions to trigger it ?

Suggested change
this.triggerGetPaymentMethods(regionCode, {
this.getPaymentMethods(regionCode, {
provider: provider.id,
}).catch(() => {
// ignore errors
});

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea. I will follow up with a refactor for all of the trigger methods.

Copy link

@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.

Copy link
Contributor

@amitabh94 amitabh94 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@georgeweiler georgeweiler added this pull request to the merge queue Jan 28, 2026
Merged via the queue into main with commit 172b31b Jan 28, 2026
306 checks passed
@georgeweiler georgeweiler deleted the TRAM-3232-reactive-payment-methods branch January 28, 2026 21:22
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.

4 participants