Skip to content

Commit 80b9a0f

Browse files
authored
Ensure networksMetadata never references old network client IDs (#7047)
In debugging a long-standing issue where SelectedNetworkController sometimes requests invalid network client IDs from NetworkController, one bug was discovered in NetworkController. Namely, when a network is removed, its data is removed from `networkConfigurationsByChainId`, but not `networksMetadata`. This commit fixes `removeNetwork` to do this, and ensures that when the controller is initialized, if `networksMetadata` contains invalid network client IDs, they are removed.
1 parent 2a2dc96 commit 80b9a0f

File tree

5 files changed

+258
-87
lines changed

5 files changed

+258
-87
lines changed

packages/gas-fee-controller/src/GasFeeController.test.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,16 @@ type AllEvents = AllGasFeeControllerEvents | AllNetworkControllerEvents;
6363
type RootMessenger = Messenger<MockAnyNamespace, AllActions, AllEvents>;
6464

6565
const getRootMessenger = (): RootMessenger => {
66-
return new Messenger({ namespace: MOCK_ANY_NAMESPACE });
66+
const rootMessenger = new Messenger<
67+
MockAnyNamespace,
68+
MessengerActions<NetworkControllerMessenger>,
69+
MessengerEvents<NetworkControllerMessenger>
70+
>({ namespace: MOCK_ANY_NAMESPACE });
71+
rootMessenger.registerActionHandler(
72+
'ErrorReportingService:captureException',
73+
jest.fn(),
74+
);
75+
return rootMessenger;
6776
};
6877

6978
const setupNetworkController = async ({
@@ -86,6 +95,10 @@ const setupNetworkController = async ({
8695
namespace: 'NetworkController',
8796
parent: rootMessenger,
8897
});
98+
rootMessenger.delegate({
99+
messenger: networkControllerMessenger,
100+
actions: ['ErrorReportingService:captureException'],
101+
});
89102

90103
const infuraProjectId = '123';
91104

packages/network-controller/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313
- Providers accessible either via network clients or global proxies no longer emit events (or inherit from EventEmitter, for that matter).
1414
- Bump `@metamask/controller-utils` from `^11.14.1` to `^11.15.0` ([#7003](https://github.com/MetaMask/core/pull/7003))
1515

16+
### Fixed
17+
18+
- Ensure `networksMetadata` never references old network client IDs ([#7047](https://github.com/MetaMask/core/pull/7047))
19+
- When removing a network configuration, ensure that metadata for all RPC endpoints in the network configuration are also removed from `networksMetadata`
20+
- When initializing the controller, remove metadata for RPC endpoints in `networksMetadata` that are not present in a network configuration
21+
1622
## [25.0.0]
1723

1824
### Changed

packages/network-controller/src/NetworkController.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,12 +1082,17 @@ function correctInitialState(
10821082
const networkConfigurationsSortedByChainId = getNetworkConfigurations(
10831083
state,
10841084
).sort((a, b) => a.chainId.localeCompare(b.chainId));
1085-
const networkClientIds = getAvailableNetworkClientIds(
1085+
const availableNetworkClientIds = getAvailableNetworkClientIds(
10861086
networkConfigurationsSortedByChainId,
10871087
);
1088+
const invalidNetworkClientIdsWithMetadata = Object.keys(
1089+
state.networksMetadata,
1090+
).filter(
1091+
(networkClientId) => !availableNetworkClientIds.includes(networkClientId),
1092+
);
10881093

10891094
return produce(state, (newState) => {
1090-
if (!networkClientIds.includes(state.selectedNetworkClientId)) {
1095+
if (!availableNetworkClientIds.includes(state.selectedNetworkClientId)) {
10911096
const firstNetworkConfiguration = networkConfigurationsSortedByChainId[0];
10921097
const newSelectedNetworkClientId =
10931098
firstNetworkConfiguration.rpcEndpoints[
@@ -1101,6 +1106,18 @@ function correctInitialState(
11011106
);
11021107
newState.selectedNetworkClientId = newSelectedNetworkClientId;
11031108
}
1109+
1110+
if (invalidNetworkClientIdsWithMetadata.length > 0) {
1111+
for (const invalidNetworkClientId of invalidNetworkClientIdsWithMetadata) {
1112+
delete newState.networksMetadata[invalidNetworkClientId];
1113+
}
1114+
messenger.call(
1115+
'ErrorReportingService:captureException',
1116+
new Error(
1117+
'`networksMetadata` had invalid network client IDs, which have been removed',
1118+
),
1119+
);
1120+
}
11041121
});
11051122
}
11061123

@@ -2401,6 +2418,10 @@ export class NetworkController extends BaseController<
24012418
mode: 'remove',
24022419
existingNetworkConfiguration,
24032420
});
2421+
2422+
for (const rpcEndpoint of existingNetworkConfiguration.rpcEndpoints) {
2423+
delete state.networksMetadata[rpcEndpoint.networkClientId];
2424+
}
24042425
});
24052426

24062427
this.messenger.publish(

0 commit comments

Comments
 (0)