diff --git a/packages/network-controller/src/NetworkController.ts b/packages/network-controller/src/NetworkController.ts index f9e5d566bcf..b3c6226303f 100644 --- a/packages/network-controller/src/NetworkController.ts +++ b/packages/network-controller/src/NetworkController.ts @@ -723,12 +723,12 @@ export class NetworkController extends BaseControllerV2< /** * Rolls back provider config to the previous provider in case of errors or inability to connect during network switch. */ - rollbackToPreviousProvider() { + async rollbackToPreviousProvider() { const specifier = this.#previousNetworkSpecifier; if (isNetworkType(specifier)) { - this.setProviderType(specifier); + await this.setProviderType(specifier); } else if (typeof specifier === 'string') { - this.setActiveNetwork(specifier); + await this.setActiveNetwork(specifier); } } } diff --git a/packages/network-controller/tests/NetworkController.test.ts b/packages/network-controller/tests/NetworkController.test.ts index ac805379891..9b1fe873f21 100644 --- a/packages/network-controller/tests/NetworkController.test.ts +++ b/packages/network-controller/tests/NetworkController.test.ts @@ -4753,7 +4753,9 @@ describe('NetworkController', () => { rpcTarget: rpcUrlOrTarget, type: NetworkType.rpc, }); - controller.rollbackToPreviousProvider(); + + await controller.rollbackToPreviousProvider(); + expect(controller.state.providerConfig).toStrictEqual( initialProviderConfig, ); @@ -4797,8 +4799,8 @@ describe('NetworkController', () => { messenger, 'NetworkController:providerConfigChange', { - produceEvents: () => { - controller.rollbackToPreviousProvider(); + produceEvents: async () => { + await controller.rollbackToPreviousProvider(); }, }, ); @@ -4884,19 +4886,22 @@ describe('NetworkController', () => { }, }, ]); - createMetamaskProviderMock.mockReturnValue(fakeMetamaskProvider); await controller.setActiveNetwork('testNetworkConfigurationId'); expect(controller.state.networkDetails).toStrictEqual({ isEIP1559Compatible: true, }); + await waitForStateChanges(messenger, { - propertyPath: ['networkId'], + propertyPath: ['networkStatus'], count: 1, produceStateChanges: () => { + // Intentionally not awaited because we want to check state + // partway through the operation controller.rollbackToPreviousProvider(); }, }); + expect(controller.state.networkStatus).toBe( NetworkStatus.Unknown, ); @@ -4947,16 +4952,11 @@ describe('NetworkController', () => { }, }, ]); - createMetamaskProviderMock.mockReturnValue(fakeMetamaskProvider); await controller.setActiveNetwork('testNetworkConfigurationId'); - await waitForStateChanges(messenger, { - propertyPath: ['networkId'], - count: 1, - produceStateChanges: () => { - controller.rollbackToPreviousProvider(); - }, - }); + + await controller.rollbackToPreviousProvider(); + const { provider } = controller.getProviderAndBlockTracker(); const promisifiedSendAsync = promisify(provider.sendAsync).bind( provider, @@ -5005,13 +5005,8 @@ describe('NetworkController', () => { const { provider: providerBefore } = controller.getProviderAndBlockTracker(); - await waitForStateChanges(messenger, { - propertyPath: ['networkId'], - count: 1, - produceStateChanges: () => { - controller.rollbackToPreviousProvider(); - }, - }); + await controller.rollbackToPreviousProvider(); + const { provider: providerAfter } = controller.getProviderAndBlockTracker(); @@ -5072,13 +5067,8 @@ describe('NetworkController', () => { await controller.setActiveNetwork('testNetworkConfigurationId'); expect(controller.state.networkId).toStrictEqual('999'); - await waitForStateChanges(messenger, { - propertyPath: ['networkId'], - count: 2, - produceStateChanges: () => { - controller.rollbackToPreviousProvider(); - }, - }); + await controller.rollbackToPreviousProvider(); + expect(controller.state.networkId).toStrictEqual('1'); }, ); @@ -5128,7 +5118,9 @@ describe('NetworkController', () => { rpcTarget: undefined, id: undefined, }); - controller.rollbackToPreviousProvider(); + + await controller.rollbackToPreviousProvider(); + expect(controller.state.providerConfig).toStrictEqual({ ...networkConfiguration, rpcTarget: rpcUrlOrTarget, @@ -5190,7 +5182,9 @@ describe('NetworkController', () => { rpcTarget: rpcUrlOrTarget2, type: NetworkType.rpc, }); - controller.rollbackToPreviousProvider(); + + await controller.rollbackToPreviousProvider(); + expect(controller.state.providerConfig).toStrictEqual({ ...initialProviderConfig, rpcTarget: rpcUrlOrTarget1, @@ -5242,8 +5236,8 @@ describe('NetworkController', () => { messenger, 'NetworkController:providerConfigChange', { - produceEvents: () => { - controller.rollbackToPreviousProvider(); + produceEvents: async () => { + await controller.rollbackToPreviousProvider(); }, }, ); @@ -5254,7 +5248,7 @@ describe('NetworkController', () => { ); }); - it('resets the network state to "unknown" and the isEIP before emitting NetworkController:providerConfigChange', async () => { + it('resets the network state to "unknown" and empties the network details before emitting NetworkController:providerConfigChange', async () => { const messenger = buildMessenger(); const initialProviderConfigNetworkConfiguration = { rpcUrl: 'https://mock-rpc-url-2', @@ -5332,19 +5326,22 @@ describe('NetworkController', () => { expect(controller.state.networkStatus).toStrictEqual( NetworkStatus.Available, ); + + await controller.rollbackToPreviousProvider(); await waitForStateChanges(messenger, { propertyPath: ['networkStatus'], count: 1, produceStateChanges: () => { + // Intentionally not awaited because we want to check state + // partway through the operation controller.rollbackToPreviousProvider(); }, }); + expect(controller.state.networkStatus).toStrictEqual( NetworkStatus.Unknown, ); - expect(controller.state.networkDetails).toStrictEqual({ - isEIP1559Compatible: false, - }); + expect(controller.state.networkDetails).toStrictEqual({}); }, ); }); @@ -5397,16 +5394,11 @@ describe('NetworkController', () => { }, }, ]); - createMetamaskProviderMock.mockReturnValue(fakeMetamaskProvider); await controller.setActiveNetwork('testNetworkConfigurationId1'); - await waitForStateChanges(messenger, { - propertyPath: ['networkId'], - count: 1, - produceStateChanges: () => { - controller.rollbackToPreviousProvider(); - }, - }); + + await controller.rollbackToPreviousProvider(); + const { provider } = controller.getProviderAndBlockTracker(); const promisifiedSendAsync = promisify(provider.sendAsync).bind( provider, @@ -5466,13 +5458,8 @@ describe('NetworkController', () => { const { provider: providerBefore } = controller.getProviderAndBlockTracker(); - await waitForStateChanges(messenger, { - propertyPath: ['networkId'], - count: 1, - produceStateChanges: () => { - controller.rollbackToPreviousProvider(); - }, - }); + await controller.rollbackToPreviousProvider(); + const { provider: providerAfter } = controller.getProviderAndBlockTracker(); @@ -5542,13 +5529,8 @@ describe('NetworkController', () => { await controller.setActiveNetwork('testNetworkConfigurationId1'); expect(controller.state.networkId).toStrictEqual('999'); - await waitForStateChanges(messenger, { - propertyPath: ['networkId'], - count: 2, - produceStateChanges: () => { - controller.rollbackToPreviousProvider(); - }, - }); + await controller.rollbackToPreviousProvider(); + expect(controller.state.networkId).toStrictEqual('1'); }, ); @@ -5594,7 +5576,7 @@ describe('NetworkController', () => { rpcTarget: rpcUrlOrTarget, type: NetworkType.rpc, }); - controller.rollbackToPreviousProvider(); + await controller.rollbackToPreviousProvider(); expect(controller.state.providerConfig).toStrictEqual( initialProviderConfig, @@ -5628,7 +5610,7 @@ describe('NetworkController', () => { ...BUILT_IN_NETWORKS.sepolia, }), }); - controller.rollbackToPreviousProvider(); + await controller.rollbackToPreviousProvider(); expect(controller.state.providerConfig).toStrictEqual( initialProviderConfig, );