Skip to content

Commit 5f863de

Browse files
cryptodev-2smikespositoMrtenz
authored
refactor: migrate ShieldController to @metamask/messenger (#6497)
## Explanation <!-- Thanks for your contribution! Take a moment to answer these questions so that reviewers have the information they need to properly understand your changes: * What is the current state of things and why does it need to change? * What is the solution your changes offer and how does it work? * Are there any changes whose purpose might not obvious to those unfamiliar with the domain? * If your primary goal was to update one package but you found you had to update another one along the way, why did you do so? * If you had to upgrade a dependency, why did you do so? --> This PR migrates `ShieldController ` to the new `@metamask/messenger` message bus, as opposed to the one exported from `@metamask/base-controller`. ## References <!-- Are there any issues that this pull request is tied to? Are there other links that reviewers should consult to understand these changes better? Are there client or consumer pull requests to adopt any breaking changes? For example: * Fixes #12345 * Related to #67890 --> * Related to #5626 ## Checklist - [ ] I've updated the test suite for new or updated code as appropriate - [ ] I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate - [ ] I've communicated my changes to consumers by [updating changelogs for packages I've changed](https://github.com/MetaMask/core/tree/main/docs/contributing.md#updating-changelogs), highlighting breaking changes as necessary - [ ] I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Migrates ShieldController to @metamask/messenger, adds getState action, renames metadata key, and updates tests and configs accordingly. > > - **Shield Controller**: > - Migrate to `@metamask/messenger` (replace `RestrictedMessenger`; switch to `messenger.subscribe/publish/unsubscribe`; import controller types from `@metamask/base-controller/next`). > - Add `ShieldControllerGetStateAction` and export via `src/index.ts`. > - Rename metadata key `anonymous` to `includeInDebugSnapshot`. > - Update tests to new messenger API: introduce `rootMessenger`, adjust mocks and utils to use `@metamask/messenger`. > - Add dependency `@metamask/messenger`; include TS references to `packages/messenger`. > - **Docs/Changelog/Graph**: > - Update changelog with added action and BREAKING changes. > - README dependency graph: add `shield_controller --> messenger` and `eip_7702_internal_rpc_middleware --> controller_utils`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3e00774. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Michele Esposito <[email protected]> Co-authored-by: Maarten Zuidhoorn <[email protected]>
1 parent ed168cf commit 5f863de

File tree

11 files changed

+134
-95
lines changed

11 files changed

+134
-95
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ linkStyle default opacity:0.5
343343
selected_network_controller --> network_controller;
344344
selected_network_controller --> permission_controller;
345345
shield_controller --> base_controller;
346+
shield_controller --> messenger;
346347
shield_controller --> signature_controller;
347348
shield_controller --> transaction_controller;
348349
signature_controller --> base_controller;

packages/shield-controller/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- Add new controller action `ShieldControllerGetStateAction` ([#6497](https://github.com/MetaMask/core/pull/6497))
13+
14+
### Changed
15+
16+
- **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#6497](https://github.com/MetaMask/core/pull/6497))
17+
- Previously, `ShieldController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`.
18+
- **BREAKING:** Metadata property `anonymous` renamed to `includeInDebugSnapshot` ([#6497](https://github.com/MetaMask/core/pull/6497))
19+
1020
## [0.4.0]
1121

1222
### Added

packages/shield-controller/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
},
4949
"dependencies": {
5050
"@metamask/base-controller": "^8.4.2",
51+
"@metamask/messenger": "^0.3.0",
5152
"@metamask/utils": "^11.8.1"
5253
},
5354
"devDependencies": {

packages/shield-controller/src/ShieldController.test.ts

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { deriveStateFromMetadata } from '@metamask/base-controller';
1+
import { deriveStateFromMetadata } from '@metamask/base-controller/next';
22
import type { SignatureRequest } from '@metamask/signature-controller';
33
import {
44
SignatureRequestStatus,
@@ -40,7 +40,7 @@ function setup({
4040
normalizeSignatureRequest?: NormalizeSignatureRequestFn;
4141
} = {}) {
4242
const backend = createMockBackend();
43-
const { messenger, baseMessenger } = createMockMessenger();
43+
const { messenger, rootMessenger } = createMockMessenger();
4444

4545
const controller = new ShieldController({
4646
backend,
@@ -53,18 +53,18 @@ function setup({
5353
return {
5454
controller,
5555
messenger,
56-
baseMessenger,
56+
rootMessenger,
5757
backend,
5858
};
5959
}
6060

6161
describe('ShieldController', () => {
6262
describe('checkCoverage', () => {
6363
it('should trigger checkCoverage when a new transaction is added', async () => {
64-
const { baseMessenger, backend } = setup();
64+
const { rootMessenger, messenger, backend } = setup();
6565
const txMeta = generateMockTxMeta();
66-
const coverageResultReceived = setupCoverageResultReceived(baseMessenger);
67-
baseMessenger.publish(
66+
const coverageResultReceived = setupCoverageResultReceived(messenger);
67+
rootMessenger.publish(
6868
'TransactionController:stateChange',
6969
{ transactions: [txMeta] } as TransactionControllerState,
7070
undefined as never,
@@ -74,14 +74,14 @@ describe('ShieldController', () => {
7474
});
7575

7676
it('should tolerate calling start and stop multiple times', async () => {
77-
const { backend, baseMessenger, controller } = setup();
77+
const { backend, rootMessenger, messenger, controller } = setup();
7878
controller.stop();
7979
controller.stop();
8080
controller.start();
8181
controller.start();
8282
const txMeta = generateMockTxMeta();
83-
const coverageResultReceived = setupCoverageResultReceived(baseMessenger);
84-
baseMessenger.publish(
83+
const coverageResultReceived = setupCoverageResultReceived(messenger);
84+
rootMessenger.publish(
8585
'TransactionController:stateChange',
8686
{ transactions: [txMeta] } as TransactionControllerState,
8787
undefined as never,
@@ -91,11 +91,11 @@ describe('ShieldController', () => {
9191
});
9292

9393
it('should no longer trigger checkCoverage when controller is stopped', async () => {
94-
const { controller, baseMessenger, backend } = setup();
94+
const { controller, rootMessenger, backend } = setup();
9595
controller.stop();
9696
const txMeta = generateMockTxMeta();
9797
const coverageResultReceived = new Promise<void>((resolve, reject) => {
98-
baseMessenger.subscribe(
98+
rootMessenger.subscribe(
9999
'ShieldController:coverageResultReceived',
100100
(_coverageResult) => resolve(),
101101
);
@@ -104,7 +104,7 @@ describe('ShieldController', () => {
104104
100,
105105
);
106106
});
107-
baseMessenger.publish(
107+
rootMessenger.publish(
108108
'TransactionController:stateChange',
109109
{ transactions: [txMeta] } as TransactionControllerState,
110110
undefined as never,
@@ -143,12 +143,12 @@ describe('ShieldController', () => {
143143
});
144144

145145
it('should check coverage when a transaction is simulated', async () => {
146-
const { baseMessenger, backend } = setup();
146+
const { rootMessenger, messenger, backend } = setup();
147147
const txMeta = generateMockTxMeta();
148-
const coverageResultReceived = setupCoverageResultReceived(baseMessenger);
148+
const coverageResultReceived = setupCoverageResultReceived(messenger);
149149

150150
// Add transaction.
151-
baseMessenger.publish(
151+
rootMessenger.publish(
152152
'TransactionController:stateChange',
153153
{ transactions: [txMeta] } as TransactionControllerState,
154154
undefined as never,
@@ -161,9 +161,8 @@ describe('ShieldController', () => {
161161
txMeta2.simulationData = {
162162
tokenBalanceChanges: [],
163163
};
164-
const coverageResultReceived2 =
165-
setupCoverageResultReceived(baseMessenger);
166-
baseMessenger.publish(
164+
const coverageResultReceived2 = setupCoverageResultReceived(messenger);
165+
rootMessenger.publish(
167166
'TransactionController:stateChange',
168167
{ transactions: [txMeta2] } as TransactionControllerState,
169168
undefined as never,
@@ -178,16 +177,15 @@ describe('ShieldController', () => {
178177
TX_META_SIMULATION_DATA_MOCKS.forEach(
179178
({ description, previousSimulationData, newSimulationData }) => {
180179
it(`should check coverage when ${description}`, async () => {
181-
const { baseMessenger, backend } = setup();
180+
const { rootMessenger, messenger, backend } = setup();
182181
const previousTxMeta = {
183182
...generateMockTxMeta(),
184183
simulationData: previousSimulationData,
185184
};
186-
const coverageResultReceived =
187-
setupCoverageResultReceived(baseMessenger);
185+
const coverageResultReceived = setupCoverageResultReceived(messenger);
188186

189187
// Add transaction.
190-
baseMessenger.publish(
188+
rootMessenger.publish(
191189
'TransactionController:stateChange',
192190
{ transactions: [previousTxMeta] } as TransactionControllerState,
193191
undefined as never,
@@ -201,8 +199,8 @@ describe('ShieldController', () => {
201199
const txMeta2 = { ...previousTxMeta };
202200
txMeta2.simulationData = newSimulationData;
203201
const coverageResultReceived2 =
204-
setupCoverageResultReceived(baseMessenger);
205-
baseMessenger.publish(
202+
setupCoverageResultReceived(messenger);
203+
rootMessenger.publish(
206204
'TransactionController:stateChange',
207205
{ transactions: [txMeta2] } as TransactionControllerState,
208206
undefined as never,
@@ -236,14 +234,14 @@ describe('ShieldController', () => {
236234
const MOCK_SIGNATURE_REQUEST = generateMockSignatureRequest();
237235

238236
it('should check signature coverage', async () => {
239-
const { baseMessenger, backend } = setup();
237+
const { rootMessenger, backend } = setup();
240238
const coverageResultReceived = new Promise<void>((resolve) => {
241-
baseMessenger.subscribe(
239+
rootMessenger.subscribe(
242240
'ShieldController:coverageResultReceived',
243241
(_coverageResult) => resolve(),
244242
);
245243
});
246-
baseMessenger.publish(
244+
rootMessenger.publish(
247245
'SignatureController:stateChange',
248246
{
249247
signatureRequests: {
@@ -271,16 +269,16 @@ describe('ShieldController', () => {
271269
.mockImplementationOnce((_signatureRequest: SignatureRequest) => {
272270
return MOCK_NORMALIZED_SIGNATURE_REQUEST;
273271
});
274-
const { baseMessenger, backend } = setup({
272+
const { rootMessenger, backend } = setup({
275273
normalizeSignatureRequest: normalizeSignatureRequestMock,
276274
});
277275
const coverageResultReceived = new Promise<void>((resolve) => {
278-
baseMessenger.subscribe(
276+
rootMessenger.subscribe(
279277
'ShieldController:coverageResultReceived',
280278
(_coverageResult) => resolve(),
281279
);
282280
});
283-
baseMessenger.publish(
281+
rootMessenger.publish(
284282
'SignatureController:stateChange',
285283
{
286284
signatureRequests: {
@@ -301,15 +299,15 @@ describe('ShieldController', () => {
301299
});
302300

303301
it('should check coverage for multiple signature request', async () => {
304-
const { baseMessenger, backend } = setup();
302+
const { rootMessenger, backend } = setup();
305303
const signatureRequest1 = generateMockSignatureRequest();
306304
const coverageResultReceived1 = new Promise<void>((resolve) => {
307-
baseMessenger.subscribe(
305+
rootMessenger.subscribe(
308306
'ShieldController:coverageResultReceived',
309307
(_coverageResult) => resolve(),
310308
);
311309
});
312-
baseMessenger.publish(
310+
rootMessenger.publish(
313311
'SignatureController:stateChange',
314312
{
315313
signatureRequests: {
@@ -325,12 +323,12 @@ describe('ShieldController', () => {
325323

326324
const signatureRequest2 = generateMockSignatureRequest();
327325
const coverageResultReceived2 = new Promise<void>((resolve) => {
328-
baseMessenger.subscribe(
326+
rootMessenger.subscribe(
329327
'ShieldController:coverageResultReceived',
330328
(_coverageResult) => resolve(),
331329
);
332330
});
333-
baseMessenger.publish(
331+
rootMessenger.publish(
334332
'SignatureController:stateChange',
335333
{
336334
signatureRequests: {
@@ -361,7 +359,7 @@ describe('ShieldController', () => {
361359
updateSignatureRequest?: (signatureRequest: SignatureRequest) => void;
362360
},
363361
) {
364-
const { messenger, baseMessenger } = components;
362+
const { messenger, rootMessenger } = components;
365363

366364
// Create a promise that resolves when the state changes
367365
const stateUpdated = new Promise((resolve) =>
@@ -370,7 +368,7 @@ describe('ShieldController', () => {
370368

371369
// Publish a signature request
372370
const signatureRequest = generateMockSignatureRequest();
373-
baseMessenger.publish(
371+
rootMessenger.publish(
374372
'SignatureController:stateChange',
375373
{
376374
signatureRequests: { [signatureRequest.id]: signatureRequest },
@@ -386,7 +384,7 @@ describe('ShieldController', () => {
386384
updatedSignatureRequest.status = SignatureRequestStatus.Signed;
387385
updatedSignatureRequest.rawSig = '0x00';
388386
options?.updateSignatureRequest?.(updatedSignatureRequest);
389-
baseMessenger.publish(
387+
rootMessenger.publish(
390388
'SignatureController:stateChange',
391389
{
392390
signatureRequests: { [signatureRequest.id]: updatedSignatureRequest },
@@ -455,15 +453,15 @@ describe('ShieldController', () => {
455453
components: ReturnType<typeof setup>,
456454
options?: { updateTransaction: (txMeta: TransactionMeta) => void },
457455
) {
458-
const { messenger, baseMessenger } = components;
456+
const { messenger, rootMessenger } = components;
459457
// Create a promise that resolves when the state changes
460458
const stateUpdated = new Promise((resolve) =>
461459
messenger.subscribe('ShieldController:stateChange', resolve),
462460
);
463461

464462
// Publish a transaction
465463
const txMeta = generateMockTxMeta();
466-
baseMessenger.publish(
464+
rootMessenger.publish(
467465
'TransactionController:stateChange',
468466
{ transactions: [txMeta] } as TransactionControllerState,
469467
undefined as never,
@@ -477,7 +475,7 @@ describe('ShieldController', () => {
477475
updatedTxMeta.status = TransactionStatus.submitted;
478476
updatedTxMeta.hash = '0x00';
479477
options?.updateTransaction(updatedTxMeta);
480-
baseMessenger.publish(
478+
rootMessenger.publish(
481479
'TransactionController:stateChange',
482480
{ transactions: [updatedTxMeta] } as TransactionControllerState,
483481
undefined as never,
@@ -536,7 +534,7 @@ describe('ShieldController', () => {
536534
deriveStateFromMetadata(
537535
controller.state,
538536
controller.metadata,
539-
'anonymous',
537+
'includeInDebugSnapshot',
540538
),
541539
).toMatchInlineSnapshot(`Object {}`);
542540
});

0 commit comments

Comments
 (0)