Skip to content

feat: add getPaymentMethodsForContext to ramps-controller - #9801

Merged
saustrie-consensys merged 12 commits into
mainfrom
saustrie/tram-3838-payment-methods-for-context
Aug 28, 2026
Merged

feat: add getPaymentMethodsForContext to ramps-controller#9801
saustrie-consensys merged 12 commits into
mainfrom
saustrie/tram-3838-payment-methods-for-context

Conversation

@saustrie-consensys

@saustrie-consensys saustrie-consensys commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Explanation

Money account "Pay with" previously read Buy-scoped payment methods even though Money quotes use a deposit asset and a different eligible-provider set. That mismatch could offer methods such as Revolut Pay that cannot produce a Money deposit quote (TRAM-3838 / metamask-mobile#34109).

Shared context API and provenance

getPaymentMethodsForContext is a new shared Core API. It combines payment-method fetch and automatic-selection behavior that already existed in Mobile UB2 with Core's existing provider-resolution helpers, while allowing callers to choose whether the result updates Buy state.

#resolveProviderIdsForPaymentMethods is a new adapter over existing Core behavior. It reuses #resolveAllProvidersFlag, #filterProviderIdsBySupport, #getSupportingProvidersForRegion, and #resolveProviderIdsForQuote instead of creating a separate provider policy.

mergePaymentMethodsById was newly designed for multi-provider fan-out. It was not copied from Mobile.

normalizeRampsAssetId is not new behavior. Mobile has carried the same rule since April 2026 as normalizeAssetIdForApi (metamask-mobile#29037). This PR promotes it into Core's public API so the rule lives in one place and Mobile can drop its copy. providerServesAsset now uses it too, which is a behavior change: non-EVM CAIP-19 references are no longer lowercased, since Solana base58 and bitcoin bech32 references are case-sensitive and lowercasing both sides could report a provider as serving an asset it does not serve.

Merge scope

mergePaymentMethodsById returns a single provider list unchanged by identity. It preserves the provider's array, row references, ordering, length, and duplicate IDs, so single-provider consumers such as standalone Buy keep verbatim provider output just as legacy getPaymentMethods did.

Deduping runs only when two or more provider lists are combined, and it keeps the first-seen entry per canonical ID. There is no field-level collision policy, because payment-method metadata is provider-invariant: the API serves it from a per-region catalog (PaymentMethodsList.ts) and the provider query narrows that catalog by ID-set membership (RegionsV2Service.ts, providerPaymentIds.has(payment.id)) without rewriting fields. Two providers returning the same payment ID therefore return identical score, delay, and name. The same data is already deduped first-seen-wins by the API itself for its multi-region path.

Provider fan-out does vary array order, because the API sorts by reliability per request. That affects ordering, not field values, and mergePaymentMethodsById preserves first-seen encounter order.

Stateful write guards

updateState: true reproduces legacy Buy catalog and selection writes, but it is guarded because the controller mutates shared state from inside the query function. A consumer's query cache cannot undo that side effect after a stale request commits.

The write requires the stored region, selected asset, and selected provider to match the request context. Stored region is trimmed and lowercased before comparison, and a missing region remains fail-closed. EVM asset IDs are compared case-insensitively while non-EVM asset case is preserved.

A region-only stale write is reachable when an older region request remains in flight, the user changes region, and the new region repopulates the same asset and provider before the older response returns. Legacy behavior checked asset and provider but not region. These guards close that latent gap rather than adding a cache-only safeguard.

Two same-context stateful requests cannot be ordered by those guards, because the context key falls back to the globally selected provider when more than one provider is passed. Rather than order them with a request sequence, updateState: true now throws when provider resolution yields more than one provider, before any fetch is issued. The shared Buy catalog has one slot per region, token, and selected provider, so a fan-out write has nowhere unambiguous to land. Callers wanting a multi-provider catalog pass updateState: false and read the returned methods. UB2 already passes exactly one explicit selected provider, and MMPay deposit contexts are read-only, so no current caller is affected.

An earlier revision of this PR ordered these writes with a per-request sequence counter instead. It was removed: the race it guarded is unreachable for a single-provider write (the state context key and the fetch cache key move together, so concurrent duplicates collapse in executeRequest's pending dedupe), and the counter was the source of both Bugbot findings on this PR, the second introduced by the fix for the first.

Catalog writers

paymentMethods.data and paymentMethods.selected have two writers in Core: the pre-existing getPaymentMethods and the new getPaymentMethodsForContext. Neither one's write guard is aware of the other, so a client calling both for the same context has always been able to interleave them.

The consumer PR removes Mobile's last call to getPaymentMethods (it was in app/components/UI/Ramp/queries/paymentMethods.ts on main), so once both land, getPaymentMethodsForContext is Mobile's only writer of that state. getPaymentMethods stays exported and unchanged for other consumers.

Scope boundary

This PR does not include getSmartSelectedQuote or applyQuoteContext. Payment-method context is the minimum shared boundary required by the implemented Money and UB2 consumers. Quote choice and quote-state application still have consumer-specific orchestration and remain deferred to the tracked UB2 dumbification follow-up (TRAM-3856).

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

Note

Medium Risk
Touches payment-method catalog state, provider eligibility matching, and new concurrent-write guards; behavior change for non-EVM asset matching could affect which providers are considered to serve an asset.

Overview
Adds getPaymentMethodsForContext (and the messenger action) so Money/headless flows can load payment methods for a deposit asset and provider set using the same resolution rules as getQuotes, without defaulting to the Buy catalog’s selected token/provider. By default the call is request-only; optional updateState: true writes paymentMethods only when region, selected token, and selected provider still match, and throws if resolution yields more than one provider.

Multi-provider fetches fan out, merge via new mergePaymentMethodsById / pickPaymentMethod, and tolerate partial failures. normalizeRampsAssetId is exported and used for comparisons; providerServesAsset / getProvidersServingAsset now stop lowercasing non-EVM CAIP-19 ids so Solana/bitcoin references stay case-sensitive.

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

Add a context-scoped payment-method API aligned with getQuotes provider
resolution so Headless/MM Pay can list request-eligible methods for a
deposit asset without mutating the Buy payment-method catalog (TRAM-3838).
@saustrie-consensys

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@saustrie-consensys
saustrie-consensys force-pushed the saustrie/tram-3838-payment-methods-for-context branch from 0a0be4b to 1bbcc4b Compare August 7, 2026 13:25
@saustrie-consensys
saustrie-consensys force-pushed the saustrie/tram-3838-payment-methods-for-context branch from 1bbcc4b to 8321b8c Compare August 7, 2026 13:25
@saustrie-consensys

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@github-actions

github-actions Bot commented Aug 7, 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.6.1-preview-6e2b5fe
@metamask-previews/accounts-controller@39.0.7-preview-6e2b5fe
@metamask-previews/address-book-controller@7.1.2-preview-6e2b5fe
@metamask-previews/ai-controllers@0.8.0-preview-6e2b5fe
@metamask-previews/analytics-controller@2.0.0-preview-6e2b5fe
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-6e2b5fe
@metamask-previews/announcement-controller@8.1.0-preview-6e2b5fe
@metamask-previews/app-metadata-controller@2.0.1-preview-6e2b5fe
@metamask-previews/approval-controller@9.0.2-preview-6e2b5fe
@metamask-previews/assets-controller@13.1.1-preview-6e2b5fe
@metamask-previews/assets-controllers@111.1.0-preview-6e2b5fe
@metamask-previews/authenticated-user-storage@3.0.1-preview-6e2b5fe
@metamask-previews/base-controller@9.1.0-preview-6e2b5fe
@metamask-previews/base-data-service@0.1.3-preview-6e2b5fe
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-6e2b5fe
@metamask-previews/bridge-controller@79.0.1-preview-6e2b5fe
@metamask-previews/bridge-status-controller@75.0.0-preview-6e2b5fe
@metamask-previews/build-utils@3.0.4-preview-6e2b5fe
@metamask-previews/chain-agnostic-permission@1.7.0-preview-6e2b5fe
@metamask-previews/chomp-api-service@4.0.0-preview-6e2b5fe
@metamask-previews/claims-controller@0.5.4-preview-6e2b5fe
@metamask-previews/client-controller@1.0.1-preview-6e2b5fe
@metamask-previews/client-utils@2.0.1-preview-6e2b5fe
@metamask-previews/compliance-controller@2.1.0-preview-6e2b5fe
@metamask-previews/composable-controller@12.0.1-preview-6e2b5fe
@metamask-previews/config-registry-controller@2.0.1-preview-6e2b5fe
@metamask-previews/connectivity-controller@0.3.0-preview-6e2b5fe
@metamask-previews/controller-utils@12.3.0-preview-6e2b5fe
@metamask-previews/core-backend@8.1.1-preview-6e2b5fe
@metamask-previews/delegation-controller@3.0.2-preview-6e2b5fe
@metamask-previews/earn-controller@12.2.4-preview-6e2b5fe
@metamask-previews/eip-5792-middleware@3.0.5-preview-6e2b5fe
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-6e2b5fe
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-6e2b5fe
@metamask-previews/ens-controller@19.1.6-preview-6e2b5fe
@metamask-previews/eth-block-tracker@15.0.1-preview-6e2b5fe
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-6e2b5fe
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-6e2b5fe
@metamask-previews/foundryup@1.0.1-preview-6e2b5fe
@metamask-previews/gas-fee-controller@26.3.1-preview-6e2b5fe
@metamask-previews/gator-permissions-controller@5.0.1-preview-6e2b5fe
@metamask-previews/geolocation-controller@1.0.0-preview-6e2b5fe
@metamask-previews/java-tron-up@1.0.0-preview-6e2b5fe
@metamask-previews/json-rpc-engine@10.5.0-preview-6e2b5fe
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-6e2b5fe
@metamask-previews/keyring-controller@27.1.1-preview-6e2b5fe
@metamask-previews/kyc-controller@0.0.0-preview-6e2b5fe
@metamask-previews/local-node-utils@1.0.0-preview-6e2b5fe
@metamask-previews/logging-controller@8.0.2-preview-6e2b5fe
@metamask-previews/message-manager@14.1.2-preview-6e2b5fe
@metamask-previews/messenger@2.0.0-preview-6e2b5fe
@metamask-previews/messenger-cli@0.2.0-preview-6e2b5fe
@metamask-previews/money-account-api-data-service@0.4.0-preview-6e2b5fe
@metamask-previews/money-account-balance-service@2.4.1-preview-6e2b5fe
@metamask-previews/money-account-controller@1.0.0-preview-6e2b5fe
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-6e2b5fe
@metamask-previews/money-account-utils@1.1.0-preview-6e2b5fe
@metamask-previews/multichain-account-service@13.0.1-preview-6e2b5fe
@metamask-previews/multichain-api-middleware@4.0.2-preview-6e2b5fe
@metamask-previews/multichain-network-controller@3.2.3-preview-6e2b5fe
@metamask-previews/multichain-transactions-controller@7.1.2-preview-6e2b5fe
@metamask-previews/name-controller@9.1.2-preview-6e2b5fe
@metamask-previews/network-connection-banner-controller@0.1.2-preview-6e2b5fe
@metamask-previews/network-controller@35.0.1-preview-6e2b5fe
@metamask-previews/network-enablement-controller@6.0.3-preview-6e2b5fe
@metamask-previews/notification-services-controller@26.0.1-preview-6e2b5fe
@metamask-previews/passkey-controller@3.0.0-preview-6e2b5fe
@metamask-previews/permission-controller@13.1.1-preview-6e2b5fe
@metamask-previews/permission-log-controller@5.1.0-preview-6e2b5fe
@metamask-previews/perps-controller@11.0.0-preview-6e2b5fe
@metamask-previews/phishing-controller@17.3.1-preview-6e2b5fe
@metamask-previews/platform-api-docs@0.0.0-preview-6e2b5fe
@metamask-previews/polling-controller@16.0.9-preview-6e2b5fe
@metamask-previews/preferences-controller@23.1.0-preview-6e2b5fe
@metamask-previews/profile-metrics-controller@4.0.3-preview-6e2b5fe
@metamask-previews/profile-sync-controller@29.0.0-preview-6e2b5fe
@metamask-previews/ramps-controller@20.0.0-preview-6e2b5fe
@metamask-previews/rate-limit-controller@7.0.1-preview-6e2b5fe
@metamask-previews/react-data-query@0.2.2-preview-6e2b5fe
@metamask-previews/remote-feature-flag-controller@5.0.0-preview-6e2b5fe
@metamask-previews/sample-controllers@5.0.4-preview-6e2b5fe
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-6e2b5fe
@metamask-previews/selected-network-controller@26.1.6-preview-6e2b5fe
@metamask-previews/sentinel-api-service@1.0.0-preview-6e2b5fe
@metamask-previews/shield-controller@5.1.3-preview-6e2b5fe
@metamask-previews/signature-controller@39.2.9-preview-6e2b5fe
@metamask-previews/smart-transactions-controller@25.1.0-preview-6e2b5fe
@metamask-previews/snap-account-service@2.1.2-preview-6e2b5fe
@metamask-previews/social-controllers@2.7.1-preview-6e2b5fe
@metamask-previews/solana-test-validator-up@1.0.0-preview-6e2b5fe
@metamask-previews/stellar-quickstart-up@0.0.0-preview-6e2b5fe
@metamask-previews/storage-service@1.0.2-preview-6e2b5fe
@metamask-previews/subscription-controller@6.2.2-preview-6e2b5fe
@metamask-previews/transaction-controller@69.5.1-preview-6e2b5fe
@metamask-previews/transaction-pay-controller@26.2.3-preview-6e2b5fe
@metamask-previews/user-operation-controller@41.2.8-preview-6e2b5fe
@metamask-previews/wallet@9.0.0-preview-6e2b5fe
@metamask-previews/wallet-cli@0.0.0-preview-6e2b5fe

@github-actions

github-actions Bot commented Aug 7, 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.6.1-preview-8321b8c
@metamask-previews/accounts-controller@39.0.7-preview-8321b8c
@metamask-previews/address-book-controller@7.1.2-preview-8321b8c
@metamask-previews/ai-controllers@0.8.0-preview-8321b8c
@metamask-previews/analytics-controller@2.0.0-preview-8321b8c
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-8321b8c
@metamask-previews/announcement-controller@8.1.0-preview-8321b8c
@metamask-previews/app-metadata-controller@2.0.1-preview-8321b8c
@metamask-previews/approval-controller@9.0.2-preview-8321b8c
@metamask-previews/assets-controller@13.1.1-preview-8321b8c
@metamask-previews/assets-controllers@111.1.0-preview-8321b8c
@metamask-previews/authenticated-user-storage@3.0.1-preview-8321b8c
@metamask-previews/base-controller@9.1.0-preview-8321b8c
@metamask-previews/base-data-service@0.1.3-preview-8321b8c
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-8321b8c
@metamask-previews/bridge-controller@79.0.1-preview-8321b8c
@metamask-previews/bridge-status-controller@75.0.0-preview-8321b8c
@metamask-previews/build-utils@3.0.4-preview-8321b8c
@metamask-previews/chain-agnostic-permission@1.7.0-preview-8321b8c
@metamask-previews/chomp-api-service@4.0.0-preview-8321b8c
@metamask-previews/claims-controller@0.5.4-preview-8321b8c
@metamask-previews/client-controller@1.0.1-preview-8321b8c
@metamask-previews/client-utils@2.0.1-preview-8321b8c
@metamask-previews/compliance-controller@2.1.0-preview-8321b8c
@metamask-previews/composable-controller@12.0.1-preview-8321b8c
@metamask-previews/config-registry-controller@2.0.1-preview-8321b8c
@metamask-previews/connectivity-controller@0.3.0-preview-8321b8c
@metamask-previews/controller-utils@12.3.0-preview-8321b8c
@metamask-previews/core-backend@8.1.1-preview-8321b8c
@metamask-previews/delegation-controller@3.0.2-preview-8321b8c
@metamask-previews/earn-controller@12.2.4-preview-8321b8c
@metamask-previews/eip-5792-middleware@3.0.5-preview-8321b8c
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-8321b8c
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-8321b8c
@metamask-previews/ens-controller@19.1.6-preview-8321b8c
@metamask-previews/eth-block-tracker@15.0.1-preview-8321b8c
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-8321b8c
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-8321b8c
@metamask-previews/foundryup@1.0.1-preview-8321b8c
@metamask-previews/gas-fee-controller@26.3.1-preview-8321b8c
@metamask-previews/gator-permissions-controller@5.0.1-preview-8321b8c
@metamask-previews/geolocation-controller@1.0.0-preview-8321b8c
@metamask-previews/java-tron-up@1.0.0-preview-8321b8c
@metamask-previews/json-rpc-engine@10.5.0-preview-8321b8c
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-8321b8c
@metamask-previews/keyring-controller@27.1.1-preview-8321b8c
@metamask-previews/kyc-controller@0.0.0-preview-8321b8c
@metamask-previews/local-node-utils@1.0.0-preview-8321b8c
@metamask-previews/logging-controller@8.0.2-preview-8321b8c
@metamask-previews/message-manager@14.1.2-preview-8321b8c
@metamask-previews/messenger@2.0.0-preview-8321b8c
@metamask-previews/messenger-cli@0.2.0-preview-8321b8c
@metamask-previews/money-account-api-data-service@0.4.0-preview-8321b8c
@metamask-previews/money-account-balance-service@2.4.1-preview-8321b8c
@metamask-previews/money-account-controller@1.0.0-preview-8321b8c
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-8321b8c
@metamask-previews/money-account-utils@1.1.0-preview-8321b8c
@metamask-previews/multichain-account-service@13.0.1-preview-8321b8c
@metamask-previews/multichain-api-middleware@4.0.2-preview-8321b8c
@metamask-previews/multichain-network-controller@3.2.3-preview-8321b8c
@metamask-previews/multichain-transactions-controller@7.1.2-preview-8321b8c
@metamask-previews/name-controller@9.1.2-preview-8321b8c
@metamask-previews/network-connection-banner-controller@0.1.2-preview-8321b8c
@metamask-previews/network-controller@35.0.1-preview-8321b8c
@metamask-previews/network-enablement-controller@6.0.3-preview-8321b8c
@metamask-previews/notification-services-controller@26.0.1-preview-8321b8c
@metamask-previews/passkey-controller@3.0.0-preview-8321b8c
@metamask-previews/permission-controller@13.1.1-preview-8321b8c
@metamask-previews/permission-log-controller@5.1.0-preview-8321b8c
@metamask-previews/perps-controller@11.0.0-preview-8321b8c
@metamask-previews/phishing-controller@17.3.1-preview-8321b8c
@metamask-previews/platform-api-docs@0.0.0-preview-8321b8c
@metamask-previews/polling-controller@16.0.9-preview-8321b8c
@metamask-previews/preferences-controller@23.1.0-preview-8321b8c
@metamask-previews/profile-metrics-controller@4.0.3-preview-8321b8c
@metamask-previews/profile-sync-controller@29.0.0-preview-8321b8c
@metamask-previews/ramps-controller@20.0.0-preview-8321b8c
@metamask-previews/rate-limit-controller@7.0.1-preview-8321b8c
@metamask-previews/react-data-query@0.2.2-preview-8321b8c
@metamask-previews/remote-feature-flag-controller@5.0.0-preview-8321b8c
@metamask-previews/sample-controllers@5.0.4-preview-8321b8c
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-8321b8c
@metamask-previews/selected-network-controller@26.1.6-preview-8321b8c
@metamask-previews/sentinel-api-service@1.0.0-preview-8321b8c
@metamask-previews/shield-controller@5.1.3-preview-8321b8c
@metamask-previews/signature-controller@39.2.9-preview-8321b8c
@metamask-previews/smart-transactions-controller@25.1.0-preview-8321b8c
@metamask-previews/snap-account-service@2.1.2-preview-8321b8c
@metamask-previews/social-controllers@2.7.1-preview-8321b8c
@metamask-previews/solana-test-validator-up@1.0.0-preview-8321b8c
@metamask-previews/stellar-quickstart-up@0.0.0-preview-8321b8c
@metamask-previews/storage-service@1.0.2-preview-8321b8c
@metamask-previews/subscription-controller@6.2.2-preview-8321b8c
@metamask-previews/transaction-controller@69.5.1-preview-8321b8c
@metamask-previews/transaction-pay-controller@26.2.3-preview-8321b8c
@metamask-previews/user-operation-controller@41.2.8-preview-8321b8c
@metamask-previews/wallet@9.0.0-preview-8321b8c
@metamask-previews/wallet-cli@0.0.0-preview-8321b8c

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

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@github-actions

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.6.1-preview-634f4cc50
@metamask-previews/accounts-controller@39.0.7-preview-634f4cc50
@metamask-previews/address-book-controller@7.1.2-preview-634f4cc50
@metamask-previews/ai-controllers@0.8.0-preview-634f4cc50
@metamask-previews/analytics-controller@2.0.0-preview-634f4cc50
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-634f4cc50
@metamask-previews/announcement-controller@8.1.0-preview-634f4cc50
@metamask-previews/app-metadata-controller@2.0.1-preview-634f4cc50
@metamask-previews/approval-controller@9.0.2-preview-634f4cc50
@metamask-previews/assets-controller@13.1.1-preview-634f4cc50
@metamask-previews/assets-controllers@111.1.0-preview-634f4cc50
@metamask-previews/authenticated-user-storage@3.0.1-preview-634f4cc50
@metamask-previews/base-controller@9.1.0-preview-634f4cc50
@metamask-previews/base-data-service@0.1.3-preview-634f4cc50
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-634f4cc50
@metamask-previews/bridge-controller@79.0.1-preview-634f4cc50
@metamask-previews/bridge-status-controller@75.0.0-preview-634f4cc50
@metamask-previews/build-utils@3.0.4-preview-634f4cc50
@metamask-previews/chain-agnostic-permission@1.7.0-preview-634f4cc50
@metamask-previews/chomp-api-service@4.0.0-preview-634f4cc50
@metamask-previews/claims-controller@0.5.4-preview-634f4cc50
@metamask-previews/client-controller@1.0.1-preview-634f4cc50
@metamask-previews/client-utils@2.0.1-preview-634f4cc50
@metamask-previews/compliance-controller@2.1.0-preview-634f4cc50
@metamask-previews/composable-controller@12.0.1-preview-634f4cc50
@metamask-previews/config-registry-controller@2.0.1-preview-634f4cc50
@metamask-previews/connectivity-controller@0.3.0-preview-634f4cc50
@metamask-previews/controller-utils@12.3.0-preview-634f4cc50
@metamask-previews/core-backend@8.1.1-preview-634f4cc50
@metamask-previews/delegation-controller@3.0.2-preview-634f4cc50
@metamask-previews/earn-controller@12.2.4-preview-634f4cc50
@metamask-previews/eip-5792-middleware@3.0.5-preview-634f4cc50
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-634f4cc50
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-634f4cc50
@metamask-previews/ens-controller@19.1.6-preview-634f4cc50
@metamask-previews/eth-block-tracker@15.0.1-preview-634f4cc50
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-634f4cc50
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-634f4cc50
@metamask-previews/foundryup@1.0.1-preview-634f4cc50
@metamask-previews/gas-fee-controller@26.3.1-preview-634f4cc50
@metamask-previews/gator-permissions-controller@5.0.1-preview-634f4cc50
@metamask-previews/geolocation-controller@1.0.0-preview-634f4cc50
@metamask-previews/java-tron-up@1.0.0-preview-634f4cc50
@metamask-previews/json-rpc-engine@10.5.0-preview-634f4cc50
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-634f4cc50
@metamask-previews/keyring-controller@27.1.1-preview-634f4cc50
@metamask-previews/kyc-controller@0.0.0-preview-634f4cc50
@metamask-previews/local-node-utils@1.0.0-preview-634f4cc50
@metamask-previews/logging-controller@8.0.2-preview-634f4cc50
@metamask-previews/message-manager@14.1.2-preview-634f4cc50
@metamask-previews/messenger@2.0.0-preview-634f4cc50
@metamask-previews/messenger-cli@0.2.0-preview-634f4cc50
@metamask-previews/money-account-api-data-service@0.4.0-preview-634f4cc50
@metamask-previews/money-account-balance-service@2.4.1-preview-634f4cc50
@metamask-previews/money-account-controller@1.0.0-preview-634f4cc50
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-634f4cc50
@metamask-previews/money-account-utils@1.1.0-preview-634f4cc50
@metamask-previews/multichain-account-service@13.0.1-preview-634f4cc50
@metamask-previews/multichain-api-middleware@4.0.2-preview-634f4cc50
@metamask-previews/multichain-network-controller@3.2.3-preview-634f4cc50
@metamask-previews/multichain-transactions-controller@7.1.2-preview-634f4cc50
@metamask-previews/name-controller@9.1.2-preview-634f4cc50
@metamask-previews/network-connection-banner-controller@0.1.2-preview-634f4cc50
@metamask-previews/network-controller@35.0.1-preview-634f4cc50
@metamask-previews/network-enablement-controller@6.0.3-preview-634f4cc50
@metamask-previews/notification-services-controller@26.0.1-preview-634f4cc50
@metamask-previews/passkey-controller@3.0.0-preview-634f4cc50
@metamask-previews/permission-controller@13.1.1-preview-634f4cc50
@metamask-previews/permission-log-controller@5.1.0-preview-634f4cc50
@metamask-previews/perps-controller@11.0.0-preview-634f4cc50
@metamask-previews/phishing-controller@17.3.1-preview-634f4cc50
@metamask-previews/platform-api-docs@0.0.0-preview-634f4cc50
@metamask-previews/polling-controller@16.0.9-preview-634f4cc50
@metamask-previews/preferences-controller@23.1.0-preview-634f4cc50
@metamask-previews/profile-metrics-controller@4.0.3-preview-634f4cc50
@metamask-previews/profile-sync-controller@29.0.0-preview-634f4cc50
@metamask-previews/ramps-controller@20.0.0-preview-634f4cc50
@metamask-previews/rate-limit-controller@7.0.1-preview-634f4cc50
@metamask-previews/react-data-query@0.2.2-preview-634f4cc50
@metamask-previews/remote-feature-flag-controller@5.0.0-preview-634f4cc50
@metamask-previews/sample-controllers@5.0.4-preview-634f4cc50
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-634f4cc50
@metamask-previews/selected-network-controller@26.1.6-preview-634f4cc50
@metamask-previews/sentinel-api-service@1.0.0-preview-634f4cc50
@metamask-previews/shield-controller@5.1.3-preview-634f4cc50
@metamask-previews/signature-controller@39.2.9-preview-634f4cc50
@metamask-previews/smart-transactions-controller@25.1.0-preview-634f4cc50
@metamask-previews/snap-account-service@2.1.2-preview-634f4cc50
@metamask-previews/social-controllers@2.7.1-preview-634f4cc50
@metamask-previews/solana-test-validator-up@1.0.0-preview-634f4cc50
@metamask-previews/stellar-quickstart-up@0.0.0-preview-634f4cc50
@metamask-previews/storage-service@1.0.2-preview-634f4cc50
@metamask-previews/subscription-controller@6.2.2-preview-634f4cc50
@metamask-previews/transaction-controller@69.5.1-preview-634f4cc50
@metamask-previews/transaction-pay-controller@26.2.3-preview-634f4cc50
@metamask-previews/user-operation-controller@41.2.8-preview-634f4cc50
@metamask-previews/wallet@9.0.0-preview-634f4cc50
@metamask-previews/wallet-cli@0.0.0-preview-634f4cc50

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

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@saustrie-consensys
saustrie-consensys marked this pull request as ready for review August 25, 2026 14:54
@saustrie-consensys
saustrie-consensys requested review from a team as code owners August 25, 2026 14:54
Comment thread packages/ramps-controller/src/RampsController.ts Outdated
@cursor
cursor Bot requested review from amitabh94 and georgeweiler August 25, 2026 15:00
@github-actions

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.6.1-preview-12019cffe
@metamask-previews/accounts-controller@39.0.7-preview-12019cffe
@metamask-previews/address-book-controller@7.1.2-preview-12019cffe
@metamask-previews/ai-controllers@0.8.0-preview-12019cffe
@metamask-previews/analytics-controller@2.0.0-preview-12019cffe
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-12019cffe
@metamask-previews/announcement-controller@8.1.0-preview-12019cffe
@metamask-previews/app-metadata-controller@2.0.1-preview-12019cffe
@metamask-previews/approval-controller@9.0.2-preview-12019cffe
@metamask-previews/assets-controller@13.1.1-preview-12019cffe
@metamask-previews/assets-controllers@111.1.0-preview-12019cffe
@metamask-previews/authenticated-user-storage@3.0.1-preview-12019cffe
@metamask-previews/base-controller@9.1.0-preview-12019cffe
@metamask-previews/base-data-service@0.1.3-preview-12019cffe
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-12019cffe
@metamask-previews/bridge-controller@79.0.1-preview-12019cffe
@metamask-previews/bridge-status-controller@75.0.0-preview-12019cffe
@metamask-previews/build-utils@3.0.4-preview-12019cffe
@metamask-previews/chain-agnostic-permission@1.7.0-preview-12019cffe
@metamask-previews/chomp-api-service@4.0.0-preview-12019cffe
@metamask-previews/claims-controller@0.5.4-preview-12019cffe
@metamask-previews/client-controller@1.0.1-preview-12019cffe
@metamask-previews/client-utils@2.0.1-preview-12019cffe
@metamask-previews/compliance-controller@2.1.0-preview-12019cffe
@metamask-previews/composable-controller@12.0.1-preview-12019cffe
@metamask-previews/config-registry-controller@2.0.1-preview-12019cffe
@metamask-previews/connectivity-controller@0.3.0-preview-12019cffe
@metamask-previews/controller-utils@12.3.0-preview-12019cffe
@metamask-previews/core-backend@8.1.1-preview-12019cffe
@metamask-previews/delegation-controller@3.0.2-preview-12019cffe
@metamask-previews/earn-controller@12.2.4-preview-12019cffe
@metamask-previews/eip-5792-middleware@3.0.5-preview-12019cffe
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-12019cffe
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-12019cffe
@metamask-previews/ens-controller@19.1.6-preview-12019cffe
@metamask-previews/eth-block-tracker@15.0.1-preview-12019cffe
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-12019cffe
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-12019cffe
@metamask-previews/foundryup@1.0.1-preview-12019cffe
@metamask-previews/gas-fee-controller@26.3.1-preview-12019cffe
@metamask-previews/gator-permissions-controller@5.0.1-preview-12019cffe
@metamask-previews/geolocation-controller@1.0.0-preview-12019cffe
@metamask-previews/java-tron-up@1.0.0-preview-12019cffe
@metamask-previews/json-rpc-engine@10.5.0-preview-12019cffe
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-12019cffe
@metamask-previews/keyring-controller@27.1.1-preview-12019cffe
@metamask-previews/kyc-controller@0.0.0-preview-12019cffe
@metamask-previews/local-node-utils@1.0.0-preview-12019cffe
@metamask-previews/logging-controller@8.0.2-preview-12019cffe
@metamask-previews/message-manager@14.1.2-preview-12019cffe
@metamask-previews/messenger@2.0.0-preview-12019cffe
@metamask-previews/messenger-cli@0.2.0-preview-12019cffe
@metamask-previews/money-account-api-data-service@0.4.0-preview-12019cffe
@metamask-previews/money-account-balance-service@2.4.1-preview-12019cffe
@metamask-previews/money-account-controller@1.0.0-preview-12019cffe
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-12019cffe
@metamask-previews/money-account-utils@1.1.0-preview-12019cffe
@metamask-previews/multichain-account-service@13.0.1-preview-12019cffe
@metamask-previews/multichain-api-middleware@4.0.2-preview-12019cffe
@metamask-previews/multichain-network-controller@3.2.3-preview-12019cffe
@metamask-previews/multichain-transactions-controller@7.1.2-preview-12019cffe
@metamask-previews/name-controller@9.1.2-preview-12019cffe
@metamask-previews/network-connection-banner-controller@0.1.2-preview-12019cffe
@metamask-previews/network-controller@35.0.1-preview-12019cffe
@metamask-previews/network-enablement-controller@6.0.3-preview-12019cffe
@metamask-previews/notification-services-controller@26.0.1-preview-12019cffe
@metamask-previews/passkey-controller@3.0.0-preview-12019cffe
@metamask-previews/permission-controller@13.1.1-preview-12019cffe
@metamask-previews/permission-log-controller@5.1.0-preview-12019cffe
@metamask-previews/perps-controller@11.0.0-preview-12019cffe
@metamask-previews/phishing-controller@17.3.1-preview-12019cffe
@metamask-previews/platform-api-docs@0.0.0-preview-12019cffe
@metamask-previews/polling-controller@16.0.9-preview-12019cffe
@metamask-previews/preferences-controller@23.1.0-preview-12019cffe
@metamask-previews/profile-metrics-controller@4.0.3-preview-12019cffe
@metamask-previews/profile-sync-controller@29.0.0-preview-12019cffe
@metamask-previews/ramps-controller@20.0.0-preview-12019cffe
@metamask-previews/rate-limit-controller@7.0.1-preview-12019cffe
@metamask-previews/react-data-query@0.2.2-preview-12019cffe
@metamask-previews/remote-feature-flag-controller@5.0.0-preview-12019cffe
@metamask-previews/sample-controllers@5.0.4-preview-12019cffe
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-12019cffe
@metamask-previews/selected-network-controller@26.1.6-preview-12019cffe
@metamask-previews/sentinel-api-service@1.0.0-preview-12019cffe
@metamask-previews/shield-controller@5.1.3-preview-12019cffe
@metamask-previews/signature-controller@39.2.9-preview-12019cffe
@metamask-previews/smart-transactions-controller@25.1.0-preview-12019cffe
@metamask-previews/snap-account-service@2.1.2-preview-12019cffe
@metamask-previews/social-controllers@2.7.1-preview-12019cffe
@metamask-previews/solana-test-validator-up@1.0.0-preview-12019cffe
@metamask-previews/stellar-quickstart-up@0.0.0-preview-12019cffe
@metamask-previews/storage-service@1.0.2-preview-12019cffe
@metamask-previews/subscription-controller@6.2.2-preview-12019cffe
@metamask-previews/transaction-controller@69.5.1-preview-12019cffe
@metamask-previews/transaction-pay-controller@26.2.3-preview-12019cffe
@metamask-previews/user-operation-controller@41.2.8-preview-12019cffe
@metamask-previews/wallet@9.0.0-preview-12019cffe
@metamask-previews/wallet-cli@0.0.0-preview-12019cffe

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

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@github-actions

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.6.1-preview-2f49d5c05
@metamask-previews/accounts-controller@39.0.7-preview-2f49d5c05
@metamask-previews/address-book-controller@7.1.2-preview-2f49d5c05
@metamask-previews/ai-controllers@0.8.0-preview-2f49d5c05
@metamask-previews/analytics-controller@2.0.0-preview-2f49d5c05
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-2f49d5c05
@metamask-previews/announcement-controller@8.1.0-preview-2f49d5c05
@metamask-previews/app-metadata-controller@2.0.1-preview-2f49d5c05
@metamask-previews/approval-controller@9.0.2-preview-2f49d5c05
@metamask-previews/assets-controller@13.1.1-preview-2f49d5c05
@metamask-previews/assets-controllers@111.1.0-preview-2f49d5c05
@metamask-previews/authenticated-user-storage@3.0.1-preview-2f49d5c05
@metamask-previews/base-controller@9.1.0-preview-2f49d5c05
@metamask-previews/base-data-service@0.1.3-preview-2f49d5c05
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-2f49d5c05
@metamask-previews/bridge-controller@79.0.1-preview-2f49d5c05
@metamask-previews/bridge-status-controller@75.0.0-preview-2f49d5c05
@metamask-previews/build-utils@3.0.4-preview-2f49d5c05
@metamask-previews/chain-agnostic-permission@1.7.0-preview-2f49d5c05
@metamask-previews/chomp-api-service@4.0.0-preview-2f49d5c05
@metamask-previews/claims-controller@0.5.4-preview-2f49d5c05
@metamask-previews/client-controller@1.0.1-preview-2f49d5c05
@metamask-previews/client-utils@2.0.1-preview-2f49d5c05
@metamask-previews/compliance-controller@2.1.0-preview-2f49d5c05
@metamask-previews/composable-controller@12.0.1-preview-2f49d5c05
@metamask-previews/config-registry-controller@2.0.1-preview-2f49d5c05
@metamask-previews/connectivity-controller@0.3.0-preview-2f49d5c05
@metamask-previews/controller-utils@12.3.0-preview-2f49d5c05
@metamask-previews/core-backend@8.1.1-preview-2f49d5c05
@metamask-previews/delegation-controller@3.0.2-preview-2f49d5c05
@metamask-previews/earn-controller@12.2.4-preview-2f49d5c05
@metamask-previews/eip-5792-middleware@3.0.5-preview-2f49d5c05
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-2f49d5c05
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-2f49d5c05
@metamask-previews/ens-controller@19.1.6-preview-2f49d5c05
@metamask-previews/eth-block-tracker@15.0.1-preview-2f49d5c05
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-2f49d5c05
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-2f49d5c05
@metamask-previews/foundryup@1.0.1-preview-2f49d5c05
@metamask-previews/gas-fee-controller@26.3.1-preview-2f49d5c05
@metamask-previews/gator-permissions-controller@5.0.1-preview-2f49d5c05
@metamask-previews/geolocation-controller@1.0.0-preview-2f49d5c05
@metamask-previews/java-tron-up@1.0.0-preview-2f49d5c05
@metamask-previews/json-rpc-engine@10.5.0-preview-2f49d5c05
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-2f49d5c05
@metamask-previews/keyring-controller@27.1.1-preview-2f49d5c05
@metamask-previews/kyc-controller@0.0.0-preview-2f49d5c05
@metamask-previews/local-node-utils@1.0.0-preview-2f49d5c05
@metamask-previews/logging-controller@8.0.2-preview-2f49d5c05
@metamask-previews/message-manager@14.1.2-preview-2f49d5c05
@metamask-previews/messenger@2.0.0-preview-2f49d5c05
@metamask-previews/messenger-cli@0.2.0-preview-2f49d5c05
@metamask-previews/money-account-api-data-service@0.4.0-preview-2f49d5c05
@metamask-previews/money-account-balance-service@2.4.1-preview-2f49d5c05
@metamask-previews/money-account-controller@1.0.0-preview-2f49d5c05
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-2f49d5c05
@metamask-previews/money-account-utils@1.1.0-preview-2f49d5c05
@metamask-previews/multichain-account-service@13.0.1-preview-2f49d5c05
@metamask-previews/multichain-api-middleware@4.0.2-preview-2f49d5c05
@metamask-previews/multichain-network-controller@3.2.3-preview-2f49d5c05
@metamask-previews/multichain-transactions-controller@7.1.2-preview-2f49d5c05
@metamask-previews/name-controller@9.1.2-preview-2f49d5c05
@metamask-previews/network-connection-banner-controller@0.1.2-preview-2f49d5c05
@metamask-previews/network-controller@35.0.1-preview-2f49d5c05
@metamask-previews/network-enablement-controller@6.0.3-preview-2f49d5c05
@metamask-previews/notification-services-controller@26.0.1-preview-2f49d5c05
@metamask-previews/passkey-controller@3.0.0-preview-2f49d5c05
@metamask-previews/permission-controller@13.1.1-preview-2f49d5c05
@metamask-previews/permission-log-controller@5.1.0-preview-2f49d5c05
@metamask-previews/perps-controller@11.0.0-preview-2f49d5c05
@metamask-previews/phishing-controller@17.3.1-preview-2f49d5c05
@metamask-previews/platform-api-docs@0.0.0-preview-2f49d5c05
@metamask-previews/polling-controller@16.0.9-preview-2f49d5c05
@metamask-previews/preferences-controller@23.1.0-preview-2f49d5c05
@metamask-previews/profile-metrics-controller@4.0.3-preview-2f49d5c05
@metamask-previews/profile-sync-controller@29.0.0-preview-2f49d5c05
@metamask-previews/ramps-controller@20.0.0-preview-2f49d5c05
@metamask-previews/rate-limit-controller@7.0.1-preview-2f49d5c05
@metamask-previews/react-data-query@0.2.2-preview-2f49d5c05
@metamask-previews/remote-feature-flag-controller@5.0.0-preview-2f49d5c05
@metamask-previews/sample-controllers@5.0.4-preview-2f49d5c05
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-2f49d5c05
@metamask-previews/selected-network-controller@26.1.6-preview-2f49d5c05
@metamask-previews/sentinel-api-service@1.0.0-preview-2f49d5c05
@metamask-previews/shield-controller@5.1.3-preview-2f49d5c05
@metamask-previews/signature-controller@39.2.9-preview-2f49d5c05
@metamask-previews/smart-transactions-controller@25.1.0-preview-2f49d5c05
@metamask-previews/snap-account-service@2.1.2-preview-2f49d5c05
@metamask-previews/social-controllers@2.7.1-preview-2f49d5c05
@metamask-previews/solana-test-validator-up@1.0.0-preview-2f49d5c05
@metamask-previews/stellar-quickstart-up@0.0.0-preview-2f49d5c05
@metamask-previews/storage-service@1.0.2-preview-2f49d5c05
@metamask-previews/subscription-controller@6.2.2-preview-2f49d5c05
@metamask-previews/transaction-controller@69.5.1-preview-2f49d5c05
@metamask-previews/transaction-pay-controller@26.2.3-preview-2f49d5c05
@metamask-previews/user-operation-controller@41.2.8-preview-2f49d5c05
@metamask-previews/wallet@9.0.0-preview-2f49d5c05
@metamask-previews/wallet-cli@0.0.0-preview-2f49d5c05

@saustrie-consensys
saustrie-consensys marked this pull request as draft August 25, 2026 15:18
@saustrie-consensys
saustrie-consensys marked this pull request as ready for review August 25, 2026 15:19
Removes the per-request sequence counter that ordered `updateState: true`
writes. The counter guarded a race between two same-context stateful
requests that no caller can reach: the only consumer passes exactly one
explicit provider when writing, so two such requests share a fetch cache
key and collapse in `executeRequest`'s pending dedupe. It was also the
source of both Bugbot findings on this PR, the second introduced by the
fix for the first. The region, asset, and provider equality checks stay,
since those close the gap legacy `getPaymentMethods` had.

In its place, `updateState: true` throws when provider resolution yields
more than one provider, making the unsafe shape impossible rather than
ordered.

Drops the field-level collision rules from `mergePaymentMethodsById`,
keeping dedupe by canonical id with first seen winning. Payment method
metadata is provider-invariant: the API serves it from a per-region
catalog and the `provider` query narrows that catalog by id-set
membership without rewriting fields, so colliding entries carry
identical values.

Promotes the local asset-id normalizer to an exported
`normalizeRampsAssetId` and points `providerServesAsset` at it so the
package ships one rule. That also stops non-EVM references being
lowercased, which could report a provider as serving an asset it does
not serve.
@saustrie-consensys

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@github-actions

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.6.1-preview-350abcd62
@metamask-previews/accounts-controller@39.0.7-preview-350abcd62
@metamask-previews/address-book-controller@7.1.2-preview-350abcd62
@metamask-previews/ai-controllers@0.8.0-preview-350abcd62
@metamask-previews/analytics-controller@2.0.0-preview-350abcd62
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-350abcd62
@metamask-previews/announcement-controller@8.1.0-preview-350abcd62
@metamask-previews/app-metadata-controller@2.0.1-preview-350abcd62
@metamask-previews/approval-controller@9.0.2-preview-350abcd62
@metamask-previews/assets-controller@13.1.1-preview-350abcd62
@metamask-previews/assets-controllers@111.1.0-preview-350abcd62
@metamask-previews/authenticated-user-storage@3.0.1-preview-350abcd62
@metamask-previews/base-controller@9.1.0-preview-350abcd62
@metamask-previews/base-data-service@0.1.3-preview-350abcd62
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-350abcd62
@metamask-previews/bridge-controller@79.0.1-preview-350abcd62
@metamask-previews/bridge-status-controller@75.0.0-preview-350abcd62
@metamask-previews/build-utils@3.0.4-preview-350abcd62
@metamask-previews/chain-agnostic-permission@1.7.0-preview-350abcd62
@metamask-previews/chomp-api-service@4.0.0-preview-350abcd62
@metamask-previews/claims-controller@0.5.4-preview-350abcd62
@metamask-previews/client-controller@1.0.1-preview-350abcd62
@metamask-previews/client-utils@2.0.1-preview-350abcd62
@metamask-previews/compliance-controller@2.1.0-preview-350abcd62
@metamask-previews/composable-controller@12.0.1-preview-350abcd62
@metamask-previews/config-registry-controller@2.0.1-preview-350abcd62
@metamask-previews/connectivity-controller@0.3.0-preview-350abcd62
@metamask-previews/controller-utils@12.3.0-preview-350abcd62
@metamask-previews/core-backend@8.1.1-preview-350abcd62
@metamask-previews/delegation-controller@3.0.2-preview-350abcd62
@metamask-previews/earn-controller@12.2.4-preview-350abcd62
@metamask-previews/eip-5792-middleware@3.0.5-preview-350abcd62
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-350abcd62
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-350abcd62
@metamask-previews/ens-controller@19.1.6-preview-350abcd62
@metamask-previews/eth-block-tracker@15.0.1-preview-350abcd62
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-350abcd62
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-350abcd62
@metamask-previews/foundryup@1.0.1-preview-350abcd62
@metamask-previews/gas-fee-controller@26.3.1-preview-350abcd62
@metamask-previews/gator-permissions-controller@5.0.1-preview-350abcd62
@metamask-previews/geolocation-controller@1.0.0-preview-350abcd62
@metamask-previews/java-tron-up@1.0.0-preview-350abcd62
@metamask-previews/json-rpc-engine@10.5.0-preview-350abcd62
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-350abcd62
@metamask-previews/keyring-controller@27.1.1-preview-350abcd62
@metamask-previews/kyc-controller@0.0.0-preview-350abcd62
@metamask-previews/local-node-utils@1.0.0-preview-350abcd62
@metamask-previews/logging-controller@8.0.2-preview-350abcd62
@metamask-previews/message-manager@14.1.2-preview-350abcd62
@metamask-previews/messenger@2.0.0-preview-350abcd62
@metamask-previews/messenger-cli@0.2.0-preview-350abcd62
@metamask-previews/money-account-api-data-service@0.4.0-preview-350abcd62
@metamask-previews/money-account-balance-service@2.4.1-preview-350abcd62
@metamask-previews/money-account-controller@1.0.0-preview-350abcd62
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-350abcd62
@metamask-previews/money-account-utils@1.1.0-preview-350abcd62
@metamask-previews/multichain-account-service@13.0.1-preview-350abcd62
@metamask-previews/multichain-api-middleware@4.0.2-preview-350abcd62
@metamask-previews/multichain-network-controller@3.2.3-preview-350abcd62
@metamask-previews/multichain-transactions-controller@7.1.2-preview-350abcd62
@metamask-previews/name-controller@9.1.2-preview-350abcd62
@metamask-previews/network-connection-banner-controller@0.1.2-preview-350abcd62
@metamask-previews/network-controller@35.0.1-preview-350abcd62
@metamask-previews/network-enablement-controller@6.0.3-preview-350abcd62
@metamask-previews/notification-services-controller@26.0.1-preview-350abcd62
@metamask-previews/passkey-controller@3.0.0-preview-350abcd62
@metamask-previews/permission-controller@13.1.1-preview-350abcd62
@metamask-previews/permission-log-controller@5.1.0-preview-350abcd62
@metamask-previews/perps-controller@11.0.0-preview-350abcd62
@metamask-previews/phishing-controller@17.3.1-preview-350abcd62
@metamask-previews/platform-api-docs@0.0.0-preview-350abcd62
@metamask-previews/polling-controller@16.0.9-preview-350abcd62
@metamask-previews/preferences-controller@23.1.0-preview-350abcd62
@metamask-previews/profile-metrics-controller@4.0.3-preview-350abcd62
@metamask-previews/profile-sync-controller@29.0.0-preview-350abcd62
@metamask-previews/ramps-controller@20.0.0-preview-350abcd62
@metamask-previews/rate-limit-controller@7.0.1-preview-350abcd62
@metamask-previews/react-data-query@0.2.2-preview-350abcd62
@metamask-previews/remote-feature-flag-controller@5.0.0-preview-350abcd62
@metamask-previews/sample-controllers@5.0.4-preview-350abcd62
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-350abcd62
@metamask-previews/selected-network-controller@26.1.6-preview-350abcd62
@metamask-previews/sentinel-api-service@1.0.0-preview-350abcd62
@metamask-previews/shield-controller@5.1.3-preview-350abcd62
@metamask-previews/signature-controller@39.2.9-preview-350abcd62
@metamask-previews/smart-transactions-controller@25.1.0-preview-350abcd62
@metamask-previews/snap-account-service@2.1.2-preview-350abcd62
@metamask-previews/social-controllers@2.7.1-preview-350abcd62
@metamask-previews/solana-test-validator-up@1.0.0-preview-350abcd62
@metamask-previews/stellar-quickstart-up@0.0.0-preview-350abcd62
@metamask-previews/storage-service@1.0.2-preview-350abcd62
@metamask-previews/subscription-controller@6.2.2-preview-350abcd62
@metamask-previews/transaction-controller@69.5.1-preview-350abcd62
@metamask-previews/transaction-pay-controller@26.2.3-preview-350abcd62
@metamask-previews/user-operation-controller@41.2.8-preview-350abcd62
@metamask-previews/wallet@9.0.0-preview-350abcd62
@metamask-previews/wallet-cli@0.0.0-preview-350abcd62

saustrie-consensys added a commit to MetaMask/metamask-mobile that referenced this pull request Aug 27, 2026
Picks up the Core review-response changes on MetaMask/core#9801: the
payment-method write sequencing is gone, `updateState: true` now throws
for a multi-provider fan-out, provider merging is dedupe-only, and
`normalizeRampsAssetId` is exported.
@saustrie-consensys

saustrie-consensys commented Aug 27, 2026

Copy link
Copy Markdown
Contributor Author

Is there some code in this PR that can be done on the backend or does it need to be on core?

mergePaymentMethodsById (and maybe the Promise.allSettled fan-out before it) could move to the backend. Either by modifying getPaymentsV2 to accept a repeated provider (drop assertAtMostOneFilterValuePerQueryKey and widen one type in getPaymentsWithRegions), or by using getRegionV2, which already takes a provider array and returns the same combined list. I looked into it out yesterday, might be worth doing it as a future follow up ticket, since this is becoming a lot of tech debt being handled for one Revolut ticket at this point. Handling more refactoring increases time by a lot since I'm carefully trying to minimize side effects.

The rest wouldn't be easily moveable. #resolveProviderIdsForPaymentMethods and #resolveAllProvidersFlag need moneyHeadlessAllProviders and its allowlist. The updateState write path needs userRegion.regionCode, tokens.selected, providers.selected, and paymentMethods.data / .selected, all of which live in Core state.

@amitabh94

Cuts the added test block from 1,554 lines to 437 while keeping every
behavioral guard. Most of the saving is a shared `withContext` fixture
builder plus `stubPaymentMethods`, `deferPaymentMethods` and
`expectBuyCatalogIntact`, replacing 31 sixteen-line state preambles, and
hoisting the provider constants out of 38 duplicated local declarations.

Deletes the seven `mergePaymentMethodsById` tests. Now that the function
is a dedupe loop it stays at 100% from the controller tests alone, and it
is not exported from `index.ts`.

Removes tests that duplicated each other rather than covering distinct
behavior: five variants of one selection-precedence chain, three
fail-closed guard variants, two resolution-path variants, and a
cache-behavior test whose final call passed `forceRefresh: true` and so
could not fail for the reason its name claimed.

Extracts `pickPaymentMethod` and `contextStillMatches` in the controller,
replacing the selection chain that was written twice and the write guard
that was written twice. The selection-precedence contract that needed 215
lines of controller tests is now a 16-line table test on the helper.

Adds a direct assertion for `normalizeRampsAssetId` passing a Solana
asset id through unchanged. That arm is the reason the function is not a
plain `toLowerCase()`, and it was only covered incidentally before.

Regenerates `RampsController-method-action-types.ts`, which was left
stale by the previous commit's JSDoc change.

Sets the package coverage thresholds to the post-trim values. New-code
coverage is 91.45%; the package measures 99.72 / 97.52 / 100 / 99.71.
@saustrie-consensys

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@github-actions

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.6.1-preview-2f76f9aac
@metamask-previews/accounts-controller@39.0.7-preview-2f76f9aac
@metamask-previews/address-book-controller@7.1.2-preview-2f76f9aac
@metamask-previews/ai-controllers@0.8.0-preview-2f76f9aac
@metamask-previews/analytics-controller@2.0.0-preview-2f76f9aac
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-2f76f9aac
@metamask-previews/announcement-controller@8.1.0-preview-2f76f9aac
@metamask-previews/app-metadata-controller@2.0.1-preview-2f76f9aac
@metamask-previews/approval-controller@9.0.2-preview-2f76f9aac
@metamask-previews/assets-controller@13.1.1-preview-2f76f9aac
@metamask-previews/assets-controllers@111.1.0-preview-2f76f9aac
@metamask-previews/authenticated-user-storage@3.0.1-preview-2f76f9aac
@metamask-previews/base-controller@9.1.0-preview-2f76f9aac
@metamask-previews/base-data-service@0.1.3-preview-2f76f9aac
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-2f76f9aac
@metamask-previews/bridge-controller@79.0.1-preview-2f76f9aac
@metamask-previews/bridge-status-controller@75.0.0-preview-2f76f9aac
@metamask-previews/build-utils@3.0.4-preview-2f76f9aac
@metamask-previews/chain-agnostic-permission@1.7.0-preview-2f76f9aac
@metamask-previews/chomp-api-service@4.0.0-preview-2f76f9aac
@metamask-previews/claims-controller@0.5.4-preview-2f76f9aac
@metamask-previews/client-controller@1.0.1-preview-2f76f9aac
@metamask-previews/client-utils@2.0.1-preview-2f76f9aac
@metamask-previews/compliance-controller@2.1.0-preview-2f76f9aac
@metamask-previews/composable-controller@12.0.1-preview-2f76f9aac
@metamask-previews/config-registry-controller@2.0.1-preview-2f76f9aac
@metamask-previews/connectivity-controller@0.3.0-preview-2f76f9aac
@metamask-previews/controller-utils@12.3.0-preview-2f76f9aac
@metamask-previews/core-backend@8.1.1-preview-2f76f9aac
@metamask-previews/delegation-controller@3.0.2-preview-2f76f9aac
@metamask-previews/earn-controller@12.2.4-preview-2f76f9aac
@metamask-previews/eip-5792-middleware@3.0.5-preview-2f76f9aac
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-2f76f9aac
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-2f76f9aac
@metamask-previews/ens-controller@19.1.6-preview-2f76f9aac
@metamask-previews/eth-block-tracker@15.0.1-preview-2f76f9aac
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-2f76f9aac
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-2f76f9aac
@metamask-previews/foundryup@1.0.1-preview-2f76f9aac
@metamask-previews/gas-fee-controller@26.3.1-preview-2f76f9aac
@metamask-previews/gator-permissions-controller@5.0.1-preview-2f76f9aac
@metamask-previews/geolocation-controller@1.0.0-preview-2f76f9aac
@metamask-previews/java-tron-up@1.0.0-preview-2f76f9aac
@metamask-previews/json-rpc-engine@10.5.0-preview-2f76f9aac
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-2f76f9aac
@metamask-previews/keyring-controller@27.1.1-preview-2f76f9aac
@metamask-previews/kyc-controller@0.0.0-preview-2f76f9aac
@metamask-previews/local-node-utils@1.0.0-preview-2f76f9aac
@metamask-previews/logging-controller@8.0.2-preview-2f76f9aac
@metamask-previews/message-manager@14.1.2-preview-2f76f9aac
@metamask-previews/messenger@2.0.0-preview-2f76f9aac
@metamask-previews/messenger-cli@0.2.0-preview-2f76f9aac
@metamask-previews/money-account-api-data-service@0.4.0-preview-2f76f9aac
@metamask-previews/money-account-balance-service@2.4.1-preview-2f76f9aac
@metamask-previews/money-account-controller@1.0.0-preview-2f76f9aac
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-2f76f9aac
@metamask-previews/money-account-utils@1.1.0-preview-2f76f9aac
@metamask-previews/multichain-account-service@13.0.1-preview-2f76f9aac
@metamask-previews/multichain-api-middleware@4.0.2-preview-2f76f9aac
@metamask-previews/multichain-network-controller@3.2.3-preview-2f76f9aac
@metamask-previews/multichain-transactions-controller@7.1.2-preview-2f76f9aac
@metamask-previews/name-controller@9.1.2-preview-2f76f9aac
@metamask-previews/network-connection-banner-controller@0.1.2-preview-2f76f9aac
@metamask-previews/network-controller@35.0.1-preview-2f76f9aac
@metamask-previews/network-enablement-controller@6.0.3-preview-2f76f9aac
@metamask-previews/notification-services-controller@26.0.1-preview-2f76f9aac
@metamask-previews/passkey-controller@3.0.0-preview-2f76f9aac
@metamask-previews/permission-controller@13.1.1-preview-2f76f9aac
@metamask-previews/permission-log-controller@5.1.0-preview-2f76f9aac
@metamask-previews/perps-controller@11.0.0-preview-2f76f9aac
@metamask-previews/phishing-controller@17.3.1-preview-2f76f9aac
@metamask-previews/platform-api-docs@0.0.0-preview-2f76f9aac
@metamask-previews/polling-controller@16.0.9-preview-2f76f9aac
@metamask-previews/preferences-controller@23.1.0-preview-2f76f9aac
@metamask-previews/profile-metrics-controller@4.0.3-preview-2f76f9aac
@metamask-previews/profile-sync-controller@29.0.0-preview-2f76f9aac
@metamask-previews/ramps-controller@20.0.0-preview-2f76f9aac
@metamask-previews/rate-limit-controller@7.0.1-preview-2f76f9aac
@metamask-previews/react-data-query@0.2.2-preview-2f76f9aac
@metamask-previews/remote-feature-flag-controller@5.0.0-preview-2f76f9aac
@metamask-previews/sample-controllers@5.0.4-preview-2f76f9aac
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-2f76f9aac
@metamask-previews/selected-network-controller@26.1.6-preview-2f76f9aac
@metamask-previews/sentinel-api-service@1.0.0-preview-2f76f9aac
@metamask-previews/shield-controller@5.1.3-preview-2f76f9aac
@metamask-previews/signature-controller@39.2.9-preview-2f76f9aac
@metamask-previews/smart-transactions-controller@25.1.0-preview-2f76f9aac
@metamask-previews/snap-account-service@2.1.2-preview-2f76f9aac
@metamask-previews/social-controllers@2.7.1-preview-2f76f9aac
@metamask-previews/solana-test-validator-up@1.0.0-preview-2f76f9aac
@metamask-previews/stellar-quickstart-up@0.0.0-preview-2f76f9aac
@metamask-previews/storage-service@1.0.2-preview-2f76f9aac
@metamask-previews/subscription-controller@6.2.2-preview-2f76f9aac
@metamask-previews/transaction-controller@69.5.1-preview-2f76f9aac
@metamask-previews/transaction-pay-controller@26.2.3-preview-2f76f9aac
@metamask-previews/user-operation-controller@41.2.8-preview-2f76f9aac
@metamask-previews/wallet@9.0.0-preview-2f76f9aac
@metamask-previews/wallet-cli@0.0.0-preview-2f76f9aac

Only `packages/ramps-controller/CHANGELOG.md` conflicted, where #9955 and
#9945 added a `Changed` section alongside this branch's `Fixed` section.
Resolved by keeping both in Keep a Changelog order.

`RampsController.ts`, `RampsController.test.ts` and `index.ts` merged
cleanly: #9955 widens `getProviders` to return the backend ranking
metadata and adds two type exports, which is orthogonal to this branch's
payment-method context work.
saustrie-consensys added a commit to MetaMask/metamask-mobile that referenced this pull request Aug 27, 2026
Picks up the Core test trim and the two extracted helpers
(`pickPaymentMethod`, `contextStillMatches`) from MetaMask/core#9801.
`contextStillMatches` took `RampsControllerState`, but both call sites pass
Immer's `WritableDraft`. Checking that draft against the full state type
exceeds TypeScript's instantiation depth limit during declaration emit,
failing the build with TS2589. `tsc --noEmit` accepts it, so `lint:tsc`
passed and only `yarn build` caught it.

Narrows the parameter to a named `ContextGuardState` covering just the
three fields the guard reads. Behaviour is unchanged.
@saustrie-consensys

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@github-actions

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@8.0.0-preview-3b815a38a
@metamask-previews/accounts-controller@39.1.1-preview-3b815a38a
@metamask-previews/address-book-controller@7.1.2-preview-3b815a38a
@metamask-previews/ai-controllers@0.8.0-preview-3b815a38a
@metamask-previews/analytics-controller@2.0.0-preview-3b815a38a
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-3b815a38a
@metamask-previews/announcement-controller@8.1.0-preview-3b815a38a
@metamask-previews/app-metadata-controller@2.0.1-preview-3b815a38a
@metamask-previews/approval-controller@9.0.2-preview-3b815a38a
@metamask-previews/assets-controller@14.0.2-preview-3b815a38a
@metamask-previews/assets-controllers@111.1.3-preview-3b815a38a
@metamask-previews/authenticated-user-storage@3.0.2-preview-3b815a38a
@metamask-previews/base-controller@9.1.0-preview-3b815a38a
@metamask-previews/base-data-service@1.0.0-preview-3b815a38a
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-3b815a38a
@metamask-previews/bridge-controller@80.0.0-preview-3b815a38a
@metamask-previews/bridge-status-controller@75.3.0-preview-3b815a38a
@metamask-previews/build-utils@3.0.4-preview-3b815a38a
@metamask-previews/chain-agnostic-permission@1.7.0-preview-3b815a38a
@metamask-previews/chomp-api-service@4.0.1-preview-3b815a38a
@metamask-previews/claims-controller@0.6.1-preview-3b815a38a
@metamask-previews/client-controller@1.0.1-preview-3b815a38a
@metamask-previews/client-utils@2.1.1-preview-3b815a38a
@metamask-previews/compliance-controller@2.1.0-preview-3b815a38a
@metamask-previews/composable-controller@12.0.1-preview-3b815a38a
@metamask-previews/config-registry-controller@3.1.0-preview-3b815a38a
@metamask-previews/connectivity-controller@0.3.0-preview-3b815a38a
@metamask-previews/controller-utils@12.3.0-preview-3b815a38a
@metamask-previews/core-backend@9.0.0-preview-3b815a38a
@metamask-previews/delegation-controller@3.0.2-preview-3b815a38a
@metamask-previews/earn-controller@12.2.6-preview-3b815a38a
@metamask-previews/eip-5792-middleware@3.0.5-preview-3b815a38a
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-3b815a38a
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-3b815a38a
@metamask-previews/eth-block-tracker@15.0.1-preview-3b815a38a
@metamask-previews/eth-json-rpc-middleware@24.0.1-preview-3b815a38a
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-3b815a38a
@metamask-previews/foundryup@1.0.1-preview-3b815a38a
@metamask-previews/gas-fee-controller@26.3.2-preview-3b815a38a
@metamask-previews/gator-permissions-controller@5.0.2-preview-3b815a38a
@metamask-previews/geolocation-controller@1.0.0-preview-3b815a38a
@metamask-previews/java-tron-up@1.0.0-preview-3b815a38a
@metamask-previews/json-rpc-engine@10.5.0-preview-3b815a38a
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-3b815a38a
@metamask-previews/keyring-controller@27.1.1-preview-3b815a38a
@metamask-previews/kyc-controller@0.0.0-preview-3b815a38a
@metamask-previews/local-node-utils@1.0.0-preview-3b815a38a
@metamask-previews/logging-controller@9.0.0-preview-3b815a38a
@metamask-previews/message-manager@14.1.2-preview-3b815a38a
@metamask-previews/messenger@2.0.0-preview-3b815a38a
@metamask-previews/messenger-cli@0.2.0-preview-3b815a38a
@metamask-previews/money-account-api-data-service@0.4.1-preview-3b815a38a
@metamask-previews/money-account-balance-service@2.4.3-preview-3b815a38a
@metamask-previews/money-account-controller@1.0.0-preview-3b815a38a
@metamask-previews/money-account-upgrade-controller@3.0.2-preview-3b815a38a
@metamask-previews/money-account-utils@1.1.0-preview-3b815a38a
@metamask-previews/multichain-account-service@13.0.2-preview-3b815a38a
@metamask-previews/multichain-api-middleware@4.0.3-preview-3b815a38a
@metamask-previews/multichain-network-controller@3.2.4-preview-3b815a38a
@metamask-previews/multichain-transactions-controller@7.1.2-preview-3b815a38a
@metamask-previews/name-controller@9.1.2-preview-3b815a38a
@metamask-previews/network-connection-banner-controller@0.2.1-preview-3b815a38a
@metamask-previews/network-controller@36.0.0-preview-3b815a38a
@metamask-previews/network-enablement-controller@6.0.5-preview-3b815a38a
@metamask-previews/notification-services-controller@26.0.1-preview-3b815a38a
@metamask-previews/passkey-controller@3.1.0-preview-3b815a38a
@metamask-previews/permission-controller@13.1.1-preview-3b815a38a
@metamask-previews/permission-log-controller@5.1.0-preview-3b815a38a
@metamask-previews/perps-controller@13.0.0-preview-3b815a38a
@metamask-previews/phishing-controller@17.4.0-preview-3b815a38a
@metamask-previews/platform-api-docs@0.0.0-preview-3b815a38a
@metamask-previews/polling-controller@16.0.9-preview-3b815a38a
@metamask-previews/preferences-controller@23.1.0-preview-3b815a38a
@metamask-previews/profile-metrics-controller@4.0.3-preview-3b815a38a
@metamask-previews/profile-sync-controller@29.0.0-preview-3b815a38a
@metamask-previews/ramps-controller@20.0.0-preview-3b815a38a
@metamask-previews/rate-limit-controller@7.0.1-preview-3b815a38a
@metamask-previews/react-data-query@1.0.0-preview-3b815a38a
@metamask-previews/remote-feature-flag-controller@6.0.0-preview-3b815a38a
@metamask-previews/sample-controllers@5.0.6-preview-3b815a38a
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-3b815a38a
@metamask-previews/selected-network-controller@26.1.7-preview-3b815a38a
@metamask-previews/sentinel-api-service@1.0.1-preview-3b815a38a
@metamask-previews/shield-controller@6.0.1-preview-3b815a38a
@metamask-previews/signature-controller@39.2.10-preview-3b815a38a
@metamask-previews/smart-transactions-controller@25.1.1-preview-3b815a38a
@metamask-previews/snap-account-service@2.1.2-preview-3b815a38a
@metamask-previews/social-controllers@2.8.0-preview-3b815a38a
@metamask-previews/solana-test-validator-up@1.0.0-preview-3b815a38a
@metamask-previews/stellar-quickstart-up@0.0.0-preview-3b815a38a
@metamask-previews/storage-service@1.0.2-preview-3b815a38a
@metamask-previews/subscription-controller@8.0.1-preview-3b815a38a
@metamask-previews/transaction-controller@69.6.1-preview-3b815a38a
@metamask-previews/transaction-pay-controller@27.0.0-preview-3b815a38a
@metamask-previews/user-operation-controller@41.2.9-preview-3b815a38a
@metamask-previews/wallet@12.0.2-preview-3b815a38a
@metamask-previews/wallet-cli@0.0.0-preview-3b815a38a

* @param assetId - CAIP-19 asset id, in either case form.
* @returns The asset id in the form the Ramps API uses.
*/
export function normalizeRampsAssetId(assetId: string): string {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Isnt Ramps api giving out caip id?

amitabh94
amitabh94 previously approved these changes Aug 27, 2026
@saustrie-consensys
saustrie-consensys added this pull request to the merge queue Aug 27, 2026
@amitabh94
amitabh94 removed this pull request from the merge queue due to a manual request Aug 27, 2026
The previous wording said the providers endpoint returns
`supportedCryptoCurrencies` keys in both cases. Measured against prod
across gb, us-ca, us-ny, fr, de and br, every `eip155` key there is
lowercase; it is `topTokens` that returns four mainnet ids checksummed
(USDT, USDC, WBTC, LINK), in both its `topTokens` and `allTokens` lists
with no lowercase duplicate. Blaming the providers endpoint sent readers
to check the one that is consistent.

Also records what the change does and does not do: a plain
`toLowerCase()` on both sides already matched EVM ids, so the only
behavioral change is the non-EVM passthrough, and current API data has
non-EVM ids in identical case on both endpoints, making that a guard
against drift rather than a fix for an observed mismatch.
@saustrie-consensys
saustrie-consensys added this pull request to the merge queue Aug 28, 2026
Merged via the queue into main with commit 6dd4d00 Aug 28, 2026
51 checks passed
@saustrie-consensys
saustrie-consensys deleted the saustrie/tram-3838-payment-methods-for-context branch August 28, 2026 13:34
@saustrie-consensys saustrie-consensys mentioned this pull request Aug 28, 2026
4 tasks
saustrie-consensys added a commit to MetaMask/metamask-mobile that referenced this pull request Aug 28, 2026
MetaMask/core#9801 exports `normalizeRampsAssetId`, the same rule this
module has carried locally as `normalizeAssetIdForApi` since April
(#29037). Consumes the Core export and deletes the local copy so the rule
has one definition instead of two.

The Core version is a superset for every string input: it trims, and its
`/^eip155:/iu` namespace test widens the previous `startsWith('eip155:')`
so an `EIP155:` prefix is also treated as EVM. Both call sites pass a
value the types guarantee is a non-empty string, so Core's narrower
`string` signature is safe where the local copy accepted
`string | undefined`. The `.trim()` at the query call site is now
redundant and dropped; `paymentMethods.test.ts` still covers it by
passing a whitespace-padded id.
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.

3 participants