diff --git a/packages/network-controller/src/NetworkController.ts b/packages/network-controller/src/NetworkController.ts index b8c0822dfd..9b0e61b932 100644 --- a/packages/network-controller/src/NetworkController.ts +++ b/packages/network-controller/src/NetworkController.ts @@ -806,6 +806,15 @@ export class NetworkController extends BaseControllerV2< await this.setActiveNetwork(specifier); } } + + /** + * Deactivates the controller, stopping any ongoing polling. + * + * In-progress requests will not be aborted. + */ + async destroy() { + await this.#blockTrackerProxy?.destroy(); + } } export default NetworkController; diff --git a/packages/network-controller/tests/NetworkController.test.ts b/packages/network-controller/tests/NetworkController.test.ts index 286523e958..cb9f09377f 100644 --- a/packages/network-controller/tests/NetworkController.test.ts +++ b/packages/network-controller/tests/NetworkController.test.ts @@ -5520,6 +5520,37 @@ describe('NetworkController', () => { ); }); }); + + describe('destroy', () => { + describe('if the blockTracker is defined', () => { + it('should stop the blockTracker', async () => { + await withController({}, async ({ controller }) => { + const fakeProvider = buildFakeProvider(); + const fakeNetworkClient = buildFakeClient(fakeProvider); + createNetworkClientMock.mockReturnValue(fakeNetworkClient); + await controller.initializeProvider(); + const destroySpy = jest.spyOn( + fakeNetworkClient.blockTracker, + 'destroy', + ); + + await controller.destroy(); + + expect(destroySpy).toHaveBeenCalled(); + }); + }); + }); + + describe('if the blockTracker is undefined', () => { + it('should not throw errors', async () => { + await withController({}, async ({ controller }) => { + const { blockTracker } = controller.getProviderAndBlockTracker(); + expect(blockTracker).toBeUndefined(); + expect(async () => await controller.destroy()).not.toThrow(); + }); + }); + }); + }); }); /**