diff --git a/packages/shield-controller/CHANGELOG.md b/packages/shield-controller/CHANGELOG.md index ae929cd73ab..336d326a923 100644 --- a/packages/shield-controller/CHANGELOG.md +++ b/packages/shield-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Make start and stop idempotent ([#6817](https://github.com/MetaMask/core/pull/6817)) + ## [0.3.1] ### Changed diff --git a/packages/shield-controller/src/ShieldController.test.ts b/packages/shield-controller/src/ShieldController.test.ts index ac9e8597a5e..b741aaa5dfc 100644 --- a/packages/shield-controller/src/ShieldController.test.ts +++ b/packages/shield-controller/src/ShieldController.test.ts @@ -57,12 +57,24 @@ describe('ShieldController', () => { it('should trigger checkCoverage when a new transaction is added', async () => { const { baseMessenger, backend } = setup(); const txMeta = generateMockTxMeta(); - const coverageResultReceived = new Promise((resolve) => { - baseMessenger.subscribe( - 'ShieldController:coverageResultReceived', - (_coverageResult) => resolve(), - ); - }); + const coverageResultReceived = setupCoverageResultReceived(baseMessenger); + baseMessenger.publish( + 'TransactionController:stateChange', + { transactions: [txMeta] } as TransactionControllerState, + undefined as never, + ); + expect(await coverageResultReceived).toBeUndefined(); + expect(backend.checkCoverage).toHaveBeenCalledWith({ txMeta }); + }); + + it('should tolerate calling start and stop multiple times', async () => { + const { backend, baseMessenger, controller } = setup(); + controller.stop(); + controller.stop(); + controller.start(); + controller.start(); + const txMeta = generateMockTxMeta(); + const coverageResultReceived = setupCoverageResultReceived(baseMessenger); baseMessenger.publish( 'TransactionController:stateChange', { transactions: [txMeta] } as TransactionControllerState, diff --git a/packages/shield-controller/src/ShieldController.ts b/packages/shield-controller/src/ShieldController.ts index 2208cd7e90b..470f2982709 100644 --- a/packages/shield-controller/src/ShieldController.ts +++ b/packages/shield-controller/src/ShieldController.ts @@ -152,6 +152,8 @@ export class ShieldController extends BaseController< previousSignatureRequests: Record | undefined, ) => void; + #started: boolean; + constructor(options: ShieldControllerOptions) { const { messenger, @@ -177,9 +179,15 @@ export class ShieldController extends BaseController< this.#handleTransactionControllerStateChange.bind(this); this.#signatureControllerStateChangeHandler = this.#handleSignatureControllerStateChange.bind(this); + this.#started = false; } start() { + if (this.#started) { + return; + } + this.#started = true; + this.messagingSystem.subscribe( 'TransactionController:stateChange', this.#transactionControllerStateChangeHandler, @@ -194,6 +202,11 @@ export class ShieldController extends BaseController< } stop() { + if (!this.#started) { + return; + } + this.#started = false; + this.messagingSystem.unsubscribe( 'TransactionController:stateChange', this.#transactionControllerStateChangeHandler,