diff --git a/packages/snaps-controllers/CHANGELOG.md b/packages/snaps-controllers/CHANGELOG.md index c5b8f57eff..a8679c894b 100644 --- a/packages/snaps-controllers/CHANGELOG.md +++ b/packages/snaps-controllers/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#3611](https://github.com/MetaMask/snaps/pull/3611)) + - Previously, `SnapController`, `CronjobController`, `SnapInsightsController`, `SnapInterfaceController`, `MultichainRouter`, `ExecutionService` and `WebSocketService` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`. +- **BREAKING:** Metadata property `anonymous` renamed to `includeInDebugSnapshot` ([#3611](https://github.com/MetaMask/snaps/pull/3611)) +- Bump `@metamask/approval-controller` from `^7.2.0` to `^8.0.0`(([#3611](https://github.com/MetaMask/snaps/pull/3611)) +- Bump `@metamask/base-controller` from `^8.4.1` to `^9.0.0`(([#3611](https://github.com/MetaMask/snaps/pull/3611)) +- Bump `@metamask/permission-controller` from `^11.0.6` to `^12.0.0`(([#3611](https://github.com/MetaMask/snaps/pull/3611)) + ## [15.0.2] ### Fixed diff --git a/packages/snaps-controllers/coverage.json b/packages/snaps-controllers/coverage.json index 8f93da8746..61ba9a304f 100644 --- a/packages/snaps-controllers/coverage.json +++ b/packages/snaps-controllers/coverage.json @@ -1,6 +1,6 @@ { - "branches": 95.23, - "functions": 99, - "lines": 98.74, - "statements": 98.58 + "branches": 94.87, + "functions": 98.03, + "lines": 98.63, + "statements": 98.43 } diff --git a/packages/snaps-controllers/package.json b/packages/snaps-controllers/package.json index fcd0a89a13..4e4b74ed90 100644 --- a/packages/snaps-controllers/package.json +++ b/packages/snaps-controllers/package.json @@ -79,13 +79,14 @@ "test:watch": "jest --watch" }, "dependencies": { - "@metamask/approval-controller": "^7.2.0", - "@metamask/base-controller": "^8.4.1", + "@metamask/approval-controller": "^8.0.0", + "@metamask/base-controller": "^9.0.0", "@metamask/json-rpc-engine": "^10.1.0", "@metamask/json-rpc-middleware-stream": "^8.0.8", "@metamask/key-tree": "^10.1.1", + "@metamask/messenger": "^0.3.0", "@metamask/object-multiplex": "^2.1.0", - "@metamask/permission-controller": "^11.0.6", + "@metamask/permission-controller": "^12.0.0", "@metamask/phishing-controller": "^13.1.0", "@metamask/post-message-stream": "^10.0.0", "@metamask/rpc-errors": "^7.0.3", diff --git a/packages/snaps-controllers/src/cronjob/CronjobController.test.ts b/packages/snaps-controllers/src/cronjob/CronjobController.test.ts index 2e911ca8db..d682f05a70 100644 --- a/packages/snaps-controllers/src/cronjob/CronjobController.test.ts +++ b/packages/snaps-controllers/src/cronjob/CronjobController.test.ts @@ -72,14 +72,14 @@ describe('CronjobController', () => { cronjobController.register(MOCK_SNAP_ID); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledWith( 'PermissionController:getPermissions', MOCK_SNAP_ID, ); jest.advanceTimersByTime(inMilliseconds(1, Duration.Minute)); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 2, 'SnapController:handleRequest', { @@ -121,14 +121,14 @@ describe('CronjobController', () => { cronjobController.register(MOCK_SNAP_ID); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledWith( 'PermissionController:getPermissions', MOCK_SNAP_ID, ); jest.advanceTimersByTime(inMilliseconds(1, Duration.Minute)); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 2, 'SnapController:handleRequest', { @@ -162,7 +162,7 @@ describe('CronjobController', () => { jest.advanceTimersByTime(inMilliseconds(1, Duration.Minute)); - expect(rootMessenger.call).not.toHaveBeenCalledWith( + expect(controllerMessenger.call).not.toHaveBeenCalledWith( 'SnapController:handleRequest', { snapId: MOCK_SNAP_ID, @@ -212,7 +212,7 @@ describe('CronjobController', () => { jest.advanceTimersByTime(inMilliseconds(24, Duration.Hour)); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledWith( 'SnapController:handleRequest', { snapId: MOCK_SNAP_ID, @@ -263,7 +263,7 @@ describe('CronjobController', () => { cronjobController.init(); await new Promise((resolve) => originalProcessNextTick(resolve)); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledWith( 'SnapController:handleRequest', { snapId: MOCK_SNAP_ID, @@ -312,13 +312,13 @@ describe('CronjobController', () => { cronjobController.register(MOCK_SNAP_ID); jest.runOnlyPendingTimers(); - expect(rootMessenger.call).toHaveBeenCalledTimes(1); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(1); + expect(controllerMessenger.call).toHaveBeenCalledWith( 'PermissionController:getPermissions', MOCK_SNAP_ID, ); - expect(rootMessenger.call).not.toHaveBeenCalledWith( + expect(controllerMessenger.call).not.toHaveBeenCalledWith( 'SnapController:handleRequest', { snapId: MOCK_SNAP_ID, @@ -360,18 +360,18 @@ describe('CronjobController', () => { cronjobController.register(MOCK_SNAP_ID); jest.advanceTimersByTime(inMilliseconds(1, Duration.Day)); - expect(rootMessenger.call).toHaveBeenCalledTimes(1); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(1); + expect(controllerMessenger.call).toHaveBeenCalledWith( 'PermissionController:getPermissions', MOCK_SNAP_ID, ); jest.advanceTimersByTime(inMilliseconds(1, Duration.Day)); - expect(rootMessenger.call).toHaveBeenCalledTimes(1); + expect(controllerMessenger.call).toHaveBeenCalledTimes(1); jest.advanceTimersByTime(inMilliseconds(1, Duration.Day)); - expect(rootMessenger.call).toHaveBeenCalledTimes(2); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(2); + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 2, 'SnapController:handleRequest', { @@ -451,7 +451,7 @@ describe('CronjobController', () => { jest.advanceTimersByTime(inMilliseconds(1, Duration.Day)); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledWith( 'SnapController:handleRequest', { snapId: MOCK_SNAP_ID, @@ -514,7 +514,7 @@ describe('CronjobController', () => { jest.advanceTimersByTime(inMilliseconds(1, Duration.Minute)); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 2, 'SnapController:handleRequest', { @@ -528,7 +528,7 @@ describe('CronjobController', () => { }, ); - expect(rootMessenger.call).toHaveBeenCalledTimes(2); + expect(controllerMessenger.call).toHaveBeenCalledTimes(2); cronjobController.destroy(); }); @@ -623,8 +623,8 @@ describe('CronjobController', () => { jest.advanceTimersByTime(inMilliseconds(1, Duration.Day)); - expect(rootMessenger.call).toHaveBeenCalledTimes(3); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(3); + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 2, 'SnapController:handleRequest', { @@ -638,7 +638,7 @@ describe('CronjobController', () => { }, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 3, 'SnapController:handleRequest', { @@ -817,8 +817,8 @@ describe('CronjobController', () => { jest.advanceTimersByTime(inMilliseconds(1, Duration.Day)); - expect(rootMessenger.call).toHaveBeenCalledTimes(1); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(1); + expect(controllerMessenger.call).toHaveBeenCalledWith( 'PermissionController:getPermissions', MOCK_SNAP_ID, ); @@ -905,7 +905,7 @@ describe('CronjobController', () => { jest.advanceTimersByTime(inMilliseconds(1, Duration.Day)); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledWith( 'SnapController:handleRequest', { snapId: MOCK_SNAP_ID, @@ -1111,7 +1111,7 @@ describe('CronjobController', () => { jest.advanceTimersByTime(inMilliseconds(1, Duration.Day)); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledWith( 'SnapController:handleRequest', { snapId: MOCK_SNAP_ID, diff --git a/packages/snaps-controllers/src/cronjob/CronjobController.ts b/packages/snaps-controllers/src/cronjob/CronjobController.ts index ba7c2497b2..df12e9fbb7 100644 --- a/packages/snaps-controllers/src/cronjob/CronjobController.ts +++ b/packages/snaps-controllers/src/cronjob/CronjobController.ts @@ -1,9 +1,9 @@ import type { - RestrictedMessenger, ControllerGetStateAction, ControllerStateChangeEvent, } from '@metamask/base-controller'; import { BaseController } from '@metamask/base-controller'; +import type { Messenger } from '@metamask/messenger'; import type { GetPermissions } from '@metamask/permission-controller'; import { getCronjobCaveatJobs, @@ -83,12 +83,10 @@ export type CronjobControllerEvents = | SnapEnabled | SnapDisabled; -export type CronjobControllerMessenger = RestrictedMessenger< +export type CronjobControllerMessenger = Messenger< typeof controllerName, CronjobControllerActions, - CronjobControllerEvents, - CronjobControllerActions['type'], - CronjobControllerEvents['type'] + CronjobControllerEvents >; export const DAILY_TIMEOUT = inMilliseconds(24, Duration.Hour); @@ -181,7 +179,7 @@ export class CronjobController extends BaseController< events: { includeInStateLogs: false, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: false, }, }, @@ -196,49 +194,47 @@ export class CronjobController extends BaseController< this.#timers = new Map(); this.#stateManager = stateManager; - this.messagingSystem.subscribe( + this.messenger.subscribe( 'SnapController:snapInstalled', this.#handleSnapInstalledEvent, ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'SnapController:snapUninstalled', this.#handleSnapUninstalledEvent, ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'SnapController:snapEnabled', this.#handleSnapEnabledEvent, ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'SnapController:snapDisabled', this.#handleSnapDisabledEvent, ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'SnapController:snapUpdated', this.#handleSnapUpdatedEvent, ); - this.messagingSystem.registerActionHandler( - `${controllerName}:init`, - (...args) => this.init(...args), + this.messenger.registerActionHandler(`${controllerName}:init`, (...args) => + this.init(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:schedule`, (...args) => this.schedule(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:cancel`, (...args) => this.cancel(...args), ); - this.messagingSystem.registerActionHandler( - `${controllerName}:get`, - (...args) => this.get(...args), + this.messenger.registerActionHandler(`${controllerName}:get`, (...args) => + this.get(...args), ); } @@ -336,27 +332,27 @@ export class CronjobController extends BaseController< destroy() { super.destroy(); - this.messagingSystem.unsubscribe( + this.messenger.unsubscribe( 'SnapController:snapInstalled', this.#handleSnapInstalledEvent, ); - this.messagingSystem.unsubscribe( + this.messenger.unsubscribe( 'SnapController:snapUninstalled', this.#handleSnapUninstalledEvent, ); - this.messagingSystem.unsubscribe( + this.messenger.unsubscribe( 'SnapController:snapEnabled', this.#handleSnapEnabledEvent, ); - this.messagingSystem.unsubscribe( + this.messenger.unsubscribe( 'SnapController:snapDisabled', this.#handleSnapDisabledEvent, ); - this.messagingSystem.unsubscribe( + this.messenger.unsubscribe( 'SnapController:snapUpdated', this.#handleSnapUpdatedEvent, ); @@ -473,7 +469,7 @@ export class CronjobController extends BaseController< * @param event - The event to execute. */ #execute(event: InternalBackgroundEvent) { - this.messagingSystem + this.messenger .call('SnapController:handleRequest', { snapId: event.snapId, origin: METAMASK_ORIGIN, @@ -529,7 +525,7 @@ export class CronjobController extends BaseController< * @returns Array of cronjob specifications. */ #getSnapCronjobs(snapId: SnapId): SchedulableBackgroundEvent[] { - const permissions = this.messagingSystem.call( + const permissions = this.messenger.call( 'PermissionController:getPermissions', snapId, ); diff --git a/packages/snaps-controllers/src/insights/SnapInsightsController.test.ts b/packages/snaps-controllers/src/insights/SnapInsightsController.test.ts index 6ba96b60bb..cf934e930f 100644 --- a/packages/snaps-controllers/src/insights/SnapInsightsController.test.ts +++ b/packages/snaps-controllers/src/insights/SnapInsightsController.test.ts @@ -86,8 +86,8 @@ describe('SnapInsightsController', () => { }, }); - expect(rootMessenger.call).toHaveBeenCalledTimes(5); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(5); + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 4, 'SnapController:handleRequest', { @@ -104,7 +104,7 @@ describe('SnapInsightsController', () => { }, }, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 5, 'SnapController:handleRequest', { @@ -133,8 +133,8 @@ describe('SnapInsightsController', () => { }); expect(Object.values(controller.state.insights)).toHaveLength(0); - expect(rootMessenger.call).toHaveBeenCalledTimes(6); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(6); + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 6, 'SnapInterfaceController:deleteInterface', expect.any(String), @@ -211,8 +211,8 @@ describe('SnapInsightsController', () => { }, }); - expect(rootMessenger.call).toHaveBeenCalledTimes(5); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(5); + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 4, 'SnapController:handleRequest', { @@ -233,7 +233,7 @@ describe('SnapInsightsController', () => { }, }, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 5, 'SnapController:handleRequest', { @@ -268,8 +268,8 @@ describe('SnapInsightsController', () => { ); expect(Object.values(controller.state.insights)).toHaveLength(0); - expect(rootMessenger.call).toHaveBeenCalledTimes(6); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(6); + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 6, 'SnapInterfaceController:deleteInterface', expect.any(String), @@ -336,8 +336,8 @@ describe('SnapInsightsController', () => { }, }); - expect(rootMessenger.call).toHaveBeenCalledTimes(5); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(5); + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 4, 'SnapController:handleRequest', { @@ -357,7 +357,7 @@ describe('SnapInsightsController', () => { }, }, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 5, 'SnapController:handleRequest', { @@ -450,7 +450,7 @@ describe('SnapInsightsController', () => { }, }); - expect(rootMessenger.call).toHaveBeenCalledTimes(8); + expect(controllerMessenger.call).toHaveBeenCalledTimes(8); }); it('ignores insight if transaction has already been signed', async () => { @@ -510,8 +510,8 @@ describe('SnapInsightsController', () => { expect(Object.values(controller.state.insights)).toHaveLength(0); - expect(rootMessenger.call).toHaveBeenCalledTimes(5); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(5); + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 4, 'SnapController:handleRequest', { @@ -528,7 +528,7 @@ describe('SnapInsightsController', () => { }, }, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 5, 'SnapController:handleRequest', { @@ -608,8 +608,8 @@ describe('SnapInsightsController', () => { expect(Object.values(controller.state.insights)).toHaveLength(0); - expect(rootMessenger.call).toHaveBeenCalledTimes(5); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenCalledTimes(5); + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 4, 'SnapController:handleRequest', { @@ -629,7 +629,7 @@ describe('SnapInsightsController', () => { }, }, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(controllerMessenger.call).toHaveBeenNthCalledWith( 5, 'SnapController:handleRequest', { diff --git a/packages/snaps-controllers/src/insights/SnapInsightsController.ts b/packages/snaps-controllers/src/insights/SnapInsightsController.ts index f4074cb7ed..62287a4600 100644 --- a/packages/snaps-controllers/src/insights/SnapInsightsController.ts +++ b/packages/snaps-controllers/src/insights/SnapInsightsController.ts @@ -1,9 +1,9 @@ import type { - RestrictedMessenger, ControllerGetStateAction, ControllerStateChangeEvent, } from '@metamask/base-controller'; import { BaseController } from '@metamask/base-controller'; +import type { Messenger } from '@metamask/messenger'; import type { Caveat, GetPermissions, @@ -58,12 +58,10 @@ export type SnapInsightsControllerAllowedEvents = | TransactionControllerTransactionStatusUpdatedEvent | SignatureStateChange; -export type SnapInsightsControllerMessenger = RestrictedMessenger< +export type SnapInsightsControllerMessenger = Messenger< typeof controllerName, SnapInsightsControllerActions | SnapInsightsControllerAllowedActions, - SnapInsightControllerEvents | SnapInsightsControllerAllowedEvents, - SnapInsightsControllerAllowedActions['type'], - SnapInsightsControllerAllowedEvents['type'] + SnapInsightControllerEvents | SnapInsightsControllerAllowedEvents >; export type SnapInsight = { @@ -103,7 +101,7 @@ export class SnapInsightsController extends BaseController< insights: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, }, @@ -111,17 +109,17 @@ export class SnapInsightsController extends BaseController< state: { insights: {}, ...state }, }); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'TransactionController:unapprovedTransactionAdded', this.#handleTransaction.bind(this), ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'TransactionController:transactionStatusUpdated', this.#handleTransactionStatusUpdate.bind(this), ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'SignatureController:stateChange', this.#handleSignatureStateChange.bind(this), ); @@ -145,11 +143,11 @@ export class SnapInsightsController extends BaseController< * @returns A list of objects containing Snap IDs and the permission object. */ #getSnapsWithPermission(permissionName: string) { - const allSnaps = this.messagingSystem.call('SnapController:getAll'); + const allSnaps = this.messenger.call('SnapController:getAll'); const filteredSnaps = getRunnableSnaps(allSnaps); return filteredSnaps.reduce((accumulator, snap) => { - const permissions = this.messagingSystem.call( + const permissions = this.messenger.call( 'PermissionController:getPermissions', snap.id, ); @@ -335,7 +333,7 @@ export class SnapInsightsController extends BaseController< Object.values(this.state.insights[id]) .filter((insight) => insight.interfaceId) .forEach((insight) => { - this.messagingSystem.call( + this.messenger.call( 'SnapInterfaceController:deleteInterface', insight.interfaceId as string, ); @@ -364,7 +362,7 @@ export class SnapInsightsController extends BaseController< handler: HandlerType.OnTransaction | HandlerType.OnSignature; params: Record; }) { - return this.messagingSystem.call('SnapController:handleRequest', { + return this.messenger.call('SnapController:handleRequest', { snapId, origin: 'metamask', handler, diff --git a/packages/snaps-controllers/src/interface/SnapInterfaceController.test.tsx b/packages/snaps-controllers/src/interface/SnapInterfaceController.test.tsx index 5f10a1b856..1473239dfc 100644 --- a/packages/snaps-controllers/src/interface/SnapInterfaceController.test.tsx +++ b/packages/snaps-controllers/src/interface/SnapInterfaceController.test.tsx @@ -1,16 +1,17 @@ import { deriveStateFromMetadata } from '@metamask/base-controller'; +import { PhishingDetectorResultType } from '@metamask/phishing-controller'; import type { SnapId } from '@metamask/snaps-sdk'; import { + ContentType, form, image, input, panel, text, - ContentType, } from '@metamask/snaps-sdk'; import { - AssetSelector, AccountSelector, + AssetSelector, Box, Field, FileInput, @@ -28,10 +29,10 @@ import { MOCK_SNAP_ID } from '@metamask/snaps-utils/test-utils'; import { SnapInterfaceController } from './SnapInterfaceController'; import { - MOCK_ACCOUNT_ID, - MockApprovalController, getRestrictedSnapInterfaceControllerMessenger, getRootSnapInterfaceControllerMessenger, + MOCK_ACCOUNT_ID, + MockApprovalController, } from '../test-utils'; jest.mock('@metamask/snaps-utils', () => ({ @@ -113,8 +114,8 @@ describe('SnapInterfaceController', () => { id, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 2, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'PhishingController:testOrigin', 'https://foo.bar/', ); @@ -149,8 +150,8 @@ describe('SnapInterfaceController', () => { components, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 3, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 2, 'MultichainAssetsController:getState', ); @@ -204,8 +205,8 @@ describe('SnapInterfaceController', () => { id, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 2, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'PhishingController:testOrigin', 'https://foo.bar/', ); @@ -246,8 +247,8 @@ describe('SnapInterfaceController', () => { id, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 2, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'AccountsController:getSelectedMultichainAccount', ); @@ -322,13 +323,13 @@ describe('SnapInterfaceController', () => { id, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 2, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'AccountsController:getSelectedMultichainAccount', ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 3, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 2, 'AccountsController:listMultichainAccounts', ); @@ -399,13 +400,13 @@ describe('SnapInterfaceController', () => { id, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 2, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'AccountsController:getSelectedMultichainAccount', ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 3, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 2, 'AccountsController:listMultichainAccounts', ); @@ -532,7 +533,7 @@ describe('SnapInterfaceController', () => { rootMessenger.registerActionHandler( 'PhishingController:testOrigin', - () => ({ result: true, type: 'all' }), + () => ({ result: true, type: PhishingDetectorResultType.All }), ); // eslint-disable-next-line no-new @@ -556,8 +557,8 @@ describe('SnapInterfaceController', () => { ), ).toThrow('Invalid URL: The specified URL is not allowed.'); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 2, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'PhishingController:testOrigin', 'https://foo.bar/', ); @@ -572,7 +573,7 @@ describe('SnapInterfaceController', () => { rootMessenger.registerActionHandler( 'PhishingController:testOrigin', - () => ({ result: true, type: 'all' }), + () => ({ result: true, type: PhishingDetectorResultType.All }), ); // eslint-disable-next-line no-new @@ -596,8 +597,8 @@ describe('SnapInterfaceController', () => { ), ).toThrow('Invalid URL: The specified URL is not allowed.'); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 2, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'PhishingController:testOrigin', 'https://foo.bar/', ); @@ -636,8 +637,8 @@ describe('SnapInterfaceController', () => { ), ).toThrow('Invalid URL: The Snap being navigated to is not installed.'); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 2, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'SnapController:get', MOCK_SNAP_ID, ); @@ -652,7 +653,7 @@ describe('SnapInterfaceController', () => { rootMessenger.registerActionHandler( 'PhishingController:testOrigin', - () => ({ result: true, type: 'all' }), + () => ({ result: true, type: PhishingDetectorResultType.All }), ); rootMessenger.registerActionHandler( @@ -694,8 +695,8 @@ describe('SnapInterfaceController', () => { 'Could not find account for address: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:7S3P4HxJpyyigGzodYwHtCxZyUQe9JiBMHyRWXArAaKv', ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 2, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'AccountsController:getAccountByAddress', '7S3P4HxJpyyigGzodYwHtCxZyUQe9JiBMHyRWXArAaKv', ); @@ -1067,7 +1068,7 @@ describe('SnapInterfaceController', () => { rootMessenger.registerActionHandler( 'PhishingController:testOrigin', - () => ({ result: true, type: 'all' }), + () => ({ result: true, type: PhishingDetectorResultType.All }), ); // eslint-disable-next-line no-new @@ -1103,8 +1104,8 @@ describe('SnapInterfaceController', () => { ), ).toThrow('Invalid URL: The specified URL is not allowed.'); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 3, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'PhishingController:testOrigin', 'https://foo.bar/', ); @@ -1119,7 +1120,7 @@ describe('SnapInterfaceController', () => { rootMessenger.registerActionHandler( 'PhishingController:testOrigin', - () => ({ result: true, type: 'all' }), + () => ({ result: true, type: PhishingDetectorResultType.All }), ); // eslint-disable-next-line no-new @@ -1159,8 +1160,8 @@ describe('SnapInterfaceController', () => { ), ).toThrow('Invalid URL: The specified URL is not allowed.'); - expect(rootMessenger.call).toHaveBeenNthCalledWith( - 3, + expect(controllerMessenger.call).toHaveBeenNthCalledWith( + 1, 'PhishingController:testOrigin', 'https://foo.bar/', ); diff --git a/packages/snaps-controllers/src/interface/SnapInterfaceController.ts b/packages/snaps-controllers/src/interface/SnapInterfaceController.ts index 81a1378ba0..af81e680f1 100644 --- a/packages/snaps-controllers/src/interface/SnapInterfaceController.ts +++ b/packages/snaps-controllers/src/interface/SnapInterfaceController.ts @@ -3,11 +3,11 @@ import type { HasApprovalRequest, } from '@metamask/approval-controller'; import type { - RestrictedMessenger, ControllerGetStateAction, ControllerStateChangeEvent, } from '@metamask/base-controller'; import { BaseController } from '@metamask/base-controller'; +import type { Messenger } from '@metamask/messenger'; import type { TestOrigin } from '@metamask/phishing-controller'; import type { InterfaceState, @@ -164,12 +164,10 @@ export type SnapInterfaceControllerEvents = | SnapInterfaceControllerStateChangeEvent | NotificationListUpdatedEvent; -export type SnapInterfaceControllerMessenger = RestrictedMessenger< +export type SnapInterfaceControllerMessenger = Messenger< typeof controllerName, SnapInterfaceControllerActions | SnapInterfaceControllerAllowedActions, - SnapInterfaceControllerEvents, - SnapInterfaceControllerAllowedActions['type'], - SnapInterfaceControllerEvents['type'] + SnapInterfaceControllerEvents >; export type StoredInterface = { @@ -216,7 +214,7 @@ export class SnapInterfaceController extends BaseController< } }, {}); }, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, }, @@ -224,7 +222,7 @@ export class SnapInterfaceController extends BaseController< state: { interfaces: {}, ...state }, }); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'NotificationServicesController:notificationsListUpdated', this.#onNotificationsListUpdated.bind(this), ); @@ -237,32 +235,32 @@ export class SnapInterfaceController extends BaseController< * actions. */ #registerMessageHandlers() { - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:createInterface`, this.createInterface.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:getInterface`, this.getInterface.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:updateInterface`, this.updateInterface.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:deleteInterface`, this.deleteInterface.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:updateInterfaceState`, this.updateInterfaceState.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:resolveInterface`, this.resolveInterface.bind(this), ); @@ -441,8 +439,7 @@ export class SnapInterfaceController extends BaseController< * @returns True if the origin is on the phishing list, otherwise false. */ #checkPhishingList(origin: string) { - return this.messagingSystem.call('PhishingController:testOrigin', origin) - .result; + return this.messenger.call('PhishingController:testOrigin', origin).result; } /** @@ -453,7 +450,7 @@ export class SnapInterfaceController extends BaseController< * @returns True if an approval request exists, otherwise false. */ #hasApprovalRequest(id: string) { - return this.messagingSystem.call('ApprovalController:hasRequest', { + return this.messenger.call('ApprovalController:hasRequest', { id, }); } @@ -465,11 +462,7 @@ export class SnapInterfaceController extends BaseController< * @param value - The value to resolve the promise with. */ async #acceptApprovalRequest(id: string, value: Json) { - await this.messagingSystem.call( - 'ApprovalController:acceptRequest', - id, - value, - ); + await this.messenger.call('ApprovalController:acceptRequest', id, value); } /** @@ -478,7 +471,7 @@ export class SnapInterfaceController extends BaseController< * @returns The selected account. */ #getSelectedAccount() { - return this.messagingSystem.call( + return this.messenger.call( 'AccountsController:getSelectedMultichainAccount', ); } @@ -490,7 +483,7 @@ export class SnapInterfaceController extends BaseController< * @returns The list of accounts. */ #listAccounts(chainIds?: CaipChainId[]) { - const accounts = this.messagingSystem.call( + const accounts = this.messenger.call( 'AccountsController:listMultichainAccounts', ); @@ -512,7 +505,7 @@ export class SnapInterfaceController extends BaseController< #getAccountByAddress(address: CaipAccountId) { const { address: parsedAddress } = parseCaipAccountId(address); - return this.messagingSystem.call( + return this.messenger.call( 'AccountsController:getAccountByAddress', parsedAddress, ); @@ -524,7 +517,7 @@ export class SnapInterfaceController extends BaseController< * @returns The MultichainAssetsController state. */ #getAssetsState() { - return this.messagingSystem.call('MultichainAssetsController:getState'); + return this.messenger.call('MultichainAssetsController:getState'); } /** @@ -534,7 +527,7 @@ export class SnapInterfaceController extends BaseController< * @returns The snap. */ #getSnap(id: string) { - return this.messagingSystem.call('SnapController:get', id); + return this.messenger.call('SnapController:get', id); } /** diff --git a/packages/snaps-controllers/src/multichain/MultichainRouter.test.ts b/packages/snaps-controllers/src/multichain/MultichainRouter.test.ts index cfafdad2a7..5f1e61544c 100644 --- a/packages/snaps-controllers/src/multichain/MultichainRouter.test.ts +++ b/packages/snaps-controllers/src/multichain/MultichainRouter.test.ts @@ -5,6 +5,7 @@ import { } from '@metamask/snaps-utils/test-utils'; import { MultichainRouter } from './MultichainRouter'; +import { METAMASK_ORIGIN } from '../snaps/constants'; import { getRootMultichainRouterMessenger, getRestrictedMultichainRouterMessenger, @@ -51,9 +52,12 @@ describe('MultichainRouter', () => { ); const result = await messenger.call('MultichainRouter:handleRequest', { + origin: METAMASK_ORIGIN, connectedAddresses: BTC_CONNECTED_ACCOUNTS, scope: BTC_CAIP2, request: { + jsonrpc: '2.0', + id: 1, method: 'sendBitcoin', params: { message: 'foo', @@ -102,9 +106,12 @@ describe('MultichainRouter', () => { ); const result = await messenger.call('MultichainRouter:handleRequest', { + origin: METAMASK_ORIGIN, connectedAddresses: SOLANA_CONNECTED_ACCOUNTS, scope: SOLANA_CAIP2, request: { + jsonrpc: '2.0', + id: 1, method: 'signAndSendTransaction', params: { message: 'foo', @@ -149,10 +156,12 @@ describe('MultichainRouter', () => { ); const result = await messenger.call('MultichainRouter:handleRequest', { + origin: METAMASK_ORIGIN, connectedAddresses: [], scope: SOLANA_CAIP2, - origin: 'metamask', request: { + jsonrpc: '2.0', + id: 1, method: 'getVersion', }, }); @@ -162,7 +171,7 @@ describe('MultichainRouter', () => { 'solana-core': '1.16.7', }); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(messenger.call).toHaveBeenNthCalledWith( 5, 'SnapController:handleRequest', { @@ -173,7 +182,7 @@ describe('MultichainRouter', () => { method: '', params: { request: { - id: expect.any(String), + id: 1, jsonrpc: '2.0', method: 'getVersion', }, @@ -206,9 +215,12 @@ describe('MultichainRouter', () => { await expect( messenger.call('MultichainRouter:handleRequest', { + origin: METAMASK_ORIGIN, connectedAddresses: [], scope: SOLANA_CAIP2, request: { + jsonrpc: '2.0', + id: 1, method: 'getVersion', }, }), @@ -241,9 +253,12 @@ describe('MultichainRouter', () => { await expect( messenger.call('MultichainRouter:handleRequest', { + origin: METAMASK_ORIGIN, connectedAddresses: SOLANA_CONNECTED_ACCOUNTS, scope: SOLANA_CAIP2, request: { + jsonrpc: '2.0', + id: 1, method: 'signAndSendTransaction', params: { message: 'foo', @@ -282,9 +297,12 @@ describe('MultichainRouter', () => { await expect( messenger.call('MultichainRouter:handleRequest', { + origin: METAMASK_ORIGIN, connectedAddresses: SOLANA_CONNECTED_ACCOUNTS, scope: SOLANA_CAIP2, request: { + jsonrpc: '2.0', + id: 1, method: 'signAndSendTransaction', params: { message: 'foo', @@ -322,9 +340,12 @@ describe('MultichainRouter', () => { await expect( messenger.call('MultichainRouter:handleRequest', { + origin: METAMASK_ORIGIN, connectedAddresses: SOLANA_CONNECTED_ACCOUNTS, scope: SOLANA_CAIP2, request: { + jsonrpc: '2.0', + id: 1, method: 'signAndSendTransaction', params: { message: 'foo', diff --git a/packages/snaps-controllers/src/multichain/MultichainRouter.ts b/packages/snaps-controllers/src/multichain/MultichainRouter.ts index 7762cfb298..c4b3d04c47 100644 --- a/packages/snaps-controllers/src/multichain/MultichainRouter.ts +++ b/packages/snaps-controllers/src/multichain/MultichainRouter.ts @@ -1,4 +1,4 @@ -import type { RestrictedMessenger } from '@metamask/base-controller'; +import type { Messenger } from '@metamask/messenger'; import type { GetPermissions } from '@metamask/permission-controller'; import { rpcErrors } from '@metamask/rpc-errors'; import { @@ -60,7 +60,7 @@ type SnapKeyring = { }; // Expecting a bound function that calls KeyringController.withKeyring selecting the Snap keyring -type WithSnapKeyringFunction = ( +export type WithSnapKeyringFunction = ( operation: ({ keyring }: { keyring: SnapKeyring }) => Promise, ) => Promise; @@ -83,12 +83,9 @@ export type MultichainRouterAllowedActions = export type MultichainRouterEvents = never; -export type MultichainRouterMessenger = RestrictedMessenger< +export type MultichainRouterMessenger = Messenger< typeof name, - MultichainRouterActions | MultichainRouterAllowedActions, - never, - MultichainRouterAllowedActions['type'], - MultichainRouterEvents['type'] + MultichainRouterActions | MultichainRouterAllowedActions >; export type MultichainRouterArgs = { diff --git a/packages/snaps-controllers/src/services/ExecutionService.ts b/packages/snaps-controllers/src/services/ExecutionService.ts index f551e78c16..3d6898ce21 100644 --- a/packages/snaps-controllers/src/services/ExecutionService.ts +++ b/packages/snaps-controllers/src/services/ExecutionService.ts @@ -1,4 +1,4 @@ -import type { RestrictedMessenger } from '@metamask/base-controller'; +import type { Messenger } from '@metamask/messenger'; import type { SnapRpcHookArgs } from '@metamask/snaps-utils'; import type { Json } from '@metamask/utils'; @@ -95,10 +95,8 @@ export type ExecutionServiceActions = | TerminateSnapAction | TerminateAllSnapsAction; -export type ExecutionServiceMessenger = RestrictedMessenger< +export type ExecutionServiceMessenger = Messenger< 'ExecutionService', ExecutionServiceActions, - ExecutionServiceEvents, - ExecutionServiceActions['type'], - ExecutionServiceEvents['type'] + ExecutionServiceEvents >; diff --git a/packages/snaps-controllers/src/snaps/SnapController.test.tsx b/packages/snaps-controllers/src/snaps/SnapController.test.tsx index a5ea4a82ce..f8aa458bc1 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.test.tsx +++ b/packages/snaps-controllers/src/snaps/SnapController.test.tsx @@ -1,7 +1,4 @@ -import { - deriveStateFromMetadata, - getPersistentState, -} from '@metamask/base-controller'; +import { deriveStateFromMetadata } from '@metamask/base-controller'; import { encrypt } from '@metamask/browser-passworder'; import { createAsyncMiddleware, @@ -88,7 +85,10 @@ import { STATE_DEBOUNCE_TIMEOUT, } from './constants'; import { SnapsRegistryStatus } from './registry'; -import type { SnapControllerState } from './SnapController'; +import type { + PersistedSnapControllerState, + SnapControllerState, +} from './SnapController'; import { SNAP_APPROVAL_INSTALL, SNAP_APPROVAL_RESULT, @@ -2854,7 +2854,7 @@ describe('SnapController', () => { }, }); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(messenger.call).toHaveBeenNthCalledWith( 4, 'ExecutionService:handleRpcRequest', MOCK_SNAP_ID, @@ -5184,8 +5184,8 @@ describe('SnapController', () => { }, }); - expect(rootMessenger.call).toHaveBeenCalledTimes(5); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(options.messenger.call).toHaveBeenCalledTimes(5); + expect(options.messenger.call).toHaveBeenCalledWith( 'ExecutionService:handleRpcRequest', MOCK_SNAP_ID, { @@ -6314,7 +6314,7 @@ describe('SnapController', () => { }); const [snapController] = getSnapControllerWithEES(snapControllerOptions); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(snapControllerOptions.messenger.call).toHaveBeenCalledWith( 'PermissionController:grantPermissions', { approvedPermissions: { @@ -6330,7 +6330,7 @@ describe('SnapController', () => { }, ); - expect(rootMessenger.publish).toHaveBeenCalledWith( + expect(snapControllerOptions.messenger.publish).toHaveBeenCalledWith( 'SnapController:snapInstalled', getTruncatedSnap(), METAMASK_ORIGIN, @@ -6414,12 +6414,12 @@ describe('SnapController', () => { () => MOCK_SNAP_PERMISSIONS, ); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(snapControllerOptions.messenger.call).toHaveBeenCalledWith( 'PermissionController:grantPermissions', { approvedPermissions, subject: { origin: 'npm:filsnap' } }, ); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(snapControllerOptions.messenger.call).toHaveBeenCalledWith( 'PermissionController:grantPermissions', { approvedPermissions, @@ -6463,7 +6463,7 @@ describe('SnapController', () => { }); const [snapController] = getSnapControllerWithEES(snapControllerOptions); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(snapControllerOptions.messenger.call).toHaveBeenCalledWith( 'PermissionController:grantPermissions', { approvedPermissions: { @@ -6543,14 +6543,14 @@ describe('SnapController', () => { }); const [snapController] = getSnapControllerWithEES(snapControllerOptions); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(snapControllerOptions.messenger.call).toHaveBeenCalledWith( 'PermissionController:revokePermissions', { [MOCK_SNAP_ID]: ['snap_dialog'], }, ); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(snapControllerOptions.messenger.call).toHaveBeenCalledWith( 'PermissionController:grantPermissions', { approvedPermissions: { @@ -6561,7 +6561,7 @@ describe('SnapController', () => { }, ); - expect(rootMessenger.publish).toHaveBeenCalledWith( + expect(snapControllerOptions.messenger.publish).toHaveBeenCalledWith( 'SnapController:snapUpdated', getTruncatedSnap({ version: '1.2.3', @@ -6630,7 +6630,7 @@ describe('SnapController', () => { }); const [snapController] = getSnapControllerWithEES(snapControllerOptions); - expect(rootMessenger.call).toHaveBeenCalledTimes(0); + expect(snapControllerOptions.messenger.call).toHaveBeenCalledTimes(0); snapController.destroy(); }); @@ -6680,7 +6680,7 @@ describe('SnapController', () => { }); const [snapController] = getSnapControllerWithEES(snapControllerOptions); - expect(rootMessenger.call).toHaveBeenCalledWith( + expect(snapControllerOptions.messenger.call).toHaveBeenCalledWith( 'PermissionController:grantPermissions', { approvedPermissions: { @@ -6910,7 +6910,7 @@ describe('SnapController', () => { await new Promise((resolve) => setTimeout(resolve, 10)); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(messenger.call).toHaveBeenNthCalledWith( 6, 'ExecutionService:handleRpcRequest', MOCK_SNAP_ID, @@ -6976,7 +6976,7 @@ describe('SnapController', () => { await new Promise((resolve) => setTimeout(resolve, 10)); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(messenger.call).toHaveBeenNthCalledWith( 6, 'ExecutionService:handleRpcRequest', MOCK_SNAP_ID, @@ -10172,12 +10172,13 @@ describe('SnapController', () => { expect(updatedSnap.version).toStrictEqual(updateVersion); expect(updatedSnap.preinstalled).toBe(true); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(messenger.call).toHaveBeenNthCalledWith( 7, 'PermissionController:revokePermissions', { [snapId]: [SnapEndowments.Rpc, SnapEndowments.LifecycleHooks] }, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + + expect(messenger.call).toHaveBeenNthCalledWith( 8, 'PermissionController:grantPermissions', { @@ -12621,7 +12622,7 @@ describe('SnapController', () => { deriveStateFromMetadata( controller.state, controller.metadata, - 'anonymous', + 'includeInDebugSnapshot', ), ).toMatchInlineSnapshot(`{}`); }); @@ -12747,15 +12748,16 @@ describe('SnapController', () => { ); // persist the state somewhere - const persistedState = getPersistentState( + const persistedState = deriveStateFromMetadata( firstSnapController.state, firstSnapController.metadata, + 'persist', ); // create a new controller const secondSnapController = getSnapController( getSnapControllerOptions({ - state: persistedState, + state: persistedState as PersistedSnapControllerState, }), ); @@ -12786,15 +12788,16 @@ describe('SnapController', () => { expect(firstSnapController.state.snaps[MOCK_SNAP_ID]).toBeDefined(); // persist the state somewhere - const persistedState = getPersistentState( + const persistedState = deriveStateFromMetadata( firstSnapController.state, firstSnapController.metadata, + 'persist', ); // create a new controller const secondSnapController = getSnapController( getSnapControllerOptions({ - state: persistedState, + state: persistedState as PersistedSnapControllerState, }), ); diff --git a/packages/snaps-controllers/src/snaps/SnapController.ts b/packages/snaps-controllers/src/snaps/SnapController.ts index a1cee38882..c547231b21 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.ts +++ b/packages/snaps-controllers/src/snaps/SnapController.ts @@ -4,12 +4,12 @@ import { type UpdateRequestState, } from '@metamask/approval-controller'; import type { - RestrictedMessenger, ControllerGetStateAction, ControllerStateChangeEvent, } from '@metamask/base-controller'; import { BaseController } from '@metamask/base-controller'; import type { CryptographicFunctions } from '@metamask/key-tree'; +import type { Messenger } from '@metamask/messenger'; import type { Caveat, GetEndowments, @@ -694,12 +694,10 @@ export type AllowedEvents = | SnapUpdated | KeyringControllerLock; -type SnapControllerMessenger = RestrictedMessenger< +type SnapControllerMessenger = Messenger< typeof controllerName, SnapControllerActions | AllowedActions, - SnapControllerEvents | AllowedEvents, - AllowedActions['type'], - AllowedEvents['type'] + SnapControllerEvents | AllowedEvents >; type FeatureFlags = { @@ -977,13 +975,13 @@ export class SnapController extends BaseController< snapStates: { includeInStateLogs: false, persist: true, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: false, }, unencryptedSnapStates: { includeInStateLogs: false, persist: true, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: false, }, snaps: { @@ -1019,7 +1017,7 @@ export class SnapController extends BaseController< }, {}) ); }, - anonymous: false, + includeInDebugSnapshot: false, // TODO: Ensure larger snap properties are not sent to the UI // Currently these are stripped out manually in the extension usedInUi: true, @@ -1057,23 +1055,23 @@ export class SnapController extends BaseController< this.#pollForLastRequestStatus(); /* eslint-disable @typescript-eslint/unbound-method */ - this.messagingSystem.subscribe( + this.messenger.subscribe( 'ExecutionService:unhandledError', this._onUnhandledSnapError, ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'ExecutionService:outboundRequest', this._onOutboundRequest, ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'ExecutionService:outboundResponse', this._onOutboundResponse, ); /* eslint-enable @typescript-eslint/unbound-method */ - this.messagingSystem.subscribe( + this.messenger.subscribe( 'SnapController:snapInstalled', ({ id }, origin) => { this.#callLifecycleHook(origin, id, HandlerType.OnInstall).catch( @@ -1088,7 +1086,7 @@ export class SnapController extends BaseController< }, ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'SnapController:snapUpdated', ({ id }, _oldVersion, origin) => { this.#callLifecycleHook(origin, id, HandlerType.OnUpdate).catch( @@ -1103,7 +1101,7 @@ export class SnapController extends BaseController< }, ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'KeyringController:lock', this.#handleLock.bind(this), ); @@ -1121,7 +1119,7 @@ export class SnapController extends BaseController< this.#trackSnapExport = throttleTracking( (snapId: SnapId, handler: string, success: boolean, origin: string) => { - const snapMetadata = this.messagingSystem.call( + const snapMetadata = this.messenger.call( 'SnapsRegistry:getMetadata', snapId, ); @@ -1215,117 +1213,114 @@ export class SnapController extends BaseController< * actions. */ #registerMessageHandlers(): void { - this.messagingSystem.registerActionHandler( - `${controllerName}:init`, - (...args) => this.init(...args), + this.messenger.registerActionHandler(`${controllerName}:init`, (...args) => + this.init(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:clearSnapState`, (...args) => this.clearSnapState(...args), ); - this.messagingSystem.registerActionHandler( - `${controllerName}:get`, - (...args) => this.get(...args), + this.messenger.registerActionHandler(`${controllerName}:get`, (...args) => + this.get(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:getSnapState`, async (...args) => this.getSnapState(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:handleRequest`, async (...args) => this.handleRequest(...args), ); - this.messagingSystem.registerActionHandler( - `${controllerName}:has`, - (...args) => this.has(...args), + this.messenger.registerActionHandler(`${controllerName}:has`, (...args) => + this.has(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:updateRegistry`, async () => this.updateRegistry(), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:updateSnapState`, async (...args) => this.updateSnapState(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:enable`, (...args) => this.enableSnap(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:disable`, async (...args) => this.disableSnap(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:remove`, async (...args) => this.removeSnap(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:getPermitted`, (...args) => this.getPermittedSnaps(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:install`, async (...args) => this.installSnaps(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:getAll`, (...args) => this.getAllSnaps(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:getRunnableSnaps`, (...args) => this.getRunnableSnaps(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:incrementActiveReferences`, (...args) => this.incrementActiveReferences(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:decrementActiveReferences`, (...args) => this.decrementActiveReferences(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:disconnectOrigin`, (...args) => this.removeSnapFromSubject(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:revokeDynamicPermissions`, (...args) => this.revokeDynamicSnapPermissions(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:getFile`, async (...args) => this.getSnapFile(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:stopAllSnaps`, async (...args) => this.stopAllSnaps(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:isMinimumPlatformVersion`, (...args) => this.isMinimumPlatformVersion(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `${controllerName}:setClientActive`, (...args) => this.setClientActive(...args), ); @@ -1452,7 +1447,7 @@ export class SnapController extends BaseController< // Emit events if (isUpdate) { - this.messagingSystem.publish( + this.messenger.publish( 'SnapController:snapUpdated', this.getTruncatedExpect(snapId), existingSnap.version, @@ -1460,7 +1455,7 @@ export class SnapController extends BaseController< true, ); } else { - this.messagingSystem.publish( + this.messenger.publish( 'SnapController:snapInstalled', this.getTruncatedExpect(snapId), METAMASK_ORIGIN, @@ -1490,9 +1485,9 @@ export class SnapController extends BaseController< */ async updateRegistry(): Promise { this.#assertCanUsePlatform(); - await this.messagingSystem.call('SnapsRegistry:update'); + await this.messenger.call('SnapsRegistry:update'); - const blockedSnaps = await this.messagingSystem.call( + const blockedSnaps = await this.messenger.call( 'SnapsRegistry:get', Object.values(this.state.snaps).reduce( (blockListArg, snap) => { @@ -1582,7 +1577,7 @@ export class SnapController extends BaseController< ); } - this.messagingSystem.publish( + this.messenger.publish( `${controllerName}:snapBlocked`, snapId, blockedSnapInfo, @@ -1606,7 +1601,7 @@ export class SnapController extends BaseController< delete state.snaps[snapId].blockInformation; }); - this.messagingSystem.publish(`${controllerName}:snapUnblocked`, snapId); + this.messenger.publish(`${controllerName}:snapUnblocked`, snapId); } async #assertIsInstallAllowed( @@ -1619,7 +1614,7 @@ export class SnapController extends BaseController< platformVersion: string | undefined; }, ) { - const results = await this.messagingSystem.call('SnapsRegistry:get', { + const results = await this.messenger.call('SnapsRegistry:get', { [snapId]: snapInfo, }); @@ -1781,7 +1776,7 @@ export class SnapController extends BaseController< state.snaps[snapId].enabled = true; }); - this.messagingSystem.publish( + this.messenger.publish( 'SnapController:snapEnabled', this.getTruncatedExpect(snapId), ); @@ -1806,7 +1801,7 @@ export class SnapController extends BaseController< await this.stopSnap(snapId, SnapStatusEvents.Stop); } - this.messagingSystem.publish( + this.messenger.publish( 'SnapController:snapDisabled', this.getTruncatedExpect(snapId), ); @@ -1887,7 +1882,7 @@ export class SnapController extends BaseController< * @param snapId - The snap to terminate. */ async #terminateSnap(snapId: SnapId) { - await this.messagingSystem.call('ExecutionService:terminateSnap', snapId); + await this.messenger.call('ExecutionService:terminateSnap', snapId); // Hack to give up execution for a bit to let gracefully terminating Snaps return. await new Promise((resolve) => setTimeout(resolve, 1)); @@ -1901,7 +1896,7 @@ export class SnapController extends BaseController< // Hack to give up execution for a bit to let timed out requests return. await new Promise((resolve) => setTimeout(resolve, 1)); - this.messagingSystem.publish( + this.messenger.publish( 'SnapController:snapTerminated', this.getTruncatedExpect(snapId), ); @@ -2398,10 +2393,7 @@ export class SnapController extends BaseController< // If the snap has been fully installed before, also emit snapUninstalled. if (snap.status !== SnapStatus.Installing) { - this.messagingSystem.publish( - `SnapController:snapUninstalled`, - truncated, - ); + this.messenger.publish(`SnapController:snapUninstalled`, truncated); } }), ); @@ -2429,7 +2421,7 @@ export class SnapController extends BaseController< } #addSnapToSubject(origin: string, snapId: SnapId) { - const subjectPermissions = this.messagingSystem.call( + const subjectPermissions = this.messenger.call( 'PermissionController:getPermissions', origin, ) as SubjectPermissions; @@ -2449,7 +2441,7 @@ export class SnapController extends BaseController< // If an existing caveat exists, we add the snap to that. if (existingCaveat) { - this.messagingSystem.call( + this.messenger.call( 'PermissionController:updateCaveat', origin, WALLET_SNAP_PERMISSION_KEY, @@ -2472,7 +2464,7 @@ export class SnapController extends BaseController< }, } as RequestedPermissions; - this.messagingSystem.call('PermissionController:grantPermissions', { + this.messenger.call('PermissionController:grantPermissions', { approvedPermissions, subject: { origin }, }); @@ -2485,7 +2477,7 @@ export class SnapController extends BaseController< * @param snapId - The id of the snap to remove. */ removeSnapFromSubject(origin: string, snapId: SnapId) { - const subjectPermissions = this.messagingSystem.call( + const subjectPermissions = this.messenger.call( 'PermissionController:getPermissions', origin, ) as SubjectPermissions; @@ -2509,7 +2501,7 @@ export class SnapController extends BaseController< }; delete newCaveatValue[snapId]; if (Object.keys(newCaveatValue).length > 0) { - this.messagingSystem.call( + this.messenger.call( 'PermissionController:updateCaveat', origin, WALLET_SNAP_PERMISSION_KEY, @@ -2517,7 +2509,7 @@ export class SnapController extends BaseController< newCaveatValue, ); } else { - this.messagingSystem.call('PermissionController:revokePermissions', { + this.messenger.call('PermissionController:revokePermissions', { [origin]: [WALLET_SNAP_PERMISSION_KEY], }); } @@ -2541,7 +2533,7 @@ export class SnapController extends BaseController< ), 'Non-dynamic permissions cannot be revoked', ); - this.messagingSystem.call('PermissionController:revokePermissions', { + this.messenger.call('PermissionController:revokePermissions', { [snapId]: permissionNames, }); } @@ -2552,7 +2544,7 @@ export class SnapController extends BaseController< * @param snapId - The id of the Snap. */ #removeSnapFromSubjects(snapId: SnapId) { - const subjects = this.messagingSystem.call( + const subjects = this.messenger.call( 'PermissionController:getSubjectNames', ); for (const subject of subjects) { @@ -2566,13 +2558,8 @@ export class SnapController extends BaseController< * @param snapId - The snap ID. */ #revokeAllSnapPermissions(snapId: string) { - if ( - this.messagingSystem.call('PermissionController:hasPermissions', snapId) - ) { - this.messagingSystem.call( - 'PermissionController:revokeAllPermissions', - snapId, - ); + if (this.messenger.call('PermissionController:hasPermissions', snapId)) { + this.messenger.call('PermissionController:revokeAllPermissions', snapId); } } @@ -2626,10 +2613,7 @@ export class SnapController extends BaseController< */ getPermittedSnaps(origin: string): RequestSnapsResult { const permissions = - this.messagingSystem.call( - 'PermissionController:getPermissions', - origin, - ) ?? {}; + this.messenger.call('PermissionController:getPermissions', origin) ?? {}; const snaps = permissions[WALLET_SNAP_PERMISSION_KEY]?.caveats?.find( (caveat) => caveat.type === SnapCaveatType.SnapIds, @@ -2725,7 +2709,7 @@ export class SnapController extends BaseController< // Once we finish all installs / updates, emit events. pendingInstalls.forEach((snapId) => - this.messagingSystem.publish( + this.messenger.publish( `SnapController:snapInstalled`, this.getTruncatedExpect(snapId), origin, @@ -2734,7 +2718,7 @@ export class SnapController extends BaseController< ); pendingUpdates.forEach(({ snapId, oldVersion }) => - this.messagingSystem.publish( + this.messenger.publish( `SnapController:snapUpdated`, this.getTruncatedExpect(snapId), oldVersion, @@ -2799,7 +2783,7 @@ export class SnapController extends BaseController< type: SNAP_APPROVAL_INSTALL, }); - this.messagingSystem.publish( + this.messenger.publish( 'SnapController:snapInstallStarted', snapId, origin, @@ -2857,7 +2841,7 @@ export class SnapController extends BaseController< error: errorString, }); - this.messagingSystem.publish( + this.messenger.publish( 'SnapController:snapInstallFailed', snapId, origin, @@ -2879,7 +2863,7 @@ export class SnapController extends BaseController< type: string; }): PendingApproval { const id = nanoid(); - const promise = this.messagingSystem.call( + const promise = this.messenger.call( 'ApprovalController:addRequest', { origin, @@ -2902,7 +2886,7 @@ export class SnapController extends BaseController< #updateApproval(id: string, requestState: Record) { try { - this.messagingSystem.call('ApprovalController:updateRequestState', { + this.messenger.call('ApprovalController:updateRequestState', { id, requestState, }); @@ -2965,7 +2949,7 @@ export class SnapController extends BaseController< }); try { - this.messagingSystem.publish( + this.messenger.publish( 'SnapController:snapInstallStarted', snapId, origin, @@ -3126,7 +3110,7 @@ export class SnapController extends BaseController< }); } - this.messagingSystem.publish( + this.messenger.publish( 'SnapController:snapInstallFailed', snapId, origin, @@ -3142,7 +3126,7 @@ export class SnapController extends BaseController< snapId: SnapId, versionRange: SemVerRange, ): Promise { - return await this.messagingSystem.call( + return await this.messenger.call( 'SnapsRegistry:resolveVersion', snapId, versionRange, @@ -3220,13 +3204,10 @@ export class SnapController extends BaseController< try { const runtime = this.#getRuntimeExpect(snapId); - const result = await this.messagingSystem.call( - 'ExecutionService:executeSnap', - { - ...snapData, - endowments: await this.#getEndowments(snapId), - }, - ); + const result = await this.messenger.call('ExecutionService:executeSnap', { + ...snapData, + endowments: await this.#getEndowments(snapId), + }); this.#transition(snapId, SnapStatusEvents.Start); // We treat the initialization of the snap as the first request, for idle timing purposes. @@ -3254,13 +3235,13 @@ export class SnapController extends BaseController< for (const permissionName of this.#environmentEndowmentPermissions) { if ( - this.messagingSystem.call( + this.messenger.call( 'PermissionController:hasPermission', snapId, permissionName, ) ) { - const endowments = await this.messagingSystem.call( + const endowments = await this.messenger.call( 'PermissionController:getEndowments', snapId, permissionName, @@ -3416,7 +3397,7 @@ export class SnapController extends BaseController< localizedFiles, ); - this.messagingSystem.call('SubjectMetadataController:addSubjectMetadata', { + this.messenger.call('SubjectMetadataController:addSubjectMetadata', { subjectType: SubjectType.Snap, name: proposedName, origin: snap.id, @@ -3547,26 +3528,24 @@ export class SnapController extends BaseController< } /* eslint-disable @typescript-eslint/unbound-method */ - this.messagingSystem.unsubscribe( + this.messenger.unsubscribe( 'ExecutionService:unhandledError', this._onUnhandledSnapError, ); - this.messagingSystem.unsubscribe( + this.messenger.unsubscribe( 'ExecutionService:outboundRequest', this._onOutboundRequest, ); - this.messagingSystem.unsubscribe( + this.messenger.unsubscribe( 'ExecutionService:outboundResponse', this._onOutboundResponse, ); - this.messagingSystem.clearEventSubscriptions( - 'SnapController:snapInstalled', - ); + this.messenger.clearEventSubscriptions('SnapController:snapInstalled'); - this.messagingSystem.clearEventSubscriptions('SnapController:snapUpdated'); + this.messenger.clearEventSubscriptions('SnapController:snapUpdated'); /* eslint-enable @typescript-eslint/unbound-method */ } @@ -3615,7 +3594,7 @@ export class SnapController extends BaseController< "'permissionName' must be either a string or null.", ); - const permissions = this.messagingSystem.call( + const permissions = this.messenger.call( 'PermissionController:getPermissions', snapId, ); @@ -3642,7 +3621,7 @@ export class SnapController extends BaseController< ) { assert(handlerPermissions); - const subject = this.messagingSystem.call( + const subject = this.messenger.call( 'SubjectMetadataController:getSubjectMetadata', origin, ); @@ -3712,7 +3691,7 @@ export class SnapController extends BaseController< const timer = new Timer(timeout); this.#recordSnapRpcRequestStart(snapId, transformedRequest.id, timer); - const handleRpcRequestPromise = this.messagingSystem.call( + const handleRpcRequestPromise = this.messenger.call( 'ExecutionService:handleRpcRequest', snapId, { origin, handler: handlerType, request: transformedRequest }, @@ -3818,7 +3797,7 @@ export class SnapController extends BaseController< content: ComponentOrElement, contentType?: ContentType, ): Promise { - return this.messagingSystem.call( + return this.messenger.call( 'SnapInterfaceController:createInterface', snapId, content, @@ -3830,11 +3809,7 @@ export class SnapController extends BaseController< #assertInterfaceExists(snapId: SnapId, id: string) { // This will throw if the interface isn't accessible, but we assert nevertheless. assert( - this.messagingSystem.call( - 'SnapInterfaceController:getInterface', - snapId, - id, - ), + this.messenger.call('SnapInterfaceController:getInterface', snapId, id), ); } @@ -3920,7 +3895,7 @@ export class SnapController extends BaseController< { params: requestedParams }: { params: OnAssetsLookupArguments }, { assets }: OnAssetsLookupResponse, ) { - const permissions = this.messagingSystem.call( + const permissions = this.messenger.call( 'PermissionController:getPermissions', snapId, ); @@ -4032,7 +4007,7 @@ export class SnapController extends BaseController< assert(request.params && hasProperty(request.params, 'id')); const interfaceId = request.params.id as string; - const { context } = this.messagingSystem.call( + const { context } = this.messenger.call( 'SnapInterfaceController:getInterface', snapId, interfaceId, @@ -4252,7 +4227,7 @@ export class SnapController extends BaseController< const truncatedSnap = this.getTruncatedExpect(snapId); - this.messagingSystem.publish( + this.messenger.publish( 'SnapController:snapRolledback', truncatedSnap, rollbackSnapshot.newVersion, @@ -4331,10 +4306,7 @@ export class SnapController extends BaseController< >; } { const oldPermissions = - this.messagingSystem.call( - 'PermissionController:getPermissions', - snapId, - ) ?? {}; + this.messenger.call('PermissionController:getPermissions', snapId) ?? {}; const newPermissions = permissionsDiff( desiredPermissionsSet, @@ -4358,7 +4330,7 @@ export class SnapController extends BaseController< } #isSubjectConnectedToSnap(snapId: SnapId, origin: string) { - const subjectPermissions = this.messagingSystem.call( + const subjectPermissions = this.messenger.call( 'PermissionController:getPermissions', origin, ) as SubjectPermissions; @@ -4420,12 +4392,12 @@ export class SnapController extends BaseController< if (Object.keys(newPermissions).includes(SnapEndowments.EthereumProvider)) { // This will return the globally selected network if the Snap doesn't have // one set. - const networkClientId = this.messagingSystem.call( + const networkClientId = this.messenger.call( 'SelectedNetworkController:getNetworkClientIdForDomain', snapId, ); - const { configuration } = this.messagingSystem.call( + const { configuration } = this.messenger.call( 'NetworkController:getNetworkClientById', networkClientId, ); @@ -4488,7 +4460,7 @@ export class SnapController extends BaseController< }) { const unusedPermissionsKeys = Object.keys(unusedPermissions); if (isNonEmptyArray(unusedPermissionsKeys)) { - this.messagingSystem.call('PermissionController:revokePermissions', { + this.messenger.call('PermissionController:revokePermissions', { [snapId]: unusedPermissionsKeys, }); } @@ -4499,7 +4471,7 @@ export class SnapController extends BaseController< newPermissions, ); - this.messagingSystem.call('PermissionController:grantPermissions', { + this.messenger.call('PermissionController:grantPermissions', { approvedPermissions, subject: { origin: snapId }, requestData, @@ -4546,7 +4518,7 @@ export class SnapController extends BaseController< #callLifecycleHooks(origin: string, handler: HandlerType) { const snaps = this.getRunnableSnaps(); for (const { id } of snaps) { - const hasLifecycleHooksEndowment = this.messagingSystem.call( + const hasLifecycleHooksEndowment = this.messenger.call( 'PermissionController:hasPermission', id, SnapEndowments.LifecycleHooks, @@ -4586,7 +4558,7 @@ export class SnapController extends BaseController< assert(permissionName, 'Lifecycle hook must have an endowment.'); - const hasPermission = this.messagingSystem.call( + const hasPermission = this.messenger.call( 'PermissionController:hasPermission', snapId, permissionName, diff --git a/packages/snaps-controllers/src/snaps/registry/json.ts b/packages/snaps-controllers/src/snaps/registry/json.ts index e7acb76e62..e9fea8fd74 100644 --- a/packages/snaps-controllers/src/snaps/registry/json.ts +++ b/packages/snaps-controllers/src/snaps/registry/json.ts @@ -1,9 +1,9 @@ import type { ControllerGetStateAction, ControllerStateChangeEvent, - RestrictedMessenger, } from '@metamask/base-controller'; import { BaseController } from '@metamask/base-controller'; +import type { Messenger } from '@metamask/messenger'; import type { SnapsRegistryDatabase } from '@metamask/snaps-registry'; import { verify } from '@metamask/snaps-registry'; import { getTargetVersion } from '@metamask/snaps-utils'; @@ -88,12 +88,10 @@ export type SnapsRegistryStateChangeEvent = ControllerStateChangeEvent< export type SnapsRegistryEvents = SnapsRegistryStateChangeEvent; -export type SnapsRegistryMessenger = RestrictedMessenger< +export type SnapsRegistryMessenger = Messenger< 'SnapsRegistry', SnapsRegistryActions, - SnapsRegistryEvents, - SnapsRegistryActions['type'], - SnapsRegistryEvents['type'] + SnapsRegistryEvents >; export type SnapsRegistryState = { @@ -145,19 +143,19 @@ export class JsonSnapsRegistry extends BaseController< database: { includeInStateLogs: true, persist: true, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, lastUpdated: { includeInStateLogs: true, persist: true, - anonymous: false, + includeInDebugSnapshot: true, usedInUi: false, }, databaseUnavailable: { includeInStateLogs: true, persist: true, - anonymous: false, + includeInDebugSnapshot: true, usedInUi: false, }, }, @@ -174,24 +172,22 @@ export class JsonSnapsRegistry extends BaseController< this.#refetchOnAllowlistMiss = refetchOnAllowlistMiss; this.#currentUpdate = null; - this.messagingSystem.registerActionHandler( - 'SnapsRegistry:get', - async (...args) => this.#get(...args), + this.messenger.registerActionHandler('SnapsRegistry:get', async (...args) => + this.#get(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( 'SnapsRegistry:getMetadata', (...args) => this.#getMetadata(...args), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( 'SnapsRegistry:resolveVersion', async (...args) => this.#resolveVersion(...args), ); - this.messagingSystem.registerActionHandler( - 'SnapsRegistry:update', - async () => this.#triggerUpdate(), + this.messenger.registerActionHandler('SnapsRegistry:update', async () => + this.#triggerUpdate(), ); } diff --git a/packages/snaps-controllers/src/test-utils/controller.ts b/packages/snaps-controllers/src/test-utils/controller.tsx similarity index 86% rename from packages/snaps-controllers/src/test-utils/controller.ts rename to packages/snaps-controllers/src/test-utils/controller.tsx index df8aee00f5..d259c5f164 100644 --- a/packages/snaps-controllers/src/test-utils/controller.ts +++ b/packages/snaps-controllers/src/test-utils/controller.tsx @@ -1,39 +1,39 @@ import type { ApprovalRequest } from '@metamask/approval-controller'; -import type { Messenger, RestrictedMessenger } from '@metamask/base-controller'; import { - encryptWithKey, decryptWithKey, - keyFromPassword, - importKey, + encryptWithKey, exportKey, generateSalt, + importKey, isVaultUpdated, + keyFromPassword, } from '@metamask/browser-passworder'; +import { Messenger } from '@metamask/messenger'; import type { + Caveat, PermissionConstraint, + SubjectMetadata, SubjectPermissions, ValidPermission, - Caveat, - SubjectMetadata, } from '@metamask/permission-controller'; import { SubjectType } from '@metamask/permission-controller'; +import { PhishingDetectorResultType } from '@metamask/phishing-controller'; import { providerErrors } from '@metamask/rpc-errors'; import { SnapEndowments, WALLET_SNAP_PERMISSION_KEY, } from '@metamask/snaps-rpc-methods'; import type { SnapId } from '@metamask/snaps-sdk'; -import { text } from '@metamask/snaps-sdk'; +import { Text } from '@metamask/snaps-sdk/jsx'; import { SnapCaveatType } from '@metamask/snaps-utils'; import { - MockControllerMessenger, getPersistedSnapObject, - getTruncatedSnap, + getSnapObject, MOCK_LOCAL_SNAP_ID, MOCK_ORIGIN, MOCK_SNAP_ID, + MockControllerMessenger, TEST_SECRET_RECOVERY_PHRASE_SEED_BYTES, - getSnapObject, } from '@metamask/snaps-utils/test-utils'; import type { Json } from '@metamask/utils'; @@ -59,7 +59,6 @@ import type { MultichainRouterAllowedActions, MultichainRouterEvents, } from '../multichain'; -import { SnapController } from '../snaps'; import type { AllowedActions, AllowedEvents, @@ -70,6 +69,7 @@ import type { SnapsRegistryActions, SnapsRegistryEvents, } from '../snaps'; +import { SnapController } from '../snaps'; import type { KeyDerivationOptions } from '../types'; import type { WebSocketServiceActions, @@ -412,10 +412,6 @@ export const getControllerMessenger = (registry = new MockSnapsRegistry()) => { asyncNoOp, ); messenger.registerActionHandler('ExecutionService:terminateSnap', asyncNoOp); - messenger.registerActionHandler( - 'ExecutionService:terminateAllSnaps', - asyncNoOp, - ); messenger.registerActionHandler( 'SnapsRegistry:get', @@ -446,9 +442,10 @@ export const getControllerMessenger = (registry = new MockSnapsRegistry()) => { if (id !== MOCK_INTERFACE_ID) { throw new Error(`Interface with id '${id}' not found.`); } + return { snapId, - content: text('foo bar'), + content: console.log('hello world');, state: {}, context: null, } as StoredInterface; @@ -465,31 +462,21 @@ export const getSnapControllerMessenger = ( typeof getControllerMessenger > = getControllerMessenger(), ) => { - const snapControllerMessenger = messenger.getRestricted< + const snapControllerMessenger = new Messenger< 'SnapController', - SnapControllerActions['type'] | AllowedActions['type'], - SnapControllerEvents['type'] | AllowedEvents['type'] + SnapControllerActions | AllowedActions, + SnapControllerEvents | AllowedEvents, + any >({ - name: 'SnapController', - allowedEvents: [ - 'ExecutionService:unhandledError', - 'ExecutionService:outboundRequest', - 'ExecutionService:outboundResponse', - 'SnapController:snapAdded', - 'SnapController:snapBlocked', - 'SnapController:snapInstalled', - 'SnapController:snapUninstalled', - 'SnapController:snapUnblocked', - 'SnapController:snapUpdated', - 'SnapController:stateChange', - 'SnapController:snapRolledback', - 'KeyringController:lock', - ], - allowedActions: [ + namespace: 'SnapController', + parent: messenger, + }); + + messenger.delegate({ + actions: [ 'ApprovalController:addRequest', 'ApprovalController:updateRequestState', 'ExecutionService:executeSnap', - 'ExecutionService:terminateAllSnaps', 'ExecutionService:terminateSnap', 'ExecutionService:handleRpcRequest', 'NetworkController:getNetworkClientById', @@ -503,37 +490,23 @@ export const getSnapControllerMessenger = ( 'PermissionController:revokePermissionForAllSubjects', 'PermissionController:updateCaveat', 'PermissionController:getSubjectNames', - 'PhishingController:testOrigin', 'SelectedNetworkController:getNetworkClientIdForDomain', - 'SnapController:get', - 'SnapController:handleRequest', - 'SnapController:getSnapState', - 'SnapController:has', - 'SnapController:updateSnapState', - 'SnapController:clearSnapState', - 'SnapController:updateBlockedSnaps', - 'SnapController:enable', - 'SnapController:disable', - 'SnapController:remove', - 'SnapController:getAll', - 'SnapController:getRunnableSnaps', - 'SnapController:getPermitted', - 'SnapController:install', - 'SnapController:incrementActiveReferences', - 'SnapController:decrementActiveReferences', - 'SnapController:getRegistryMetadata', 'SubjectMetadataController:getSubjectMetadata', 'SubjectMetadataController:addSubjectMetadata', 'SnapsRegistry:get', 'SnapsRegistry:getMetadata', 'SnapsRegistry:update', - 'SnapController:disconnectOrigin', - 'SnapController:revokeDynamicPermissions', - 'SnapController:getFile', 'SnapsRegistry:resolveVersion', 'SnapInterfaceController:createInterface', 'SnapInterfaceController:getInterface', ], + events: [ + 'ExecutionService:unhandledError', + 'ExecutionService:outboundRequest', + 'ExecutionService:outboundResponse', + 'KeyringController:lock', + ], + messenger: snapControllerMessenger, }); jest.spyOn(snapControllerMessenger, 'call'); @@ -650,6 +623,7 @@ export const getSnapControllerWithEES = ( service?: ReturnType, ) => { const _service = + // @ts-expect-error: TODO: Investigate type mismatch. service ?? getNodeEES(getNodeEESMessenger(options.rootMessenger)); const controller = new SnapController(options); @@ -685,28 +659,30 @@ export const getRestrictedCronjobControllerMessenger = ( > = getRootCronjobControllerMessenger(), mocked = true, ) => { - const cronjobControllerMessenger = messenger.getRestricted< + const cronjobControllerMessenger = new Messenger< 'CronjobController', - CronjobControllerActions['type'] | AllowedActions['type'], - CronjobControllerEvents['type'] | AllowedEvents['type'] + CronjobControllerActions | AllowedActions, + CronjobControllerEvents | AllowedEvents, + any >({ - name: 'CronjobController', - allowedEvents: [ + namespace: 'CronjobController', + parent: messenger, + }); + + messenger.delegate({ + actions: [ + 'PermissionController:hasPermission', + 'PermissionController:getPermissions', + 'SnapController:handleRequest', + ], + events: [ 'SnapController:snapInstalled', 'SnapController:snapUpdated', 'SnapController:snapUninstalled', 'SnapController:snapEnabled', 'SnapController:snapDisabled', ], - allowedActions: [ - 'PermissionController:hasPermission', - 'PermissionController:getPermissions', - 'SnapController:getAll', - 'SnapController:handleRequest', - 'CronjobController:scheduleBackgroundEvent', - 'CronjobController:cancelBackgroundEvent', - 'CronjobController:getBackgroundEvents', - ], + messenger: cronjobControllerMessenger, }); if (mocked) { @@ -724,13 +700,11 @@ export const getRestrictedCronjobControllerMessenger = ( }, ); - messenger.registerActionHandler('SnapController:getAll', () => { - return [getTruncatedSnap()]; - }); - messenger.registerActionHandler('SnapController:handleRequest', asyncNoOp); } + jest.spyOn(cronjobControllerMessenger, 'call'); + return cronjobControllerMessenger; }; @@ -751,22 +725,12 @@ export const getRestrictedSnapsRegistryControllerMessenger = ( typeof getRootSnapsRegistryControllerMessenger > = getRootSnapsRegistryControllerMessenger(), ) => { - const controllerMessenger = messenger.getRestricted< + return new Messenger< 'SnapsRegistry', - SnapsRegistryActions['type'], - SnapsRegistryEvents['type'] - >({ - name: 'SnapsRegistry', - allowedEvents: [], - allowedActions: [ - 'SnapsRegistry:get', - 'SnapsRegistry:getMetadata', - 'SnapsRegistry:update', - 'SnapsRegistry:resolveVersion', - ], - }); - - return controllerMessenger; + SnapsRegistryActions, + SnapsRegistryEvents, + any + >({ namespace: 'SnapsRegistry', parent: messenger }); }; // Mock controller messenger for Interface Controller @@ -787,13 +751,15 @@ export const getRestrictedSnapInterfaceControllerMessenger = ( > = getRootSnapInterfaceControllerMessenger(), mocked = true, ) => { - const snapInterfaceControllerMessenger = messenger.getRestricted< + const snapInterfaceControllerMessenger = new Messenger< 'SnapInterfaceController', - SnapInterfaceControllerAllowedActions['type'], - SnapInterfaceControllerEvents['type'] - >({ - name: 'SnapInterfaceController', - allowedActions: [ + SnapInterfaceControllerAllowedActions, + SnapInterfaceControllerEvents, + any + >({ namespace: 'SnapInterfaceController', parent: messenger }); + + messenger.delegate({ + actions: [ 'PhishingController:testOrigin', 'ApprovalController:hasRequest', 'ApprovalController:acceptRequest', @@ -803,16 +769,14 @@ export const getRestrictedSnapInterfaceControllerMessenger = ( 'AccountsController:getSelectedMultichainAccount', 'AccountsController:listMultichainAccounts', ], - allowedEvents: [ - 'NotificationServicesController:notificationsListUpdated', - 'SnapInterfaceController:stateChange', - ], + events: ['NotificationServicesController:notificationsListUpdated'], + messenger: snapInterfaceControllerMessenger, }); if (mocked) { messenger.registerActionHandler('PhishingController:testOrigin', () => ({ result: false, - type: 'all', + type: PhishingDetectorResultType.All, })); messenger.registerActionHandler( @@ -868,6 +832,8 @@ export const getRestrictedSnapInterfaceControllerMessenger = ( }); } + jest.spyOn(snapInterfaceControllerMessenger, 'call'); + return snapInterfaceControllerMessenger; }; @@ -888,25 +854,33 @@ export const getRestrictedSnapInsightsControllerMessenger = ( typeof getRootSnapInsightsControllerMessenger > = getRootSnapInsightsControllerMessenger(), ) => { - const controllerMessenger = messenger.getRestricted< + const controllerMessenger = new Messenger< 'SnapInsightsController', - SnapInsightsControllerAllowedActions['type'], - SnapInsightsControllerAllowedEvents['type'] + SnapInsightsControllerAllowedActions, + SnapInsightsControllerAllowedEvents, + any >({ - name: 'SnapInsightsController', - allowedEvents: [ - 'TransactionController:unapprovedTransactionAdded', - 'TransactionController:transactionStatusUpdated', - 'SignatureController:stateChange', - ], - allowedActions: [ + namespace: 'SnapInsightsController', + parent: messenger, + }); + + messenger.delegate({ + actions: [ 'PermissionController:getPermissions', 'SnapController:getAll', 'SnapController:handleRequest', 'SnapInterfaceController:deleteInterface', ], + events: [ + 'TransactionController:unapprovedTransactionAdded', + 'TransactionController:transactionStatusUpdated', + 'SignatureController:stateChange', + ], + messenger: controllerMessenger, }); + jest.spyOn(controllerMessenger, 'call'); + return controllerMessenger; }; @@ -917,15 +891,7 @@ export const getRestrictedSnapInsightsControllerMessenger = ( * @returns A promise that resolves when the state change event is emitted. */ export async function waitForStateChange( - messenger: - | Messenger - | RestrictedMessenger< - 'SnapController', - any, - SnapControllerStateChangeEvent, - any, - 'SnapController:stateChange' - >, + messenger: Messenger<'SnapController', any, SnapControllerStateChangeEvent>, ) { return new Promise((resolve) => { messenger.subscribe('SnapController:stateChange', () => { @@ -951,20 +917,25 @@ export const getRestrictedMultichainRouterMessenger = ( typeof getRootMultichainRouterMessenger > = getRootMultichainRouterMessenger(), ) => { - const controllerMessenger = messenger.getRestricted< + const controllerMessenger = new Messenger< 'MultichainRouter', - MultichainRouterAllowedActions['type'] - >({ - name: 'MultichainRouter', - allowedEvents: [], - allowedActions: [ + MultichainRouterActions | MultichainRouterAllowedActions, + never, + any + >({ namespace: 'MultichainRouter', parent: messenger }); + + messenger.delegate({ + actions: [ 'PermissionController:getPermissions', 'SnapController:getAll', 'SnapController:handleRequest', 'AccountsController:listMultichainAccounts', ], + messenger: controllerMessenger, }); + jest.spyOn(controllerMessenger, 'call'); + return controllerMessenger; }; @@ -985,19 +956,24 @@ export const getRestrictedWebSocketServiceMessenger = ( typeof getRootWebSocketServiceMessenger > = getRootWebSocketServiceMessenger(), ) => { - const controllerMessenger = messenger.getRestricted< + const controllerMessenger = new Messenger< 'WebSocketService', - WebSocketServiceAllowedActions['type'], - WebSocketServiceEvents['type'] - >({ - name: 'WebSocketService', - allowedEvents: [ + WebSocketServiceActions | WebSocketServiceAllowedActions, + WebSocketServiceEvents, + any + >({ namespace: 'WebSocketService', parent: messenger }); + + messenger.delegate({ + actions: ['SnapController:handleRequest'], + events: [ 'SnapController:snapInstalled', 'SnapController:snapUpdated', 'SnapController:snapUninstalled', ], - allowedActions: ['SnapController:handleRequest'], + messenger: controllerMessenger, }); + jest.spyOn(controllerMessenger, 'call'); + return controllerMessenger; }; diff --git a/packages/snaps-controllers/src/test-utils/execution-environment.ts b/packages/snaps-controllers/src/test-utils/execution-environment.ts index 51701a3306..f0126f179c 100644 --- a/packages/snaps-controllers/src/test-utils/execution-environment.ts +++ b/packages/snaps-controllers/src/test-utils/execution-environment.ts @@ -1,5 +1,6 @@ import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import { createEngineStream } from '@metamask/json-rpc-middleware-stream'; +import { Messenger } from '@metamask/messenger'; import { logError, type SnapRpcHookArgs } from '@metamask/snaps-utils'; import type { MockControllerMessenger } from '@metamask/snaps-utils/test-utils'; import { pipeline } from 'readable-stream'; @@ -19,21 +20,21 @@ export const getNodeEESMessenger = ( ExecutionServiceActions, ExecutionServiceEvents >, -) => - messenger.getRestricted({ - name: 'ExecutionService', - allowedEvents: [ - 'ExecutionService:unhandledError', - 'ExecutionService:outboundRequest', - 'ExecutionService:outboundResponse', - ], - allowedActions: [ - 'ExecutionService:executeSnap', - 'ExecutionService:handleRpcRequest', - 'ExecutionService:terminateAllSnaps', - 'ExecutionService:terminateSnap', - ], - }); +) => { + const executionServiceMessenger = new Messenger< + 'ExecutionService', + ExecutionServiceActions, + ExecutionServiceEvents, + any + >({ namespace: 'ExecutionService', parent: messenger }); + + messenger.unregisterActionHandler('ExecutionService:handleRpcRequest'); + messenger.unregisterActionHandler('ExecutionService:executeSnap'); + messenger.unregisterActionHandler('ExecutionService:terminateSnap'); + messenger.unregisterActionHandler('ExecutionService:terminateAllSnaps'); + + return executionServiceMessenger; +}; export const getNodeEES = ( messenger: ReturnType, @@ -64,6 +65,10 @@ export const getNodeEES = ( }); export class ExecutionEnvironmentStub implements ExecutionService { + name: 'ExecutionService' = 'ExecutionService' as const; + + state = null; + constructor(messenger: ReturnType) { messenger.registerActionHandler( `ExecutionService:handleRpcRequest`, diff --git a/packages/snaps-controllers/src/test-utils/multichain.ts b/packages/snaps-controllers/src/test-utils/multichain.ts index 695d66fd75..8fd6a147fc 100644 --- a/packages/snaps-controllers/src/test-utils/multichain.ts +++ b/packages/snaps-controllers/src/test-utils/multichain.ts @@ -4,6 +4,8 @@ import { SnapCaveatType } from '@metamask/snaps-utils'; import { MOCK_SNAP_ID } from '@metamask/snaps-utils/test-utils'; import type { CaipAccountId, CaipChainId, Json } from '@metamask/utils'; +import type { WithSnapKeyringFunction } from '../multichain'; + export const BTC_CAIP2 = 'bip122:000000000019d6689c085ae165831e93' as CaipChainId; export const BTC_CONNECTED_ACCOUNTS = [ @@ -28,6 +30,7 @@ export const MOCK_BTC_ACCOUNTS = [ methods: ['sendBitcoin'], options: { index: 0, scope: BTC_CAIP2 }, type: 'bip122:p2wpkh', + scopes: [], }, ]; @@ -55,6 +58,7 @@ export const MOCK_SOLANA_ACCOUNTS = [ methods: ['signAndSendTransaction'], options: { index: 0, scope: SOLANA_CAIP2 }, type: 'solana:data-account', + scopes: [], }, ]; @@ -99,14 +103,14 @@ type MockOperationCallback = ({ keyring, }: { keyring: MockSnapKeyring; -}) => Promise; +}) => Promise; export const getMockWithSnapKeyring = ( { submitRequest = jest.fn(), resolveAccountAddress = jest.fn() } = { submitRequest: jest.fn(), resolveAccountAddress: jest.fn(), }, -) => { +): WithSnapKeyringFunction => { return async (callback: MockOperationCallback) => callback({ keyring: { diff --git a/packages/snaps-controllers/src/test-utils/service.ts b/packages/snaps-controllers/src/test-utils/service.ts index a2f321d737..f324a2257e 100644 --- a/packages/snaps-controllers/src/test-utils/service.ts +++ b/packages/snaps-controllers/src/test-utils/service.ts @@ -1,6 +1,6 @@ -import { Messenger } from '@metamask/base-controller'; import { JsonRpcEngine } from '@metamask/json-rpc-engine'; import { createEngineStream } from '@metamask/json-rpc-middleware-stream'; +import { Messenger } from '@metamask/messenger'; import { logError } from '@metamask/snaps-utils'; import { pipeline } from 'readable-stream'; import type { Duplex } from 'readable-stream'; @@ -18,18 +18,12 @@ export const createService = < 'messenger' | 'setupSnapProvider' >, ) => { - const messenger = new Messenger(); - - const restrictedMessenger = messenger.getRestricted< - 'ExecutionService', - never, - ErrorMessageEvent['type'] - >({ - name: 'ExecutionService', - }); + const messenger = new Messenger<'ExecutionService', never, ErrorMessageEvent>( + { namespace: 'ExecutionService' }, + ); const service = new ServiceClass({ - messenger: restrictedMessenger, + messenger, setupSnapProvider: (_snapId: string, rpcStream: Duplex) => { const mux = setupMultiplex(rpcStream, 'foo'); const stream = mux.createStream('metamask-provider'); @@ -54,6 +48,6 @@ export const createService = < return { service, - messenger: restrictedMessenger, + messenger, }; }; diff --git a/packages/snaps-controllers/src/websocket/WebSocketService.test.ts b/packages/snaps-controllers/src/websocket/WebSocketService.test.ts index 3cfff491b0..6af27e29a3 100644 --- a/packages/snaps-controllers/src/websocket/WebSocketService.test.ts +++ b/packages/snaps-controllers/src/websocket/WebSocketService.test.ts @@ -18,9 +18,9 @@ const MOCK_WEBSOCKET_BROKEN_URI = 'wss://broken.metamask.io'; class MockWebSocket { readonly #origin: string; - #closeListener: EventListener; + #closeListener?: EventListener; - #messageListener: EventListener; + #messageListener?: EventListener; constructor(url: string) { this.#origin = new URL(url).origin; @@ -47,7 +47,7 @@ class MockWebSocket { send(data: string | Uint8Array) { if (data === 'Ping') { - this.#messageListener( + this.#messageListener?.( new MessageEvent('message', { origin: this.#origin, data: 'Pong' }), ); return; @@ -58,7 +58,7 @@ class MockWebSocket { isEqual(Array.from(data), Array.from(stringToBytes('Ping'))) ) { const bytes = stringToBytes('Pong'); - this.#messageListener( + this.#messageListener?.( new MessageEvent('message', { origin: this.#origin, data: bytes.buffer, @@ -73,7 +73,7 @@ class MockWebSocket { event.code = code; event.reason = reason; event.wasClean = wasClean; - this.#closeListener(event); + this.#closeListener?.(event); } close() { @@ -117,7 +117,7 @@ describe('WebSocketService', () => { 'Ping', ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(messenger.call).toHaveBeenNthCalledWith( 2, 'SnapController:handleRequest', { @@ -137,7 +137,7 @@ describe('WebSocketService', () => { }, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(messenger.call).toHaveBeenNthCalledWith( 4, 'SnapController:handleRequest', { @@ -192,7 +192,7 @@ describe('WebSocketService', () => { Array.from(stringToBytes('Ping')), ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(messenger.call).toHaveBeenNthCalledWith( 2, 'SnapController:handleRequest', { @@ -212,7 +212,7 @@ describe('WebSocketService', () => { }, ); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(messenger.call).toHaveBeenNthCalledWith( 4, 'SnapController:handleRequest', { @@ -327,7 +327,7 @@ describe('WebSocketService', () => { messenger.call('WebSocketService:getAll', MOCK_SNAP_ID), ).toHaveLength(0); - expect(rootMessenger.call).toHaveBeenNthCalledWith( + expect(messenger.call).toHaveBeenNthCalledWith( 5, 'SnapController:handleRequest', { diff --git a/packages/snaps-controllers/src/websocket/WebSocketService.ts b/packages/snaps-controllers/src/websocket/WebSocketService.ts index 3bc73239d5..15addd7c4f 100644 --- a/packages/snaps-controllers/src/websocket/WebSocketService.ts +++ b/packages/snaps-controllers/src/websocket/WebSocketService.ts @@ -1,4 +1,4 @@ -import type { RestrictedMessenger } from '@metamask/base-controller'; +import type { Messenger } from '@metamask/messenger'; import { rpcErrors } from '@metamask/rpc-errors'; import type { GetWebSocketsResult, @@ -60,12 +60,10 @@ export type WebSocketServiceEvents = | SnapUpdated | SnapInstalled; -export type WebSocketServiceMessenger = RestrictedMessenger< +export type WebSocketServiceMessenger = Messenger< 'WebSocketService', WebSocketServiceActions | WebSocketServiceAllowedActions, - WebSocketServiceEvents, - WebSocketServiceAllowedActions['type'], - WebSocketServiceEvents['type'] + WebSocketServiceEvents >; type WebSocketServiceArgs = { diff --git a/packages/snaps-jest/package.json b/packages/snaps-jest/package.json index 4e1329adf8..b5b51872e4 100644 --- a/packages/snaps-jest/package.json +++ b/packages/snaps-jest/package.json @@ -74,6 +74,7 @@ "@jest/types": "^29.6.3", "@lavamoat/allow-scripts": "^3.4.0", "@metamask/auto-changelog": "^5.0.2", + "@metamask/phishing-controller": "^13.1.0", "@metamask/snaps-utils": "workspace:^", "@swc/core": "1.11.31", "@swc/jest": "^0.2.38", diff --git a/packages/snaps-jest/src/test-utils/controller.ts b/packages/snaps-jest/src/test-utils/controller.ts index e32e5c5bf2..8a81a51feb 100644 --- a/packages/snaps-jest/src/test-utils/controller.ts +++ b/packages/snaps-jest/src/test-utils/controller.ts @@ -1,8 +1,7 @@ -import type { SnapInterfaceControllerAllowedActions } from '@metamask/snaps-controllers'; +import { PhishingDetectorResultType } from '@metamask/phishing-controller'; +import type { RootControllerAllowedActions } from '@metamask/snaps-simulation'; import { MockControllerMessenger } from '@metamask/snaps-utils/test-utils'; -import type { RootControllerAllowedActions } from '../internals/simulation/controllers'; - export const getRootControllerMessenger = (mocked = true) => { const messenger = new MockControllerMessenger< RootControllerAllowedActions, @@ -12,7 +11,7 @@ export const getRootControllerMessenger = (mocked = true) => { if (mocked) { messenger.registerActionHandler('PhishingController:testOrigin', () => ({ result: false, - type: 'all', + type: PhishingDetectorResultType.All, })); messenger.registerActionHandler( @@ -33,24 +32,3 @@ export const getRootControllerMessenger = (mocked = true) => { return messenger; }; - -export const getRestrictedSnapInterfaceControllerMessenger = ( - messenger: ReturnType< - typeof getRootControllerMessenger - > = getRootControllerMessenger(), -) => { - const snapInterfaceControllerMessenger = messenger.getRestricted< - 'SnapInterfaceController', - SnapInterfaceControllerAllowedActions['type'] - >({ - name: 'SnapInterfaceController', - allowedActions: [ - 'PhishingController:testOrigin', - 'ApprovalController:hasRequest', - 'ApprovalController:acceptRequest', - ], - allowedEvents: [], - }); - - return snapInterfaceControllerMessenger; -}; diff --git a/packages/snaps-rpc-methods/CHANGELOG.md b/packages/snaps-rpc-methods/CHANGELOG.md index 0fcf10498d..e391361fc3 100644 --- a/packages/snaps-rpc-methods/CHANGELOG.md +++ b/packages/snaps-rpc-methods/CHANGELOG.md @@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- **BREAKING**: `handleSnapInstall` now accepts a `messenger` parameter of type `Messenger` instead of a `messagingSystem` parameter of type `RestrictedMessenger` ([#3611](https://github.com/MetaMask/snaps/pull/3611)) +- **BREAKING**: `MockControllerMessenger` now extends `Messenger` from `@metamask/messenger` instead of from `@metamask/base-controller` ([#3611](https://github.com/MetaMask/snaps/pull/3611)) +- Bump `@metamask/permission-controller` from `^11.0.6` to `^12.0.0`(([#3611](https://github.com/MetaMask/snaps/pull/3611)) + +### Removed + +- Remove `@metamask/base-controller` dependency ([#3611](https://github.com/MetaMask/snaps/pull/3611)) + ## [13.5.3] ### Fixed diff --git a/packages/snaps-rpc-methods/package.json b/packages/snaps-rpc-methods/package.json index 2ed148aa85..67de0e7d3e 100644 --- a/packages/snaps-rpc-methods/package.json +++ b/packages/snaps-rpc-methods/package.json @@ -56,7 +56,7 @@ }, "dependencies": { "@metamask/key-tree": "^10.1.1", - "@metamask/permission-controller": "^11.0.6", + "@metamask/permission-controller": "^12.0.0", "@metamask/rpc-errors": "^7.0.3", "@metamask/snaps-sdk": "workspace:^", "@metamask/snaps-utils": "workspace:^", @@ -68,6 +68,7 @@ "@lavamoat/allow-scripts": "^3.4.0", "@metamask/auto-changelog": "^5.0.2", "@metamask/json-rpc-engine": "^10.1.0", + "@metamask/messenger": "^0.3.0", "@swc/core": "1.11.31", "@swc/jest": "^0.2.38", "@ts-bridge/cli": "^0.6.1", diff --git a/packages/snaps-rpc-methods/src/restricted/invokeSnap.test.ts b/packages/snaps-rpc-methods/src/restricted/invokeSnap.test.ts index 2e404008da..e36ebf07d5 100644 --- a/packages/snaps-rpc-methods/src/restricted/invokeSnap.test.ts +++ b/packages/snaps-rpc-methods/src/restricted/invokeSnap.test.ts @@ -1,3 +1,4 @@ +import { Messenger } from '@metamask/messenger'; import type { PermissionsRequest } from '@metamask/permission-controller'; import { PermissionType } from '@metamask/permission-controller'; import { SnapCaveatType } from '@metamask/snaps-utils'; @@ -116,9 +117,16 @@ describe('handleSnapInstall', () => { never >(); - const sideEffectMessenger = messenger.getRestricted({ - name: 'PermissionController', - allowedActions: ['SnapController:install', 'SnapController:getPermitted'], + const sideEffectMessenger = new Messenger< + 'PermissionController', + InstallSnaps | GetPermittedSnaps, + never, + any + >({ namespace: 'PermissionController', parent: messenger }); + + messenger.delegate({ + messenger: sideEffectMessenger, + actions: ['SnapController:install', 'SnapController:getPermitted'], }); const expectedResult = { @@ -154,7 +162,7 @@ describe('handleSnapInstall', () => { const result = await handleSnapInstall({ requestData, - messagingSystem: sideEffectMessenger, + messenger: sideEffectMessenger, }); expect(sideEffectMessenger.call).toHaveBeenCalledWith( @@ -172,9 +180,16 @@ describe('handleSnapInstall', () => { never >(); - const sideEffectMessenger = messenger.getRestricted({ - name: 'PermissionController', - allowedActions: ['SnapController:install', 'SnapController:getPermitted'], + const sideEffectMessenger = new Messenger< + 'PermissionController', + InstallSnaps | GetPermittedSnaps, + never, + any + >({ namespace: 'PermissionController', parent: messenger }); + + messenger.delegate({ + messenger: sideEffectMessenger, + actions: ['SnapController:install', 'SnapController:getPermitted'], }); const expectedResult = { @@ -213,7 +228,7 @@ describe('handleSnapInstall', () => { const result = await handleSnapInstall({ requestData, - messagingSystem: sideEffectMessenger, + messenger: sideEffectMessenger, }); expect(sideEffectMessenger.call).toHaveBeenCalledWith( diff --git a/packages/snaps-rpc-methods/src/restricted/invokeSnap.ts b/packages/snaps-rpc-methods/src/restricted/invokeSnap.ts index bffc491cd9..e69eb1926d 100644 --- a/packages/snaps-rpc-methods/src/restricted/invokeSnap.ts +++ b/packages/snaps-rpc-methods/src/restricted/invokeSnap.ts @@ -71,17 +71,17 @@ export type InvokeSnapParams = { * * @param params - The side-effect params. * @param params.requestData - The request data associated to the requested permission. - * @param params.messagingSystem - The messenger to call an action. + * @param params.messenger - The messenger to call an action. * @returns The result of the Snap installation. */ export const handleSnapInstall: PermissionSideEffect< AllowedActions, never ->['onPermitted'] = async ({ requestData, messagingSystem }) => { +>['onPermitted'] = async ({ requestData, messenger }) => { const snaps = requestData.permissions[WALLET_SNAP_PERMISSION_KEY].caveats?.[0] .value as RequestSnapsParams; - const permittedSnaps = messagingSystem.call( + const permittedSnaps = messenger.call( `SnapController:getPermitted`, requestData.metadata.origin, ); @@ -96,7 +96,7 @@ export const handleSnapInstall: PermissionSideEffect< {}, ); - return messagingSystem.call( + return messenger.call( `SnapController:install`, requestData.metadata.origin, dedupedSnaps, diff --git a/packages/snaps-simulation/CHANGELOG.md b/packages/snaps-simulation/CHANGELOG.md index 4437e0931c..9d525e69eb 100644 --- a/packages/snaps-simulation/CHANGELOG.md +++ b/packages/snaps-simulation/CHANGELOG.md @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Bump `@metamask/permission-controller` from `^11.0.6` to `^12.0.0`(([#3611](https://github.com/MetaMask/snaps/pull/3611)) + +### Removed + +- Remove `@metamask/base-controller` dependency ([#3611](https://github.com/MetaMask/snaps/pull/3611)) + ## [3.5.0] ### Added diff --git a/packages/snaps-simulation/package.json b/packages/snaps-simulation/package.json index e29add9ddf..1d5f92d69b 100644 --- a/packages/snaps-simulation/package.json +++ b/packages/snaps-simulation/package.json @@ -55,12 +55,12 @@ "test:watch": "jest --watch" }, "dependencies": { - "@metamask/base-controller": "^8.4.1", "@metamask/eth-json-rpc-middleware": "^17.0.1", "@metamask/json-rpc-engine": "^10.1.0", "@metamask/json-rpc-middleware-stream": "^8.0.8", "@metamask/key-tree": "^10.1.1", - "@metamask/permission-controller": "^11.0.6", + "@metamask/messenger": "^0.3.0", + "@metamask/permission-controller": "^12.0.0", "@metamask/phishing-controller": "^13.1.0", "@metamask/snaps-controllers": "workspace:^", "@metamask/snaps-execution-environments": "workspace:^", diff --git a/packages/snaps-simulation/src/controllers.test.ts b/packages/snaps-simulation/src/controllers.test.ts index 836a57d86b..431baf15cf 100644 --- a/packages/snaps-simulation/src/controllers.test.ts +++ b/packages/snaps-simulation/src/controllers.test.ts @@ -1,4 +1,4 @@ -import { Messenger } from '@metamask/base-controller'; +import { Messenger } from '@metamask/messenger'; import { PermissionController, SubjectMetadataController, @@ -21,7 +21,7 @@ const MOCK_HOOKS: RestrictedMiddlewareHooks = { describe('getControllers', () => { it('returns the controllers', () => { const { permissionController, subjectMetadataController } = getControllers({ - controllerMessenger: new Messenger(), + controllerMessenger: new Messenger({ namespace: 'Root' }), hooks: MOCK_HOOKS, runSaga: jest.fn(), options: getMockOptions(), diff --git a/packages/snaps-simulation/src/controllers.ts b/packages/snaps-simulation/src/controllers.ts index 3f3f56201d..9d841beae0 100644 --- a/packages/snaps-simulation/src/controllers.ts +++ b/packages/snaps-simulation/src/controllers.ts @@ -1,4 +1,4 @@ -import type { Messenger } from '@metamask/base-controller'; +import { Messenger } from '@metamask/messenger'; import type { CaveatSpecificationConstraint, PermissionSpecificationConstraint, @@ -43,12 +43,13 @@ export type RootControllerAllowedEvents = SnapInterfaceControllerStateChangeEvent; export type RootControllerMessenger = Messenger< + any, RootControllerAllowedActions, RootControllerAllowedEvents >; export type GetControllersOptions = { - controllerMessenger: Messenger; + controllerMessenger: Messenger; hooks: RestrictedMiddlewareHooks; runSaga: RunSagaFunction; options: SimulationOptions; @@ -72,30 +73,34 @@ export type Controllers = { export function getControllers(options: GetControllersOptions): Controllers { const { controllerMessenger } = options; const subjectMetadataController = new SubjectMetadataController({ - messenger: controllerMessenger.getRestricted({ - name: 'SubjectMetadataController', - allowedActions: [], - allowedEvents: [], + messenger: new Messenger({ + namespace: 'SubjectMetadataController', + parent: controllerMessenger, }), subjectCacheLimit: 100, }); + const interfaceControllerMessenger = new Messenger({ + namespace: 'SnapInterfaceController', + parent: controllerMessenger, + }); + + controllerMessenger.delegate({ + messenger: interfaceControllerMessenger, + actions: [ + 'PhishingController:testOrigin', + 'ApprovalController:hasRequest', + 'ApprovalController:acceptRequest', + 'AccountsController:getAccountByAddress', + 'AccountsController:getSelectedMultichainAccount', + 'AccountsController:listMultichainAccounts', + 'MultichainAssetsController:getState', + ], + events: ['NotificationServicesController:notificationsListUpdated'], + }); + const interfaceController = new SnapInterfaceController({ - messenger: controllerMessenger.getRestricted({ - name: 'SnapInterfaceController', - allowedActions: [ - 'PhishingController:testOrigin', - 'ApprovalController:hasRequest', - 'ApprovalController:acceptRequest', - 'AccountsController:getAccountByAddress', - 'AccountsController:getSelectedMultichainAccount', - 'AccountsController:listMultichainAccounts', - 'MultichainAssetsController:getState', - ], - allowedEvents: [ - 'NotificationServicesController:notificationsListUpdated', - ], - }), + messenger: interfaceControllerMessenger, }); const permissionController = getPermissionController(options); @@ -118,20 +123,26 @@ export function getControllers(options: GetControllersOptions): Controllers { function getPermissionController(options: GetControllersOptions) { const { controllerMessenger } = options; const permissionSpecifications = getPermissionSpecifications(options); + const messenger = new Messenger({ + namespace: 'PermissionController', + parent: controllerMessenger, + }); + + controllerMessenger.delegate({ + messenger, + actions: [ + `ApprovalController:addRequest`, + `ApprovalController:hasRequest`, + `ApprovalController:acceptRequest`, + `ApprovalController:rejectRequest`, + `SnapController:getPermitted`, + `SnapController:install`, + `SubjectMetadataController:getSubjectMetadata`, + ], + }); + return new PermissionController({ - messenger: controllerMessenger.getRestricted({ - name: 'PermissionController', - allowedActions: [ - `ApprovalController:addRequest`, - `ApprovalController:hasRequest`, - `ApprovalController:acceptRequest`, - `ApprovalController:rejectRequest`, - `SnapController:getPermitted`, - `SnapController:install`, - `SubjectMetadataController:getSubjectMetadata`, - ], - allowedEvents: [], - }), + messenger, caveatSpecifications: { ...snapsCaveatsSpecifications, ...snapsEndowmentCaveatSpecifications, diff --git a/packages/snaps-simulation/src/methods/specifications.test.ts b/packages/snaps-simulation/src/methods/specifications.test.ts index e04839afe9..8881eab17a 100644 --- a/packages/snaps-simulation/src/methods/specifications.test.ts +++ b/packages/snaps-simulation/src/methods/specifications.test.ts @@ -1,4 +1,5 @@ -import { Messenger } from '@metamask/base-controller'; +import type { MockAnyNamespace } from '@metamask/messenger'; +import { MOCK_ANY_NAMESPACE, Messenger } from '@metamask/messenger'; import { getSnapManifest, MOCK_SNAP_ID, @@ -15,13 +16,10 @@ import type { RestrictedMiddlewareHooks } from '../simulation'; import { getMockOptions } from '../test-utils/options'; const MOCK_HOOKS: RestrictedMiddlewareHooks = { + getClientCryptography: jest.fn(), getMnemonic: jest.fn(), - getSnapFile: jest.fn(), - createInterface: jest.fn(), - updateInterface: jest.fn(), - getInterfaceState: jest.fn(), + getMnemonicSeed: jest.fn(), getIsLocked: jest.fn(), - resolveInterface: jest.fn(), }; describe('resolve', () => { @@ -45,7 +43,9 @@ describe('getPermissionSpecifications', () => { hooks: MOCK_HOOKS, runSaga: jest.fn(), options: getMockOptions(), - controllerMessenger: new Messenger(), + controllerMessenger: new Messenger({ + namespace: MOCK_ANY_NAMESPACE, + }), }), ).toMatchInlineSnapshot(` { @@ -324,7 +324,9 @@ describe('getPermissionSpecifications', () => { describe('getEndowments', () => { it('returns the endowments', async () => { const controllers = getControllers({ - controllerMessenger: new Messenger(), + controllerMessenger: new Messenger({ + namespace: MOCK_ANY_NAMESPACE, + }), hooks: MOCK_HOOKS, runSaga: jest.fn(), options: getMockOptions(), diff --git a/packages/snaps-simulation/src/simulation.test.ts b/packages/snaps-simulation/src/simulation.test.ts index 162a320465..b263416c74 100644 --- a/packages/snaps-simulation/src/simulation.test.ts +++ b/packages/snaps-simulation/src/simulation.test.ts @@ -236,7 +236,11 @@ describe('getRestrictedHooks', () => { describe('getPermittedHooks', () => { const { runSaga, store } = createStore(getMockOptions()); - const controllerMessenger = getRootControllerMessenger(); + let controllerMessenger = getRootControllerMessenger(); + + beforeEach(() => { + controllerMessenger = getRootControllerMessenger(); + }); it('returns the `hasPermission` hook', async () => { const { snapId, close } = await getMockServer({ diff --git a/packages/snaps-simulation/src/simulation.ts b/packages/snaps-simulation/src/simulation.ts index 98539ddd07..e6e49328dd 100644 --- a/packages/snaps-simulation/src/simulation.ts +++ b/packages/snaps-simulation/src/simulation.ts @@ -1,10 +1,12 @@ +import { createEngineStream } from '@metamask/json-rpc-middleware-stream'; +import type { CryptographicFunctions } from '@metamask/key-tree'; import type { ActionConstraint, EventConstraint, -} from '@metamask/base-controller'; -import { Messenger } from '@metamask/base-controller'; -import { createEngineStream } from '@metamask/json-rpc-middleware-stream'; -import type { CryptographicFunctions } from '@metamask/key-tree'; + MockAnyNamespace, + NamespacedName, +} from '@metamask/messenger'; +import { MOCK_ANY_NAMESPACE, Messenger } from '@metamask/messenger'; import { PhishingDetectorResultType } from '@metamask/phishing-controller'; import type { AbstractExecutionService } from '@metamask/snaps-controllers'; import { @@ -106,7 +108,11 @@ export type InstalledSnap = { snapId: SnapId; store: Store; executionService: InstanceType; - controllerMessenger: Messenger; + controllerMessenger: Messenger< + NamespacedName, + ActionConstraint, + EventConstraint + >; runSaga: RunSagaFunction; }; @@ -353,7 +359,9 @@ export async function installSnap< // Create Redux store. const { store, runSaga } = createStore(options); - const controllerMessenger = new Messenger(); + const controllerMessenger = new Messenger({ + namespace: MOCK_ANY_NAMESPACE, + }); registerActions(controllerMessenger, runSaga, options, snapId); @@ -386,10 +394,9 @@ export async function installSnap< const ExecutionService = executionService ?? NodeThreadExecutionService; const service = new ExecutionService({ ...executionServiceOptions, - messenger: controllerMessenger.getRestricted({ - name: 'ExecutionService', - allowedActions: [], - allowedEvents: [], + messenger: new Messenger({ + namespace: 'ExecutionService', + parent: controllerMessenger, }), setupSnapProvider: (_snapId: string, rpcStream: Duplex) => { const mux = setupMultiplex(rpcStream, 'snapStream'); diff --git a/packages/snaps-simulation/src/test-utils/controller.ts b/packages/snaps-simulation/src/test-utils/controller.ts index e08224d57e..f32660f033 100644 --- a/packages/snaps-simulation/src/test-utils/controller.ts +++ b/packages/snaps-simulation/src/test-utils/controller.ts @@ -1,8 +1,6 @@ +import { Messenger } from '@metamask/messenger'; import { PhishingDetectorResultType } from '@metamask/phishing-controller'; -import type { - SnapInterfaceControllerAllowedActions, - SnapInterfaceControllerEvents, -} from '@metamask/snaps-controllers'; +import type { SnapInterfaceControllerAllowedActions } from '@metamask/snaps-controllers'; import { MockControllerMessenger } from '@metamask/snaps-utils/test-utils'; import type { RootControllerAllowedActions } from '../controllers'; @@ -43,13 +41,19 @@ export const getRestrictedSnapInterfaceControllerMessenger = ( typeof getRootControllerMessenger > = getRootControllerMessenger(), ) => { - const snapInterfaceControllerMessenger = messenger.getRestricted< + const controllerMessenger = new Messenger< 'SnapInterfaceController', - SnapInterfaceControllerAllowedActions['type'], - SnapInterfaceControllerEvents['type'] + SnapInterfaceControllerAllowedActions, + never, + any >({ - name: 'SnapInterfaceController', - allowedActions: [ + namespace: 'SnapInterfaceController', + parent: messenger, + }); + + messenger.delegate({ + messenger: controllerMessenger, + actions: [ 'PhishingController:testOrigin', 'ApprovalController:hasRequest', 'ApprovalController:acceptRequest', @@ -58,8 +62,8 @@ export const getRestrictedSnapInterfaceControllerMessenger = ( 'AccountsController:listMultichainAccounts', 'MultichainAssetsController:getState', ], - allowedEvents: ['NotificationServicesController:notificationsListUpdated'], + events: ['NotificationServicesController:notificationsListUpdated'], }); - return snapInterfaceControllerMessenger; + return controllerMessenger; }; diff --git a/packages/snaps-utils/CHANGELOG.md b/packages/snaps-utils/CHANGELOG.md index 28fdf5c2f4..99997595be 100644 --- a/packages/snaps-utils/CHANGELOG.md +++ b/packages/snaps-utils/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Bump `@metamask/permission-controller` from `^11.0.6` to `^12.0.0`(([#3611](https://github.com/MetaMask/snaps/pull/3611)) + ## [11.6.0] ### Added diff --git a/packages/snaps-utils/package.json b/packages/snaps-utils/package.json index 756198a7d2..22213ebb5a 100644 --- a/packages/snaps-utils/package.json +++ b/packages/snaps-utils/package.json @@ -80,9 +80,9 @@ "dependencies": { "@babel/core": "^7.23.2", "@babel/types": "^7.23.0", - "@metamask/base-controller": "^8.4.1", "@metamask/key-tree": "^10.1.1", - "@metamask/permission-controller": "^11.0.6", + "@metamask/messenger": "^0.3.0", + "@metamask/permission-controller": "^12.0.0", "@metamask/rpc-errors": "^7.0.3", "@metamask/slip44": "^4.3.0", "@metamask/snaps-registry": "^3.2.3", diff --git a/packages/snaps-utils/src/test-utils/controller.ts b/packages/snaps-utils/src/test-utils/controller.ts index 16ac821e38..c917fd921b 100644 --- a/packages/snaps-utils/src/test-utils/controller.ts +++ b/packages/snaps-utils/src/test-utils/controller.ts @@ -2,13 +2,18 @@ import type { ActionConstraint, ActionHandler, EventConstraint, -} from '@metamask/base-controller'; -import { Messenger } from '@metamask/base-controller'; + MockAnyNamespace, +} from '@metamask/messenger'; +import { MOCK_ANY_NAMESPACE, Messenger } from '@metamask/messenger'; export class MockControllerMessenger< Action extends ActionConstraint, Event extends EventConstraint, -> extends Messenger { +> extends Messenger { + constructor() { + super({ namespace: MOCK_ANY_NAMESPACE }); + } + /** * Registers an action handler for the given action type. If an action handler * already exists for the given action type, it will be overwritten. diff --git a/yarn.lock b/yarn.lock index 8e601caaf6..1d3a47f034 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2815,15 +2815,16 @@ __metadata: languageName: node linkType: hard -"@metamask/approval-controller@npm:^7.2.0": - version: 7.2.0 - resolution: "@metamask/approval-controller@npm:7.2.0" +"@metamask/approval-controller@npm:^8.0.0": + version: 8.0.0 + resolution: "@metamask/approval-controller@npm:8.0.0" dependencies: - "@metamask/base-controller": "npm:^8.4.1" + "@metamask/base-controller": "npm:^9.0.0" + "@metamask/messenger": "npm:^0.3.0" "@metamask/rpc-errors": "npm:^7.0.2" "@metamask/utils": "npm:^11.8.1" nanoid: "npm:^3.3.8" - checksum: 10/717d0b6dee37b4ea0eaf4cc81840599a8e9466bdef9d29a2040379e9a346403c49dc27b749fdc66d48e7c24e762b7b36d9942ec78f2a38712d16001b37797a71 + checksum: 10/356fa411f2b077a31ea7565ffafaa4ecd68100ed93c26027ef4c30c55f7bf49a9f76a819bee05925756b0d4890d01a0ea0983b3b57bab3bf5b9ec2336f1a40e9 languageName: node linkType: hard @@ -2884,7 +2885,7 @@ __metadata: languageName: unknown linkType: soft -"@metamask/base-controller@npm:^8.0.0, @metamask/base-controller@npm:^8.0.1, @metamask/base-controller@npm:^8.4.1": +"@metamask/base-controller@npm:^8.0.1": version: 8.4.1 resolution: "@metamask/base-controller@npm:8.4.1" dependencies: @@ -2895,6 +2896,17 @@ __metadata: languageName: node linkType: hard +"@metamask/base-controller@npm:^9.0.0": + version: 9.0.0 + resolution: "@metamask/base-controller@npm:9.0.0" + dependencies: + "@metamask/messenger": "npm:^0.3.0" + "@metamask/utils": "npm:^11.8.1" + immer: "npm:^9.0.6" + checksum: 10/27554d34ec85c4b585b87850c90dfeaaf9c7e6430f2ab2fa80a1ec06ccc17641e118afab7ad765a0b7255ffef37bc9f6ca5065d459228a2dc660bc463293310d + languageName: node + linkType: hard + "@metamask/bip32-example-snap@workspace:^, @metamask/bip32-example-snap@workspace:packages/examples/packages/bip32": version: 0.0.0-use.local resolution: "@metamask/bip32-example-snap@workspace:packages/examples/packages/bip32" @@ -3012,7 +3024,7 @@ __metadata: languageName: unknown linkType: soft -"@metamask/controller-utils@npm:^11.11.0, @metamask/controller-utils@npm:^11.5.0": +"@metamask/controller-utils@npm:^11.11.0, @metamask/controller-utils@npm:^11.14.1": version: 11.14.1 resolution: "@metamask/controller-utils@npm:11.14.1" dependencies: @@ -3905,22 +3917,23 @@ __metadata: languageName: node linkType: hard -"@metamask/permission-controller@npm:^11.0.6": - version: 11.0.6 - resolution: "@metamask/permission-controller@npm:11.0.6" +"@metamask/permission-controller@npm:^12.0.0": + version: 12.0.0 + resolution: "@metamask/permission-controller@npm:12.0.0" dependencies: - "@metamask/base-controller": "npm:^8.0.0" - "@metamask/controller-utils": "npm:^11.5.0" - "@metamask/json-rpc-engine": "npm:^10.0.3" + "@metamask/base-controller": "npm:^9.0.0" + "@metamask/controller-utils": "npm:^11.14.1" + "@metamask/json-rpc-engine": "npm:^10.1.1" + "@metamask/messenger": "npm:^0.3.0" "@metamask/rpc-errors": "npm:^7.0.2" - "@metamask/utils": "npm:^11.1.0" + "@metamask/utils": "npm:^11.8.1" "@types/deep-freeze-strict": "npm:^1.1.0" deep-freeze-strict: "npm:^1.1.1" immer: "npm:^9.0.6" nanoid: "npm:^3.3.8" peerDependencies: - "@metamask/approval-controller": ^7.0.0 - checksum: 10/d1497033738a2c4d84cf5d884e4eea65593d08539cc0592429db101852d11c46fd9a0a7ae1649daee2f01148a15bcdfda77ce4e300a3a9e2c7955dcca6142f9f + "@metamask/approval-controller": ^8.0.0 + checksum: 10/81ac553db8ab90d23161c5268d37728a0d0b263480dd9050a94efb64d3d317f00b8c00254b529ead823723c9eb7ae4efd3374da58440d4632411860753e1c94a languageName: node linkType: hard @@ -4243,15 +4256,16 @@ __metadata: resolution: "@metamask/snaps-controllers@workspace:packages/snaps-controllers" dependencies: "@lavamoat/allow-scripts": "npm:^3.4.0" - "@metamask/approval-controller": "npm:^7.2.0" + "@metamask/approval-controller": "npm:^8.0.0" "@metamask/auto-changelog": "npm:^5.0.2" - "@metamask/base-controller": "npm:^8.4.1" + "@metamask/base-controller": "npm:^9.0.0" "@metamask/browser-passworder": "npm:^6.0.0" "@metamask/json-rpc-engine": "npm:^10.1.0" "@metamask/json-rpc-middleware-stream": "npm:^8.0.8" "@metamask/key-tree": "npm:^10.1.1" + "@metamask/messenger": "npm:^0.3.0" "@metamask/object-multiplex": "npm:^2.1.0" - "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/permission-controller": "npm:^12.0.0" "@metamask/phishing-controller": "npm:^13.1.0" "@metamask/post-message-stream": "npm:^10.0.0" "@metamask/rpc-errors": "npm:^7.0.3" @@ -4379,6 +4393,7 @@ __metadata: "@jest/types": "npm:^29.6.3" "@lavamoat/allow-scripts": "npm:^3.4.0" "@metamask/auto-changelog": "npm:^5.0.2" + "@metamask/phishing-controller": "npm:^13.1.0" "@metamask/snaps-controllers": "workspace:^" "@metamask/snaps-sdk": "workspace:^" "@metamask/snaps-simulation": "workspace:^" @@ -4450,7 +4465,8 @@ __metadata: "@metamask/auto-changelog": "npm:^5.0.2" "@metamask/json-rpc-engine": "npm:^10.1.0" "@metamask/key-tree": "npm:^10.1.1" - "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/messenger": "npm:^0.3.0" + "@metamask/permission-controller": "npm:^12.0.0" "@metamask/rpc-errors": "npm:^7.0.3" "@metamask/snaps-sdk": "workspace:^" "@metamask/snaps-utils": "workspace:^" @@ -4538,12 +4554,12 @@ __metadata: dependencies: "@lavamoat/allow-scripts": "npm:^3.4.0" "@metamask/auto-changelog": "npm:^5.0.2" - "@metamask/base-controller": "npm:^8.4.1" "@metamask/eth-json-rpc-middleware": "npm:^17.0.1" "@metamask/json-rpc-engine": "npm:^10.1.0" "@metamask/json-rpc-middleware-stream": "npm:^8.0.8" "@metamask/key-tree": "npm:^10.1.1" - "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/messenger": "npm:^0.3.0" + "@metamask/permission-controller": "npm:^12.0.0" "@metamask/phishing-controller": "npm:^13.1.0" "@metamask/snaps-controllers": "workspace:^" "@metamask/snaps-execution-environments": "workspace:^" @@ -4584,9 +4600,9 @@ __metadata: "@babel/types": "npm:^7.23.0" "@lavamoat/allow-scripts": "npm:^3.4.0" "@metamask/auto-changelog": "npm:^5.0.2" - "@metamask/base-controller": "npm:^8.4.1" "@metamask/key-tree": "npm:^10.1.1" - "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/messenger": "npm:^0.3.0" + "@metamask/permission-controller": "npm:^12.0.0" "@metamask/post-message-stream": "npm:^10.0.0" "@metamask/rpc-errors": "npm:^7.0.3" "@metamask/slip44": "npm:^4.3.0"