Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
5c69e3d
refactor: migrate `ApprovalController` to `@metamask/messenger`
mikesposito Aug 26, 2025
65c4c78
update changelog
mikesposito Aug 26, 2025
0549ba0
refactor: migrate `TransactionController` to `@metamask/messenger`
mikesposito Aug 27, 2025
4941db5
refactor: migrate `NetworkController` to `@metamask/messenger`
mikesposito Aug 28, 2025
e5bf8bd
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Aug 28, 2025
373c5c4
migrate `TransactionControllerIntegration.test.ts`
mikesposito Aug 28, 2025
38eb76d
update changelogs
mikesposito Aug 28, 2025
5f3e1f3
fix lint
mikesposito Aug 28, 2025
6210cf2
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Sep 3, 2025
f482a84
refactor: migrate `gas-fee-controller` to `@metamask/messenger`
mikesposito Sep 3, 2025
b176039
migrate `NftController` messenger
mikesposito Sep 3, 2025
01cd576
migrate `TokensController` messenger
mikesposito Sep 3, 2025
b72884f
migrate `AssetsContractController` messenger
mikesposito Sep 3, 2025
31c7ee0
update changelogs
mikesposito Sep 3, 2025
5bd5f52
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Sep 3, 2025
1051a2e
fix `NetworkController` tests
mikesposito Sep 3, 2025
eeade8f
update eslint thresholds
mikesposito Sep 3, 2025
ef59e6f
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Sep 23, 2025
0267ab2
rename `anonymous` to `inclueInDebugSnapshot`
mikesposito Sep 23, 2025
d899417
update tsconfig and README
mikesposito Sep 23, 2025
b2a2585
refactor: use `MockAnyNetwork`
mikesposito Sep 23, 2025
f786d7b
update messenger to 0.3.0
mikesposito Sep 23, 2025
c07c63d
fix `NftController` lint
mikesposito Sep 23, 2025
cf380bd
fix changelogs
mikesposito Sep 23, 2025
d8541b3
add entry to gas-fee-controller changelog
mikesposito Sep 23, 2025
69a0891
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Sep 23, 2025
86f184c
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Sep 23, 2025
ab37030
apply @mcmire suggestions
mikesposito Oct 13, 2025
d948037
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 13, 2025
836d1c7
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 15, 2025
79acaff
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 20, 2025
c5534c1
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 20, 2025
5cfd256
lint: import `MockAnyNamespace` as type
mikesposito Oct 21, 2025
79578d7
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 21, 2025
3983931
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 23, 2025
0e9ca2d
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 24, 2025
a5be219
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 24, 2025
4881477
rename `messagingSystem` to `messenger`
mikesposito Oct 24, 2025
4e2a9ea
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 24, 2025
cf3638e
Update messagingSystem references to messenger
Gudahtt Oct 24, 2025
998ffb9
Update changelogs following branch update
Gudahtt Oct 24, 2025
97d658b
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 27, 2025
c2dee6e
Merge branch 'main' into mikesposito/messenger/approval-controller
mikesposito Oct 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,10 @@ linkStyle default opacity:0.5
app_metadata_controller --> base_controller;
app_metadata_controller --> messenger;
approval_controller --> base_controller;
approval_controller --> messenger;
assets_controllers --> base_controller;
assets_controllers --> controller_utils;
assets_controllers --> messenger;
assets_controllers --> polling_controller;
assets_controllers --> account_tree_controller;
assets_controllers --> accounts_controller;
Expand Down Expand Up @@ -275,6 +277,7 @@ linkStyle default opacity:0.5
network_controller --> eth_json_rpc_middleware;
network_controller --> eth_json_rpc_provider;
network_controller --> json_rpc_engine;
network_controller --> messenger;
network_controller --> error_reporting_service;
network_enablement_controller --> base_controller;
network_enablement_controller --> controller_utils;
Expand Down Expand Up @@ -333,6 +336,7 @@ linkStyle default opacity:0.5
token_search_discovery_controller --> base_controller;
transaction_controller --> base_controller;
transaction_controller --> controller_utils;
transaction_controller --> messenger;
transaction_controller --> accounts_controller;
transaction_controller --> approval_controller;
transaction_controller --> eth_block_tracker;
Expand Down
2 changes: 1 addition & 1 deletion eslint-warning-thresholds.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
},
"packages/assets-controllers/src/TokensController.test.ts": {
"import-x/namespace": 1,
"import-x/order": 4,
"import-x/order": 3,
"jest/no-conditional-in-test": 2
},
"packages/assets-controllers/src/TokensController.ts": {
Expand Down
5 changes: 5 additions & 0 deletions packages/approval-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed

- **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#6386](https://github.com/MetaMask/core/pull/6386))
- Previously, `ApprovalController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`.

## [7.2.1]

### Changed
Expand Down
1 change: 1 addition & 0 deletions packages/approval-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
},
"dependencies": {
"@metamask/base-controller": "^8.4.2",
"@metamask/messenger": "^0.3.0",
"@metamask/rpc-errors": "^7.0.2",
"@metamask/utils": "^11.8.1",
"nanoid": "^3.3.8"
Expand Down
102 changes: 52 additions & 50 deletions packages/approval-controller/src/ApprovalController.test.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
/* eslint-disable jest/expect-expect */

import { deriveStateFromMetadata, Messenger } from '@metamask/base-controller';
import { deriveStateFromMetadata } from '@metamask/base-controller/next';
import {
MOCK_ANY_NAMESPACE,
Messenger,
type MessengerActions,
type MessengerEvents,
type MockAnyNamespace,
} from '@metamask/messenger';
import { errorCodes, JsonRpcError } from '@metamask/rpc-errors';
import { nanoid } from 'nanoid';

import { flushPromises } from '../../../tests/helpers';

Check warning on line 14 in packages/approval-controller/src/ApprovalController.test.ts

View workflow job for this annotation

GitHub Actions / Lint, build, and test / Lint (22.x)

`../../../tests/helpers` import should occur after import of `./errors`
import type {
AddApprovalOptions,
ApprovalControllerActions,
ApprovalControllerEvents,
ApprovalControllerMessenger,
ErrorOptions,
StartFlowOptions,
SuccessOptions,
Expand All @@ -28,6 +36,12 @@

jest.mock('nanoid');

type AllActions = MessengerActions<ApprovalControllerMessenger>;

type AllEvents = MessengerEvents<ApprovalControllerMessenger>;

type RootMessenger = Messenger<MockAnyNamespace, AllActions, AllEvents>;

const nanoidMock = jest.mocked(nanoid);

const PENDING_APPROVALS_STORE_KEY = 'pendingApprovals';
Expand Down Expand Up @@ -223,20 +237,26 @@
}

/**
* Constructs a restricted messenger.
* Constructs a controller messenger.
*
* @returns A restricted messenger.
* @returns A controller messenger.
*/
function getRestrictedMessenger() {
const messenger = new Messenger<
ApprovalControllerActions,
ApprovalControllerEvents
>();
return messenger.getRestricted({
name: 'ApprovalController',
allowedActions: [],
allowedEvents: [],
function getMessengers() {
const rootMessenger: RootMessenger = new Messenger({
namespace: MOCK_ANY_NAMESPACE,
});
return {
rootMessenger,
approvalControllerMessenger: new Messenger<
typeof controllerName,
ApprovalControllerActions,
ApprovalControllerEvents,
typeof rootMessenger
>({
namespace: controllerName,
parent: rootMessenger,
}),
};
}

describe('approval controller', () => {
Expand All @@ -250,7 +270,7 @@
showApprovalRequest = jest.fn();

approvalController = new ApprovalController({
messenger: getRestrictedMessenger(),
messenger: getMessengers().approvalControllerMessenger,
showApprovalRequest,
});
});
Expand Down Expand Up @@ -353,7 +373,7 @@
const id = Object.keys(
approvalController.state[PENDING_APPROVALS_STORE_KEY],
)[0];
expect(id && typeof id === 'string').toBe(true);

Check warning on line 376 in packages/approval-controller/src/ApprovalController.test.ts

View workflow job for this annotation

GitHub Actions / Lint, build, and test / Lint (22.x)

Avoid having conditionals in tests
});

it('adds correctly specified entry with request data', () => {
Expand Down Expand Up @@ -404,12 +424,12 @@
).not.toThrow();

expect(
approvalController.has({ id: 'foo1' }) &&

Check warning on line 427 in packages/approval-controller/src/ApprovalController.test.ts

View workflow job for this annotation

GitHub Actions / Lint, build, and test / Lint (22.x)

Avoid having conditionals in tests
approvalController.has({ id: 'foo2' }),
).toBe(true);

expect(
approvalController.has({ origin: ORIGIN }) &&

Check warning on line 432 in packages/approval-controller/src/ApprovalController.test.ts

View workflow job for this annotation

GitHub Actions / Lint, build, and test / Lint (22.x)

Avoid having conditionals in tests

Check warning on line 432 in packages/approval-controller/src/ApprovalController.test.ts

View workflow job for this annotation

GitHub Actions / Lint, build, and test / Lint (22.x)

Avoid having conditionals in tests
approvalController.has({ origin: ORIGIN, type: 'myType1' }) &&
approvalController.has({ origin: ORIGIN, type: 'myType2' }),
).toBe(true);
Expand Down Expand Up @@ -445,7 +465,7 @@

it('does not throw on origin and type collision if type excluded', () => {
approvalController = new ApprovalController({
messenger: getRestrictedMessenger(),
messenger: getMessengers().approvalControllerMessenger,
showApprovalRequest,
typesExcludedFromRateLimiting: ['myType'],
});
Expand Down Expand Up @@ -638,7 +658,7 @@

it('gets the count when specifying origin and type with type excluded from rate limiting', () => {
approvalController = new ApprovalController({
messenger: getRestrictedMessenger(),
messenger: getMessengers().approvalControllerMessenger,
showApprovalRequest,
typesExcludedFromRateLimiting: [TYPE],
});
Expand Down Expand Up @@ -678,7 +698,7 @@

it('gets the total approval count with type excluded from rate limiting', () => {
approvalController = new ApprovalController({
messenger: getRestrictedMessenger(),
messenger: getMessengers().approvalControllerMessenger,
showApprovalRequest,
typesExcludedFromRateLimiting: ['type0'],
});
Expand Down Expand Up @@ -946,7 +966,7 @@
approvalController.accept('foo');

expect(
!approvalController.has({ id: 'foo' }) &&

Check warning on line 969 in packages/approval-controller/src/ApprovalController.test.ts

View workflow job for this annotation

GitHub Actions / Lint, build, and test / Lint (22.x)

Avoid having conditionals in tests

Check warning on line 969 in packages/approval-controller/src/ApprovalController.test.ts

View workflow job for this annotation

GitHub Actions / Lint, build, and test / Lint (22.x)

Avoid having conditionals in tests

Check warning on line 969 in packages/approval-controller/src/ApprovalController.test.ts

View workflow job for this annotation

GitHub Actions / Lint, build, and test / Lint (22.x)

Avoid having conditionals in tests
!approvalController.has({ type: 'type' }) &&
!approvalController.has({ origin: 'bar.baz' }) &&
!approvalController.state[PENDING_APPROVALS_STORE_KEY].foo,
Expand All @@ -966,7 +986,7 @@
approvalController.accept('fizz');

expect(
!approvalController.has({ id: 'fizz' }) &&

Check warning on line 989 in packages/approval-controller/src/ApprovalController.test.ts

View workflow job for this annotation

GitHub Actions / Lint, build, and test / Lint (22.x)

Avoid having conditionals in tests
!approvalController.has({ origin: 'bar.baz', type: 'type2' }),
).toBe(true);

Expand Down Expand Up @@ -1269,23 +1289,16 @@

describe('actions', () => {
it('addApprovalRequest: shouldShowRequest = true', async () => {
const messenger = new Messenger<
ApprovalControllerActions,
ApprovalControllerEvents
>();
const { rootMessenger, approvalControllerMessenger } = getMessengers();

approvalController = new ApprovalController({
messenger: messenger.getRestricted({
name: controllerName,
allowedActions: [],
allowedEvents: [],
}),
messenger: approvalControllerMessenger,
showApprovalRequest,
});

// TODO: Either fix this lint violation or explain why it's necessary to ignore.
// eslint-disable-next-line @typescript-eslint/no-floating-promises
messenger.call(
rootMessenger.call(
'ApprovalController:addRequest',
{ id: 'foo', origin: 'bar.baz', type: TYPE },
true,
Expand All @@ -1295,23 +1308,16 @@
});

it('addApprovalRequest: shouldShowRequest = false', async () => {
const messenger = new Messenger<
ApprovalControllerActions,
ApprovalControllerEvents
>();
const { rootMessenger, approvalControllerMessenger } = getMessengers();

approvalController = new ApprovalController({
messenger: messenger.getRestricted({
name: controllerName,
allowedActions: [],
allowedEvents: [],
}),
messenger: approvalControllerMessenger,
showApprovalRequest,
});

// TODO: Either fix this lint violation or explain why it's necessary to ignore.
// eslint-disable-next-line @typescript-eslint/no-floating-promises
messenger.call(
rootMessenger.call(
'ApprovalController:addRequest',
{ id: 'foo', origin: 'bar.baz', type: TYPE },
false,
Expand All @@ -1321,17 +1327,10 @@
});

it('updateRequestState', () => {
const messenger = new Messenger<
ApprovalControllerActions,
ApprovalControllerEvents
>();
const { approvalControllerMessenger } = getMessengers();

approvalController = new ApprovalController({
messenger: messenger.getRestricted({
name: controllerName,
allowedActions: [],
allowedEvents: [],
}),
messenger: approvalControllerMessenger,
showApprovalRequest,
});

Expand All @@ -1344,10 +1343,13 @@
requestState: { foo: 'bar' },
});

messenger.call('ApprovalController:updateRequestState', {
id: 'foo',
requestState: { foo: 'foobar' },
});
approvalControllerMessenger.call(
'ApprovalController:updateRequestState',
{
id: 'foo',
requestState: { foo: 'foobar' },
},
);

expect(approvalController.get('foo')?.requestState).toStrictEqual({
foo: 'foobar',
Expand Down Expand Up @@ -1719,7 +1721,7 @@
deriveStateFromMetadata(
approvalController.state,
approvalController.metadata,
'anonymous',
'includeInDebugSnapshot',
),
).toMatchInlineSnapshot(`
Object {
Expand Down
45 changes: 23 additions & 22 deletions packages/approval-controller/src/ApprovalController.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import type { ControllerGetStateAction } from '@metamask/base-controller';
import type {
ControllerGetStateAction,
StateMetadata,
} from '@metamask/base-controller/next';
import {
BaseController,
type ControllerStateChangeEvent,
type RestrictedMessenger,
} from '@metamask/base-controller';
} from '@metamask/base-controller/next';
import type { Messenger } from '@metamask/messenger';
import type { JsonRpcError, DataWithOptionalCause } from '@metamask/rpc-errors';
import { rpcErrors } from '@metamask/rpc-errors';
import type { Json, OptionalField } from '@metamask/utils';
Expand All @@ -26,23 +29,23 @@ export const APPROVAL_TYPE_RESULT_SUCCESS = 'result_success';

const controllerName = 'ApprovalController';

const stateMetadata = {
const stateMetadata: StateMetadata<ApprovalControllerState> = {
pendingApprovals: {
includeInStateLogs: true,
persist: false,
anonymous: true,
includeInDebugSnapshot: true,
usedInUi: true,
},
pendingApprovalCount: {
includeInStateLogs: true,
persist: false,
anonymous: false,
includeInDebugSnapshot: false,
usedInUi: true,
},
approvalFlows: {
includeInStateLogs: true,
persist: false,
anonymous: false,
includeInDebugSnapshot: false,
usedInUi: true,
},
};
Expand Down Expand Up @@ -134,12 +137,10 @@ export type ApprovalControllerState = {
approvalFlows: ApprovalFlowState[];
};

export type ApprovalControllerMessenger = RestrictedMessenger<
export type ApprovalControllerMessenger = Messenger<
typeof controllerName,
ApprovalControllerActions,
ApprovalControllerEvents,
never,
never
ApprovalControllerEvents
>;

// Option Types
Expand Down Expand Up @@ -413,12 +414,12 @@ export class ApprovalController extends BaseController<
* actions.
*/
private registerMessageHandlers(): void {
this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:clearRequests` as const,
this.clear.bind(this),
);

this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:addRequest` as const,
(opts: AddApprovalOptions, shouldShowRequest: boolean) => {
if (shouldShowRequest) {
Expand All @@ -428,47 +429,47 @@ export class ApprovalController extends BaseController<
},
);

this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:hasRequest` as const,
this.has.bind(this),
);

this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:acceptRequest` as const,
this.accept.bind(this),
);

this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:rejectRequest` as const,
this.reject.bind(this),
);

this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:updateRequestState` as const,
this.updateRequestState.bind(this),
);

this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:startFlow` as const,
this.startFlow.bind(this),
);

this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:endFlow` as const,
this.endFlow.bind(this),
);

this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:setFlowLoadingText` as const,
this.setFlowLoadingText.bind(this),
);

this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:showSuccess` as const,
this.success.bind(this),
);

this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
`${controllerName}:showError` as const,
this.error.bind(this),
);
Expand Down
Loading
Loading