@metamask/network-controller 25.0.0 → 27.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +64 -1
  2. package/dist/NetworkController.cjs +83 -114
  3. package/dist/NetworkController.cjs.map +1 -1
  4. package/dist/NetworkController.d.cts +136 -27
  5. package/dist/NetworkController.d.cts.map +1 -1
  6. package/dist/NetworkController.d.mts +136 -27
  7. package/dist/NetworkController.d.mts.map +1 -1
  8. package/dist/NetworkController.mjs +84 -115
  9. package/dist/NetworkController.mjs.map +1 -1
  10. package/dist/constants.cjs +18 -10
  11. package/dist/constants.cjs.map +1 -1
  12. package/dist/constants.d.cts +18 -10
  13. package/dist/constants.d.cts.map +1 -1
  14. package/dist/constants.d.mts +18 -10
  15. package/dist/constants.d.mts.map +1 -1
  16. package/dist/constants.mjs +18 -10
  17. package/dist/constants.mjs.map +1 -1
  18. package/dist/create-auto-managed-network-client.cjs +4 -3
  19. package/dist/create-auto-managed-network-client.cjs.map +1 -1
  20. package/dist/create-auto-managed-network-client.d.cts +5 -2
  21. package/dist/create-auto-managed-network-client.d.cts.map +1 -1
  22. package/dist/create-auto-managed-network-client.d.mts +5 -2
  23. package/dist/create-auto-managed-network-client.d.mts.map +1 -1
  24. package/dist/create-auto-managed-network-client.mjs +4 -3
  25. package/dist/create-auto-managed-network-client.mjs.map +1 -1
  26. package/dist/create-network-client.cjs +177 -78
  27. package/dist/create-network-client.cjs.map +1 -1
  28. package/dist/create-network-client.d.cts +5 -2
  29. package/dist/create-network-client.d.cts.map +1 -1
  30. package/dist/create-network-client.d.mts +5 -2
  31. package/dist/create-network-client.d.mts.map +1 -1
  32. package/dist/create-network-client.mjs +178 -79
  33. package/dist/create-network-client.mjs.map +1 -1
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +1 -1
  36. package/dist/index.d.cts.map +1 -1
  37. package/dist/index.d.mts +1 -1
  38. package/dist/index.d.mts.map +1 -1
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/rpc-service/rpc-service-chain.cjs +247 -39
  41. package/dist/rpc-service/rpc-service-chain.cjs.map +1 -1
  42. package/dist/rpc-service/rpc-service-chain.d.cts +108 -27
  43. package/dist/rpc-service/rpc-service-chain.d.cts.map +1 -1
  44. package/dist/rpc-service/rpc-service-chain.d.mts +108 -27
  45. package/dist/rpc-service/rpc-service-chain.d.mts.map +1 -1
  46. package/dist/rpc-service/rpc-service-chain.mjs +247 -39
  47. package/dist/rpc-service/rpc-service-chain.mjs.map +1 -1
  48. package/dist/rpc-service/rpc-service-requestable.cjs.map +1 -1
  49. package/dist/rpc-service/rpc-service-requestable.d.cts +16 -6
  50. package/dist/rpc-service/rpc-service-requestable.d.cts.map +1 -1
  51. package/dist/rpc-service/rpc-service-requestable.d.mts +16 -6
  52. package/dist/rpc-service/rpc-service-requestable.d.mts.map +1 -1
  53. package/dist/rpc-service/rpc-service-requestable.mjs.map +1 -1
  54. package/dist/rpc-service/rpc-service.cjs +68 -34
  55. package/dist/rpc-service/rpc-service.cjs.map +1 -1
  56. package/dist/rpc-service/rpc-service.d.cts +33 -24
  57. package/dist/rpc-service/rpc-service.d.cts.map +1 -1
  58. package/dist/rpc-service/rpc-service.d.mts +33 -24
  59. package/dist/rpc-service/rpc-service.d.mts.map +1 -1
  60. package/dist/rpc-service/rpc-service.mjs +69 -35
  61. package/dist/rpc-service/rpc-service.mjs.map +1 -1
  62. package/dist/rpc-service/shared.cjs.map +1 -1
  63. package/dist/rpc-service/shared.d.cts +25 -3
  64. package/dist/rpc-service/shared.d.cts.map +1 -1
  65. package/dist/rpc-service/shared.d.mts +25 -3
  66. package/dist/rpc-service/shared.d.mts.map +1 -1
  67. package/dist/rpc-service/shared.mjs.map +1 -1
  68. package/dist/types.cjs.map +1 -1
  69. package/dist/types.d.cts +6 -2
  70. package/dist/types.d.cts.map +1 -1
  71. package/dist/types.d.mts +6 -2
  72. package/dist/types.d.mts.map +1 -1
  73. package/dist/types.mjs.map +1 -1
  74. package/package.json +13 -11
