From 75308c7e7b9fd200c3e4de0696d38e0008f958df Mon Sep 17 00:00:00 2001 From: Amitabh Aggarwal Date: Sun, 20 Sep 2026 22:55:25 -0500 Subject: [PATCH 1/3] fix(ramps-controller): omit crypto from payment methods requests Payment methods depend on provider and region. Sending crypto on the URL was ignored by the API and split the CDN cache per token. Co-authored-by: Cursor --- packages/ramps-controller/CHANGELOG.md | 4 +++ .../ramps-controller/src/RampsService.test.ts | 29 +++++++++++++------ packages/ramps-controller/src/RampsService.ts | 5 ++-- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/ramps-controller/CHANGELOG.md b/packages/ramps-controller/CHANGELOG.md index dcf3548fc84..9a8990c17b4 100644 --- a/packages/ramps-controller/CHANGELOG.md +++ b/packages/ramps-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Stop sending `crypto` on `RampsService.getPaymentMethods`. Payment methods are provider + region; the param was ignored by `/v2/regions/:region/payments` and split the CDN cache per token. `assetId` remains on the method for caller cache keys. + ## [23.0.0] ### Added diff --git a/packages/ramps-controller/src/RampsService.test.ts b/packages/ramps-controller/src/RampsService.test.ts index c1a72337806..a9ef0280564 100644 --- a/packages/ramps-controller/src/RampsService.test.ts +++ b/packages/ramps-controller/src/RampsService.test.ts @@ -1760,7 +1760,6 @@ describe('RampsService', () => { .get('/v2/regions/us-al/payments') .query({ region: 'us-al', - crypto: 'eip155:1/slip44:60', provider: '/providers/stripe', sdk: '2.1.6', controller: CONTROLLER_VERSION, @@ -1788,12 +1787,30 @@ describe('RampsService', () => { ]); }); + it('does not send crypto on the payments URL', async () => { + const scope = nock('https://on-ramp-cache.uat-api.cx.metamask.io') + .get('/v2/regions/us-al/payments') + .query((query) => query.crypto === undefined) + .reply(200, mockPaymentMethodsResponse); + const { service } = getService(); + + const paymentMethodsPromise = service.getPaymentMethods({ + region: 'us-al', + assetId: 'eip155:1/slip44:60', + provider: '/providers/stripe', + }); + await jest.runAllTimersAsync(); + await flushPromises(); + await paymentMethodsPromise; + + expect(scope.isDone()).toBe(true); + }); + it('normalizes region case', async () => { nock('https://on-ramp-cache.uat-api.cx.metamask.io') .get('/v2/regions/us-al/payments') .query({ region: 'us-al', - crypto: 'eip155:1/slip44:60', provider: '/providers/stripe', sdk: '2.1.6', controller: CONTROLLER_VERSION, @@ -1819,7 +1836,6 @@ describe('RampsService', () => { .get('/v2/regions/us-al/payments') .query({ region: 'us-al', - crypto: 'eip155:1/slip44:60', provider: '/providers/stripe', sdk: '2.1.6', controller: CONTROLLER_VERSION, @@ -1846,7 +1862,6 @@ describe('RampsService', () => { .get('/v2/regions/us-al/payments') .query({ region: 'us-al', - crypto: 'eip155:1/slip44:60', provider: '/providers/stripe', sdk: '2.1.6', controller: CONTROLLER_VERSION, @@ -1873,7 +1888,6 @@ describe('RampsService', () => { .get('/v2/regions/us-al/payments') .query({ region: 'us-al', - crypto: 'eip155:1/slip44:60', provider: '/providers/stripe', sdk: '2.1.6', controller: CONTROLLER_VERSION, @@ -1900,7 +1914,6 @@ describe('RampsService', () => { .get('/v2/regions/us-al/payments') .query({ region: 'us-al', - crypto: 'eip155:1/slip44:60', provider: '/providers/stripe', sdk: '2.1.6', controller: CONTROLLER_VERSION, @@ -1922,7 +1935,7 @@ describe('RampsService', () => { await flushPromises(); await expect(paymentMethodsPromise).rejects.toThrow( - `Fetching 'https://on-ramp-cache.uat-api.cx.metamask.io/v2/regions/us-al/payments?sdk=2.1.6&controller=${CONTROLLER_VERSION}&context=mobile-ios®ion=us-al&crypto=eip155%3A1%2Fslip44%3A60&provider=%2Fproviders%2Fstripe' failed with status '500'`, + `Fetching 'https://on-ramp-cache.uat-api.cx.metamask.io/v2/regions/us-al/payments?sdk=2.1.6&controller=${CONTROLLER_VERSION}&context=mobile-ios®ion=us-al&provider=%2Fproviders%2Fstripe' failed with status '500'`, ); }); @@ -1931,7 +1944,6 @@ describe('RampsService', () => { .get('/v2/regions/us-al/payments') .query({ region: 'us-al', - crypto: 'eip155:1/slip44:60', provider: '/providers/stripe', sdk: '2.1.6', controller: CONTROLLER_VERSION, @@ -1959,7 +1971,6 @@ describe('RampsService', () => { .get('/v2/regions/us-al/payments') .query({ region: 'us-al', - crypto: 'eip155:1/slip44:60', provider: '/providers/stripe', sdk: '2.1.6', controller: CONTROLLER_VERSION, diff --git a/packages/ramps-controller/src/RampsService.ts b/packages/ramps-controller/src/RampsService.ts index ab2ade4a4e1..705d447ed2e 100644 --- a/packages/ramps-controller/src/RampsService.ts +++ b/packages/ramps-controller/src/RampsService.ts @@ -1331,7 +1331,9 @@ export class RampsService { * * @param options - Query parameters for filtering payment methods. * @param options.region - User's region code (e.g., "us-al"). - * @param options.assetId - CAIP-19 cryptocurrency identifier. + * @param options.assetId - CAIP-19 cryptocurrency identifier. Kept on the + * caller contract for local cache/staleness; not sent — `/payments` is scoped + * to provider + region (the API ignores `crypto`). * @param options.provider - Provider ID path. * @returns The payment methods response containing payments array. */ @@ -1348,7 +1350,6 @@ export class RampsService { this.#addCommonParams(url); url.searchParams.set('region', options.region.toLowerCase().trim()); - url.searchParams.set('crypto', options.assetId); url.searchParams.set('provider', options.provider); const response = await this.#policy.execute(async () => { From 30509b29455d4f6b665ade18b7e9c0c6199b9c0f Mon Sep 17 00:00:00 2001 From: Amitabh Aggarwal Date: Sun, 20 Sep 2026 23:01:59 -0500 Subject: [PATCH 2/3] chore(ramps-controller): link changelog entry to #10307 Co-authored-by: Cursor --- packages/ramps-controller/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ramps-controller/CHANGELOG.md b/packages/ramps-controller/CHANGELOG.md index 9a8990c17b4..4dd4eb71550 100644 --- a/packages/ramps-controller/CHANGELOG.md +++ b/packages/ramps-controller/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Stop sending `crypto` on `RampsService.getPaymentMethods`. Payment methods are provider + region; the param was ignored by `/v2/regions/:region/payments` and split the CDN cache per token. `assetId` remains on the method for caller cache keys. +- Stop sending `crypto` on `RampsService.getPaymentMethods`. Payment methods are provider + region; the param was ignored by `/v2/regions/:region/payments` and split the CDN cache per token. `assetId` remains on the method for caller cache keys. ([#10307](https://github.com/MetaMask/core/pull/10307)) ## [23.0.0] From 34d28de43ccfa2a69bc29988ea1f12e4aa8c779a Mon Sep 17 00:00:00 2001 From: Amitabh Aggarwal Date: Mon, 21 Sep 2026 12:31:22 -0500 Subject: [PATCH 3/3] chore(ramps-controller): regenerate RampsService action types Co-authored-by: Cursor --- .../ramps-controller/src/RampsService-method-action-types.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ramps-controller/src/RampsService-method-action-types.ts b/packages/ramps-controller/src/RampsService-method-action-types.ts index c9b00ec92d4..39b2e80f1f4 100644 --- a/packages/ramps-controller/src/RampsService-method-action-types.ts +++ b/packages/ramps-controller/src/RampsService-method-action-types.ts @@ -98,7 +98,9 @@ export type RampsServiceGetProvidersAction = { * * @param options - Query parameters for filtering payment methods. * @param options.region - User's region code (e.g., "us-al"). - * @param options.assetId - CAIP-19 cryptocurrency identifier. + * @param options.assetId - CAIP-19 cryptocurrency identifier. Kept on the + * caller contract for local cache/staleness; not sent — `/payments` is scoped + * to provider + region (the API ignores `crypto`). * @param options.provider - Provider ID path. * @returns The payment methods response containing payments array. */