Skip to content

Commit 0415411

Browse files
committed
Make rollbackToPreviousProvider async
The network controller method `rollbackToPreviousProvider` has been made async. This method used to switch back to the previous network without waiting for the network switch operation to complete. Now it will not resolve until the switch has completed. Relates to #1176
1 parent 7d1d9a6 commit 0415411

File tree

2 files changed

+44
-62
lines changed

2 files changed

+44
-62
lines changed

packages/network-controller/src/NetworkController.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -723,12 +723,12 @@ export class NetworkController extends BaseControllerV2<
723723
/**
724724
* Rolls back provider config to the previous provider in case of errors or inability to connect during network switch.
725725
*/
726-
rollbackToPreviousProvider() {
726+
async rollbackToPreviousProvider() {
727727
const specifier = this.#previousNetworkSpecifier;
728728
if (isNetworkType(specifier)) {
729-
this.setProviderType(specifier);
729+
await this.setProviderType(specifier);
730730
} else if (typeof specifier === 'string') {
731-
this.setActiveNetwork(specifier);
731+
await this.setActiveNetwork(specifier);
732732
}
733733
}
734734
}

packages/network-controller/tests/NetworkController.test.ts

Lines changed: 41 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4785,7 +4785,9 @@ describe('NetworkController', () => {
47854785
rpcTarget: rpcUrlOrTarget,
47864786
type: NetworkType.rpc,
47874787
});
4788-
controller.rollbackToPreviousProvider();
4788+
4789+
await controller.rollbackToPreviousProvider();
4790+
47894791
expect(controller.state.providerConfig).toStrictEqual(
47904792
initialProviderConfig,
47914793
);
@@ -4829,8 +4831,8 @@ describe('NetworkController', () => {
48294831
messenger,
48304832
'NetworkController:providerConfigChange',
48314833
{
4832-
produceEvents: () => {
4833-
controller.rollbackToPreviousProvider();
4834+
produceEvents: async () => {
4835+
await controller.rollbackToPreviousProvider();
48344836
},
48354837
},
48364838
);
@@ -4916,19 +4918,22 @@ describe('NetworkController', () => {
49164918
},
49174919
},
49184920
]);
4919-
49204921
createMetamaskProviderMock.mockReturnValue(fakeMetamaskProvider);
49214922
await controller.setActiveNetwork('testNetworkConfigurationId');
49224923
expect(controller.state.networkDetails).toStrictEqual({
49234924
isEIP1559Compatible: true,
49244925
});
4926+
49254927
await waitForStateChanges(messenger, {
4926-
propertyPath: ['networkId'],
4928+
propertyPath: ['networkStatus'],
49274929
count: 1,
49284930
produceStateChanges: () => {
4931+
// Intentionally not awaited because we want to check state
4932+
// partway through the operation
49294933
controller.rollbackToPreviousProvider();
49304934
},
49314935
});
4936+
49324937
expect(controller.state.networkStatus).toBe(
49334938
NetworkStatus.Unknown,
49344939
);
@@ -4979,16 +4984,11 @@ describe('NetworkController', () => {
49794984
},
49804985
},
49814986
]);
4982-
49834987
createMetamaskProviderMock.mockReturnValue(fakeMetamaskProvider);
49844988
await controller.setActiveNetwork('testNetworkConfigurationId');
4985-
await waitForStateChanges(messenger, {
4986-
propertyPath: ['networkId'],
4987-
count: 1,
4988-
produceStateChanges: () => {
4989-
controller.rollbackToPreviousProvider();
4990-
},
4991-
});
4989+
4990+
await controller.rollbackToPreviousProvider();
4991+
49924992
const { provider } = controller.getProviderAndBlockTracker();
49934993
const promisifiedSendAsync = promisify(provider.sendAsync).bind(
49944994
provider,
@@ -5037,13 +5037,8 @@ describe('NetworkController', () => {
50375037
const { provider: providerBefore } =
50385038
controller.getProviderAndBlockTracker();
50395039

5040-
await waitForStateChanges(messenger, {
5041-
propertyPath: ['networkId'],
5042-
count: 1,
5043-
produceStateChanges: () => {
5044-
controller.rollbackToPreviousProvider();
5045-
},
5046-
});
5040+
await controller.rollbackToPreviousProvider();
5041+
50475042
const { provider: providerAfter } =
50485043
controller.getProviderAndBlockTracker();
50495044

@@ -5104,13 +5099,8 @@ describe('NetworkController', () => {
51045099
await controller.setActiveNetwork('testNetworkConfigurationId');
51055100
expect(controller.state.networkId).toStrictEqual('999');
51065101

5107-
await waitForStateChanges(messenger, {
5108-
propertyPath: ['networkId'],
5109-
count: 2,
5110-
produceStateChanges: () => {
5111-
controller.rollbackToPreviousProvider();
5112-
},
5113-
});
5102+
await controller.rollbackToPreviousProvider();
5103+
51145104
expect(controller.state.networkId).toStrictEqual('1');
51155105
},
51165106
);
@@ -5160,7 +5150,9 @@ describe('NetworkController', () => {
51605150
rpcTarget: undefined,
51615151
id: undefined,
51625152
});
5163-
controller.rollbackToPreviousProvider();
5153+
5154+
await controller.rollbackToPreviousProvider();
5155+
51645156
expect(controller.state.providerConfig).toStrictEqual({
51655157
...networkConfiguration,
51665158
rpcTarget: rpcUrlOrTarget,
@@ -5222,7 +5214,9 @@ describe('NetworkController', () => {
52225214
rpcTarget: rpcUrlOrTarget2,
52235215
type: NetworkType.rpc,
52245216
});
5225-
controller.rollbackToPreviousProvider();
5217+
5218+
await controller.rollbackToPreviousProvider();
5219+
52265220
expect(controller.state.providerConfig).toStrictEqual({
52275221
...initialProviderConfig,
52285222
rpcTarget: rpcUrlOrTarget1,
@@ -5274,8 +5268,8 @@ describe('NetworkController', () => {
52745268
messenger,
52755269
'NetworkController:providerConfigChange',
52765270
{
5277-
produceEvents: () => {
5278-
controller.rollbackToPreviousProvider();
5271+
produceEvents: async () => {
5272+
await controller.rollbackToPreviousProvider();
52795273
},
52805274
},
52815275
);
@@ -5286,7 +5280,7 @@ describe('NetworkController', () => {
52865280
);
52875281
});
52885282

5289-
it('resets the network state to "unknown" and the isEIP before emitting NetworkController:providerConfigChange', async () => {
5283+
it('resets the network state to "unknown" and empties the network details emitting NetworkController:providerConfigChange', async () => {
52905284
const messenger = buildMessenger();
52915285
const initialProviderConfigNetworkConfiguration = {
52925286
rpcUrl: 'https://mock-rpc-url-2',
@@ -5364,19 +5358,22 @@ describe('NetworkController', () => {
53645358
expect(controller.state.networkStatus).toStrictEqual(
53655359
NetworkStatus.Available,
53665360
);
5361+
5362+
await controller.rollbackToPreviousProvider();
53675363
await waitForStateChanges(messenger, {
53685364
propertyPath: ['networkStatus'],
53695365
count: 1,
53705366
produceStateChanges: () => {
5367+
// Intentionally not awaited because we want to check state
5368+
// partway through the operation
53715369
controller.rollbackToPreviousProvider();
53725370
},
53735371
});
5372+
53745373
expect(controller.state.networkStatus).toStrictEqual(
53755374
NetworkStatus.Unknown,
53765375
);
5377-
expect(controller.state.networkDetails).toStrictEqual({
5378-
isEIP1559Compatible: false,
5379-
});
5376+
expect(controller.state.networkDetails).toStrictEqual({});
53805377
},
53815378
);
53825379
});
@@ -5429,16 +5426,11 @@ describe('NetworkController', () => {
54295426
},
54305427
},
54315428
]);
5432-
54335429
createMetamaskProviderMock.mockReturnValue(fakeMetamaskProvider);
54345430
await controller.setActiveNetwork('testNetworkConfigurationId1');
5435-
await waitForStateChanges(messenger, {
5436-
propertyPath: ['networkId'],
5437-
count: 1,
5438-
produceStateChanges: () => {
5439-
controller.rollbackToPreviousProvider();
5440-
},
5441-
});
5431+
5432+
await controller.rollbackToPreviousProvider();
5433+
54425434
const { provider } = controller.getProviderAndBlockTracker();
54435435
const promisifiedSendAsync = promisify(provider.sendAsync).bind(
54445436
provider,
@@ -5498,13 +5490,8 @@ describe('NetworkController', () => {
54985490
const { provider: providerBefore } =
54995491
controller.getProviderAndBlockTracker();
55005492

5501-
await waitForStateChanges(messenger, {
5502-
propertyPath: ['networkId'],
5503-
count: 1,
5504-
produceStateChanges: () => {
5505-
controller.rollbackToPreviousProvider();
5506-
},
5507-
});
5493+
await controller.rollbackToPreviousProvider();
5494+
55085495
const { provider: providerAfter } =
55095496
controller.getProviderAndBlockTracker();
55105497

@@ -5574,13 +5561,8 @@ describe('NetworkController', () => {
55745561
await controller.setActiveNetwork('testNetworkConfigurationId1');
55755562
expect(controller.state.networkId).toStrictEqual('999');
55765563

5577-
await waitForStateChanges(messenger, {
5578-
propertyPath: ['networkId'],
5579-
count: 2,
5580-
produceStateChanges: () => {
5581-
controller.rollbackToPreviousProvider();
5582-
},
5583-
});
5564+
await controller.rollbackToPreviousProvider();
5565+
55845566
expect(controller.state.networkId).toStrictEqual('1');
55855567
},
55865568
);
@@ -5626,7 +5608,7 @@ describe('NetworkController', () => {
56265608
rpcTarget: rpcUrlOrTarget,
56275609
type: NetworkType.rpc,
56285610
});
5629-
controller.rollbackToPreviousProvider();
5611+
await controller.rollbackToPreviousProvider();
56305612

56315613
expect(controller.state.providerConfig).toStrictEqual(
56325614
initialProviderConfig,
@@ -5660,7 +5642,7 @@ describe('NetworkController', () => {
56605642
...BUILT_IN_NETWORKS.sepolia,
56615643
}),
56625644
});
5663-
controller.rollbackToPreviousProvider();
5645+
await controller.rollbackToPreviousProvider();
56645646
expect(controller.state.providerConfig).toStrictEqual(
56655647
initialProviderConfig,
56665648
);

0 commit comments

Comments
 (0)