From 5ad0e0ff793d832d0128b0f629f0cab4add7b789 Mon Sep 17 00:00:00 2001 From: George Weiler Date: Fri, 26 Jun 2026 12:30:33 -0600 Subject: [PATCH 1/6] feat(wallet): add opt-in ramps initialization configs Export RampsService, RampsController, and TransakService wallet init configurations for clients that opt in, bumping @metamask/wallet to 4.1.0. Co-authored-by: Cursor --- packages/wallet/CHANGELOG.md | 4 ++ packages/wallet/package.json | 13 ++++++- .../initialization/instances/ramps/index.ts | 6 +++ .../ramps-controller/ramps-controller.test.ts | 26 +++++++++++++ .../ramps-controller/ramps-controller.ts | 36 ++++++++++++++++++ .../instances/ramps/ramps-controller/types.ts | 7 ++++ .../ramps/ramps-service/ramps-service.test.ts | 31 ++++++++++++++++ .../ramps/ramps-service/ramps-service.ts | 37 +++++++++++++++++++ .../instances/ramps/ramps-service/types.ts | 13 +++++++ .../transak-service/transak-service.test.ts | 31 ++++++++++++++++ .../ramps/transak-service/transak-service.ts | 29 +++++++++++++++ .../instances/ramps/transak-service/types.ts | 14 +++++++ packages/wallet/src/types.ts | 6 +++ packages/wallet/tsconfig.build.json | 1 + packages/wallet/tsconfig.json | 1 + 15 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 packages/wallet/src/initialization/instances/ramps/index.ts create mode 100644 packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.test.ts create mode 100644 packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts create mode 100644 packages/wallet/src/initialization/instances/ramps/ramps-controller/types.ts create mode 100644 packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts create mode 100644 packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts create mode 100644 packages/wallet/src/initialization/instances/ramps/ramps-service/types.ts create mode 100644 packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts create mode 100644 packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts create mode 100644 packages/wallet/src/initialization/instances/ramps/transak-service/types.ts diff --git a/packages/wallet/CHANGELOG.md b/packages/wallet/CHANGELOG.md index 9afc460900..1e5492702f 100644 --- a/packages/wallet/CHANGELOG.md +++ b/packages/wallet/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Export opt-in `RampsService`, `RampsController`, and `TransakService` initialization configurations from `@metamask/wallet/initialization/instances/ramps` for aggregator and native on-ramp flows. These are not included in default wallet instances; consumers pass them via `initializationConfigurations`. + ## [5.0.0] ### Added diff --git a/packages/wallet/package.json b/packages/wallet/package.json index b2935ac95e..608f6af1a6 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/wallet", - "version": "5.0.0", + "version": "5.1.0", "description": "Provides a shared framework for building MetaMask wallets", "keywords": [ "Ethereum", @@ -32,6 +32,16 @@ "default": "./dist/index.cjs" } }, + "./initialization/instances/ramps": { + "import": { + "types": "./dist/initialization/instances/ramps/index.d.mts", + "default": "./dist/initialization/instances/ramps/index.mjs" + }, + "require": { + "types": "./dist/initialization/instances/ramps/index.d.cts", + "default": "./dist/initialization/instances/ramps/index.cjs" + } + }, "./package.json": "./package.json" }, "publishConfig": { @@ -62,6 +72,7 @@ "@metamask/keyring-controller": "^27.1.0", "@metamask/messenger": "^1.2.0", "@metamask/network-controller": "^33.0.0", + "@metamask/ramps-controller": "^14.3.0", "@metamask/remote-feature-flag-controller": "^4.2.2", "@metamask/scure-bip39": "^2.1.1", "@metamask/storage-service": "^1.0.2", diff --git a/packages/wallet/src/initialization/instances/ramps/index.ts b/packages/wallet/src/initialization/instances/ramps/index.ts new file mode 100644 index 0000000000..5bbe8bfb95 --- /dev/null +++ b/packages/wallet/src/initialization/instances/ramps/index.ts @@ -0,0 +1,6 @@ +export { rampsService } from './ramps-service/ramps-service'; +export type { RampsServiceInstanceOptions } from './ramps-service/types'; +export { rampsController } from './ramps-controller/ramps-controller'; +export type { RampsControllerInstanceOptions } from './ramps-controller/types'; +export { transakService } from './transak-service/transak-service'; +export type { TransakServiceInstanceOptions } from './transak-service/types'; diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.test.ts b/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.test.ts new file mode 100644 index 0000000000..843cbc1958 --- /dev/null +++ b/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.test.ts @@ -0,0 +1,26 @@ +import { Messenger } from '@metamask/messenger'; + +import type { + DefaultActions, + DefaultEvents, + RootMessenger, +} from '../../defaults'; +import { rampsController } from './ramps-controller'; + +describe('rampsController', () => { + it('constructs a RampsController with default state', () => { + const parent: RootMessenger = new Messenger({ + namespace: 'Root', + }); + const messenger = rampsController.getMessenger(parent); + + const controller = rampsController.init({ + messenger, + state: undefined, + options: {}, + }); + + expect(controller.name).toBe('RampsController'); + expect(controller.state.userRegion).toBeNull(); + }); +}); diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts b/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts new file mode 100644 index 0000000000..a17ee4ce2c --- /dev/null +++ b/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts @@ -0,0 +1,36 @@ +import { Messenger } from '@metamask/messenger'; +import { + RampsController, + RampsControllerMessenger, + RAMPS_CONTROLLER_REQUIRED_SERVICE_ACTIONS, +} from '@metamask/ramps-controller'; + +import { InitializationConfiguration } from '../../../types'; + +export const rampsController: InitializationConfiguration< + RampsController, + RampsControllerMessenger +> = { + name: 'RampsController', + init: ({ state, messenger, options }) => + new RampsController({ + messenger, + state: state ?? {}, + requestCacheTTL: options.requestCacheTTL, + requestCacheMaxSize: options.requestCacheMaxSize, + }), + getMessenger: (parent) => { + const messenger: RampsControllerMessenger = new Messenger({ + namespace: 'RampsController', + parent, + }); + + parent.delegate({ + messenger, + actions: [...RAMPS_CONTROLLER_REQUIRED_SERVICE_ACTIONS], + events: [], + }); + + return messenger; + }, +}; diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-controller/types.ts b/packages/wallet/src/initialization/instances/ramps/ramps-controller/types.ts new file mode 100644 index 0000000000..0e36b1611b --- /dev/null +++ b/packages/wallet/src/initialization/instances/ramps/ramps-controller/types.ts @@ -0,0 +1,7 @@ +/** + * Per-instance options for the wallet's `RampsController`. + */ +export type RampsControllerInstanceOptions = { + requestCacheTTL?: number; + requestCacheMaxSize?: number; +}; diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts new file mode 100644 index 0000000000..021aabe956 --- /dev/null +++ b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts @@ -0,0 +1,31 @@ +import { RampsEnvironment } from '@metamask/ramps-controller'; +import { Messenger } from '@metamask/messenger'; + +import type { + DefaultActions, + DefaultEvents, + RootMessenger, +} from '../../defaults'; +import { rampsService } from './ramps-service'; + +describe('rampsService', () => { + it('constructs a RampsService with injected options', () => { + const parent: RootMessenger = new Messenger({ + namespace: 'Root', + }); + const messenger = rampsService.getMessenger(parent); + const fetchMock = jest.fn(); + + const service = rampsService.init({ + messenger, + state: undefined, + options: { + environment: RampsEnvironment.Staging, + context: 'extension', + fetch: fetchMock as unknown as typeof fetch, + }, + }); + + expect(service.name).toBe('RampsService'); + }); +}); diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts new file mode 100644 index 0000000000..9b3ca875af --- /dev/null +++ b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts @@ -0,0 +1,37 @@ +import { Messenger } from '@metamask/messenger'; +import { + RampsService, + RampsServiceMessenger, +} from '@metamask/ramps-controller'; + +import { InitializationConfiguration } from '../../../types'; + +export const rampsService: InitializationConfiguration< + RampsService, + RampsServiceMessenger +> = { + name: 'RampsService', + init: ({ messenger, options }) => + new RampsService({ + messenger, + environment: options.environment, + context: options.context, + fetch: options.fetch, + policyOptions: options.policyOptions, + baseUrlOverride: options.baseUrlOverride, + }), + getMessenger: (parent) => { + const messenger: RampsServiceMessenger = new Messenger({ + namespace: 'RampsService', + parent, + }); + + parent.delegate({ + messenger, + actions: ['AuthenticationController:getBearerToken'], + events: [], + }); + + return messenger; + }, +}; diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-service/types.ts b/packages/wallet/src/initialization/instances/ramps/ramps-service/types.ts new file mode 100644 index 0000000000..7d60b85fe5 --- /dev/null +++ b/packages/wallet/src/initialization/instances/ramps/ramps-service/types.ts @@ -0,0 +1,13 @@ +import type { CreateServicePolicyOptions } from '@metamask/controller-utils'; +import type { RampsEnvironment } from '@metamask/ramps-controller'; + +/** + * Per-instance options for the wallet's `RampsService`. + */ +export type RampsServiceInstanceOptions = { + environment?: RampsEnvironment; + context: string; + fetch: typeof fetch; + policyOptions?: CreateServicePolicyOptions; + baseUrlOverride?: string; +}; diff --git a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts new file mode 100644 index 0000000000..68c07281bb --- /dev/null +++ b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts @@ -0,0 +1,31 @@ +import { TransakEnvironment } from '@metamask/ramps-controller'; +import { Messenger } from '@metamask/messenger'; + +import type { + DefaultActions, + DefaultEvents, + RootMessenger, +} from '../../defaults'; +import { transakService } from './transak-service'; + +describe('transakService', () => { + it('constructs a TransakService with injected options', () => { + const parent: RootMessenger = new Messenger({ + namespace: 'Root', + }); + const messenger = transakService.getMessenger(parent); + const fetchMock = jest.fn(); + + const service = transakService.init({ + messenger, + state: undefined, + options: { + environment: TransakEnvironment.Staging, + context: 'mobile-ios', + fetch: fetchMock as unknown as typeof fetch, + }, + }); + + expect(service.name).toBe('TransakService'); + }); +}); diff --git a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts new file mode 100644 index 0000000000..7aaddec38c --- /dev/null +++ b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts @@ -0,0 +1,29 @@ +import { Messenger } from '@metamask/messenger'; +import { + TransakService, + TransakServiceMessenger, +} from '@metamask/ramps-controller'; + +import { InitializationConfiguration } from '../../../types'; + +export const transakService: InitializationConfiguration< + TransakService, + TransakServiceMessenger +> = { + name: 'TransakService', + init: ({ messenger, options }) => + new TransakService({ + messenger, + environment: options.environment, + context: options.context, + fetch: options.fetch, + apiKey: options.apiKey, + policyOptions: options.policyOptions, + orderRetryDelayMs: options.orderRetryDelayMs, + }), + getMessenger: (parent) => + new Messenger({ + namespace: 'TransakService', + parent, + }), +}; diff --git a/packages/wallet/src/initialization/instances/ramps/transak-service/types.ts b/packages/wallet/src/initialization/instances/ramps/transak-service/types.ts new file mode 100644 index 0000000000..3254d078a5 --- /dev/null +++ b/packages/wallet/src/initialization/instances/ramps/transak-service/types.ts @@ -0,0 +1,14 @@ +import type { CreateServicePolicyOptions } from '@metamask/controller-utils'; +import type { TransakEnvironment } from '@metamask/ramps-controller'; + +/** + * Per-instance options for the wallet's `TransakService`. + */ +export type TransakServiceInstanceOptions = { + environment?: TransakEnvironment; + context: string; + fetch: typeof fetch; + apiKey?: string; + policyOptions?: CreateServicePolicyOptions; + orderRetryDelayMs?: number; +}; diff --git a/packages/wallet/src/types.ts b/packages/wallet/src/types.ts index 6a66903dde..a2d68712bd 100644 --- a/packages/wallet/src/types.ts +++ b/packages/wallet/src/types.ts @@ -11,6 +11,9 @@ import type { KeyringControllerInstanceOptions } from './initialization/instance import type { NetworkControllerInstanceOptions } from './initialization/instances/network-controller/types'; import type { RemoteFeatureFlagControllerInstanceOptions } from './initialization/instances/remote-feature-flag-controller/types'; import type { StorageServiceInstanceOptions } from './initialization/instances/storage-service/types'; +import type { RampsControllerInstanceOptions } from './initialization/instances/ramps/ramps-controller/types'; +import type { RampsServiceInstanceOptions } from './initialization/instances/ramps/ramps-service/types'; +import type { TransakServiceInstanceOptions } from './initialization/instances/ramps/transak-service/types'; import type { InitializationConfiguration } from './initialization/types'; export type WalletOptions = { @@ -28,6 +31,9 @@ export type InstanceSpecificOptions = { connectivityController: ConnectivityControllerInstanceOptions; keyringController?: KeyringControllerInstanceOptions; networkController: NetworkControllerInstanceOptions; + rampsController?: RampsControllerInstanceOptions; + rampsService?: RampsServiceInstanceOptions; remoteFeatureFlagController: RemoteFeatureFlagControllerInstanceOptions; storageService: StorageServiceInstanceOptions; + transakService?: TransakServiceInstanceOptions; }; diff --git a/packages/wallet/tsconfig.build.json b/packages/wallet/tsconfig.build.json index fcf397e033..1880b6ec94 100644 --- a/packages/wallet/tsconfig.build.json +++ b/packages/wallet/tsconfig.build.json @@ -14,6 +14,7 @@ { "path": "../keyring-controller/tsconfig.build.json" }, { "path": "../messenger/tsconfig.build.json" }, { "path": "../network-controller/tsconfig.build.json" }, + { "path": "../ramps-controller/tsconfig.build.json" }, { "path": "../remote-feature-flag-controller/tsconfig.build.json" }, { "path": "../storage-service/tsconfig.build.json" } ], diff --git a/packages/wallet/tsconfig.json b/packages/wallet/tsconfig.json index a206b1baba..4341735328 100644 --- a/packages/wallet/tsconfig.json +++ b/packages/wallet/tsconfig.json @@ -12,6 +12,7 @@ { "path": "../keyring-controller/tsconfig.json" }, { "path": "../messenger/tsconfig.json" }, { "path": "../network-controller/tsconfig.json" }, + { "path": "../ramps-controller/tsconfig.json" }, { "path": "../remote-feature-flag-controller/tsconfig.json" }, { "path": "../storage-service/tsconfig.json" } ], From d230ce10957f248de4164dfd4f62d69d8c8aa76a Mon Sep 17 00:00:00 2001 From: George Weiler Date: Sat, 27 Jun 2026 05:05:49 -0600 Subject: [PATCH 2/6] fix(wallet): address review feedback on ramps opt-in configs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove rampsController/rampsService/transakService slots from InstanceSpecificOptions — opt-in configs are self-contained and should not leak into the default options surface - Use indexed access into RampsControllerOptions for requestCacheTTL and requestCacheMaxSize to stay coupled to the upstream type - Document AuthenticationController:getBearerToken prerequisite on the rampsService export so consumers know what must be registered - Replace client-specific context strings ('extension', 'mobile-ios') with 'test' in unit tests - Add ramps instance directory to CODEOWNERS under money-movement Co-Authored-By: Claude Sonnet 4.6 --- .github/CODEOWNERS | 1 + .../instances/ramps/ramps-controller/types.ts | 6 ++++-- .../instances/ramps/ramps-service/ramps-service.test.ts | 2 +- .../instances/ramps/ramps-service/ramps-service.ts | 8 ++++++++ .../ramps/transak-service/transak-service.test.ts | 2 +- packages/wallet/src/types.ts | 6 ------ 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 59fb52d8e9..66c85da473 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -136,6 +136,7 @@ /packages/profile-metrics-controller @MetaMask/mobile-platform @MetaMask/extension-platform ## Initialization +/packages/wallet/src/initialization/instances/ramps/ @MetaMask/money-movement /packages/wallet/src/initialization/instances/accounts-controller/ @MetaMask/accounts-engineers /packages/wallet/src/initialization/instances/approval-controller/ @MetaMask/confirmations /packages/wallet/src/initialization/instances/connectivity-controller/ @MetaMask/core-platform diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-controller/types.ts b/packages/wallet/src/initialization/instances/ramps/ramps-controller/types.ts index 0e36b1611b..57d608c8b8 100644 --- a/packages/wallet/src/initialization/instances/ramps/ramps-controller/types.ts +++ b/packages/wallet/src/initialization/instances/ramps/ramps-controller/types.ts @@ -1,7 +1,9 @@ +import type { RampsControllerOptions } from '@metamask/ramps-controller'; + /** * Per-instance options for the wallet's `RampsController`. */ export type RampsControllerInstanceOptions = { - requestCacheTTL?: number; - requestCacheMaxSize?: number; + requestCacheTTL?: RampsControllerOptions['requestCacheTTL']; + requestCacheMaxSize?: RampsControllerOptions['requestCacheMaxSize']; }; diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts index 021aabe956..7541e360f6 100644 --- a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts +++ b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts @@ -21,7 +21,7 @@ describe('rampsService', () => { state: undefined, options: { environment: RampsEnvironment.Staging, - context: 'extension', + context: 'test', fetch: fetchMock as unknown as typeof fetch, }, }); diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts index 9b3ca875af..d444b1434a 100644 --- a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts +++ b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts @@ -6,6 +6,14 @@ import { import { InitializationConfiguration } from '../../../types'; +/** + * Opt-in initialization config for `RampsService`. + * + * **Prerequisite:** `AuthenticationController` must be registered on the root + * messenger before this config is used — `RampsService` delegates + * `AuthenticationController:getBearerToken` and will throw at runtime if that + * action is not available. + */ export const rampsService: InitializationConfiguration< RampsService, RampsServiceMessenger diff --git a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts index 68c07281bb..c50ecd3dbe 100644 --- a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts +++ b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts @@ -21,7 +21,7 @@ describe('transakService', () => { state: undefined, options: { environment: TransakEnvironment.Staging, - context: 'mobile-ios', + context: 'test', fetch: fetchMock as unknown as typeof fetch, }, }); diff --git a/packages/wallet/src/types.ts b/packages/wallet/src/types.ts index a2d68712bd..6a66903dde 100644 --- a/packages/wallet/src/types.ts +++ b/packages/wallet/src/types.ts @@ -11,9 +11,6 @@ import type { KeyringControllerInstanceOptions } from './initialization/instance import type { NetworkControllerInstanceOptions } from './initialization/instances/network-controller/types'; import type { RemoteFeatureFlagControllerInstanceOptions } from './initialization/instances/remote-feature-flag-controller/types'; import type { StorageServiceInstanceOptions } from './initialization/instances/storage-service/types'; -import type { RampsControllerInstanceOptions } from './initialization/instances/ramps/ramps-controller/types'; -import type { RampsServiceInstanceOptions } from './initialization/instances/ramps/ramps-service/types'; -import type { TransakServiceInstanceOptions } from './initialization/instances/ramps/transak-service/types'; import type { InitializationConfiguration } from './initialization/types'; export type WalletOptions = { @@ -31,9 +28,6 @@ export type InstanceSpecificOptions = { connectivityController: ConnectivityControllerInstanceOptions; keyringController?: KeyringControllerInstanceOptions; networkController: NetworkControllerInstanceOptions; - rampsController?: RampsControllerInstanceOptions; - rampsService?: RampsServiceInstanceOptions; remoteFeatureFlagController: RemoteFeatureFlagControllerInstanceOptions; storageService: StorageServiceInstanceOptions; - transakService?: TransakServiceInstanceOptions; }; From cfe2aa55d91c80a6e7b426da4950c38be52f241e Mon Sep 17 00:00:00 2001 From: George Weiler Date: Sat, 27 Jun 2026 05:23:02 -0600 Subject: [PATCH 3/6] fix(wallet): fix CI failures in ramps opt-in configs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Restore rampsController/rampsService/transakService slots in InstanceSpecificOptions — the InitializationConfiguration type derives options typing from this map, removing them makes options unknown throughout all three init functions - Add type casts (as never) for parent and actions in ramps messenger construction — ramps messenger types require parent actions (RampsService:*, TransakService:*, AuthenticationController:getBearerToken) not present in DefaultActions, since these are opt-in configs - Bump @metamask/ramps-controller dep from ^14.3.0 to ^15.0.0 to satisfy yarn constraints - Bump @metamask/wallet dep in wallet-cli from ^5.0.0 to ^5.1.0 - Bump root monorepo version from 1077.0.0 to 1078.0.0 - Add [5.1.0] CHANGELOG section with footer links Co-Authored-By: Claude Sonnet 4.6 --- package.json | 2 +- packages/wallet-cli/package.json | 2 +- packages/wallet/CHANGELOG.md | 5 ++++- packages/wallet/package.json | 2 +- .../instances/ramps/ramps-controller/ramps-controller.ts | 8 ++++++-- .../instances/ramps/ramps-service/ramps-service.ts | 8 ++++++-- .../instances/ramps/transak-service/transak-service.ts | 5 ++++- packages/wallet/src/types.ts | 6 ++++++ 8 files changed, 29 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 8f7ef1c68c..4a20fd6078 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/core-monorepo", - "version": "1077.0.0", + "version": "1078.0.0", "private": true, "description": "Monorepo for packages shared between MetaMask clients", "repository": { diff --git a/packages/wallet-cli/package.json b/packages/wallet-cli/package.json index 749220d8f5..547171bbdf 100644 --- a/packages/wallet-cli/package.json +++ b/packages/wallet-cli/package.json @@ -49,7 +49,7 @@ "@metamask/rpc-errors": "^7.0.2", "@metamask/storage-service": "^1.0.2", "@metamask/utils": "^11.11.0", - "@metamask/wallet": "^5.0.0", + "@metamask/wallet": "^5.1.0", "@oclif/core": "^4.10.5", "better-sqlite3": "^12.9.0", "immer": "^9.0.6" diff --git a/packages/wallet/CHANGELOG.md b/packages/wallet/CHANGELOG.md index 1e5492702f..df623eaf38 100644 --- a/packages/wallet/CHANGELOG.md +++ b/packages/wallet/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [5.1.0] + ### Added - Export opt-in `RampsService`, `RampsController`, and `TransakService` initialization configurations from `@metamask/wallet/initialization/instances/ramps` for aggregator and native on-ramp flows. These are not included in default wallet instances; consumers pass them via `initializationConfigurations`. @@ -77,7 +79,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Initial release ([#8838](https://github.com/MetaMask/core/pull/8838)) -[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/wallet@5.0.0...HEAD +[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/wallet@5.1.0...HEAD +[5.1.0]: https://github.com/MetaMask/core/compare/@metamask/wallet@5.0.0...@metamask/wallet@5.1.0 [5.0.0]: https://github.com/MetaMask/core/compare/@metamask/wallet@4.0.0...@metamask/wallet@5.0.0 [4.0.0]: https://github.com/MetaMask/core/compare/@metamask/wallet@3.0.0...@metamask/wallet@4.0.0 [3.0.0]: https://github.com/MetaMask/core/compare/@metamask/wallet@2.0.0...@metamask/wallet@3.0.0 diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 608f6af1a6..822f6e51da 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -72,7 +72,7 @@ "@metamask/keyring-controller": "^27.1.0", "@metamask/messenger": "^1.2.0", "@metamask/network-controller": "^33.0.0", - "@metamask/ramps-controller": "^14.3.0", + "@metamask/ramps-controller": "^15.0.0", "@metamask/remote-feature-flag-controller": "^4.2.2", "@metamask/scure-bip39": "^2.1.1", "@metamask/storage-service": "^1.0.2", diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts b/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts index a17ee4ce2c..be0596ab83 100644 --- a/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts +++ b/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts @@ -20,14 +20,18 @@ export const rampsController: InitializationConfiguration< requestCacheMaxSize: options.requestCacheMaxSize, }), getMessenger: (parent) => { + // Type cast required: RampsControllerMessenger's parent constraint includes + // RampsService/TransakService actions that are not in DefaultActions (since + // these are opt-in configs, not default wallet instances). + // eslint-disable-next-line @typescript-eslint/no-explicit-any const messenger: RampsControllerMessenger = new Messenger({ namespace: 'RampsController', - parent, + parent: parent as never, }); parent.delegate({ messenger, - actions: [...RAMPS_CONTROLLER_REQUIRED_SERVICE_ACTIONS], + actions: [...RAMPS_CONTROLLER_REQUIRED_SERVICE_ACTIONS] as never[], events: [], }); diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts index d444b1434a..81e4359557 100644 --- a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts +++ b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts @@ -29,14 +29,18 @@ export const rampsService: InitializationConfiguration< baseUrlOverride: options.baseUrlOverride, }), getMessenger: (parent) => { + // Type cast required: RampsServiceMessenger's parent constraint includes + // AuthenticationController:getBearerToken which is not in DefaultActions + // (these are opt-in configs, not default wallet instances). + // eslint-disable-next-line @typescript-eslint/no-explicit-any const messenger: RampsServiceMessenger = new Messenger({ namespace: 'RampsService', - parent, + parent: parent as never, }); parent.delegate({ messenger, - actions: ['AuthenticationController:getBearerToken'], + actions: ['AuthenticationController:getBearerToken'] as never[], events: [], }); diff --git a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts index 7aaddec38c..12eb13c18a 100644 --- a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts +++ b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts @@ -22,8 +22,11 @@ export const transakService: InitializationConfiguration< orderRetryDelayMs: options.orderRetryDelayMs, }), getMessenger: (parent) => + // Type cast required: TransakServiceMessenger's parent type constraint + // does not extend DefaultActions (opt-in config, not a default instance). + // eslint-disable-next-line @typescript-eslint/no-explicit-any new Messenger({ namespace: 'TransakService', - parent, + parent: parent as never, }), }; diff --git a/packages/wallet/src/types.ts b/packages/wallet/src/types.ts index 6a66903dde..99f224cc36 100644 --- a/packages/wallet/src/types.ts +++ b/packages/wallet/src/types.ts @@ -9,6 +9,9 @@ import type { ApprovalControllerInstanceOptions } from './initialization/instanc import type { ConnectivityControllerInstanceOptions } from './initialization/instances/connectivity-controller/types'; import type { KeyringControllerInstanceOptions } from './initialization/instances/keyring-controller/types'; import type { NetworkControllerInstanceOptions } from './initialization/instances/network-controller/types'; +import type { RampsControllerInstanceOptions } from './initialization/instances/ramps/ramps-controller/types'; +import type { RampsServiceInstanceOptions } from './initialization/instances/ramps/ramps-service/types'; +import type { TransakServiceInstanceOptions } from './initialization/instances/ramps/transak-service/types'; import type { RemoteFeatureFlagControllerInstanceOptions } from './initialization/instances/remote-feature-flag-controller/types'; import type { StorageServiceInstanceOptions } from './initialization/instances/storage-service/types'; import type { InitializationConfiguration } from './initialization/types'; @@ -28,6 +31,9 @@ export type InstanceSpecificOptions = { connectivityController: ConnectivityControllerInstanceOptions; keyringController?: KeyringControllerInstanceOptions; networkController: NetworkControllerInstanceOptions; + rampsController?: RampsControllerInstanceOptions; + rampsService?: RampsServiceInstanceOptions; remoteFeatureFlagController: RemoteFeatureFlagControllerInstanceOptions; storageService: StorageServiceInstanceOptions; + transakService?: TransakServiceInstanceOptions; }; From 4bac3cda36cdb70a8fd3472ab077e2b896f869ad Mon Sep 17 00:00:00 2001 From: George Weiler Date: Sat, 27 Jun 2026 05:29:22 -0600 Subject: [PATCH 4/6] fix(wallet): update README graph, changelogs for ramps dep bump - Run readme-content:update to regenerate dependency graph after adding @metamask/ramps-controller to wallet's dependencies - Add PR link and dep bump entry to wallet [5.1.0] changelog section - Update wallet-cli changelog to reflect @metamask/wallet ^5.1.0 bump Co-Authored-By: Claude Sonnet 4.6 --- README.md | 1 + packages/wallet-cli/CHANGELOG.md | 2 +- packages/wallet/CHANGELOG.md | 6 +++++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 31241932b0..b67b27f59f 100644 --- a/README.md +++ b/README.md @@ -619,6 +619,7 @@ linkStyle default opacity:0.5 wallet --> keyring_controller; wallet --> messenger; wallet --> network_controller; + wallet --> ramps_controller; wallet --> remote_feature_flag_controller; wallet --> storage_service; wallet_cli --> base_controller; diff --git a/packages/wallet-cli/CHANGELOG.md b/packages/wallet-cli/CHANGELOG.md index 9058dc2005..1dd2d6219c 100644 --- a/packages/wallet-cli/CHANGELOG.md +++ b/packages/wallet-cli/CHANGELOG.md @@ -16,6 +16,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Bump `@metamask/wallet` from `^3.0.0` to `^5.0.0` ([#9218](https://github.com/MetaMask/core/pull/9218), [#9263](https://github.com/MetaMask/core/pull/9263)) +- Bump `@metamask/wallet` from `^3.0.0` to `^5.1.0` ([#9218](https://github.com/MetaMask/core/pull/9218), [#9263](https://github.com/MetaMask/core/pull/9263), [#9290](https://github.com/MetaMask/core/pull/9290)) [Unreleased]: https://github.com/MetaMask/core/ diff --git a/packages/wallet/CHANGELOG.md b/packages/wallet/CHANGELOG.md index df623eaf38..0e6dc7d0b6 100644 --- a/packages/wallet/CHANGELOG.md +++ b/packages/wallet/CHANGELOG.md @@ -11,7 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Export opt-in `RampsService`, `RampsController`, and `TransakService` initialization configurations from `@metamask/wallet/initialization/instances/ramps` for aggregator and native on-ramp flows. These are not included in default wallet instances; consumers pass them via `initializationConfigurations`. +- Export opt-in `RampsService`, `RampsController`, and `TransakService` initialization configurations from `@metamask/wallet/initialization/instances/ramps` for aggregator and native on-ramp flows. These are not included in default wallet instances; consumers pass them via `initializationConfigurations`. ([#9290](https://github.com/MetaMask/core/pull/9290)) + +### Changed + +- Bump `@metamask/ramps-controller` from `^14.3.0` to `^15.0.0` ([#9290](https://github.com/MetaMask/core/pull/9290)) ## [5.0.0] From 47cb491c50513afd1813d2c18855ee16d076db8a Mon Sep 17 00:00:00 2001 From: George Weiler Date: Sat, 27 Jun 2026 05:34:05 -0600 Subject: [PATCH 5/6] fix(wallet): correct relative import path for defaults in ramps tests The test files are nested at ramps// so the path to initialization/defaults.ts is ../../../defaults, not ../../defaults. Fixes lint:dependencies unresolved import failures. Co-Authored-By: Claude Sonnet 4.6 --- .../instances/ramps/ramps-controller/ramps-controller.test.ts | 2 +- .../instances/ramps/ramps-service/ramps-service.test.ts | 2 +- .../instances/ramps/transak-service/transak-service.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.test.ts b/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.test.ts index 843cbc1958..53cb573cdd 100644 --- a/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.test.ts +++ b/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.test.ts @@ -4,7 +4,7 @@ import type { DefaultActions, DefaultEvents, RootMessenger, -} from '../../defaults'; +} from '../../../defaults'; import { rampsController } from './ramps-controller'; describe('rampsController', () => { diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts index 7541e360f6..b884f10d32 100644 --- a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts +++ b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts @@ -5,7 +5,7 @@ import type { DefaultActions, DefaultEvents, RootMessenger, -} from '../../defaults'; +} from '../../../defaults'; import { rampsService } from './ramps-service'; describe('rampsService', () => { diff --git a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts index c50ecd3dbe..14f0d50abd 100644 --- a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts +++ b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts @@ -5,7 +5,7 @@ import type { DefaultActions, DefaultEvents, RootMessenger, -} from '../../defaults'; +} from '../../../defaults'; import { transakService } from './transak-service'; describe('transakService', () => { From c51542c0a1bfd0636931fbb1edfcdca33cf80e8f Mon Sep 17 00:00:00 2001 From: George Weiler Date: Sat, 27 Jun 2026 05:56:31 -0600 Subject: [PATCH 6/6] fix(wallet): apply oxfmt formatting to ramps instance files Co-Authored-By: Claude Sonnet 4.6 --- .../instances/ramps/ramps-controller/ramps-controller.ts | 2 +- .../instances/ramps/ramps-service/ramps-service.test.ts | 2 +- .../instances/ramps/ramps-service/ramps-service.ts | 2 +- .../instances/ramps/transak-service/transak-service.test.ts | 2 +- .../instances/ramps/transak-service/transak-service.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts b/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts index be0596ab83..f004705bd3 100644 --- a/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts +++ b/packages/wallet/src/initialization/instances/ramps/ramps-controller/ramps-controller.ts @@ -23,7 +23,7 @@ export const rampsController: InitializationConfiguration< // Type cast required: RampsControllerMessenger's parent constraint includes // RampsService/TransakService actions that are not in DefaultActions (since // these are opt-in configs, not default wallet instances). - // eslint-disable-next-line @typescript-eslint/no-explicit-any + const messenger: RampsControllerMessenger = new Messenger({ namespace: 'RampsController', parent: parent as never, diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts index b884f10d32..7bca914db2 100644 --- a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts +++ b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.test.ts @@ -1,5 +1,5 @@ -import { RampsEnvironment } from '@metamask/ramps-controller'; import { Messenger } from '@metamask/messenger'; +import { RampsEnvironment } from '@metamask/ramps-controller'; import type { DefaultActions, diff --git a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts index 81e4359557..af1f80861a 100644 --- a/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts +++ b/packages/wallet/src/initialization/instances/ramps/ramps-service/ramps-service.ts @@ -32,7 +32,7 @@ export const rampsService: InitializationConfiguration< // Type cast required: RampsServiceMessenger's parent constraint includes // AuthenticationController:getBearerToken which is not in DefaultActions // (these are opt-in configs, not default wallet instances). - // eslint-disable-next-line @typescript-eslint/no-explicit-any + const messenger: RampsServiceMessenger = new Messenger({ namespace: 'RampsService', parent: parent as never, diff --git a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts index 14f0d50abd..b7c132e61f 100644 --- a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts +++ b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.test.ts @@ -1,5 +1,5 @@ -import { TransakEnvironment } from '@metamask/ramps-controller'; import { Messenger } from '@metamask/messenger'; +import { TransakEnvironment } from '@metamask/ramps-controller'; import type { DefaultActions, diff --git a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts index 12eb13c18a..d039cf9656 100644 --- a/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts +++ b/packages/wallet/src/initialization/instances/ramps/transak-service/transak-service.ts @@ -24,7 +24,7 @@ export const transakService: InitializationConfiguration< getMessenger: (parent) => // Type cast required: TransakServiceMessenger's parent type constraint // does not extend DefaultActions (opt-in config, not a default instance). - // eslint-disable-next-line @typescript-eslint/no-explicit-any + new Messenger({ namespace: 'TransakService', parent: parent as never,