package/CHANGELOG.md CHANGED
@@ -7,6 +7,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [27.0.0]
11
+
12
+ ### Added
13
+
14
+ - Add `NetworkController:rpcEndpointChainAvailable` messenger event ([#7166](https://github.com/MetaMask/core/pull/7166))
15
+ - This is a counterpart to the (new) `NetworkController:rpcEndpointChainUnavailable` and `NetworkController:rpcEndpointChainDegraded` events, but is published when a successful request to an endpoint within a chain of endpoints is made either initially or following a previously established degraded or unavailable status.
16
+
17
+ ### Changed
18
+
19
+ - **BREAKING:** Split up and update payload data for `NetworkController:rpcEndpointDegraded` and `NetworkController:rpcEndpointUnavailable` ([#7166](https://github.com/MetaMask/core/pull/7166))
20
+ - `NetworkController:rpcEndpointDegraded` and `NetworkController:rpcEndpointUnavailable` still exist and retain the same behavior as before.
21
+ - New events are `NetworkController:rpcEndpointChainDegraded` and `NetworkController:rpcEndpointChainUnavailable`, and are designed to represent an entire chain of endpoints. They are also guaranteed to not be published multiple times in a row. In particular, `NetworkController:rpcEndpointChainUnavailable` is published only after trying all of the endpoints for a chain and when the underlying circuit for the last endpoint breaks, not as each primary's or failover's circuit breaks.
22
+ - The event payloads have been changed:
23
+ - For individual endpoint events (`NetworkController:rpcEndpointUnavailable`, `NetworkController:rpcEndpointDegraded`): `failoverEndpointUrl` has been removed, and `primaryEndpointUrl` has been added. In addition, `networkClientId` has been added to the payload.
24
+ - For chain-level events (`NetworkController:rpcEndpointChainUnavailable`, `NetworkController:rpcEndpointChainDegraded`, `NetworkController:rpcEndpointChainAvailable`): These include `chainId`, `networkClientId`, and event-specific fields (e.g., `error`, `endpointUrl`) but do not include `primaryEndpointUrl`. Consumers can derive endpoint information from the `networkClientId` using `NetworkController:getNetworkClientById` or `NetworkController:getNetworkConfigurationByNetworkClientId`.
25
+ - **BREAKING:** Rename and update payload data for `NetworkController:rpcEndpointRequestRetried` ([#7166](https://github.com/MetaMask/core/pull/7166))
26
+ - This event is now called `NetworkController:rpcEndpointRetried`.
27
+ - The event payload has been changed as well: `failoverEndpointUrl` has been removed, and `primaryEndpointUrl` has been added. In addition, `networkClientId` and `attempt` have been added to the payload.
28
+ - **BREAKING:** Update `AbstractRpcService`/`RpcServiceRequestable` to remove `{ isolated: true }` from the `onBreak` event data type ([#7166](https://github.com/MetaMask/core/pull/7166))
29
+ - This represented the error produced when `isolate` is called on a Cockatiel circuit breaker policy. This never happens for our service (we use `isolate` internally, but this error is suppressed and cannot trigger `onBreak`)
30
+ - Move peer dependencies for controller and service packages to direct dependencies ([#7209](https://github.com/MetaMask/core/pull/7209))
31
+ - The dependencies moved are:
32
+ - `@metamask/error-reporting-service` (^3.0.0)
33
+ - In clients, it is now possible for multiple versions of these packages to exist in the dependency tree.
34
+ - For example, this scenario would be valid: a client relies on `@metamask/controller-a` 1.0.0 and `@metamask/controller-b` 1.0.0, and `@metamask/controller-b` depends on `@metamask/controller-a` 1.1.0.
35
+ - Note, however, that the versions specified in the client's `package.json` always "win", and you are expected to keep them up to date so as not to break controller and service intercommunication.
36
+ - Automatically update network status metadata when chain-level RPC events are published ([#7186](https://github.com/MetaMask/core/pull/7186))
37
+ - `NetworkController` now automatically subscribes to `NetworkController:rpcEndpointChainUnavailable`, `NetworkController:rpcEndpointChainDegraded`, and `NetworkController:rpcEndpointChainAvailable` events and updates the corresponding network's status metadata in state when these events are published.
38
+ - This enables real-time network status updates without requiring explicit `lookupNetwork` calls, providing more accurate and timely network availability information.
39
+
40
+ ## [26.0.0]
41
+
42
+ ### Added
43
+
44
+ - Add infura supported networks ([#6972](https://github.com/MetaMask/core/pull/6972))
45
+
46
+ ### Changed
47
+
48
+ - Bump `@metamask/json-rpc-engine` from `^10.1.1` to `^10.2.0` ([#7202](https://github.com/MetaMask/core/pull/7202))
49
+ - Bump `@metamask/eth-json-rpc-provider` from `^5.0.1` to `^6.0.0` ([#7202](https://github.com/MetaMask/core/pull/7202))
50
+ - Bump `@metamask/eth-json-rpc-middleware` from `^21.0.0` to `^22.0.0` ([#7202](https://github.com/MetaMask/core/pull/7202))
51
+ - Bump `@metamask/eth-block-tracker` from `^14.0.0` to `^15.0.0` ([#7202](https://github.com/MetaMask/core/pull/7202))
52
+ - **BREAKING:** Use `InternalProvider` instead of `SafeEventEmitterProvider` ([#6796](https://github.com/MetaMask/core/pull/6796))
53
+ - Providers accessible either via network clients or global proxies no longer emit events (or inherit from EventEmitter, for that matter).
54
+ - **BREAKING:** Make `Provider` type more specific ([#7061](https://github.com/MetaMask/core/pull/7061))
55
+ - The `Provider` type is now an `InternalProvider` with a context type of `{ origin: string; skipCache: boolean } & Record<string, unknown>`.
56
+ - **BREAKING:** Stop retrying `undefined` results for methods that include a block tag parameter ([#7001](https://github.com/MetaMask/core/pull/7001))
57
+ - The network client middleware, via `@metamask/eth-json-rpc-middleware`, will now throw an error if it encounters an
58
+ `undefined` result when dispatching a request with a later block number than the originally requested block number.
59
+ - In practice, this should happen rarely if ever.
60
+ - **BREAKING:** Migrate `NetworkClient` to `JsonRpcEngineV2` ([#7065](https://github.com/MetaMask/core/pull/7065))
61
+ - This ought to be unobservable, but we mark it as breaking out of an abundance of caution.
62
+ - **BREAKING:** Update signature of `request` in `AbstractRpcService` and `RpcServiceRequestable` so that the JSON-RPC request must be frozen ([#7138](https://github.com/MetaMask/core/pull/7138))
63
+ - Bump `@metamask/controller-utils` from `^11.15.0` to `^11.16.0` ([#7003](https://github.com/MetaMask/core/pull/7003), [#7202](https://github.com/MetaMask/core/pull/7202))
64
+
65
+ ### Fixed
66
+
67
+ - Ensure `networksMetadata` never references old network client IDs ([#7047](https://github.com/MetaMask/core/pull/7047))
68
+ - When removing a network configuration, ensure that metadata for all RPC endpoints in the network configuration are also removed from `networksMetadata`
69
+ - When initializing the controller, remove metadata for RPC endpoints in `networksMetadata` that are not present in a network configuration
70
+
10
71
  ## [25.0.0]
11
72
 
12
73
  ### Changed
@@ -984,7 +1045,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
984
1045
 
985
1046
  All changes listed after this point were applied to this package following the monorepo conversion.
986
1047
 
987
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/network-controller@25.0.0...HEAD
1048
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/network-controller@27.0.0...HEAD
1049
+ [27.0.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@26.0.0...@metamask/network-controller@27.0.0
1050
+ [26.0.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@25.0.0...@metamask/network-controller@26.0.0
988
1051
  [25.0.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@24.3.1...@metamask/network-controller@25.0.0
989
1052
  [24.3.1]: https://github.com/MetaMask/core/compare/@metamask/network-controller@24.3.0...@metamask/network-controller@24.3.1
990
1053
  [24.3.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@24.2.2...@metamask/network-controller@24.3.0
@@ -81,8 +81,6 @@ var RpcEndpointType;
81
81
  * @returns The keys of an object, typed according to the type of the object
82
82
  * itself.
83
83
  */
84
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
85
- // eslint-disable-next-line @typescript-eslint/naming-convention
86
84
  function knownKeysOf(
87
85
  // TODO: Replace `any` with type
88
86
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -134,10 +132,7 @@ function getDefaultInfuraNetworkConfigurationsByChainId() {
134
132
  if (constants_1.DEPRECATED_NETWORKS.has(chainId)) {
135
133
  return obj;
136
134
  }
137
- const rpcEndpointUrl =
138
- // This ESLint rule mistakenly produces an error.
139
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
140
- `https://${infuraNetworkType}.infura.io/v3/{infuraProjectId}`;
135
+ const rpcEndpointUrl = `https://${infuraNetworkType}.infura.io/v3/{infuraProjectId}`;
141
136
  const networkConfiguration = {
142
137
  blockExplorerUrls: [],
143
138
  chainId,
@@ -337,14 +332,21 @@ function validateInitialState(state) {
337
332
  */
338
333
  function correctInitialState(state, messenger) {
339
334
  const networkConfigurationsSortedByChainId = getNetworkConfigurations(state).sort((a, b) => a.chainId.localeCompare(b.chainId));
340
- const networkClientIds = getAvailableNetworkClientIds(networkConfigurationsSortedByChainId);
335
+ const availableNetworkClientIds = getAvailableNetworkClientIds(networkConfigurationsSortedByChainId);
336
+ const invalidNetworkClientIdsWithMetadata = Object.keys(state.networksMetadata).filter((networkClientId) => !availableNetworkClientIds.includes(networkClientId));
341
337
  return (0, immer_1.produce)(state, (newState) => {
342
- if (!networkClientIds.includes(state.selectedNetworkClientId)) {
338
+ if (!availableNetworkClientIds.includes(state.selectedNetworkClientId)) {
343
339
  const firstNetworkConfiguration = networkConfigurationsSortedByChainId[0];
344
340
  const newSelectedNetworkClientId = firstNetworkConfiguration.rpcEndpoints[firstNetworkConfiguration.defaultRpcEndpointIndex].networkClientId;
345
341
  messenger.call('ErrorReportingService:captureException', new Error(`\`selectedNetworkClientId\` '${state.selectedNetworkClientId}' does not refer to an RPC endpoint within a network configuration; correcting to '${newSelectedNetworkClientId}'`));
346
342
  newState.selectedNetworkClientId = newSelectedNetworkClientId;
347
343
  }
344
+ if (invalidNetworkClientIdsWithMetadata.length > 0) {
345
+ for (const invalidNetworkClientId of invalidNetworkClientIdsWithMetadata) {
346
+ delete newState.networksMetadata[invalidNetworkClientId];
347
+ }
348
+ messenger.call('ErrorReportingService:captureException', new Error('`networksMetadata` had invalid network client IDs, which have been removed'));
349
+ }
348
350
  });
349
351
  }
350
352
  /**
@@ -427,54 +429,36 @@ class NetworkController extends base_controller_1.BaseController {
427
429
  __classPrivateFieldSet(this, _NetworkController_isRpcFailoverEnabled, isRpcFailoverEnabled, "f");
428
430
  __classPrivateFieldSet(this, _NetworkController_previouslySelectedNetworkClientId, this.state.selectedNetworkClientId, "f");
429
431
  __classPrivateFieldSet(this, _NetworkController_networkConfigurationsByNetworkClientId, buildNetworkConfigurationsByNetworkClientId(this.state.networkConfigurationsByChainId), "f");
430
- this.messenger.registerActionHandler(
431
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
432
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
433
- `${this.name}:getEthQuery`, () => {
432
+ this.messenger.registerActionHandler(`${this.name}:getEthQuery`, () => {
434
433
  return __classPrivateFieldGet(this, _NetworkController_ethQuery, "f");
435
434
  });
436
- this.messenger.registerActionHandler(
437
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
438
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
439
- `${this.name}:getNetworkClientById`, this.getNetworkClientById.bind(this));
440
- this.messenger.registerActionHandler(
441
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
442
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
443
- `${this.name}:getEIP1559Compatibility`, this.getEIP1559Compatibility.bind(this));
444
- this.messenger.registerActionHandler(
445
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
446
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
447
- `${this.name}:setActiveNetwork`, this.setActiveNetwork.bind(this));
448
- this.messenger.registerActionHandler(
449
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
450
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
451
- `${this.name}:setProviderType`, this.setProviderType.bind(this));
452
- this.messenger.registerActionHandler(
453
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
454
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
455
- `${this.name}:findNetworkClientIdByChainId`, this.findNetworkClientIdByChainId.bind(this));
456
- this.messenger.registerActionHandler(
457
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
458
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
459
- `${this.name}:getNetworkConfigurationByChainId`, this.getNetworkConfigurationByChainId.bind(this));
460
- this.messenger.registerActionHandler(
461
- // ESLint is mistaken here; `name` is a string.
462
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
463
- `${this.name}:getNetworkConfigurationByNetworkClientId`, this.getNetworkConfigurationByNetworkClientId.bind(this));
435
+ this.messenger.registerActionHandler(`${this.name}:getNetworkClientById`, this.getNetworkClientById.bind(this));
436
+ this.messenger.registerActionHandler(`${this.name}:getEIP1559Compatibility`, this.getEIP1559Compatibility.bind(this));
437
+ this.messenger.registerActionHandler(`${this.name}:setActiveNetwork`, this.setActiveNetwork.bind(this));
438
+ this.messenger.registerActionHandler(`${this.name}:setProviderType`, this.setProviderType.bind(this));
439
+ this.messenger.registerActionHandler(`${this.name}:findNetworkClientIdByChainId`, this.findNetworkClientIdByChainId.bind(this));
440
+ this.messenger.registerActionHandler(`${this.name}:getNetworkConfigurationByChainId`, this.getNetworkConfigurationByChainId.bind(this));
441
+ this.messenger.registerActionHandler(`${this.name}:getNetworkConfigurationByNetworkClientId`, this.getNetworkConfigurationByNetworkClientId.bind(this));
464
442
  this.messenger.registerActionHandler(`${this.name}:getSelectedNetworkClient`, this.getSelectedNetworkClient.bind(this));
465
443
  this.messenger.registerActionHandler(`${this.name}:getSelectedChainId`, this.getSelectedChainId.bind(this));
466
- this.messenger.registerActionHandler(
467
- // ESLint is mistaken here; `name` is a string.
468
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
469
- `${this.name}:addNetwork`, this.addNetwork.bind(this));
470
- this.messenger.registerActionHandler(
471
- // ESLint is mistaken here; `name` is a string.
472
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
473
- `${this.name}:removeNetwork`, this.removeNetwork.bind(this));
474
- this.messenger.registerActionHandler(
475
- // ESLint is mistaken here; `name` is a string.
476
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
477
- `${this.name}:updateNetwork`, this.updateNetwork.bind(this));
444
+ this.messenger.registerActionHandler(`${this.name}:addNetwork`, this.addNetwork.bind(this));
445
+ this.messenger.registerActionHandler(`${this.name}:removeNetwork`, this.removeNetwork.bind(this));
446
+ this.messenger.registerActionHandler(`${this.name}:updateNetwork`, this.updateNetwork.bind(this));
447
+ this.messenger.subscribe(`${this.name}:rpcEndpointChainUnavailable`, ({ networkClientId }) => {
448
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, networkClientId, {
449
+ networkStatus: constants_1.NetworkStatus.Unavailable,
450
+ });
451
+ });
452
+ this.messenger.subscribe(`${this.name}:rpcEndpointChainDegraded`, ({ networkClientId }) => {
453
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, networkClientId, {
454
+ networkStatus: constants_1.NetworkStatus.Degraded,
455
+ });
456
+ });
457
+ this.messenger.subscribe(`${this.name}:rpcEndpointChainAvailable`, ({ networkClientId }) => {
458
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, networkClientId, {
459
+ networkStatus: constants_1.NetworkStatus.Available,
460
+ });
461
+ });
478
462
  }
479
463
  /**
480
464
  * Enables the RPC failover functionality. That is, if any RPC endpoints are
@@ -494,6 +478,7 @@ class NetworkController extends base_controller_1.BaseController {
494
478
  }
495
479
  /**
496
480
  * Accesses the provider and block tracker for the currently selected network.
481
+ *
497
482
  * @returns The proxy and block tracker proxies.
498
483
  * @deprecated This method has been replaced by `getSelectedNetworkClient` (which has a more easily used return type) and will be removed in a future release.
499
484
  */
@@ -549,19 +534,13 @@ class NetworkController extends base_controller_1.BaseController {
549
534
  // This is impossible to reach
550
535
  /* istanbul ignore if */
551
536
  if (!infuraNetworkClient) {
552
- throw new Error(
553
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
554
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
555
- `No Infura network client was found with the ID "${networkClientId}".`);
537
+ throw new Error(`No Infura network client was found with the ID "${networkClientId}".`);
556
538
  }
557
539
  return infuraNetworkClient;
558
540
  }
559
541
  const customNetworkClient = autoManagedNetworkClientRegistry[types_1.NetworkClientType.Custom][networkClientId];
560
542
  if (!customNetworkClient) {
561
- throw new Error(
562
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
563
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
564
- `No custom network client was found with the ID "${networkClientId}".`);
543
+ throw new Error(`No custom network client was found with the ID "${networkClientId}".`);
565
544
  }
566
545
  return customNetworkClient;
567
546
  }
@@ -620,10 +599,7 @@ class NetworkController extends base_controller_1.BaseController {
620
599
  */
621
600
  async setProviderType(type) {
622
601
  if (type === controller_utils_1.NetworkType.rpc) {
623
- throw new Error(
624
- // This ESLint rule mistakenly produces an error.
625
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
626
- `NetworkController - cannot call "setProviderType" with type "${controller_utils_1.NetworkType.rpc}". Use "setActiveNetwork"`);
602
+ throw new Error(`NetworkController - cannot call "setProviderType" with type "${controller_utils_1.NetworkType.rpc}". Use "setActiveNetwork"`);
627
603
  }
628
604
  if (!(0, controller_utils_1.isInfuraNetworkType)(type)) {
629
605
  throw new Error(`Unknown Infura provider type "${String(type)}".`);
@@ -916,10 +892,7 @@ class NetworkController extends base_controller_1.BaseController {
916
892
  networkClientOperation.oldRpcEndpoint.networkClientId ===
917
893
  this.state.selectedNetworkClientId);
918
894
  })) {
919
- throw new Error(
920
- // This ESLint rule mistakenly produces an error.
921
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
922
- `Could not update network: Cannot update RPC endpoints in such a way that the selected network '${this.state.selectedNetworkClientId}' would be removed without a replacement. Choose a different RPC endpoint as the selected network via the \`replacementSelectedRpcEndpointIndex\` option.`);
895
+ throw new Error(`Could not update network: Cannot update RPC endpoints in such a way that the selected network '${this.state.selectedNetworkClientId}' would be removed without a replacement. Choose a different RPC endpoint as the selected network via the \`replacementSelectedRpcEndpointIndex\` option.`);
923
896
  }
924
897
  __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_registerNetworkClientsAsNeeded).call(this, {
925
898
  networkFields: fields,
@@ -1008,6 +981,9 @@ class NetworkController extends base_controller_1.BaseController {
1008
981
  mode: 'remove',
1009
982
  existingNetworkConfiguration,
1010
983
  });
984
+ for (const rpcEndpoint of existingNetworkConfiguration.rpcEndpoints) {
985
+ delete state.networksMetadata[rpcEndpoint.networkClientId];
986
+ }
1011
987
  });
1012
988
  this.messenger.publish('NetworkController:networkRemoved', existingNetworkConfiguration);
1013
989
  }
@@ -1026,6 +1002,8 @@ class NetworkController extends base_controller_1.BaseController {
1026
1002
  *
1027
1003
  * In-progress requests will not be aborted.
1028
1004
  */
1005
+ // We're intentionally changing the signature of an extended method.
1006
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
1029
1007
  async destroy() {
1030
1008
  await __classPrivateFieldGet(this, _NetworkController_blockTrackerProxy, "f")?.destroy();
1031
1009
  }
@@ -1181,7 +1159,10 @@ async function _NetworkController_determineNetworkMetadata(networkClientId) {
1181
1159
  */
1182
1160
  async function _NetworkController_lookupGivenNetwork(networkClientId) {
1183
1161
  const { networkStatus, isEIP1559Compatible } = await __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_determineNetworkMetadata).call(this, networkClientId);
1184
- __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, networkClientId, networkStatus, isEIP1559Compatible);
1162
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, networkClientId, {
1163
+ networkStatus,
1164
+ isEIP1559Compatible,
1165
+ });
1185
1166
  }, _NetworkController_lookupSelectedNetwork =
1186
1167
  /**
1187
1168
  * Uses a request for the latest block to gather the following information on
@@ -1241,7 +1222,10 @@ async function _NetworkController_lookupSelectedNetwork() {
1241
1222
  throw error;
1242
1223
  }
1243
1224
  }
1244
- __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, this.state.selectedNetworkClientId, networkStatus, isEIP1559Compatible);
1225
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, this.state.selectedNetworkClientId, {
1226
+ networkStatus,
1227
+ isEIP1559Compatible,
1228
+ });
1245
1229
  if (isInfura) {
1246
1230
  if (networkStatus === constants_1.NetworkStatus.Available) {
1247
1231
  this.messenger.publish('NetworkController:infuraIsUnblocked');
@@ -1256,7 +1240,7 @@ async function _NetworkController_lookupSelectedNetwork() {
1256
1240
  // previously connected to an Infura network that was blocked
1257
1241
  this.messenger.publish('NetworkController:infuraIsUnblocked');
1258
1242
  }
1259
- }, _NetworkController_updateMetadataForNetwork = function _NetworkController_updateMetadataForNetwork(networkClientId, networkStatus, isEIP1559Compatible) {
1243
+ }, _NetworkController_updateMetadataForNetwork = function _NetworkController_updateMetadataForNetwork(networkClientId, metadata) {
1260
1244
  this.update((state) => {
1261
1245
  if (state.networksMetadata[networkClientId] === undefined) {
1262
1246
  state.networksMetadata[networkClientId] = {
@@ -1264,13 +1248,15 @@ async function _NetworkController_lookupSelectedNetwork() {
1264
1248
  EIPS: {},
1265
1249
  };
1266
1250
  }
1267
- const meta = state.networksMetadata[networkClientId];
1268
- meta.status = networkStatus;
1269
- if (isEIP1559Compatible === undefined) {
1270
- delete meta.EIPS[1559];
1271
- }
1272
- else {
1273
- meta.EIPS[1559] = isEIP1559Compatible;
1251
+ const newMetadata = state.networksMetadata[networkClientId];
1252
+ newMetadata.status = metadata.networkStatus;
1253
+ if ('isEIP1559Compatible' in metadata) {
1254
+ if (metadata.isEIP1559Compatible === undefined) {
1255
+ delete newMetadata.EIPS[1559];
1256
+ }
1257
+ else {
1258
+ newMetadata.EIPS[1559] = metadata.isEIP1559Compatible;
1259
+ }
1274
1260
  }
1275
1261
  });
1276
1262
  }, _NetworkController_getLatestBlock = function _NetworkController_getLatestBlock(networkClientId) {
@@ -1282,6 +1268,8 @@ async function _NetworkController_lookupSelectedNetwork() {
1282
1268
  return new Promise((resolve, reject) => {
1283
1269
  ethQuery.sendAsync({ method: 'eth_getBlockByNumber', params: ['latest', false] }, (error, block) => {
1284
1270
  if (error) {
1271
+ // This error comes from JsonRpcEngine, we don't control it.
1272
+ // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
1285
1273
  reject(error);
1286
1274
  }
1287
1275
  else {
@@ -1321,16 +1309,10 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1321
1309
  const existingNetworkConfigurationViaChainId = this.state.networkConfigurationsByChainId[networkFields.chainId];
1322
1310
  if (existingNetworkConfigurationViaChainId !== undefined) {
1323
1311
  if (existingNetworkConfiguration === null) {
1324
- throw new Error(
1325
- // This ESLint rule mistakenly produces an error.
1326
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1327
- `Could not add network for chain ${args.networkFields.chainId} as another network for that chain already exists ('${existingNetworkConfigurationViaChainId.name}')`);
1312
+ throw new Error(`Could not add network for chain ${args.networkFields.chainId} as another network for that chain already exists ('${existingNetworkConfigurationViaChainId.name}')`);
1328
1313
  }
1329
1314
  else {
1330
- throw new Error(
1331
- // This ESLint rule mistakenly produces an error.
1332
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1333
- `Cannot move network from chain ${existingNetworkConfiguration.chainId} to ${networkFields.chainId} as another network for that chain already exists ('${existingNetworkConfigurationViaChainId.name}')`);
1315
+ throw new Error(`Cannot move network from chain ${existingNetworkConfiguration.chainId} to ${networkFields.chainId} as another network for that chain already exists ('${existingNetworkConfigurationViaChainId.name}')`);
1334
1316
  }
1335
1317
  }
1336
1318
  }
@@ -1346,10 +1328,7 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1346
1328
  }
1347
1329
  for (const rpcEndpointFields of networkFields.rpcEndpoints) {
1348
1330
  if (!isValidUrl(rpcEndpointFields.url)) {
1349
- throw new Error(
1350
- // This ESLint rule mistakenly produces an error.
1351
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1352
- `${errorMessagePrefix}: An entry in \`rpcEndpoints\` has invalid URL '${rpcEndpointFields.url}'`);
1331
+ throw new Error(`${errorMessagePrefix}: An entry in \`rpcEndpoints\` has invalid URL '${rpcEndpointFields.url}'`);
1353
1332
  }
1354
1333
  const networkClientId = 'networkClientId' in rpcEndpointFields
1355
1334
  ? rpcEndpointFields.networkClientId
@@ -1357,19 +1336,13 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1357
1336
  if (rpcEndpointFields.type === RpcEndpointType.Custom &&
1358
1337
  networkClientId !== undefined &&
1359
1338
  (0, controller_utils_1.isInfuraNetworkType)(networkClientId)) {
1360
- throw new Error(
1361
- // This is a string.
1362
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1363
- `${errorMessagePrefix}: Custom RPC endpoint '${rpcEndpointFields.url}' has invalid network client ID '${networkClientId}'`);
1339
+ throw new Error(`${errorMessagePrefix}: Custom RPC endpoint '${rpcEndpointFields.url}' has invalid network client ID '${networkClientId}'`);
1364
1340
  }
1365
1341
  if (mode === 'update' &&
1366
1342
  networkClientId !== undefined &&
1367
1343
  rpcEndpointFields.type === RpcEndpointType.Custom &&
1368
1344
  !Object.values(autoManagedNetworkClientRegistry).some((networkClientsById) => networkClientId in networkClientsById)) {
1369
- throw new Error(
1370
- // This is a string.
1371
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1372
- `${errorMessagePrefix}: RPC endpoint '${rpcEndpointFields.url}' refers to network client '${networkClientId}' that does not exist`);
1345
+ throw new Error(`${errorMessagePrefix}: RPC endpoint '${rpcEndpointFields.url}' refers to network client '${networkClientId}' that does not exist`);
1373
1346
  }
1374
1347
  if (networkFields.rpcEndpoints.some((otherRpcEndpointFields) => otherRpcEndpointFields !== rpcEndpointFields &&
1375
1348
  URI.equal(otherRpcEndpointFields.url, rpcEndpointFields.url))) {
@@ -1383,16 +1356,10 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1383
1356
  const rpcEndpoint = networkConfiguration.rpcEndpoints.find((existingRpcEndpoint) => URI.equal(rpcEndpointFields.url, existingRpcEndpoint.url));
1384
1357
  if (rpcEndpoint) {
1385
1358
  if (mode === 'update') {
1386
- throw new Error(
1387
- // This ESLint rule mistakenly produces an error.
1388
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1389
- `Could not update network to point to same RPC endpoint as existing network for chain ${networkConfiguration.chainId} ('${networkConfiguration.name}')`);
1359
+ throw new Error(`Could not update network to point to same RPC endpoint as existing network for chain ${networkConfiguration.chainId} ('${networkConfiguration.name}')`);
1390
1360
  }
1391
1361
  else {
1392
- throw new Error(
1393
- // This ESLint rule mistakenly produces an error.
1394
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1395
- `Could not add network that points to same RPC endpoint as existing network for chain ${networkConfiguration.chainId} ('${networkConfiguration.name}')`);
1362
+ throw new Error(`Could not add network that points to same RPC endpoint as existing network for chain ${networkConfiguration.chainId} ('${networkConfiguration.name}')`);
1396
1363
  }
1397
1364
  }
1398
1365
  }
@@ -1420,12 +1387,8 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1420
1387
  const infuraChainId = controller_utils_1.ChainId[infuraNetworkName];
1421
1388
  if (networkFields.chainId !== infuraChainId) {
1422
1389
  throw new Error(mode === 'add'
1423
- ? // This is a string.
1424
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1425
- `Could not add network with chain ID ${networkFields.chainId} and Infura RPC endpoint for '${infuraNetworkNickname}' which represents ${infuraChainId}, as the two conflict`
1426
- : // This is a string.
1427
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1428
- `Could not update network with chain ID ${networkFields.chainId} and Infura RPC endpoint for '${infuraNetworkNickname}' which represents ${infuraChainId}, as the two conflict`);
1390
+ ? `Could not add network with chain ID ${networkFields.chainId} and Infura RPC endpoint for '${infuraNetworkNickname}' which represents ${infuraChainId}, as the two conflict`
1391
+ : `Could not update network with chain ID ${networkFields.chainId} and Infura RPC endpoint for '${infuraNetworkNickname}' which represents ${infuraChainId}, as the two conflict`);
1429
1392
  }
1430
1393
  }
1431
1394
  if (networkFields.rpcEndpoints[networkFields.defaultRpcEndpointIndex] ===
@@ -1459,6 +1422,7 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1459
1422
  for (const addedRpcEndpoint of addedRpcEndpoints) {
1460
1423
  if (addedRpcEndpoint.type === RpcEndpointType.Infura) {
1461
1424
  autoManagedNetworkClientRegistry[types_1.NetworkClientType.Infura][addedRpcEndpoint.networkClientId] = (0, create_auto_managed_network_client_1.createAutoManagedNetworkClient)({
1425
+ networkClientId: addedRpcEndpoint.networkClientId,
1462
1426
  networkClientConfiguration: {
1463
1427
  type: types_1.NetworkClientType.Infura,
1464
1428
  chainId: networkFields.chainId,
@@ -1476,6 +1440,7 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1476
1440
  }
1477
1441
  else {
1478
1442
  autoManagedNetworkClientRegistry[types_1.NetworkClientType.Custom][addedRpcEndpoint.networkClientId] = (0, create_auto_managed_network_client_1.createAutoManagedNetworkClient)({
1443
+ networkClientId: addedRpcEndpoint.networkClientId,
1479
1444
  networkClientConfiguration: {
1480
1445
  type: types_1.NetworkClientType.Custom,
1481
1446
  chainId: networkFields.chainId,
@@ -1535,6 +1500,7 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1535
1500
  return [
1536
1501
  rpcEndpoint.networkClientId,
1537
1502
  (0, create_auto_managed_network_client_1.createAutoManagedNetworkClient)({
1503
+ networkClientId: rpcEndpoint.networkClientId,
1538
1504
  networkClientConfiguration: {
1539
1505
  type: types_1.NetworkClientType.Infura,
1540
1506
  network: infuraNetworkName,
@@ -1554,6 +1520,7 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1554
1520
  return [
1555
1521
  rpcEndpoint.networkClientId,
1556
1522
  (0, create_auto_managed_network_client_1.createAutoManagedNetworkClient)({
1523
+ networkClientId: rpcEndpoint.networkClientId,
1557
1524
  networkClientConfiguration: {
1558
1525
  type: types_1.NetworkClientType.Custom,
1559
1526
  chainId: networkConfiguration.chainId,
@@ -1616,13 +1583,15 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1616
1583
  __classPrivateFieldGet(this, _NetworkController_providerProxy, "f").setTarget(__classPrivateFieldGet(this, _NetworkController_autoManagedNetworkClient, "f").provider);
1617
1584
  }
1618
1585
  else {
1619
- __classPrivateFieldSet(this, _NetworkController_providerProxy, (0, swappable_obj_proxy_1.createEventEmitterProxy)(__classPrivateFieldGet(this, _NetworkController_autoManagedNetworkClient, "f").provider), "f");
1586
+ __classPrivateFieldSet(this, _NetworkController_providerProxy, (0, swappable_obj_proxy_1.createSwappableProxy)(__classPrivateFieldGet(this, _NetworkController_autoManagedNetworkClient, "f").provider), "f");
1620
1587
  }
1621
1588
  if (__classPrivateFieldGet(this, _NetworkController_blockTrackerProxy, "f")) {
1622
1589
  __classPrivateFieldGet(this, _NetworkController_blockTrackerProxy, "f").setTarget(__classPrivateFieldGet(this, _NetworkController_autoManagedNetworkClient, "f").blockTracker);
1623
1590
  }
1624
1591
  else {
1625
- __classPrivateFieldSet(this, _NetworkController_blockTrackerProxy, (0, swappable_obj_proxy_1.createEventEmitterProxy)(__classPrivateFieldGet(this, _NetworkController_autoManagedNetworkClient, "f").blockTracker, { eventFilter: 'skipInternal' }), "f");
1592
+ __classPrivateFieldSet(this, _NetworkController_blockTrackerProxy, (0, swappable_obj_proxy_1.createEventEmitterProxy)(__classPrivateFieldGet(this, _NetworkController_autoManagedNetworkClient, "f").blockTracker, {
1593
+ eventFilter: 'skipInternal',
1594
+ }), "f");
1626
1595
  }
1627
1596
  __classPrivateFieldSet(this, _NetworkController_ethQuery, new eth_query_1.default(__classPrivateFieldGet(this, _NetworkController_providerProxy, "f")), "f");
1628
1597
  };