@metamask/network-controller 17.0.0 → 17.2.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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [17.2.0]
10
+ ### Changed
11
+ - The `setActiveNetwork` method and action now supports built-in network types ([#3764](https://github.com/MetaMask/core/pull/3764))
12
+ - Previously this would only accept a network configuration ID. Now it will accept the type of a built-in network as well, using it like an ID. This lets you switch to a built-in or custom network with a single method/action.
13
+ - Deprecate the `setProviderType` method and action ([#3764](https://github.com/MetaMask/core/pull/3764))
14
+ - Use `setActiveNetwork` instead
15
+ - Bump `@metamask/swappable-obj-proxy` to `^2.2.0` ([#3784](https://github.com/MetaMask/core/pull/3784))
16
+ - Bump `@metamask/utils` to `^8.3.0` ([#3769](https://github.com/MetaMask/core/pull/3769))
17
+ - Bump `@metamask/base-controller` to `^4.1.1` ([#3760](https://github.com/MetaMask/core/pull/3760), [#3821](https://github.com/MetaMask/core/pull/3821))
18
+ - Bump `@metamask/controller-utils` to `^8.0.2` ([#3821](https://github.com/MetaMask/core/pull/3821))
19
+ - Bump `@metamask/eth-json-rpc-provider` to `^2.3.2` ([#3821](https://github.com/MetaMask/core/pull/3821))
20
+ - Bump `@metamask/json-rpc-engine` to `^7.3.2` ([#3821](https://github.com/MetaMask/core/pull/3821))
21
+
22
+ ## [17.1.0]
23
+ ### Added
24
+ - Add `getNetworkConfigurationByNetworkClientId` method which can be used to retrieve details for both custom and built-in networks (using the network configuration object shape) ([#2055](https://github.com/MetaMask/core/pull/2055))
25
+ - Add `NetworkController:getNetworkConfigurationByNetworkClientId` messenger action for the previous method ([#2055](https://github.com/MetaMask/core/pull/2055))
26
+
27
+ ### Changed
28
+ - Bump `@metamask/base-controller` to `^4.0.1` ([#3695](https://github.com/MetaMask/core/pull/3695))
29
+ - Bump `@metamask/controller-utils` to `^8.0.1` ([#3695](https://github.com/MetaMask/core/pull/3695), [#3678](https://github.com/MetaMask/core/pull/3678), [#3667](https://github.com/MetaMask/core/pull/3667), [#3580](https://github.com/MetaMask/core/pull/3580))
30
+ - Bump `@metamask/eth-json-rpc-provider` to `^2.3.1` ([#3695](https://github.com/MetaMask/core/pull/3695))
31
+ - Bump `@metamask/json-rpc-engine` to `^7.3.1` ([#3695](https://github.com/MetaMask/core/pull/3695))
32
+ - Create new network clients before updating `networkConfigurations` state ([#3679](https://github.com/MetaMask/core/pull/3679))
33
+ - This primarily affects subscribers to the `NetworkController:stateChange` event. It's now safe to use a network client for any network that appears in the `networkConfigurations` state, whereas previously it was possible that synchronous attempts to access a network client in response to this event would fail.
34
+ - Add `NetworkState` payload to `NetworkController:networkWillChange` and `NetworkController:networkDidChange` ([#3598](https://github.com/MetaMask/core/pull/3598))
35
+ - Both of these events now include `NetworkState` as the first and only item in the payload
36
+
9
37
  ## [17.0.0]
10
38
  ### Changed
11
39
  - **BREAKING:** Bump `@metamask/base-controller` to ^4.0.0 ([#2063](https://github.com/MetaMask/core/pull/2063))
@@ -315,7 +343,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
315
343
 
316
344
  All changes listed after this point were applied to this package following the monorepo conversion.
317
345
 
318
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/network-controller@17.0.0...HEAD
346
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/network-controller@17.2.0...HEAD
347
+ [17.2.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@17.1.0...@metamask/network-controller@17.2.0
348
+ [17.1.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@17.0.0...@metamask/network-controller@17.1.0
319
349
  [17.0.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@16.0.0...@metamask/network-controller@17.0.0
320
350
  [16.0.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@15.2.0...@metamask/network-controller@16.0.0
321
351
  [15.2.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@15.1.0...@metamask/network-controller@15.2.0
@@ -142,7 +142,7 @@ export declare type NetworkControllerStateChangeEvent = ControllerStateChangeEve
142
142
  */
143
143
  export declare type NetworkControllerNetworkWillChangeEvent = {
144
144
  type: 'NetworkController:networkWillChange';
145
- payload: [];
145
+ payload: [NetworkState];
146
146
  };
147
147
  /**
148
148
  * `networkDidChange` is published after a provider has been created for a newly
@@ -150,7 +150,7 @@ export declare type NetworkControllerNetworkWillChangeEvent = {
150
150
  */
151
151
  export declare type NetworkControllerNetworkDidChangeEvent = {
152
152
  type: 'NetworkController:networkDidChange';
153
- payload: [];
153
+ payload: [NetworkState];
154
154
  };
155
155
  /**
156
156
  * `infuraIsBlocked` is published after the network is switched to an Infura
@@ -192,6 +192,12 @@ export declare type NetworkControllerFindNetworkClientIdByChainIdAction = {
192
192
  type: `NetworkController:findNetworkClientIdByChainId`;
193
193
  handler: NetworkController['findNetworkClientIdByChainId'];
194
194
  };
195
+ /**
196
+ * Change the currently selected network to the given built-in network type.
197
+ *
198
+ * @deprecated This action has been replaced by `setActiveNetwork`, and will be
199
+ * removed in a future release.
200
+ */
195
201
  export declare type NetworkControllerSetProviderTypeAction = {
196
202
  type: `NetworkController:setProviderType`;
197
203
  handler: NetworkController['setProviderType'];
@@ -200,7 +206,11 @@ export declare type NetworkControllerSetActiveNetworkAction = {
200
206
  type: `NetworkController:setActiveNetwork`;
201
207
  handler: NetworkController['setActiveNetwork'];
202
208
  };
203
- export declare type NetworkControllerActions = NetworkControllerGetStateAction | NetworkControllerGetProviderConfigAction | NetworkControllerGetEthQueryAction | NetworkControllerGetNetworkClientByIdAction | NetworkControllerGetEIP1559CompatibilityAction | NetworkControllerFindNetworkClientIdByChainIdAction | NetworkControllerSetActiveNetworkAction | NetworkControllerSetProviderTypeAction;
209
+ export declare type NetworkControllerGetNetworkConfigurationByNetworkClientId = {
210
+ type: `NetworkController:getNetworkConfigurationByNetworkClientId`;
211
+ handler: NetworkController['getNetworkConfigurationByNetworkClientId'];
212
+ };
213
+ export declare type NetworkControllerActions = NetworkControllerGetStateAction | NetworkControllerGetProviderConfigAction | NetworkControllerGetEthQueryAction | NetworkControllerGetNetworkClientByIdAction | NetworkControllerGetEIP1559CompatibilityAction | NetworkControllerFindNetworkClientIdByChainIdAction | NetworkControllerSetActiveNetworkAction | NetworkControllerSetProviderTypeAction | NetworkControllerGetNetworkConfigurationByNetworkClientId;
204
214
  export declare type NetworkControllerMessenger = RestrictedControllerMessenger<typeof name, NetworkControllerActions, NetworkControllerEvents, string, string>;
205
215
  export declare type NetworkControllerOptions = {
206
216
  messenger: NetworkControllerMessenger;
@@ -288,14 +298,17 @@ export declare class NetworkController extends BaseController<typeof name, Netwo
288
298
  * Convenience method to update provider network type settings.
289
299
  *
290
300
  * @param type - Human readable network name.
301
+ * @deprecated This has been replaced by `setActiveNetwork`, and will be
302
+ * removed in a future release
291
303
  */
292
304
  setProviderType(type: InfuraNetworkType): Promise<void>;
293
305
  /**
294
306
  * Convenience method to update provider RPC settings.
295
307
  *
296
- * @param networkConfigurationId - The unique id for the network configuration to set as the active provider.
308
+ * @param networkConfigurationIdOrType - The unique id for the network configuration to set as the active provider,
309
+ * or the type of a built-in network.
297
310
  */
298
- setActiveNetwork(networkConfigurationId: string): Promise<void>;
311
+ setActiveNetwork(networkConfigurationIdOrType: string): Promise<void>;
299
312
  /**
300
313
  * Determines whether the network supports EIP-1559 by checking whether the
301
314
  * latest block has a `baseFeePerGas` property, then updates state
@@ -311,6 +324,17 @@ export declare class NetworkController extends BaseController<typeof name, Netwo
311
324
  * Re-initializes the provider and block tracker for the current network.
312
325
  */
313
326
  resetConnection(): Promise<void>;
327
+ /**
328
+ * Returns a configuration object for the network identified by the given
329
+ * network client ID. If given an Infura network type, constructs one based on
330
+ * what we know about the network; otherwise attempts locates a network
331
+ * configuration in state that corresponds to the network client ID.
332
+ *
333
+ * @param networkClientId - The network client ID.
334
+ * @returns The configuration for the referenced network if one exists, or
335
+ * undefined otherwise.
336
+ */
337
+ getNetworkConfigurationByNetworkClientId(networkClientId: NetworkClientId): NetworkConfiguration | undefined;
314
338
  /**
315
339
  * Adds a new custom network or updates the information for an existing
316
340
  * network.
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkController.d.ts","sourceRoot":"","sources":["../src/NetworkController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NetworkController.d.ts","sourceRoot":"","sources":["../src/NetworkController.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
22
22
  var __importDefault = (this && this.__importDefault) || function (mod) {
23
23
  return (mod && mod.__esModule) ? mod : { "default": mod };
24
24
  };
25
- var _NetworkController_instances, _NetworkController_ethQuery, _NetworkController_infuraProjectId, _NetworkController_trackMetaMetricsEvent, _NetworkController_previousProviderConfig, _NetworkController_providerProxy, _NetworkController_provider, _NetworkController_blockTrackerProxy, _NetworkController_autoManagedNetworkClientRegistry, _NetworkController_refreshNetwork, _NetworkController_getLatestBlock, _NetworkController_determineEIP1559Compatibility, _NetworkController_ensureAutoManagedNetworkClientRegistryPopulated, _NetworkController_createAutoManagedNetworkClientRegistry, _NetworkController_buildIdentifiedInfuraNetworkClientConfigurations, _NetworkController_buildIdentifiedCustomNetworkClientConfigurations, _NetworkController_buildIdentifiedNetworkClientConfigurationsFromProviderConfig, _NetworkController_applyNetworkSelection;
25
+ var _NetworkController_instances, _NetworkController_ethQuery, _NetworkController_infuraProjectId, _NetworkController_trackMetaMetricsEvent, _NetworkController_previousProviderConfig, _NetworkController_providerProxy, _NetworkController_blockTrackerProxy, _NetworkController_autoManagedNetworkClientRegistry, _NetworkController_refreshNetwork, _NetworkController_getLatestBlock, _NetworkController_determineEIP1559Compatibility, _NetworkController_ensureAutoManagedNetworkClientRegistryPopulated, _NetworkController_createAutoManagedNetworkClientRegistry, _NetworkController_buildIdentifiedInfuraNetworkClientConfigurations, _NetworkController_buildIdentifiedCustomNetworkClientConfigurations, _NetworkController_buildIdentifiedNetworkClientConfigurationsFromProviderConfig, _NetworkController_applyNetworkSelection;
26
26
  Object.defineProperty(exports, "__esModule", { value: true });
27
27
  exports.NetworkController = exports.defaultState = exports.knownKeysOf = void 0;
28
28
  const base_controller_1 = require("@metamask/base-controller");
@@ -51,7 +51,10 @@ const log = (0, logger_1.createModuleLogger)(logger_1.projectLogger, 'NetworkCon
51
51
  * @returns The keys of an object, typed according to the type of the object
52
52
  * itself.
53
53
  */
54
- function knownKeysOf(object) {
54
+ function knownKeysOf(
55
+ // TODO: Replace `any` with type
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ object) {
55
58
  return Object.keys(object);
56
59
  }
57
60
  exports.knownKeysOf = knownKeysOf;
@@ -77,6 +80,8 @@ function assertOfType(value, validate, message) {
77
80
  * @param keys - The keys to pick from the object.
78
81
  * @returns the portion of the object.
79
82
  */
83
+ // TODO: Replace `any` with type
84
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
85
  function pick(object, keys) {
81
86
  const pickedObject = keys.reduce((finalObject, key) => {
82
87
  return Object.assign(Object.assign({}, finalObject), { [key]: object[key] });
@@ -96,17 +101,6 @@ function pick(object, keys) {
96
101
  function isErrorWithCode(error) {
97
102
  return typeof error === 'object' && error !== null && 'code' in error;
98
103
  }
99
- /**
100
- * Returns whether the given argument is a type that our Infura middleware
101
- * recognizes.
102
- *
103
- * @param type - A type to compare.
104
- * @returns True or false, depending on whether the given type is one that our
105
- * Infura middleware recognizes.
106
- */
107
- function isInfuraProviderType(type) {
108
- return Object.keys(controller_utils_1.InfuraNetworkType).includes(type);
109
- }
110
104
  /**
111
105
  * Builds an identifier for an Infura network client for lookup purposes.
112
106
  *
@@ -152,7 +146,7 @@ function buildCustomNetworkClientId(...args) {
152
146
  * otherwise.
153
147
  */
154
148
  function isInfuraProviderConfig(providerConfig) {
155
- return isInfuraProviderType(providerConfig.type);
149
+ return (0, controller_utils_1.isInfuraNetworkType)(providerConfig.type);
156
150
  }
157
151
  /**
158
152
  * Returns whether the given provider config refers to an Infura network.
@@ -232,7 +226,6 @@ class NetworkController extends base_controller_1.BaseController {
232
226
  _NetworkController_trackMetaMetricsEvent.set(this, void 0);
233
227
  _NetworkController_previousProviderConfig.set(this, void 0);
234
228
  _NetworkController_providerProxy.set(this, void 0);
235
- _NetworkController_provider.set(this, void 0);
236
229
  _NetworkController_blockTrackerProxy.set(this, void 0);
237
230
  _NetworkController_autoManagedNetworkClientRegistry.set(this, void 0);
238
231
  if (!infuraProjectId || typeof infuraProjectId !== 'string') {
@@ -251,6 +244,7 @@ class NetworkController extends base_controller_1.BaseController {
251
244
  this.messagingSystem.registerActionHandler(`${this.name}:setActiveNetwork`, this.setActiveNetwork.bind(this));
252
245
  this.messagingSystem.registerActionHandler(`${this.name}:setProviderType`, this.setProviderType.bind(this));
253
246
  this.messagingSystem.registerActionHandler(`${this.name}:findNetworkClientIdByChainId`, this.findNetworkClientIdByChainId.bind(this));
247
+ this.messagingSystem.registerActionHandler(`${this.name}:getNetworkConfigurationByNetworkClientId`, this.getNetworkConfigurationByNetworkClientId.bind(this));
254
248
  __classPrivateFieldSet(this, _NetworkController_previousProviderConfig, this.state.providerConfig, "f");
255
249
  }
256
250
  /**
@@ -281,7 +275,7 @@ class NetworkController extends base_controller_1.BaseController {
281
275
  throw new Error('No network client ID was provided.');
282
276
  }
283
277
  const autoManagedNetworkClientRegistry = __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_ensureAutoManagedNetworkClientRegistryPopulated).call(this);
284
- if (isInfuraProviderType(networkClientId)) {
278
+ if ((0, controller_utils_1.isInfuraNetworkType)(networkClientId)) {
285
279
  const infuraNetworkClient = autoManagedNetworkClientRegistry[types_1.NetworkClientType.Infura][networkClientId];
286
280
  if (!infuraNetworkClient) {
287
281
  throw new Error(`No Infura network client was found with the ID "${networkClientId}".`);
@@ -313,7 +307,7 @@ class NetworkController extends base_controller_1.BaseController {
313
307
  */
314
308
  lookupNetworkByClientId(networkClientId) {
315
309
  return __awaiter(this, void 0, void 0, function* () {
316
- const isInfura = isInfuraProviderType(networkClientId);
310
+ const isInfura = (0, controller_utils_1.isInfuraNetworkType)(networkClientId);
317
311
  let updatedNetworkStatus;
318
312
  let updatedIsEIP1559Compatible;
319
313
  try {
@@ -474,50 +468,47 @@ class NetworkController extends base_controller_1.BaseController {
474
468
  * Convenience method to update provider network type settings.
475
469
  *
476
470
  * @param type - Human readable network name.
471
+ * @deprecated This has been replaced by `setActiveNetwork`, and will be
472
+ * removed in a future release
477
473
  */
478
474
  setProviderType(type) {
479
475
  return __awaiter(this, void 0, void 0, function* () {
480
476
  assert_1.strict.notStrictEqual(type, controller_utils_1.NetworkType.rpc, `NetworkController - cannot call "setProviderType" with type "${controller_utils_1.NetworkType.rpc}". Use "setActiveNetwork"`);
481
- assert_1.strict.ok(isInfuraProviderType(type), `Unknown Infura provider type "${type}".`);
482
- __classPrivateFieldSet(this, _NetworkController_previousProviderConfig, this.state.providerConfig, "f");
483
- // If testnet the ticker symbol should use a testnet prefix
484
- const ticker = type in controller_utils_1.NetworksTicker && controller_utils_1.NetworksTicker[type].length > 0
485
- ? controller_utils_1.NetworksTicker[type]
486
- : 'ETH';
487
- __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_ensureAutoManagedNetworkClientRegistryPopulated).call(this);
488
- this.update((state) => {
489
- state.providerConfig.type = type;
490
- state.providerConfig.ticker = ticker;
491
- state.providerConfig.chainId = controller_utils_1.ChainId[type];
492
- state.providerConfig.rpcPrefs = controller_utils_1.BUILT_IN_NETWORKS[type].rpcPrefs;
493
- state.providerConfig.rpcUrl = undefined;
494
- state.providerConfig.nickname = undefined;
495
- state.providerConfig.id = undefined;
496
- });
497
- yield __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_refreshNetwork).call(this);
477
+ assert_1.strict.ok((0, controller_utils_1.isInfuraNetworkType)(type), `Unknown Infura provider type "${type}".`);
478
+ yield this.setActiveNetwork(type);
498
479
  });
499
480
  }
500
481
  /**
501
482
  * Convenience method to update provider RPC settings.
502
483
  *
503
- * @param networkConfigurationId - The unique id for the network configuration to set as the active provider.
484
+ * @param networkConfigurationIdOrType - The unique id for the network configuration to set as the active provider,
485
+ * or the type of a built-in network.
504
486
  */
505
- setActiveNetwork(networkConfigurationId) {
487
+ setActiveNetwork(networkConfigurationIdOrType) {
506
488
  return __awaiter(this, void 0, void 0, function* () {
507
489
  __classPrivateFieldSet(this, _NetworkController_previousProviderConfig, this.state.providerConfig, "f");
508
- const targetNetwork = this.state.networkConfigurations[networkConfigurationId];
509
- if (!targetNetwork) {
510
- throw new Error(`networkConfigurationId ${networkConfigurationId} does not match a configured networkConfiguration`);
490
+ let targetNetwork;
491
+ if ((0, controller_utils_1.isInfuraNetworkType)(networkConfigurationIdOrType)) {
492
+ const ticker = controller_utils_1.NetworksTicker[networkConfigurationIdOrType];
493
+ targetNetwork = {
494
+ chainId: controller_utils_1.ChainId[networkConfigurationIdOrType],
495
+ id: undefined,
496
+ rpcPrefs: controller_utils_1.BUILT_IN_NETWORKS[networkConfigurationIdOrType].rpcPrefs,
497
+ rpcUrl: undefined,
498
+ nickname: undefined,
499
+ ticker,
500
+ type: networkConfigurationIdOrType,
501
+ };
502
+ }
503
+ else {
504
+ if (!Object.keys(this.state.networkConfigurations).includes(networkConfigurationIdOrType)) {
505
+ throw new Error(`networkConfigurationId ${networkConfigurationIdOrType} does not match a configured networkConfiguration or built-in network type`);
506
+ }
507
+ targetNetwork = Object.assign(Object.assign({}, this.state.networkConfigurations[networkConfigurationIdOrType]), { type: controller_utils_1.NetworkType.rpc });
511
508
  }
512
509
  __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_ensureAutoManagedNetworkClientRegistryPopulated).call(this);
513
510
  this.update((state) => {
514
- state.providerConfig.type = controller_utils_1.NetworkType.rpc;
515
- state.providerConfig.rpcUrl = targetNetwork.rpcUrl;
516
- state.providerConfig.chainId = targetNetwork.chainId;
517
- state.providerConfig.ticker = targetNetwork.ticker;
518
- state.providerConfig.nickname = targetNetwork.nickname;
519
- state.providerConfig.rpcPrefs = targetNetwork.rpcPrefs;
520
- state.providerConfig.id = targetNetwork.id;
511
+ state.providerConfig = targetNetwork;
521
512
  });
522
513
  yield __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_refreshNetwork).call(this);
523
514
  });
@@ -574,6 +565,23 @@ class NetworkController extends base_controller_1.BaseController {
574
565
  yield __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_refreshNetwork).call(this);
575
566
  });
576
567
  }
568
+ /**
569
+ * Returns a configuration object for the network identified by the given
570
+ * network client ID. If given an Infura network type, constructs one based on
571
+ * what we know about the network; otherwise attempts locates a network
572
+ * configuration in state that corresponds to the network client ID.
573
+ *
574
+ * @param networkClientId - The network client ID.
575
+ * @returns The configuration for the referenced network if one exists, or
576
+ * undefined otherwise.
577
+ */
578
+ getNetworkConfigurationByNetworkClientId(networkClientId) {
579
+ if ((0, controller_utils_1.isInfuraNetworkType)(networkClientId)) {
580
+ const rpcUrl = `https://${networkClientId}.infura.io/v3/${__classPrivateFieldGet(this, _NetworkController_infuraProjectId, "f")}`;
581
+ return Object.assign({ rpcUrl }, controller_utils_1.BUILT_IN_NETWORKS[networkClientId]);
582
+ }
583
+ return this.state.networkConfigurations[networkClientId];
584
+ }
577
585
  /**
578
586
  * Adds a new custom network or updates the information for an existing
579
587
  * network.
@@ -614,6 +622,8 @@ class NetworkController extends base_controller_1.BaseController {
614
622
  }
615
623
  try {
616
624
  new URL(rpcUrl);
625
+ // TODO: Replace `any` with type
626
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
617
627
  }
618
628
  catch (e) {
619
629
  if (e.message.includes('Invalid URL')) {
@@ -629,9 +639,6 @@ class NetworkController extends base_controller_1.BaseController {
629
639
  ? existingNetworkConfiguration.id
630
640
  : (0, uuid_1.v4)();
631
641
  const networkClientId = buildCustomNetworkClientId(upsertedNetworkConfigurationId);
632
- this.update((state) => {
633
- state.networkConfigurations[upsertedNetworkConfigurationId] = Object.assign({ id: upsertedNetworkConfigurationId }, sanitizedNetworkConfiguration);
634
- });
635
642
  const customNetworkClientRegistry = autoManagedNetworkClientRegistry[types_1.NetworkClientType.Custom];
636
643
  const existingAutoManagedNetworkClient = customNetworkClientRegistry[networkClientId];
637
644
  const shouldDestroyExistingNetworkClient = existingAutoManagedNetworkClient &&
@@ -649,6 +656,9 @@ class NetworkController extends base_controller_1.BaseController {
649
656
  ticker,
650
657
  });
651
658
  }
659
+ this.update((state) => {
660
+ state.networkConfigurations[upsertedNetworkConfigurationId] = Object.assign({ id: upsertedNetworkConfigurationId }, sanitizedNetworkConfiguration);
661
+ });
652
662
  if (!existingNetworkConfiguration) {
653
663
  __classPrivateFieldGet(this, _NetworkController_trackMetaMetricsEvent, "f").call(this, {
654
664
  event: 'Custom Network Added',
@@ -745,11 +755,11 @@ class NetworkController extends base_controller_1.BaseController {
745
755
  }
746
756
  }
747
757
  exports.NetworkController = NetworkController;
748
- _NetworkController_ethQuery = new WeakMap(), _NetworkController_infuraProjectId = new WeakMap(), _NetworkController_trackMetaMetricsEvent = new WeakMap(), _NetworkController_previousProviderConfig = new WeakMap(), _NetworkController_providerProxy = new WeakMap(), _NetworkController_provider = new WeakMap(), _NetworkController_blockTrackerProxy = new WeakMap(), _NetworkController_autoManagedNetworkClientRegistry = new WeakMap(), _NetworkController_instances = new WeakSet(), _NetworkController_refreshNetwork = function _NetworkController_refreshNetwork() {
758
+ _NetworkController_ethQuery = new WeakMap(), _NetworkController_infuraProjectId = new WeakMap(), _NetworkController_trackMetaMetricsEvent = new WeakMap(), _NetworkController_previousProviderConfig = new WeakMap(), _NetworkController_providerProxy = new WeakMap(), _NetworkController_blockTrackerProxy = new WeakMap(), _NetworkController_autoManagedNetworkClientRegistry = new WeakMap(), _NetworkController_instances = new WeakSet(), _NetworkController_refreshNetwork = function _NetworkController_refreshNetwork() {
749
759
  return __awaiter(this, void 0, void 0, function* () {
750
- this.messagingSystem.publish('NetworkController:networkWillChange');
760
+ this.messagingSystem.publish('NetworkController:networkWillChange', this.state);
751
761
  __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_applyNetworkSelection).call(this);
752
- this.messagingSystem.publish('NetworkController:networkDidChange');
762
+ this.messagingSystem.publish('NetworkController:networkDidChange', this.state);
753
763
  yield this.lookupNetwork();
754
764
  });
755
765
  }, _NetworkController_getLatestBlock = function _NetworkController_getLatestBlock(networkClientId) {
@@ -899,7 +909,6 @@ _NetworkController_ethQuery = new WeakMap(), _NetworkController_infuraProjectId
899
909
  else {
900
910
  __classPrivateFieldSet(this, _NetworkController_providerProxy, (0, swappable_obj_proxy_1.createEventEmitterProxy)(provider), "f");
901
911
  }
902
- __classPrivateFieldSet(this, _NetworkController_provider, provider, "f");
903
912
  if (__classPrivateFieldGet(this, _NetworkController_blockTrackerProxy, "f")) {
904
913
  __classPrivateFieldGet(this, _NetworkController_blockTrackerProxy, "f").setTarget(blockTracker);
905
914
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkController.js","sourceRoot":"","sources":["../src/NetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport {\n BUILT_IN_NETWORKS,\n NetworksTicker,\n ChainId,\n InfuraNetworkType,\n NetworkType,\n isSafeChainId,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport { errorCodes } from '@metamask/rpc-errors';\nimport { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';\nimport type { SwappableProxy } from '@metamask/swappable-obj-proxy';\nimport type { Hex } from '@metamask/utils';\nimport {\n assertIsStrictHexString,\n hasProperty,\n isPlainObject,\n} from '@metamask/utils';\nimport { strict as assert } from 'assert';\nimport { v4 as random } from 'uuid';\n\nimport { INFURA_BLOCKED_KEY, NetworkStatus } from './constants';\nimport type {\n AutoManagedNetworkClient,\n ProxyWithAccessibleTarget,\n} from './create-auto-managed-network-client';\nimport { createAutoManagedNetworkClient } from './create-auto-managed-network-client';\nimport { projectLogger, createModuleLogger } from './logger';\nimport { NetworkClientType } from './types';\nimport type {\n BlockTracker,\n Provider,\n CustomNetworkClientConfiguration,\n InfuraNetworkClientConfiguration,\n NetworkClientConfiguration,\n} from './types';\n\nconst log = createModuleLogger(projectLogger, 'NetworkController');\n\n/**\n * @type ProviderConfig\n *\n * Configuration passed to web3-provider-engine\n * @property rpcUrl - RPC target URL.\n * @property type - Human-readable network name.\n * @property chainId - Network ID as per EIP-155.\n * @property ticker - Currency ticker.\n * @property nickname - Personalized network name.\n * @property id - Network Configuration Id.\n */\nexport type ProviderConfig = {\n rpcUrl?: string;\n type: NetworkType;\n chainId: Hex;\n ticker: string;\n nickname?: string;\n rpcPrefs?: { blockExplorerUrl?: string };\n id?: NetworkConfigurationId;\n};\n\nexport type Block = {\n baseFeePerGas?: string;\n};\n\n/**\n * Information about a network not held by any other part of state.\n */\nexport type NetworkMetadata = {\n /**\n * EIPs supported by the network.\n */\n EIPS: {\n [eipNumber: number]: boolean;\n };\n /**\n * Indicates the availability of the network\n */\n status: NetworkStatus;\n};\n\n/**\n * Custom RPC network information\n *\n * @property rpcUrl - RPC target URL.\n * @property chainId - Network ID as per EIP-155\n * @property nickname - Personalized network name.\n * @property ticker - Currency ticker.\n * @property rpcPrefs - Personalized preferences.\n */\nexport type NetworkConfiguration = {\n rpcUrl: string;\n chainId: Hex;\n ticker: string;\n nickname?: string;\n rpcPrefs?: {\n blockExplorerUrl: string;\n };\n};\n\n/**\n * The collection of network configurations in state.\n */\ntype NetworkConfigurations = Record<\n NetworkConfigurationId,\n NetworkConfiguration & { id: NetworkConfigurationId }\n>;\n\n/**\n * `Object.keys()` is intentionally generic: it returns the keys of an object,\n * but it cannot make guarantees about the contents of that object, so the type\n * of the keys is merely `string[]`. While this is technically accurate, it is\n * also unnecessary if we have an object that we own and whose contents are\n * known exactly.\n *\n * TODO: Move to @metamask/utils.\n *\n * @param object - The object.\n * @returns The keys of an object, typed according to the type of the object\n * itself.\n */\nexport function knownKeysOf<K extends PropertyKey>(\n object: Partial<Record<K, any>>,\n) {\n return Object.keys(object) as K[];\n}\n\n/**\n * Asserts that the given value is of the given type if the given validation\n * function returns a truthy result.\n *\n * @param value - The value to validate.\n * @param validate - A function used to validate that the value is of the given\n * type. Takes the `value` as an argument and is expected to return true or\n * false.\n * @param message - The message to throw if the function does not return a\n * truthy result.\n * @throws if the function does not return a truthy result.\n */\nfunction assertOfType<Type>(\n value: unknown,\n validate: (value: unknown) => boolean,\n message: string,\n): asserts value is Type {\n assert.ok(validate(value), message);\n}\n\n/**\n * Returns a portion of the given object with only the given keys.\n *\n * @param object - An object.\n * @param keys - The keys to pick from the object.\n * @returns the portion of the object.\n */\nfunction pick<Obj extends Record<any, any>, Keys extends keyof Obj>(\n object: Obj,\n keys: Keys[],\n): Pick<Obj, Keys> {\n const pickedObject = keys.reduce<Partial<Pick<Obj, Keys>>>(\n (finalObject, key) => {\n return { ...finalObject, [key]: object[key] };\n },\n {},\n );\n assertOfType<Pick<Obj, Keys>>(\n pickedObject,\n () => keys.every((key) => key in pickedObject),\n 'The reduce did not produce an object with all of the desired keys.',\n );\n return pickedObject;\n}\n\n/**\n * Type guard for determining whether the given value is an error object with a\n * `code` property, such as an instance of Error.\n *\n * TODO: Move this to @metamask/utils.\n *\n * @param error - The object to check.\n * @returns True if `error` has a `code`, false otherwise.\n */\nfunction isErrorWithCode(error: unknown): error is { code: string | number } {\n return typeof error === 'object' && error !== null && 'code' in error;\n}\n\n/**\n * Returns whether the given argument is a type that our Infura middleware\n * recognizes.\n *\n * @param type - A type to compare.\n * @returns True or false, depending on whether the given type is one that our\n * Infura middleware recognizes.\n */\nfunction isInfuraProviderType(type: string): type is InfuraNetworkType {\n return Object.keys(InfuraNetworkType).includes(type);\n}\n\n/**\n * Builds an identifier for an Infura network client for lookup purposes.\n *\n * @param infuraNetworkOrProviderConfig - The name of an Infura network or a\n * provider config.\n * @returns The built identifier.\n */\nfunction buildInfuraNetworkClientId(\n infuraNetworkOrProviderConfig:\n | InfuraNetworkType\n | (ProviderConfig & { type: InfuraNetworkType }),\n): BuiltInNetworkClientId {\n if (typeof infuraNetworkOrProviderConfig === 'string') {\n return infuraNetworkOrProviderConfig;\n }\n return infuraNetworkOrProviderConfig.type;\n}\n\n/**\n * Builds an identifier for a custom network client for lookup purposes.\n *\n * @param args - This function can be called two ways:\n * 1. The ID of a network configuration.\n * 2. A provider config and a set of network configurations.\n * @returns The built identifier.\n */\nfunction buildCustomNetworkClientId(\n ...args:\n | [NetworkConfigurationId]\n | [\n ProviderConfig & { type: typeof NetworkType.rpc; rpcUrl: string },\n NetworkConfigurations,\n ]\n): CustomNetworkClientId {\n if (args.length === 1) {\n return args[0];\n }\n const [{ id, rpcUrl }, networkConfigurations] = args;\n if (id === undefined) {\n const matchingNetworkConfiguration = Object.values(\n networkConfigurations,\n ).find((networkConfiguration) => {\n return networkConfiguration.rpcUrl === rpcUrl.toLowerCase();\n });\n if (matchingNetworkConfiguration) {\n return matchingNetworkConfiguration.id;\n }\n return rpcUrl.toLowerCase();\n }\n return id;\n}\n\n/**\n * Returns whether the given provider config refers to an Infura network.\n *\n * @param providerConfig - The provider config.\n * @returns True if the provider config refers to an Infura network, false\n * otherwise.\n */\nfunction isInfuraProviderConfig(\n providerConfig: ProviderConfig,\n): providerConfig is ProviderConfig & { type: InfuraNetworkType } {\n return isInfuraProviderType(providerConfig.type);\n}\n\n/**\n * Returns whether the given provider config refers to an Infura network.\n *\n * @param providerConfig - The provider config.\n * @returns True if the provider config refers to an Infura network, false\n * otherwise.\n */\nfunction isCustomProviderConfig(\n providerConfig: ProviderConfig,\n): providerConfig is ProviderConfig & { type: typeof NetworkType.rpc } {\n return providerConfig.type === NetworkType.rpc;\n}\n\n/**\n * As a provider config represents the settings that are used to interface with\n * an RPC endpoint, it must have both a chain ID and an RPC URL if it represents\n * a custom network. These properties _should_ be set as they are validated in\n * the UI when a user adds a custom network, but just to be safe we validate\n * them here.\n *\n * In addition, historically the `rpcUrl` property on the ProviderConfig type\n * has been optional, even though it should not be. Making this non-optional\n * would be a breaking change, so this function types the provider config\n * correctly so that we don't have to check `rpcUrl` in other places.\n *\n * @param providerConfig - A provider config.\n * @throws if the provider config does not have a chain ID or an RPC URL.\n */\nfunction validateCustomProviderConfig(\n providerConfig: ProviderConfig & { type: typeof NetworkType.rpc },\n): asserts providerConfig is typeof providerConfig & { rpcUrl: string } {\n if (providerConfig.chainId === undefined) {\n throw new Error('chainId must be provided for custom RPC endpoints');\n }\n if (providerConfig.rpcUrl === undefined) {\n throw new Error('rpcUrl must be provided for custom RPC endpoints');\n }\n}\n/**\n * The string that uniquely identifies an Infura network client.\n */\ntype BuiltInNetworkClientId = InfuraNetworkType;\n\n/**\n * The string that uniquely identifies a custom network client.\n */\ntype CustomNetworkClientId = string;\n\n/**\n * The string that uniquely identifies a network client.\n */\nexport type NetworkClientId = BuiltInNetworkClientId | CustomNetworkClientId;\n\n/**\n * Information about networks not held by any other part of state.\n */\nexport type NetworksMetadata = {\n [networkClientId: NetworkClientId]: NetworkMetadata;\n};\n\n/**\n * @type NetworkState\n *\n * Network controller state\n * @property providerConfig - RPC URL and network name provider settings of the currently connected network\n * @property properties - an additional set of network properties for the currently connected network\n * @property networkConfigurations - the full list of configured networks either preloaded or added by the user.\n */\nexport type NetworkState = {\n selectedNetworkClientId: NetworkClientId;\n providerConfig: ProviderConfig;\n networkConfigurations: NetworkConfigurations;\n networksMetadata: NetworksMetadata;\n};\n\nconst name = 'NetworkController';\n\n/**\n * Represents the block tracker for the currently selected network. (Note that\n * this is a proxy around a proxy: the inner one exists so that the block\n * tracker doesn't have to exist until it's used, and the outer one exists so\n * that the currently selected network can change without consumers needing to\n * refresh the object reference to that network.)\n */\nexport type BlockTrackerProxy = SwappableProxy<\n ProxyWithAccessibleTarget<BlockTracker>\n>;\n\n/**\n * Represents the provider for the currently selected network. (Note that this\n * is a proxy around a proxy: the inner one exists so that the provider doesn't\n * have to exist until it's used, and the outer one exists so that the currently\n * selected network can change without consumers needing to refresh the object\n * reference to that network.)\n */\nexport type ProviderProxy = SwappableProxy<ProxyWithAccessibleTarget<Provider>>;\n\nexport type NetworkControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof name,\n NetworkState\n>;\n\n/**\n * `networkWillChange` is published when the current network is about to be\n * switched, but the new provider has not been created and no state changes have\n * occurred yet.\n */\nexport type NetworkControllerNetworkWillChangeEvent = {\n type: 'NetworkController:networkWillChange';\n payload: [];\n};\n\n/**\n * `networkDidChange` is published after a provider has been created for a newly\n * switched network (but before the network has been confirmed to be available).\n */\nexport type NetworkControllerNetworkDidChangeEvent = {\n type: 'NetworkController:networkDidChange';\n payload: [];\n};\n\n/**\n * `infuraIsBlocked` is published after the network is switched to an Infura\n * network, but when Infura returns an error blocking the user based on their\n * location.\n */\nexport type NetworkControllerInfuraIsBlockedEvent = {\n type: 'NetworkController:infuraIsBlocked';\n payload: [];\n};\n\n/**\n * `infuraIsBlocked` is published either after the network is switched to an\n * Infura network and Infura does not return an error blocking the user based on\n * their location, or the network is switched to a non-Infura network.\n */\nexport type NetworkControllerInfuraIsUnblockedEvent = {\n type: 'NetworkController:infuraIsUnblocked';\n payload: [];\n};\n\nexport type NetworkControllerEvents =\n | NetworkControllerStateChangeEvent\n | NetworkControllerNetworkWillChangeEvent\n | NetworkControllerNetworkDidChangeEvent\n | NetworkControllerInfuraIsBlockedEvent\n | NetworkControllerInfuraIsUnblockedEvent;\n\nexport type NetworkControllerGetStateAction = ControllerGetStateAction<\n typeof name,\n NetworkState\n>;\n\nexport type NetworkControllerGetProviderConfigAction = {\n type: `NetworkController:getProviderConfig`;\n handler: () => ProviderConfig;\n};\n\nexport type NetworkControllerGetEthQueryAction = {\n type: `NetworkController:getEthQuery`;\n handler: () => EthQuery | undefined;\n};\n\nexport type NetworkControllerGetNetworkClientByIdAction = {\n type: `NetworkController:getNetworkClientById`;\n handler: NetworkController['getNetworkClientById'];\n};\n\nexport type NetworkControllerGetEIP1559CompatibilityAction = {\n type: `NetworkController:getEIP1559Compatibility`;\n handler: NetworkController['getEIP1559Compatibility'];\n};\n\nexport type NetworkControllerFindNetworkClientIdByChainIdAction = {\n type: `NetworkController:findNetworkClientIdByChainId`;\n handler: NetworkController['findNetworkClientIdByChainId'];\n};\n\nexport type NetworkControllerSetProviderTypeAction = {\n type: `NetworkController:setProviderType`;\n handler: NetworkController['setProviderType'];\n};\n\nexport type NetworkControllerSetActiveNetworkAction = {\n type: `NetworkController:setActiveNetwork`;\n handler: NetworkController['setActiveNetwork'];\n};\n\nexport type NetworkControllerActions =\n | NetworkControllerGetStateAction\n | NetworkControllerGetProviderConfigAction\n | NetworkControllerGetEthQueryAction\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetEIP1559CompatibilityAction\n | NetworkControllerFindNetworkClientIdByChainIdAction\n | NetworkControllerSetActiveNetworkAction\n | NetworkControllerSetProviderTypeAction;\n\nexport type NetworkControllerMessenger = RestrictedControllerMessenger<\n typeof name,\n NetworkControllerActions,\n NetworkControllerEvents,\n string,\n string\n>;\n\nexport type NetworkControllerOptions = {\n messenger: NetworkControllerMessenger;\n trackMetaMetricsEvent: () => void;\n infuraProjectId: string;\n state?: Partial<NetworkState>;\n};\n\nexport const defaultState: NetworkState = {\n selectedNetworkClientId: NetworkType.mainnet,\n providerConfig: {\n type: NetworkType.mainnet,\n chainId: ChainId.mainnet,\n ticker: NetworksTicker.mainnet,\n },\n networksMetadata: {},\n networkConfigurations: {},\n};\n\ntype MetaMetricsEventPayload = {\n event: string;\n category: string;\n referrer?: { url: string };\n actionId?: number;\n environmentType?: string;\n properties?: unknown;\n sensitiveProperties?: unknown;\n revenue?: number;\n currency?: string;\n value?: number;\n};\n\ntype NetworkConfigurationId = string;\n\n/**\n * The collection of auto-managed network clients that map to Infura networks.\n */\ntype AutoManagedBuiltInNetworkClientRegistry = Record<\n BuiltInNetworkClientId,\n AutoManagedNetworkClient<InfuraNetworkClientConfiguration>\n>;\n\n/**\n * The collection of auto-managed network clients that map to Infura networks.\n */\ntype AutoManagedCustomNetworkClientRegistry = Record<\n CustomNetworkClientId,\n AutoManagedNetworkClient<CustomNetworkClientConfiguration>\n>;\n\n/**\n * The collection of auto-managed network clients that map to Infura networks\n * as well as custom networks that users have added.\n */\ntype AutoManagedNetworkClientRegistry = {\n [NetworkClientType.Infura]: AutoManagedBuiltInNetworkClientRegistry;\n [NetworkClientType.Custom]: AutoManagedCustomNetworkClientRegistry;\n};\n\n/**\n * Controller that creates and manages an Ethereum network provider.\n */\nexport class NetworkController extends BaseController<\n typeof name,\n NetworkState,\n NetworkControllerMessenger\n> {\n #ethQuery?: EthQuery;\n\n #infuraProjectId: string;\n\n #trackMetaMetricsEvent: (event: MetaMetricsEventPayload) => void;\n\n #previousProviderConfig: ProviderConfig;\n\n #providerProxy: ProviderProxy | undefined;\n\n #provider: ProxyWithAccessibleTarget<Provider> | undefined;\n\n #blockTrackerProxy: BlockTrackerProxy | undefined;\n\n #autoManagedNetworkClientRegistry?: AutoManagedNetworkClientRegistry;\n\n constructor({\n messenger,\n state,\n infuraProjectId,\n trackMetaMetricsEvent,\n }: NetworkControllerOptions) {\n super({\n name,\n metadata: {\n selectedNetworkClientId: {\n persist: true,\n anonymous: false,\n },\n networksMetadata: {\n persist: true,\n anonymous: false,\n },\n providerConfig: {\n persist: true,\n anonymous: false,\n },\n networkConfigurations: {\n persist: true,\n anonymous: false,\n },\n },\n messenger,\n state: { ...defaultState, ...state },\n });\n if (!infuraProjectId || typeof infuraProjectId !== 'string') {\n throw new Error('Invalid Infura project ID');\n }\n this.#infuraProjectId = infuraProjectId;\n this.#trackMetaMetricsEvent = trackMetaMetricsEvent;\n this.messagingSystem.registerActionHandler(\n `${this.name}:getProviderConfig`,\n () => {\n return this.state.providerConfig;\n },\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:getEthQuery`,\n () => {\n return this.#ethQuery;\n },\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:getNetworkClientById`,\n this.getNetworkClientById.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:getEIP1559Compatibility`,\n this.getEIP1559Compatibility.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:setActiveNetwork`,\n this.setActiveNetwork.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:setProviderType`,\n this.setProviderType.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:findNetworkClientIdByChainId`,\n this.findNetworkClientIdByChainId.bind(this),\n );\n\n this.#previousProviderConfig = this.state.providerConfig;\n }\n\n /**\n * Accesses the provider and block tracker for the currently selected network.\n *\n * @returns The proxy and block tracker proxies.\n */\n getProviderAndBlockTracker(): {\n provider: SwappableProxy<ProxyWithAccessibleTarget<Provider>> | undefined;\n blockTracker:\n | SwappableProxy<ProxyWithAccessibleTarget<BlockTracker>>\n | undefined;\n } {\n return {\n provider: this.#providerProxy,\n blockTracker: this.#blockTrackerProxy,\n };\n }\n\n /**\n * Returns all of the network clients that have been created so far, keyed by\n * their identifier in the network client registry. This collection represents\n * not only built-in networks but also any custom networks that consumers have\n * added.\n *\n * @returns The list of known network clients.\n */\n getNetworkClientRegistry(): AutoManagedBuiltInNetworkClientRegistry &\n AutoManagedCustomNetworkClientRegistry {\n const autoManagedNetworkClientRegistry =\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n return Object.assign(\n {},\n autoManagedNetworkClientRegistry[NetworkClientType.Infura],\n autoManagedNetworkClientRegistry[NetworkClientType.Custom],\n );\n }\n\n /**\n * Returns the Infura network client with the given ID.\n *\n * @param infuraNetworkClientId - An Infura network client ID.\n * @returns The Infura network client.\n * @throws If an Infura network client does not exist with the given ID.\n */\n getNetworkClientById(\n infuraNetworkClientId: BuiltInNetworkClientId,\n ): AutoManagedNetworkClient<InfuraNetworkClientConfiguration>;\n\n /**\n * Returns the custom network client with the given ID.\n *\n * @param customNetworkClientId - A custom network client ID.\n * @returns The custom network client.\n * @throws If a custom network client does not exist with the given ID.\n */\n getNetworkClientById(\n customNetworkClientId: CustomNetworkClientId,\n ): AutoManagedNetworkClient<CustomNetworkClientConfiguration>;\n\n getNetworkClientById(\n networkClientId: NetworkClientId,\n ): AutoManagedNetworkClient<NetworkClientConfiguration> {\n if (!networkClientId) {\n throw new Error('No network client ID was provided.');\n }\n\n const autoManagedNetworkClientRegistry =\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n if (isInfuraProviderType(networkClientId)) {\n const infuraNetworkClient =\n autoManagedNetworkClientRegistry[NetworkClientType.Infura][\n networkClientId\n ];\n if (!infuraNetworkClient) {\n throw new Error(\n `No Infura network client was found with the ID \"${networkClientId}\".`,\n );\n }\n return infuraNetworkClient;\n }\n\n const customNetworkClient =\n autoManagedNetworkClientRegistry[NetworkClientType.Custom][\n networkClientId\n ];\n if (!customNetworkClient) {\n throw new Error(\n `No custom network client was found with the ID \"${networkClientId}\".`,\n );\n }\n return customNetworkClient;\n }\n\n /**\n * Executes a series of steps to apply the changes to the provider config:\n *\n * 1. Notifies subscribers that the network is about to change.\n * 2. Looks up a known and preinitialized network client matching the provider\n * config and re-points the provider and block tracker proxy to it.\n * 3. Notifies subscribers that the network has changed.\n */\n async #refreshNetwork() {\n this.messagingSystem.publish('NetworkController:networkWillChange');\n this.#applyNetworkSelection();\n this.messagingSystem.publish('NetworkController:networkDidChange');\n await this.lookupNetwork();\n }\n\n /**\n * Populates the network clients and establishes the initial network based on\n * the provider configuration in state.\n */\n async initializeProvider() {\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n this.#applyNetworkSelection();\n await this.lookupNetwork();\n }\n\n /**\n * Refreshes the network meta with EIP-1559 support and the network status\n * based on the given network client ID.\n *\n * @param networkClientId - The ID of the network client to update.\n */\n async lookupNetworkByClientId(networkClientId: NetworkClientId) {\n const isInfura = isInfuraProviderType(networkClientId);\n let updatedNetworkStatus: NetworkStatus;\n let updatedIsEIP1559Compatible: boolean | undefined;\n\n try {\n updatedIsEIP1559Compatible = await this.#determineEIP1559Compatibility(\n networkClientId,\n );\n updatedNetworkStatus = NetworkStatus.Available;\n } catch (error) {\n if (isErrorWithCode(error)) {\n let responseBody;\n if (\n isInfura &&\n hasProperty(error, 'message') &&\n typeof error.message === 'string'\n ) {\n try {\n responseBody = JSON.parse(error.message);\n } catch {\n // error.message must not be JSON\n }\n }\n\n if (\n isPlainObject(responseBody) &&\n responseBody.error === INFURA_BLOCKED_KEY\n ) {\n updatedNetworkStatus = NetworkStatus.Blocked;\n } else if (error.code === errorCodes.rpc.internal) {\n updatedNetworkStatus = NetworkStatus.Unknown;\n } else {\n updatedNetworkStatus = NetworkStatus.Unavailable;\n }\n } else if (\n typeof Error !== 'undefined' &&\n hasProperty(error as unknown as Error, 'message') &&\n typeof (error as unknown as Error).message === 'string' &&\n (error as unknown as Error).message.includes(\n 'No custom network client was found with the ID',\n )\n ) {\n throw error;\n } else {\n log('NetworkController - could not determine network status', error);\n updatedNetworkStatus = NetworkStatus.Unknown;\n }\n }\n this.update((state) => {\n if (state.networksMetadata[networkClientId] === undefined) {\n state.networksMetadata[networkClientId] = {\n status: NetworkStatus.Unknown,\n EIPS: {},\n };\n }\n const meta = state.networksMetadata[networkClientId];\n meta.status = updatedNetworkStatus;\n if (updatedIsEIP1559Compatible === undefined) {\n delete meta.EIPS[1559];\n } else {\n meta.EIPS[1559] = updatedIsEIP1559Compatible;\n }\n });\n }\n\n /**\n * Performs side effects after switching to a network. If the network is\n * available, updates the network state with the network ID of the network and\n * stores whether the network supports EIP-1559; otherwise clears said\n * information about the network that may have been previously stored.\n *\n * @param networkClientId - (Optional) The ID of the network client to update.\n * If no ID is provided, uses the currently selected network.\n * @fires infuraIsBlocked if the network is Infura-supported and is blocking\n * requests.\n * @fires infuraIsUnblocked if the network is Infura-supported and is not\n * blocking requests, or if the network is not Infura-supported.\n */\n async lookupNetwork(networkClientId?: NetworkClientId) {\n if (networkClientId) {\n await this.lookupNetworkByClientId(networkClientId);\n return;\n }\n\n if (!this.#ethQuery) {\n return;\n }\n\n const isInfura = isInfuraProviderConfig(this.state.providerConfig);\n\n let networkChanged = false;\n const listener = () => {\n networkChanged = true;\n this.messagingSystem.unsubscribe(\n 'NetworkController:networkDidChange',\n listener,\n );\n };\n this.messagingSystem.subscribe(\n 'NetworkController:networkDidChange',\n listener,\n );\n\n let updatedNetworkStatus: NetworkStatus;\n let updatedIsEIP1559Compatible: boolean | undefined;\n\n try {\n const isEIP1559Compatible = await this.#determineEIP1559Compatibility(\n this.state.selectedNetworkClientId,\n );\n updatedNetworkStatus = NetworkStatus.Available;\n updatedIsEIP1559Compatible = isEIP1559Compatible;\n } catch (error) {\n if (isErrorWithCode(error)) {\n let responseBody;\n if (\n isInfura &&\n hasProperty(error, 'message') &&\n typeof error.message === 'string'\n ) {\n try {\n responseBody = JSON.parse(error.message);\n } catch {\n // error.message must not be JSON\n }\n }\n\n if (\n isPlainObject(responseBody) &&\n responseBody.error === INFURA_BLOCKED_KEY\n ) {\n updatedNetworkStatus = NetworkStatus.Blocked;\n } else if (error.code === errorCodes.rpc.internal) {\n updatedNetworkStatus = NetworkStatus.Unknown;\n } else {\n updatedNetworkStatus = NetworkStatus.Unavailable;\n }\n } else {\n log('NetworkController - could not determine network status', error);\n updatedNetworkStatus = NetworkStatus.Unknown;\n }\n }\n\n if (networkChanged) {\n // If the network has changed, then `lookupNetwork` either has been or is\n // in the process of being called, so we don't need to go further.\n return;\n }\n this.messagingSystem.unsubscribe(\n 'NetworkController:networkDidChange',\n listener,\n );\n\n this.update((state) => {\n const meta = state.networksMetadata[state.selectedNetworkClientId];\n meta.status = updatedNetworkStatus;\n if (updatedIsEIP1559Compatible === undefined) {\n delete meta.EIPS[1559];\n } else {\n meta.EIPS[1559] = updatedIsEIP1559Compatible;\n }\n });\n\n if (isInfura) {\n if (updatedNetworkStatus === NetworkStatus.Available) {\n this.messagingSystem.publish('NetworkController:infuraIsUnblocked');\n } else if (updatedNetworkStatus === NetworkStatus.Blocked) {\n this.messagingSystem.publish('NetworkController:infuraIsBlocked');\n }\n } else {\n // Always publish infuraIsUnblocked regardless of network status to\n // prevent consumers from being stuck in a blocked state if they were\n // previously connected to an Infura network that was blocked\n this.messagingSystem.publish('NetworkController:infuraIsUnblocked');\n }\n }\n\n /**\n * Convenience method to update provider network type settings.\n *\n * @param type - Human readable network name.\n */\n async setProviderType(type: InfuraNetworkType) {\n assert.notStrictEqual(\n type,\n NetworkType.rpc,\n `NetworkController - cannot call \"setProviderType\" with type \"${NetworkType.rpc}\". Use \"setActiveNetwork\"`,\n );\n assert.ok(\n isInfuraProviderType(type),\n `Unknown Infura provider type \"${type}\".`,\n );\n\n this.#previousProviderConfig = this.state.providerConfig;\n\n // If testnet the ticker symbol should use a testnet prefix\n const ticker =\n type in NetworksTicker && NetworksTicker[type].length > 0\n ? NetworksTicker[type]\n : 'ETH';\n\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n this.update((state) => {\n state.providerConfig.type = type;\n state.providerConfig.ticker = ticker;\n state.providerConfig.chainId = ChainId[type];\n state.providerConfig.rpcPrefs = BUILT_IN_NETWORKS[type].rpcPrefs;\n state.providerConfig.rpcUrl = undefined;\n state.providerConfig.nickname = undefined;\n state.providerConfig.id = undefined;\n });\n await this.#refreshNetwork();\n }\n\n /**\n * Convenience method to update provider RPC settings.\n *\n * @param networkConfigurationId - The unique id for the network configuration to set as the active provider.\n */\n async setActiveNetwork(networkConfigurationId: string) {\n this.#previousProviderConfig = this.state.providerConfig;\n\n const targetNetwork =\n this.state.networkConfigurations[networkConfigurationId];\n\n if (!targetNetwork) {\n throw new Error(\n `networkConfigurationId ${networkConfigurationId} does not match a configured networkConfiguration`,\n );\n }\n\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n this.update((state) => {\n state.providerConfig.type = NetworkType.rpc;\n state.providerConfig.rpcUrl = targetNetwork.rpcUrl;\n state.providerConfig.chainId = targetNetwork.chainId;\n state.providerConfig.ticker = targetNetwork.ticker;\n state.providerConfig.nickname = targetNetwork.nickname;\n state.providerConfig.rpcPrefs = targetNetwork.rpcPrefs;\n state.providerConfig.id = targetNetwork.id;\n });\n\n await this.#refreshNetwork();\n }\n\n /**\n * Fetches the latest block for the network.\n *\n * @param networkClientId - The networkClientId to fetch the correct provider against which to check the latest block. Defaults to the selectedNetworkClientId.\n * @returns A promise that either resolves to the block header or null if\n * there is no latest block, or rejects with an error.\n */\n #getLatestBlock(networkClientId: NetworkClientId): Promise<Block> {\n if (networkClientId === undefined) {\n networkClientId = this.state.selectedNetworkClientId;\n }\n\n const networkClient = this.getNetworkClientById(networkClientId);\n const ethQuery = new EthQuery(networkClient.provider);\n\n return new Promise((resolve, reject) => {\n ethQuery.sendAsync(\n { method: 'eth_getBlockByNumber', params: ['latest', false] },\n (error: unknown, block?: unknown) => {\n if (error) {\n reject(error);\n } else {\n // TODO: Validate this type\n resolve(block as Block);\n }\n },\n );\n });\n }\n\n /**\n * Determines whether the network supports EIP-1559 by checking whether the\n * latest block has a `baseFeePerGas` property, then updates state\n * appropriately.\n *\n * @param networkClientId - The networkClientId to fetch the correct provider against which to check 1559 compatibility.\n * @returns A promise that resolves to true if the network supports EIP-1559\n * , false otherwise, or `undefined` if unable to determine the compatibility.\n */\n async getEIP1559Compatibility(networkClientId?: NetworkClientId) {\n if (networkClientId) {\n return this.get1559CompatibilityWithNetworkClientId(networkClientId);\n }\n if (!this.#ethQuery) {\n return false;\n }\n\n const { EIPS } =\n this.state.networksMetadata[this.state.selectedNetworkClientId];\n\n if (EIPS[1559] !== undefined) {\n return EIPS[1559];\n }\n\n const isEIP1559Compatible = await this.#determineEIP1559Compatibility(\n this.state.selectedNetworkClientId,\n );\n this.update((state) => {\n if (isEIP1559Compatible !== undefined) {\n state.networksMetadata[state.selectedNetworkClientId].EIPS[1559] =\n isEIP1559Compatible;\n }\n });\n return isEIP1559Compatible;\n }\n\n async get1559CompatibilityWithNetworkClientId(\n networkClientId: NetworkClientId,\n ) {\n let metadata = this.state.networksMetadata[networkClientId];\n if (metadata === undefined) {\n await this.lookupNetwork(networkClientId);\n metadata = this.state.networksMetadata[networkClientId];\n }\n const { EIPS } = metadata;\n\n // may want to include some 'freshness' value - something to make sure we refetch this from time to time\n return EIPS[1559];\n }\n\n /**\n * Retrieves and checks the latest block from the currently selected\n * network; if the block has a `baseFeePerGas` property, then we know\n * that the network supports EIP-1559; otherwise it doesn't.\n *\n * @param networkClientId - The networkClientId to fetch the correct provider against which to check 1559 compatibility\n * @returns A promise that resolves to `true` if the network supports EIP-1559,\n * `false` otherwise, or `undefined` if unable to retrieve the last block.\n */\n async #determineEIP1559Compatibility(\n networkClientId: NetworkClientId,\n ): Promise<boolean | undefined> {\n const latestBlock = await this.#getLatestBlock(networkClientId);\n\n if (!latestBlock) {\n return undefined;\n }\n\n return latestBlock.baseFeePerGas !== undefined;\n }\n\n /**\n * Re-initializes the provider and block tracker for the current network.\n */\n async resetConnection() {\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n await this.#refreshNetwork();\n }\n\n /**\n * Adds a new custom network or updates the information for an existing\n * network.\n *\n * This may involve updating the `networkConfigurations` property in\n * state as well and/or adding a new network client to the network client\n * registry. The `rpcUrl` and `chainId` of the given object are used to\n * determine which action to take:\n *\n * - If the `rpcUrl` corresponds to an existing network configuration\n * (case-insensitively), then it is overwritten with the object. Furthermore,\n * if the `chainId` is different from the existing network configuration, then\n * the existing network client is replaced with a new one.\n * - If the `rpcUrl` does not correspond to an existing network configuration\n * (case-insensitively), then the object is used to add a new network\n * configuration along with a new network client.\n *\n * @param networkConfiguration - The network configuration to add or update.\n * @param options - Additional configuration options.\n * @param options.referrer - Used to create a metrics event; the site from which the call originated, or 'metamask' for internal calls.\n * @param options.source - Used to create a metrics event; where the event originated (i.e. from a dapp or from the network form).\n * @param options.setActive - If true, switches to the network upon adding or updating it (default: false).\n * @returns The ID for the added or updated network configuration.\n */\n async upsertNetworkConfiguration(\n networkConfiguration: NetworkConfiguration,\n {\n referrer,\n source,\n setActive = false,\n }: {\n referrer: string;\n source: string;\n setActive?: boolean;\n },\n ): Promise<string> {\n const sanitizedNetworkConfiguration: NetworkConfiguration = pick(\n networkConfiguration,\n ['rpcUrl', 'chainId', 'ticker', 'nickname', 'rpcPrefs'],\n );\n const { rpcUrl, chainId, ticker } = sanitizedNetworkConfiguration;\n\n assertIsStrictHexString(chainId);\n if (!isSafeChainId(chainId)) {\n throw new Error(\n `Invalid chain ID \"${chainId}\": numerical value greater than max safe value.`,\n );\n }\n if (!rpcUrl) {\n throw new Error(\n 'An rpcUrl is required to add or update network configuration',\n );\n }\n if (!referrer || !source) {\n throw new Error(\n 'referrer and source are required arguments for adding or updating a network configuration',\n );\n }\n try {\n new URL(rpcUrl);\n } catch (e: any) {\n if (e.message.includes('Invalid URL')) {\n throw new Error('rpcUrl must be a valid URL');\n }\n }\n if (!ticker) {\n throw new Error(\n 'A ticker is required to add or update networkConfiguration',\n );\n }\n\n const autoManagedNetworkClientRegistry =\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n const existingNetworkConfiguration = Object.values(\n this.state.networkConfigurations,\n ).find(\n (networkConfig) =>\n networkConfig.rpcUrl.toLowerCase() === rpcUrl.toLowerCase(),\n );\n const upsertedNetworkConfigurationId = existingNetworkConfiguration\n ? existingNetworkConfiguration.id\n : random();\n const networkClientId = buildCustomNetworkClientId(\n upsertedNetworkConfigurationId,\n );\n\n this.update((state) => {\n state.networkConfigurations[upsertedNetworkConfigurationId] = {\n id: upsertedNetworkConfigurationId,\n ...sanitizedNetworkConfiguration,\n };\n });\n\n const customNetworkClientRegistry =\n autoManagedNetworkClientRegistry[NetworkClientType.Custom];\n const existingAutoManagedNetworkClient =\n customNetworkClientRegistry[networkClientId];\n const shouldDestroyExistingNetworkClient =\n existingAutoManagedNetworkClient &&\n existingAutoManagedNetworkClient.configuration.chainId !== chainId;\n if (shouldDestroyExistingNetworkClient) {\n existingAutoManagedNetworkClient.destroy();\n }\n if (\n !existingAutoManagedNetworkClient ||\n shouldDestroyExistingNetworkClient\n ) {\n customNetworkClientRegistry[networkClientId] =\n createAutoManagedNetworkClient({\n type: NetworkClientType.Custom,\n chainId,\n rpcUrl,\n ticker,\n });\n }\n\n if (!existingNetworkConfiguration) {\n this.#trackMetaMetricsEvent({\n event: 'Custom Network Added',\n category: 'Network',\n referrer: {\n url: referrer,\n },\n properties: {\n chain_id: chainId,\n symbol: ticker,\n source,\n },\n });\n }\n\n if (setActive) {\n await this.setActiveNetwork(upsertedNetworkConfigurationId);\n }\n\n return upsertedNetworkConfigurationId;\n }\n\n /**\n * Removes a custom network from state.\n *\n * This involves updating the `networkConfigurations` property in state as\n * well and removing the network client that corresponds to the network from\n * the client registry.\n *\n * @param networkConfigurationId - The ID of an existing network\n * configuration.\n */\n removeNetworkConfiguration(networkConfigurationId: string) {\n if (!this.state.networkConfigurations[networkConfigurationId]) {\n throw new Error(\n `networkConfigurationId ${networkConfigurationId} does not match a configured networkConfiguration`,\n );\n }\n\n const autoManagedNetworkClientRegistry =\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n const networkClientId = buildCustomNetworkClientId(networkConfigurationId);\n\n this.update((state) => {\n delete state.networkConfigurations[networkConfigurationId];\n });\n\n const customNetworkClientRegistry =\n autoManagedNetworkClientRegistry[NetworkClientType.Custom];\n const existingAutoManagedNetworkClient =\n customNetworkClientRegistry[networkClientId];\n existingAutoManagedNetworkClient.destroy();\n delete customNetworkClientRegistry[networkClientId];\n }\n\n /**\n * Switches to the previously selected network, assuming that there is one\n * (if not and `initializeProvider` has not been previously called, then this\n * method is equivalent to calling `resetConnection`).\n */\n async rollbackToPreviousProvider() {\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n this.update((state) => {\n state.providerConfig = this.#previousProviderConfig;\n });\n\n await this.#refreshNetwork();\n }\n\n /**\n * Deactivates the controller, stopping any ongoing polling.\n *\n * In-progress requests will not be aborted.\n */\n async destroy() {\n await this.#blockTrackerProxy?.destroy();\n }\n\n /**\n * Updates the controller using the given backup data.\n *\n * @param backup - The data that has been backed up.\n * @param backup.networkConfigurations - Network configurations in the backup.\n */\n loadBackup({\n networkConfigurations,\n }: {\n networkConfigurations: NetworkState['networkConfigurations'];\n }): void {\n this.update((state) => {\n state.networkConfigurations = {\n ...state.networkConfigurations,\n ...networkConfigurations,\n };\n });\n }\n\n /**\n * Searches for a network configuration ID with the given ChainID and returns it.\n *\n * @param chainId - ChainId to search for\n * @returns networkClientId of the network configuration with the given chainId\n */\n findNetworkClientIdByChainId(chainId: Hex): NetworkClientId {\n const networkClients = this.getNetworkClientRegistry();\n const networkClientEntry = Object.entries(networkClients).find(\n ([_, networkClient]) => networkClient.configuration.chainId === chainId,\n );\n if (networkClientEntry === undefined) {\n throw new Error(\"Couldn't find networkClientId for chainId\");\n }\n return networkClientEntry[0];\n }\n\n /**\n * Before accessing or switching the network, the registry of network clients\n * needs to be populated. Otherwise, `#applyNetworkSelection` and\n * `getNetworkClientRegistry` will throw an error. This method checks to see if the\n * population step has happened yet, and if not, makes it happen.\n *\n * @returns The populated network client registry.\n */\n #ensureAutoManagedNetworkClientRegistryPopulated(): AutoManagedNetworkClientRegistry {\n const autoManagedNetworkClientRegistry =\n this.#autoManagedNetworkClientRegistry ??\n this.#createAutoManagedNetworkClientRegistry();\n this.#autoManagedNetworkClientRegistry = autoManagedNetworkClientRegistry;\n return autoManagedNetworkClientRegistry;\n }\n\n /**\n * Constructs the registry of network clients based on the set of built-in\n * networks as well as the custom networks in state.\n *\n * @returns The network clients keyed by ID.\n */\n #createAutoManagedNetworkClientRegistry(): AutoManagedNetworkClientRegistry {\n return [\n ...this.#buildIdentifiedInfuraNetworkClientConfigurations(),\n ...this.#buildIdentifiedCustomNetworkClientConfigurations(),\n ...this.#buildIdentifiedNetworkClientConfigurationsFromProviderConfig(),\n ].reduce(\n (\n registry,\n [networkClientType, networkClientId, networkClientConfiguration],\n ) => {\n const autoManagedNetworkClient = createAutoManagedNetworkClient(\n networkClientConfiguration,\n );\n if (networkClientId in registry[networkClientType]) {\n return registry;\n }\n return {\n ...registry,\n [networkClientType]: {\n ...registry[networkClientType],\n [networkClientId]: autoManagedNetworkClient,\n },\n };\n },\n {\n [NetworkClientType.Infura]: {},\n [NetworkClientType.Custom]: {},\n },\n ) as AutoManagedNetworkClientRegistry;\n }\n\n /**\n * Constructs the list of network clients for built-in networks (that is,\n * the subset of the networks we know Infura supports that consumers do not\n * need to explicitly add).\n *\n * @returns The network clients.\n */\n #buildIdentifiedInfuraNetworkClientConfigurations(): [\n NetworkClientType.Infura,\n BuiltInNetworkClientId,\n InfuraNetworkClientConfiguration,\n ][] {\n return knownKeysOf(InfuraNetworkType).map((network) => {\n const networkClientId = buildInfuraNetworkClientId(network);\n const networkClientConfiguration: InfuraNetworkClientConfiguration = {\n type: NetworkClientType.Infura,\n network,\n infuraProjectId: this.#infuraProjectId,\n chainId: BUILT_IN_NETWORKS[network].chainId,\n ticker: BUILT_IN_NETWORKS[network].ticker,\n };\n return [\n NetworkClientType.Infura,\n networkClientId,\n networkClientConfiguration,\n ];\n });\n }\n\n /**\n * Constructs the list of network clients for custom networks (that is, those\n * which consumers have added via `networkConfigurations`).\n *\n * @returns The network clients.\n */\n #buildIdentifiedCustomNetworkClientConfigurations(): [\n NetworkClientType.Custom,\n CustomNetworkClientId,\n CustomNetworkClientConfiguration,\n ][] {\n return Object.entries(this.state.networkConfigurations).map(\n ([networkConfigurationId, networkConfiguration]) => {\n if (networkConfiguration.chainId === undefined) {\n throw new Error('chainId must be provided for custom RPC endpoints');\n }\n if (networkConfiguration.rpcUrl === undefined) {\n throw new Error('rpcUrl must be provided for custom RPC endpoints');\n }\n const networkClientId = buildCustomNetworkClientId(\n networkConfigurationId,\n );\n const networkClientConfiguration: CustomNetworkClientConfiguration = {\n type: NetworkClientType.Custom,\n chainId: networkConfiguration.chainId,\n rpcUrl: networkConfiguration.rpcUrl,\n ticker: networkConfiguration.ticker,\n };\n return [\n NetworkClientType.Custom,\n networkClientId,\n networkClientConfiguration,\n ];\n },\n );\n }\n\n /**\n * Converts the provider config object in state to a network client\n * configuration object.\n *\n * @returns The network client config.\n * @throws If the provider config is of type \"rpc\" and lacks either a\n * `chainId` or an `rpcUrl`.\n */\n #buildIdentifiedNetworkClientConfigurationsFromProviderConfig():\n | [\n [\n NetworkClientType.Custom,\n CustomNetworkClientId,\n CustomNetworkClientConfiguration,\n ],\n ]\n | [] {\n const { providerConfig } = this.state;\n\n if (isCustomProviderConfig(providerConfig)) {\n validateCustomProviderConfig(providerConfig);\n const networkClientId = buildCustomNetworkClientId(\n providerConfig,\n this.state.networkConfigurations,\n );\n const networkClientConfiguration: CustomNetworkClientConfiguration = {\n chainId: providerConfig.chainId,\n rpcUrl: providerConfig.rpcUrl,\n type: NetworkClientType.Custom,\n ticker: providerConfig.ticker,\n };\n return [\n [NetworkClientType.Custom, networkClientId, networkClientConfiguration],\n ];\n }\n\n if (isInfuraProviderConfig(providerConfig)) {\n return [];\n }\n\n throw new Error(`Unrecognized network type: '${providerConfig.type}'`);\n }\n\n /**\n * Uses the information in the provider config object to look up a known and\n * preinitialized network client. Once a network client is found, updates the\n * provider and block tracker proxy to point to those from the network client,\n * then finally creates an EthQuery that points to the provider proxy.\n *\n * @throws If no network client could be found matching the current provider\n * config.\n */\n #applyNetworkSelection() {\n if (!this.#autoManagedNetworkClientRegistry) {\n throw new Error(\n 'initializeProvider must be called first in order to switch the network',\n );\n }\n\n const { providerConfig } = this.state;\n\n let autoManagedNetworkClient: AutoManagedNetworkClient<NetworkClientConfiguration>;\n\n let networkClientId: NetworkClientId;\n if (isInfuraProviderConfig(providerConfig)) {\n const networkClientType = NetworkClientType.Infura;\n networkClientId = buildInfuraNetworkClientId(providerConfig);\n const builtInNetworkClientRegistry =\n this.#autoManagedNetworkClientRegistry[networkClientType];\n autoManagedNetworkClient =\n builtInNetworkClientRegistry[networkClientId as BuiltInNetworkClientId];\n if (!autoManagedNetworkClient) {\n throw new Error(\n `Could not find custom network matching ${networkClientId}`,\n );\n }\n } else if (isCustomProviderConfig(providerConfig)) {\n validateCustomProviderConfig(providerConfig);\n const networkClientType = NetworkClientType.Custom;\n networkClientId = buildCustomNetworkClientId(\n providerConfig,\n this.state.networkConfigurations,\n );\n const customNetworkClientRegistry =\n this.#autoManagedNetworkClientRegistry[networkClientType];\n autoManagedNetworkClient = customNetworkClientRegistry[networkClientId];\n if (!autoManagedNetworkClient) {\n throw new Error(\n `Could not find built-in network matching ${networkClientId}`,\n );\n }\n } else {\n throw new Error('Could not determine type of provider config');\n }\n\n this.update((state) => {\n state.selectedNetworkClientId = networkClientId;\n if (state.networksMetadata[networkClientId] === undefined) {\n state.networksMetadata[networkClientId] = {\n status: NetworkStatus.Unknown,\n EIPS: {},\n };\n }\n });\n\n const { provider, blockTracker } = autoManagedNetworkClient;\n\n if (this.#providerProxy) {\n this.#providerProxy.setTarget(provider);\n } else {\n this.#providerProxy = createEventEmitterProxy(provider);\n }\n this.#provider = provider;\n\n if (this.#blockTrackerProxy) {\n this.#blockTrackerProxy.setTarget(blockTracker);\n } else {\n this.#blockTrackerProxy = createEventEmitterProxy(blockTracker, {\n eventFilter: 'skipInternal',\n });\n }\n\n this.#ethQuery = new EthQuery(this.#providerProxy);\n }\n}\n"]}
1
+ {"version":3,"file":"NetworkController.js","sourceRoot":"","sources":["../src/NetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport {\n BUILT_IN_NETWORKS,\n NetworksTicker,\n ChainId,\n InfuraNetworkType,\n NetworkType,\n isSafeChainId,\n isInfuraNetworkType,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport { errorCodes } from '@metamask/rpc-errors';\nimport { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';\nimport type { SwappableProxy } from '@metamask/swappable-obj-proxy';\nimport type { Hex } from '@metamask/utils';\nimport {\n assertIsStrictHexString,\n hasProperty,\n isPlainObject,\n} from '@metamask/utils';\nimport { strict as assert } from 'assert';\nimport { v4 as random } from 'uuid';\n\nimport { INFURA_BLOCKED_KEY, NetworkStatus } from './constants';\nimport type {\n AutoManagedNetworkClient,\n ProxyWithAccessibleTarget,\n} from './create-auto-managed-network-client';\nimport { createAutoManagedNetworkClient } from './create-auto-managed-network-client';\nimport { projectLogger, createModuleLogger } from './logger';\nimport { NetworkClientType } from './types';\nimport type {\n BlockTracker,\n Provider,\n CustomNetworkClientConfiguration,\n InfuraNetworkClientConfiguration,\n NetworkClientConfiguration,\n} from './types';\n\nconst log = createModuleLogger(projectLogger, 'NetworkController');\n\n/**\n * @type ProviderConfig\n *\n * Configuration passed to web3-provider-engine\n * @property rpcUrl - RPC target URL.\n * @property type - Human-readable network name.\n * @property chainId - Network ID as per EIP-155.\n * @property ticker - Currency ticker.\n * @property nickname - Personalized network name.\n * @property id - Network Configuration Id.\n */\nexport type ProviderConfig = {\n rpcUrl?: string;\n type: NetworkType;\n chainId: Hex;\n ticker: string;\n nickname?: string;\n rpcPrefs?: { blockExplorerUrl?: string };\n id?: NetworkConfigurationId;\n};\n\nexport type Block = {\n baseFeePerGas?: string;\n};\n\n/**\n * Information about a network not held by any other part of state.\n */\nexport type NetworkMetadata = {\n /**\n * EIPs supported by the network.\n */\n EIPS: {\n [eipNumber: number]: boolean;\n };\n /**\n * Indicates the availability of the network\n */\n status: NetworkStatus;\n};\n\n/**\n * Custom RPC network information\n *\n * @property rpcUrl - RPC target URL.\n * @property chainId - Network ID as per EIP-155\n * @property nickname - Personalized network name.\n * @property ticker - Currency ticker.\n * @property rpcPrefs - Personalized preferences.\n */\nexport type NetworkConfiguration = {\n rpcUrl: string;\n chainId: Hex;\n ticker: string;\n nickname?: string;\n rpcPrefs?: {\n blockExplorerUrl: string;\n };\n};\n\n/**\n * The collection of network configurations in state.\n */\ntype NetworkConfigurations = Record<\n NetworkConfigurationId,\n NetworkConfiguration & { id: NetworkConfigurationId }\n>;\n\n/**\n * `Object.keys()` is intentionally generic: it returns the keys of an object,\n * but it cannot make guarantees about the contents of that object, so the type\n * of the keys is merely `string[]`. While this is technically accurate, it is\n * also unnecessary if we have an object that we own and whose contents are\n * known exactly.\n *\n * TODO: Move to @metamask/utils.\n *\n * @param object - The object.\n * @returns The keys of an object, typed according to the type of the object\n * itself.\n */\nexport function knownKeysOf<K extends PropertyKey>(\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n object: Partial<Record<K, any>>,\n) {\n return Object.keys(object) as K[];\n}\n\n/**\n * Asserts that the given value is of the given type if the given validation\n * function returns a truthy result.\n *\n * @param value - The value to validate.\n * @param validate - A function used to validate that the value is of the given\n * type. Takes the `value` as an argument and is expected to return true or\n * false.\n * @param message - The message to throw if the function does not return a\n * truthy result.\n * @throws if the function does not return a truthy result.\n */\nfunction assertOfType<Type>(\n value: unknown,\n validate: (value: unknown) => boolean,\n message: string,\n): asserts value is Type {\n assert.ok(validate(value), message);\n}\n\n/**\n * Returns a portion of the given object with only the given keys.\n *\n * @param object - An object.\n * @param keys - The keys to pick from the object.\n * @returns the portion of the object.\n */\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction pick<Obj extends Record<any, any>, Keys extends keyof Obj>(\n object: Obj,\n keys: Keys[],\n): Pick<Obj, Keys> {\n const pickedObject = keys.reduce<Partial<Pick<Obj, Keys>>>(\n (finalObject, key) => {\n return { ...finalObject, [key]: object[key] };\n },\n {},\n );\n assertOfType<Pick<Obj, Keys>>(\n pickedObject,\n () => keys.every((key) => key in pickedObject),\n 'The reduce did not produce an object with all of the desired keys.',\n );\n return pickedObject;\n}\n\n/**\n * Type guard for determining whether the given value is an error object with a\n * `code` property, such as an instance of Error.\n *\n * TODO: Move this to @metamask/utils.\n *\n * @param error - The object to check.\n * @returns True if `error` has a `code`, false otherwise.\n */\nfunction isErrorWithCode(error: unknown): error is { code: string | number } {\n return typeof error === 'object' && error !== null && 'code' in error;\n}\n\n/**\n * Builds an identifier for an Infura network client for lookup purposes.\n *\n * @param infuraNetworkOrProviderConfig - The name of an Infura network or a\n * provider config.\n * @returns The built identifier.\n */\nfunction buildInfuraNetworkClientId(\n infuraNetworkOrProviderConfig:\n | InfuraNetworkType\n | (ProviderConfig & { type: InfuraNetworkType }),\n): BuiltInNetworkClientId {\n if (typeof infuraNetworkOrProviderConfig === 'string') {\n return infuraNetworkOrProviderConfig;\n }\n return infuraNetworkOrProviderConfig.type;\n}\n\n/**\n * Builds an identifier for a custom network client for lookup purposes.\n *\n * @param args - This function can be called two ways:\n * 1. The ID of a network configuration.\n * 2. A provider config and a set of network configurations.\n * @returns The built identifier.\n */\nfunction buildCustomNetworkClientId(\n ...args:\n | [NetworkConfigurationId]\n | [\n ProviderConfig & { type: typeof NetworkType.rpc; rpcUrl: string },\n NetworkConfigurations,\n ]\n): CustomNetworkClientId {\n if (args.length === 1) {\n return args[0];\n }\n const [{ id, rpcUrl }, networkConfigurations] = args;\n if (id === undefined) {\n const matchingNetworkConfiguration = Object.values(\n networkConfigurations,\n ).find((networkConfiguration) => {\n return networkConfiguration.rpcUrl === rpcUrl.toLowerCase();\n });\n if (matchingNetworkConfiguration) {\n return matchingNetworkConfiguration.id;\n }\n return rpcUrl.toLowerCase();\n }\n return id;\n}\n\n/**\n * Returns whether the given provider config refers to an Infura network.\n *\n * @param providerConfig - The provider config.\n * @returns True if the provider config refers to an Infura network, false\n * otherwise.\n */\nfunction isInfuraProviderConfig(\n providerConfig: ProviderConfig,\n): providerConfig is ProviderConfig & { type: InfuraNetworkType } {\n return isInfuraNetworkType(providerConfig.type);\n}\n\n/**\n * Returns whether the given provider config refers to an Infura network.\n *\n * @param providerConfig - The provider config.\n * @returns True if the provider config refers to an Infura network, false\n * otherwise.\n */\nfunction isCustomProviderConfig(\n providerConfig: ProviderConfig,\n): providerConfig is ProviderConfig & { type: typeof NetworkType.rpc } {\n return providerConfig.type === NetworkType.rpc;\n}\n\n/**\n * As a provider config represents the settings that are used to interface with\n * an RPC endpoint, it must have both a chain ID and an RPC URL if it represents\n * a custom network. These properties _should_ be set as they are validated in\n * the UI when a user adds a custom network, but just to be safe we validate\n * them here.\n *\n * In addition, historically the `rpcUrl` property on the ProviderConfig type\n * has been optional, even though it should not be. Making this non-optional\n * would be a breaking change, so this function types the provider config\n * correctly so that we don't have to check `rpcUrl` in other places.\n *\n * @param providerConfig - A provider config.\n * @throws if the provider config does not have a chain ID or an RPC URL.\n */\nfunction validateCustomProviderConfig(\n providerConfig: ProviderConfig & { type: typeof NetworkType.rpc },\n): asserts providerConfig is typeof providerConfig & { rpcUrl: string } {\n if (providerConfig.chainId === undefined) {\n throw new Error('chainId must be provided for custom RPC endpoints');\n }\n if (providerConfig.rpcUrl === undefined) {\n throw new Error('rpcUrl must be provided for custom RPC endpoints');\n }\n}\n/**\n * The string that uniquely identifies an Infura network client.\n */\ntype BuiltInNetworkClientId = InfuraNetworkType;\n\n/**\n * The string that uniquely identifies a custom network client.\n */\ntype CustomNetworkClientId = string;\n\n/**\n * The string that uniquely identifies a network client.\n */\nexport type NetworkClientId = BuiltInNetworkClientId | CustomNetworkClientId;\n\n/**\n * Information about networks not held by any other part of state.\n */\nexport type NetworksMetadata = {\n [networkClientId: NetworkClientId]: NetworkMetadata;\n};\n\n/**\n * @type NetworkState\n *\n * Network controller state\n * @property providerConfig - RPC URL and network name provider settings of the currently connected network\n * @property properties - an additional set of network properties for the currently connected network\n * @property networkConfigurations - the full list of configured networks either preloaded or added by the user.\n */\nexport type NetworkState = {\n selectedNetworkClientId: NetworkClientId;\n providerConfig: ProviderConfig;\n networkConfigurations: NetworkConfigurations;\n networksMetadata: NetworksMetadata;\n};\n\nconst name = 'NetworkController';\n\n/**\n * Represents the block tracker for the currently selected network. (Note that\n * this is a proxy around a proxy: the inner one exists so that the block\n * tracker doesn't have to exist until it's used, and the outer one exists so\n * that the currently selected network can change without consumers needing to\n * refresh the object reference to that network.)\n */\nexport type BlockTrackerProxy = SwappableProxy<\n ProxyWithAccessibleTarget<BlockTracker>\n>;\n\n/**\n * Represents the provider for the currently selected network. (Note that this\n * is a proxy around a proxy: the inner one exists so that the provider doesn't\n * have to exist until it's used, and the outer one exists so that the currently\n * selected network can change without consumers needing to refresh the object\n * reference to that network.)\n */\nexport type ProviderProxy = SwappableProxy<ProxyWithAccessibleTarget<Provider>>;\n\nexport type NetworkControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof name,\n NetworkState\n>;\n\n/**\n * `networkWillChange` is published when the current network is about to be\n * switched, but the new provider has not been created and no state changes have\n * occurred yet.\n */\nexport type NetworkControllerNetworkWillChangeEvent = {\n type: 'NetworkController:networkWillChange';\n payload: [NetworkState];\n};\n\n/**\n * `networkDidChange` is published after a provider has been created for a newly\n * switched network (but before the network has been confirmed to be available).\n */\nexport type NetworkControllerNetworkDidChangeEvent = {\n type: 'NetworkController:networkDidChange';\n payload: [NetworkState];\n};\n\n/**\n * `infuraIsBlocked` is published after the network is switched to an Infura\n * network, but when Infura returns an error blocking the user based on their\n * location.\n */\nexport type NetworkControllerInfuraIsBlockedEvent = {\n type: 'NetworkController:infuraIsBlocked';\n payload: [];\n};\n\n/**\n * `infuraIsBlocked` is published either after the network is switched to an\n * Infura network and Infura does not return an error blocking the user based on\n * their location, or the network is switched to a non-Infura network.\n */\nexport type NetworkControllerInfuraIsUnblockedEvent = {\n type: 'NetworkController:infuraIsUnblocked';\n payload: [];\n};\n\nexport type NetworkControllerEvents =\n | NetworkControllerStateChangeEvent\n | NetworkControllerNetworkWillChangeEvent\n | NetworkControllerNetworkDidChangeEvent\n | NetworkControllerInfuraIsBlockedEvent\n | NetworkControllerInfuraIsUnblockedEvent;\n\nexport type NetworkControllerGetStateAction = ControllerGetStateAction<\n typeof name,\n NetworkState\n>;\n\nexport type NetworkControllerGetProviderConfigAction = {\n type: `NetworkController:getProviderConfig`;\n handler: () => ProviderConfig;\n};\n\nexport type NetworkControllerGetEthQueryAction = {\n type: `NetworkController:getEthQuery`;\n handler: () => EthQuery | undefined;\n};\n\nexport type NetworkControllerGetNetworkClientByIdAction = {\n type: `NetworkController:getNetworkClientById`;\n handler: NetworkController['getNetworkClientById'];\n};\n\nexport type NetworkControllerGetEIP1559CompatibilityAction = {\n type: `NetworkController:getEIP1559Compatibility`;\n handler: NetworkController['getEIP1559Compatibility'];\n};\n\nexport type NetworkControllerFindNetworkClientIdByChainIdAction = {\n type: `NetworkController:findNetworkClientIdByChainId`;\n handler: NetworkController['findNetworkClientIdByChainId'];\n};\n\n/**\n * Change the currently selected network to the given built-in network type.\n *\n * @deprecated This action has been replaced by `setActiveNetwork`, and will be\n * removed in a future release.\n */\nexport type NetworkControllerSetProviderTypeAction = {\n type: `NetworkController:setProviderType`;\n handler: NetworkController['setProviderType'];\n};\n\nexport type NetworkControllerSetActiveNetworkAction = {\n type: `NetworkController:setActiveNetwork`;\n handler: NetworkController['setActiveNetwork'];\n};\n\nexport type NetworkControllerGetNetworkConfigurationByNetworkClientId = {\n type: `NetworkController:getNetworkConfigurationByNetworkClientId`;\n handler: NetworkController['getNetworkConfigurationByNetworkClientId'];\n};\n\nexport type NetworkControllerActions =\n | NetworkControllerGetStateAction\n | NetworkControllerGetProviderConfigAction\n | NetworkControllerGetEthQueryAction\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetEIP1559CompatibilityAction\n | NetworkControllerFindNetworkClientIdByChainIdAction\n | NetworkControllerSetActiveNetworkAction\n | NetworkControllerSetProviderTypeAction\n | NetworkControllerGetNetworkConfigurationByNetworkClientId;\n\nexport type NetworkControllerMessenger = RestrictedControllerMessenger<\n typeof name,\n NetworkControllerActions,\n NetworkControllerEvents,\n string,\n string\n>;\n\nexport type NetworkControllerOptions = {\n messenger: NetworkControllerMessenger;\n trackMetaMetricsEvent: () => void;\n infuraProjectId: string;\n state?: Partial<NetworkState>;\n};\n\nexport const defaultState: NetworkState = {\n selectedNetworkClientId: NetworkType.mainnet,\n providerConfig: {\n type: NetworkType.mainnet,\n chainId: ChainId.mainnet,\n ticker: NetworksTicker.mainnet,\n },\n networksMetadata: {},\n networkConfigurations: {},\n};\n\ntype MetaMetricsEventPayload = {\n event: string;\n category: string;\n referrer?: { url: string };\n actionId?: number;\n environmentType?: string;\n properties?: unknown;\n sensitiveProperties?: unknown;\n revenue?: number;\n currency?: string;\n value?: number;\n};\n\ntype NetworkConfigurationId = string;\n\n/**\n * The collection of auto-managed network clients that map to Infura networks.\n */\ntype AutoManagedBuiltInNetworkClientRegistry = Record<\n BuiltInNetworkClientId,\n AutoManagedNetworkClient<InfuraNetworkClientConfiguration>\n>;\n\n/**\n * The collection of auto-managed network clients that map to Infura networks.\n */\ntype AutoManagedCustomNetworkClientRegistry = Record<\n CustomNetworkClientId,\n AutoManagedNetworkClient<CustomNetworkClientConfiguration>\n>;\n\n/**\n * The collection of auto-managed network clients that map to Infura networks\n * as well as custom networks that users have added.\n */\ntype AutoManagedNetworkClientRegistry = {\n [NetworkClientType.Infura]: AutoManagedBuiltInNetworkClientRegistry;\n [NetworkClientType.Custom]: AutoManagedCustomNetworkClientRegistry;\n};\n\n/**\n * Controller that creates and manages an Ethereum network provider.\n */\nexport class NetworkController extends BaseController<\n typeof name,\n NetworkState,\n NetworkControllerMessenger\n> {\n #ethQuery?: EthQuery;\n\n #infuraProjectId: string;\n\n #trackMetaMetricsEvent: (event: MetaMetricsEventPayload) => void;\n\n #previousProviderConfig: ProviderConfig;\n\n #providerProxy: ProviderProxy | undefined;\n\n #blockTrackerProxy: BlockTrackerProxy | undefined;\n\n #autoManagedNetworkClientRegistry?: AutoManagedNetworkClientRegistry;\n\n constructor({\n messenger,\n state,\n infuraProjectId,\n trackMetaMetricsEvent,\n }: NetworkControllerOptions) {\n super({\n name,\n metadata: {\n selectedNetworkClientId: {\n persist: true,\n anonymous: false,\n },\n networksMetadata: {\n persist: true,\n anonymous: false,\n },\n providerConfig: {\n persist: true,\n anonymous: false,\n },\n networkConfigurations: {\n persist: true,\n anonymous: false,\n },\n },\n messenger,\n state: { ...defaultState, ...state },\n });\n if (!infuraProjectId || typeof infuraProjectId !== 'string') {\n throw new Error('Invalid Infura project ID');\n }\n this.#infuraProjectId = infuraProjectId;\n this.#trackMetaMetricsEvent = trackMetaMetricsEvent;\n this.messagingSystem.registerActionHandler(\n `${this.name}:getProviderConfig`,\n () => {\n return this.state.providerConfig;\n },\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:getEthQuery`,\n () => {\n return this.#ethQuery;\n },\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:getNetworkClientById`,\n this.getNetworkClientById.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:getEIP1559Compatibility`,\n this.getEIP1559Compatibility.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:setActiveNetwork`,\n this.setActiveNetwork.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:setProviderType`,\n this.setProviderType.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:findNetworkClientIdByChainId`,\n this.findNetworkClientIdByChainId.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:getNetworkConfigurationByNetworkClientId`,\n this.getNetworkConfigurationByNetworkClientId.bind(this),\n );\n\n this.#previousProviderConfig = this.state.providerConfig;\n }\n\n /**\n * Accesses the provider and block tracker for the currently selected network.\n *\n * @returns The proxy and block tracker proxies.\n */\n getProviderAndBlockTracker(): {\n provider: SwappableProxy<ProxyWithAccessibleTarget<Provider>> | undefined;\n blockTracker:\n | SwappableProxy<ProxyWithAccessibleTarget<BlockTracker>>\n | undefined;\n } {\n return {\n provider: this.#providerProxy,\n blockTracker: this.#blockTrackerProxy,\n };\n }\n\n /**\n * Returns all of the network clients that have been created so far, keyed by\n * their identifier in the network client registry. This collection represents\n * not only built-in networks but also any custom networks that consumers have\n * added.\n *\n * @returns The list of known network clients.\n */\n getNetworkClientRegistry(): AutoManagedBuiltInNetworkClientRegistry &\n AutoManagedCustomNetworkClientRegistry {\n const autoManagedNetworkClientRegistry =\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n return Object.assign(\n {},\n autoManagedNetworkClientRegistry[NetworkClientType.Infura],\n autoManagedNetworkClientRegistry[NetworkClientType.Custom],\n );\n }\n\n /**\n * Returns the Infura network client with the given ID.\n *\n * @param infuraNetworkClientId - An Infura network client ID.\n * @returns The Infura network client.\n * @throws If an Infura network client does not exist with the given ID.\n */\n getNetworkClientById(\n infuraNetworkClientId: BuiltInNetworkClientId,\n ): AutoManagedNetworkClient<InfuraNetworkClientConfiguration>;\n\n /**\n * Returns the custom network client with the given ID.\n *\n * @param customNetworkClientId - A custom network client ID.\n * @returns The custom network client.\n * @throws If a custom network client does not exist with the given ID.\n */\n getNetworkClientById(\n customNetworkClientId: CustomNetworkClientId,\n ): AutoManagedNetworkClient<CustomNetworkClientConfiguration>;\n\n getNetworkClientById(\n networkClientId: NetworkClientId,\n ): AutoManagedNetworkClient<NetworkClientConfiguration> {\n if (!networkClientId) {\n throw new Error('No network client ID was provided.');\n }\n\n const autoManagedNetworkClientRegistry =\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n if (isInfuraNetworkType(networkClientId)) {\n const infuraNetworkClient =\n autoManagedNetworkClientRegistry[NetworkClientType.Infura][\n networkClientId\n ];\n if (!infuraNetworkClient) {\n throw new Error(\n `No Infura network client was found with the ID \"${networkClientId}\".`,\n );\n }\n return infuraNetworkClient;\n }\n\n const customNetworkClient =\n autoManagedNetworkClientRegistry[NetworkClientType.Custom][\n networkClientId\n ];\n if (!customNetworkClient) {\n throw new Error(\n `No custom network client was found with the ID \"${networkClientId}\".`,\n );\n }\n return customNetworkClient;\n }\n\n /**\n * Executes a series of steps to apply the changes to the provider config:\n *\n * 1. Notifies subscribers that the network is about to change.\n * 2. Looks up a known and preinitialized network client matching the provider\n * config and re-points the provider and block tracker proxy to it.\n * 3. Notifies subscribers that the network has changed.\n */\n async #refreshNetwork() {\n this.messagingSystem.publish(\n 'NetworkController:networkWillChange',\n this.state,\n );\n this.#applyNetworkSelection();\n this.messagingSystem.publish(\n 'NetworkController:networkDidChange',\n this.state,\n );\n await this.lookupNetwork();\n }\n\n /**\n * Populates the network clients and establishes the initial network based on\n * the provider configuration in state.\n */\n async initializeProvider() {\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n this.#applyNetworkSelection();\n await this.lookupNetwork();\n }\n\n /**\n * Refreshes the network meta with EIP-1559 support and the network status\n * based on the given network client ID.\n *\n * @param networkClientId - The ID of the network client to update.\n */\n async lookupNetworkByClientId(networkClientId: NetworkClientId) {\n const isInfura = isInfuraNetworkType(networkClientId);\n let updatedNetworkStatus: NetworkStatus;\n let updatedIsEIP1559Compatible: boolean | undefined;\n\n try {\n updatedIsEIP1559Compatible = await this.#determineEIP1559Compatibility(\n networkClientId,\n );\n updatedNetworkStatus = NetworkStatus.Available;\n } catch (error) {\n if (isErrorWithCode(error)) {\n let responseBody;\n if (\n isInfura &&\n hasProperty(error, 'message') &&\n typeof error.message === 'string'\n ) {\n try {\n responseBody = JSON.parse(error.message);\n } catch {\n // error.message must not be JSON\n }\n }\n\n if (\n isPlainObject(responseBody) &&\n responseBody.error === INFURA_BLOCKED_KEY\n ) {\n updatedNetworkStatus = NetworkStatus.Blocked;\n } else if (error.code === errorCodes.rpc.internal) {\n updatedNetworkStatus = NetworkStatus.Unknown;\n } else {\n updatedNetworkStatus = NetworkStatus.Unavailable;\n }\n } else if (\n typeof Error !== 'undefined' &&\n hasProperty(error as unknown as Error, 'message') &&\n typeof (error as unknown as Error).message === 'string' &&\n (error as unknown as Error).message.includes(\n 'No custom network client was found with the ID',\n )\n ) {\n throw error;\n } else {\n log('NetworkController - could not determine network status', error);\n updatedNetworkStatus = NetworkStatus.Unknown;\n }\n }\n this.update((state) => {\n if (state.networksMetadata[networkClientId] === undefined) {\n state.networksMetadata[networkClientId] = {\n status: NetworkStatus.Unknown,\n EIPS: {},\n };\n }\n const meta = state.networksMetadata[networkClientId];\n meta.status = updatedNetworkStatus;\n if (updatedIsEIP1559Compatible === undefined) {\n delete meta.EIPS[1559];\n } else {\n meta.EIPS[1559] = updatedIsEIP1559Compatible;\n }\n });\n }\n\n /**\n * Performs side effects after switching to a network. If the network is\n * available, updates the network state with the network ID of the network and\n * stores whether the network supports EIP-1559; otherwise clears said\n * information about the network that may have been previously stored.\n *\n * @param networkClientId - (Optional) The ID of the network client to update.\n * If no ID is provided, uses the currently selected network.\n * @fires infuraIsBlocked if the network is Infura-supported and is blocking\n * requests.\n * @fires infuraIsUnblocked if the network is Infura-supported and is not\n * blocking requests, or if the network is not Infura-supported.\n */\n async lookupNetwork(networkClientId?: NetworkClientId) {\n if (networkClientId) {\n await this.lookupNetworkByClientId(networkClientId);\n return;\n }\n\n if (!this.#ethQuery) {\n return;\n }\n\n const isInfura = isInfuraProviderConfig(this.state.providerConfig);\n\n let networkChanged = false;\n const listener = () => {\n networkChanged = true;\n this.messagingSystem.unsubscribe(\n 'NetworkController:networkDidChange',\n listener,\n );\n };\n this.messagingSystem.subscribe(\n 'NetworkController:networkDidChange',\n listener,\n );\n\n let updatedNetworkStatus: NetworkStatus;\n let updatedIsEIP1559Compatible: boolean | undefined;\n\n try {\n const isEIP1559Compatible = await this.#determineEIP1559Compatibility(\n this.state.selectedNetworkClientId,\n );\n updatedNetworkStatus = NetworkStatus.Available;\n updatedIsEIP1559Compatible = isEIP1559Compatible;\n } catch (error) {\n if (isErrorWithCode(error)) {\n let responseBody;\n if (\n isInfura &&\n hasProperty(error, 'message') &&\n typeof error.message === 'string'\n ) {\n try {\n responseBody = JSON.parse(error.message);\n } catch {\n // error.message must not be JSON\n }\n }\n\n if (\n isPlainObject(responseBody) &&\n responseBody.error === INFURA_BLOCKED_KEY\n ) {\n updatedNetworkStatus = NetworkStatus.Blocked;\n } else if (error.code === errorCodes.rpc.internal) {\n updatedNetworkStatus = NetworkStatus.Unknown;\n } else {\n updatedNetworkStatus = NetworkStatus.Unavailable;\n }\n } else {\n log('NetworkController - could not determine network status', error);\n updatedNetworkStatus = NetworkStatus.Unknown;\n }\n }\n\n if (networkChanged) {\n // If the network has changed, then `lookupNetwork` either has been or is\n // in the process of being called, so we don't need to go further.\n return;\n }\n this.messagingSystem.unsubscribe(\n 'NetworkController:networkDidChange',\n listener,\n );\n\n this.update((state) => {\n const meta = state.networksMetadata[state.selectedNetworkClientId];\n meta.status = updatedNetworkStatus;\n if (updatedIsEIP1559Compatible === undefined) {\n delete meta.EIPS[1559];\n } else {\n meta.EIPS[1559] = updatedIsEIP1559Compatible;\n }\n });\n\n if (isInfura) {\n if (updatedNetworkStatus === NetworkStatus.Available) {\n this.messagingSystem.publish('NetworkController:infuraIsUnblocked');\n } else if (updatedNetworkStatus === NetworkStatus.Blocked) {\n this.messagingSystem.publish('NetworkController:infuraIsBlocked');\n }\n } else {\n // Always publish infuraIsUnblocked regardless of network status to\n // prevent consumers from being stuck in a blocked state if they were\n // previously connected to an Infura network that was blocked\n this.messagingSystem.publish('NetworkController:infuraIsUnblocked');\n }\n }\n\n /**\n * Convenience method to update provider network type settings.\n *\n * @param type - Human readable network name.\n * @deprecated This has been replaced by `setActiveNetwork`, and will be\n * removed in a future release\n */\n async setProviderType(type: InfuraNetworkType) {\n assert.notStrictEqual(\n type,\n NetworkType.rpc,\n `NetworkController - cannot call \"setProviderType\" with type \"${NetworkType.rpc}\". Use \"setActiveNetwork\"`,\n );\n assert.ok(\n isInfuraNetworkType(type),\n `Unknown Infura provider type \"${type}\".`,\n );\n\n await this.setActiveNetwork(type);\n }\n\n /**\n * Convenience method to update provider RPC settings.\n *\n * @param networkConfigurationIdOrType - The unique id for the network configuration to set as the active provider,\n * or the type of a built-in network.\n */\n async setActiveNetwork(networkConfigurationIdOrType: string) {\n this.#previousProviderConfig = this.state.providerConfig;\n\n let targetNetwork: ProviderConfig;\n if (isInfuraNetworkType(networkConfigurationIdOrType)) {\n const ticker = NetworksTicker[networkConfigurationIdOrType];\n\n targetNetwork = {\n chainId: ChainId[networkConfigurationIdOrType],\n id: undefined,\n rpcPrefs: BUILT_IN_NETWORKS[networkConfigurationIdOrType].rpcPrefs,\n rpcUrl: undefined,\n nickname: undefined,\n ticker,\n type: networkConfigurationIdOrType,\n };\n } else {\n if (\n !Object.keys(this.state.networkConfigurations).includes(\n networkConfigurationIdOrType,\n )\n ) {\n throw new Error(\n `networkConfigurationId ${networkConfigurationIdOrType} does not match a configured networkConfiguration or built-in network type`,\n );\n }\n targetNetwork = {\n ...this.state.networkConfigurations[networkConfigurationIdOrType],\n type: NetworkType.rpc,\n };\n }\n\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n this.update((state) => {\n state.providerConfig = targetNetwork;\n });\n\n await this.#refreshNetwork();\n }\n\n /**\n * Fetches the latest block for the network.\n *\n * @param networkClientId - The networkClientId to fetch the correct provider against which to check the latest block. Defaults to the selectedNetworkClientId.\n * @returns A promise that either resolves to the block header or null if\n * there is no latest block, or rejects with an error.\n */\n #getLatestBlock(networkClientId: NetworkClientId): Promise<Block> {\n if (networkClientId === undefined) {\n networkClientId = this.state.selectedNetworkClientId;\n }\n\n const networkClient = this.getNetworkClientById(networkClientId);\n const ethQuery = new EthQuery(networkClient.provider);\n\n return new Promise((resolve, reject) => {\n ethQuery.sendAsync(\n { method: 'eth_getBlockByNumber', params: ['latest', false] },\n (error: unknown, block?: unknown) => {\n if (error) {\n reject(error);\n } else {\n // TODO: Validate this type\n resolve(block as Block);\n }\n },\n );\n });\n }\n\n /**\n * Determines whether the network supports EIP-1559 by checking whether the\n * latest block has a `baseFeePerGas` property, then updates state\n * appropriately.\n *\n * @param networkClientId - The networkClientId to fetch the correct provider against which to check 1559 compatibility.\n * @returns A promise that resolves to true if the network supports EIP-1559\n * , false otherwise, or `undefined` if unable to determine the compatibility.\n */\n async getEIP1559Compatibility(networkClientId?: NetworkClientId) {\n if (networkClientId) {\n return this.get1559CompatibilityWithNetworkClientId(networkClientId);\n }\n if (!this.#ethQuery) {\n return false;\n }\n\n const { EIPS } =\n this.state.networksMetadata[this.state.selectedNetworkClientId];\n\n if (EIPS[1559] !== undefined) {\n return EIPS[1559];\n }\n\n const isEIP1559Compatible = await this.#determineEIP1559Compatibility(\n this.state.selectedNetworkClientId,\n );\n this.update((state) => {\n if (isEIP1559Compatible !== undefined) {\n state.networksMetadata[state.selectedNetworkClientId].EIPS[1559] =\n isEIP1559Compatible;\n }\n });\n return isEIP1559Compatible;\n }\n\n async get1559CompatibilityWithNetworkClientId(\n networkClientId: NetworkClientId,\n ) {\n let metadata = this.state.networksMetadata[networkClientId];\n if (metadata === undefined) {\n await this.lookupNetwork(networkClientId);\n metadata = this.state.networksMetadata[networkClientId];\n }\n const { EIPS } = metadata;\n\n // may want to include some 'freshness' value - something to make sure we refetch this from time to time\n return EIPS[1559];\n }\n\n /**\n * Retrieves and checks the latest block from the currently selected\n * network; if the block has a `baseFeePerGas` property, then we know\n * that the network supports EIP-1559; otherwise it doesn't.\n *\n * @param networkClientId - The networkClientId to fetch the correct provider against which to check 1559 compatibility\n * @returns A promise that resolves to `true` if the network supports EIP-1559,\n * `false` otherwise, or `undefined` if unable to retrieve the last block.\n */\n async #determineEIP1559Compatibility(\n networkClientId: NetworkClientId,\n ): Promise<boolean | undefined> {\n const latestBlock = await this.#getLatestBlock(networkClientId);\n\n if (!latestBlock) {\n return undefined;\n }\n\n return latestBlock.baseFeePerGas !== undefined;\n }\n\n /**\n * Re-initializes the provider and block tracker for the current network.\n */\n async resetConnection() {\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n await this.#refreshNetwork();\n }\n\n /**\n * Returns a configuration object for the network identified by the given\n * network client ID. If given an Infura network type, constructs one based on\n * what we know about the network; otherwise attempts locates a network\n * configuration in state that corresponds to the network client ID.\n *\n * @param networkClientId - The network client ID.\n * @returns The configuration for the referenced network if one exists, or\n * undefined otherwise.\n */\n getNetworkConfigurationByNetworkClientId(\n networkClientId: NetworkClientId,\n ): NetworkConfiguration | undefined {\n if (isInfuraNetworkType(networkClientId)) {\n const rpcUrl = `https://${networkClientId}.infura.io/v3/${\n this.#infuraProjectId\n }`;\n return {\n rpcUrl,\n ...BUILT_IN_NETWORKS[networkClientId],\n };\n }\n\n return this.state.networkConfigurations[networkClientId];\n }\n\n /**\n * Adds a new custom network or updates the information for an existing\n * network.\n *\n * This may involve updating the `networkConfigurations` property in\n * state as well and/or adding a new network client to the network client\n * registry. The `rpcUrl` and `chainId` of the given object are used to\n * determine which action to take:\n *\n * - If the `rpcUrl` corresponds to an existing network configuration\n * (case-insensitively), then it is overwritten with the object. Furthermore,\n * if the `chainId` is different from the existing network configuration, then\n * the existing network client is replaced with a new one.\n * - If the `rpcUrl` does not correspond to an existing network configuration\n * (case-insensitively), then the object is used to add a new network\n * configuration along with a new network client.\n *\n * @param networkConfiguration - The network configuration to add or update.\n * @param options - Additional configuration options.\n * @param options.referrer - Used to create a metrics event; the site from which the call originated, or 'metamask' for internal calls.\n * @param options.source - Used to create a metrics event; where the event originated (i.e. from a dapp or from the network form).\n * @param options.setActive - If true, switches to the network upon adding or updating it (default: false).\n * @returns The ID for the added or updated network configuration.\n */\n async upsertNetworkConfiguration(\n networkConfiguration: NetworkConfiguration,\n {\n referrer,\n source,\n setActive = false,\n }: {\n referrer: string;\n source: string;\n setActive?: boolean;\n },\n ): Promise<string> {\n const sanitizedNetworkConfiguration: NetworkConfiguration = pick(\n networkConfiguration,\n ['rpcUrl', 'chainId', 'ticker', 'nickname', 'rpcPrefs'],\n );\n const { rpcUrl, chainId, ticker } = sanitizedNetworkConfiguration;\n\n assertIsStrictHexString(chainId);\n if (!isSafeChainId(chainId)) {\n throw new Error(\n `Invalid chain ID \"${chainId}\": numerical value greater than max safe value.`,\n );\n }\n if (!rpcUrl) {\n throw new Error(\n 'An rpcUrl is required to add or update network configuration',\n );\n }\n if (!referrer || !source) {\n throw new Error(\n 'referrer and source are required arguments for adding or updating a network configuration',\n );\n }\n try {\n new URL(rpcUrl);\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.message.includes('Invalid URL')) {\n throw new Error('rpcUrl must be a valid URL');\n }\n }\n if (!ticker) {\n throw new Error(\n 'A ticker is required to add or update networkConfiguration',\n );\n }\n\n const autoManagedNetworkClientRegistry =\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n const existingNetworkConfiguration = Object.values(\n this.state.networkConfigurations,\n ).find(\n (networkConfig) =>\n networkConfig.rpcUrl.toLowerCase() === rpcUrl.toLowerCase(),\n );\n const upsertedNetworkConfigurationId = existingNetworkConfiguration\n ? existingNetworkConfiguration.id\n : random();\n const networkClientId = buildCustomNetworkClientId(\n upsertedNetworkConfigurationId,\n );\n\n const customNetworkClientRegistry =\n autoManagedNetworkClientRegistry[NetworkClientType.Custom];\n const existingAutoManagedNetworkClient =\n customNetworkClientRegistry[networkClientId];\n const shouldDestroyExistingNetworkClient =\n existingAutoManagedNetworkClient &&\n existingAutoManagedNetworkClient.configuration.chainId !== chainId;\n if (shouldDestroyExistingNetworkClient) {\n existingAutoManagedNetworkClient.destroy();\n }\n if (\n !existingAutoManagedNetworkClient ||\n shouldDestroyExistingNetworkClient\n ) {\n customNetworkClientRegistry[networkClientId] =\n createAutoManagedNetworkClient({\n type: NetworkClientType.Custom,\n chainId,\n rpcUrl,\n ticker,\n });\n }\n\n this.update((state) => {\n state.networkConfigurations[upsertedNetworkConfigurationId] = {\n id: upsertedNetworkConfigurationId,\n ...sanitizedNetworkConfiguration,\n };\n });\n\n if (!existingNetworkConfiguration) {\n this.#trackMetaMetricsEvent({\n event: 'Custom Network Added',\n category: 'Network',\n referrer: {\n url: referrer,\n },\n properties: {\n chain_id: chainId,\n symbol: ticker,\n source,\n },\n });\n }\n\n if (setActive) {\n await this.setActiveNetwork(upsertedNetworkConfigurationId);\n }\n\n return upsertedNetworkConfigurationId;\n }\n\n /**\n * Removes a custom network from state.\n *\n * This involves updating the `networkConfigurations` property in state as\n * well and removing the network client that corresponds to the network from\n * the client registry.\n *\n * @param networkConfigurationId - The ID of an existing network\n * configuration.\n */\n removeNetworkConfiguration(networkConfigurationId: string) {\n if (!this.state.networkConfigurations[networkConfigurationId]) {\n throw new Error(\n `networkConfigurationId ${networkConfigurationId} does not match a configured networkConfiguration`,\n );\n }\n\n const autoManagedNetworkClientRegistry =\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n const networkClientId = buildCustomNetworkClientId(networkConfigurationId);\n\n this.update((state) => {\n delete state.networkConfigurations[networkConfigurationId];\n });\n\n const customNetworkClientRegistry =\n autoManagedNetworkClientRegistry[NetworkClientType.Custom];\n const existingAutoManagedNetworkClient =\n customNetworkClientRegistry[networkClientId];\n existingAutoManagedNetworkClient.destroy();\n delete customNetworkClientRegistry[networkClientId];\n }\n\n /**\n * Switches to the previously selected network, assuming that there is one\n * (if not and `initializeProvider` has not been previously called, then this\n * method is equivalent to calling `resetConnection`).\n */\n async rollbackToPreviousProvider() {\n this.#ensureAutoManagedNetworkClientRegistryPopulated();\n\n this.update((state) => {\n state.providerConfig = this.#previousProviderConfig;\n });\n\n await this.#refreshNetwork();\n }\n\n /**\n * Deactivates the controller, stopping any ongoing polling.\n *\n * In-progress requests will not be aborted.\n */\n async destroy() {\n await this.#blockTrackerProxy?.destroy();\n }\n\n /**\n * Updates the controller using the given backup data.\n *\n * @param backup - The data that has been backed up.\n * @param backup.networkConfigurations - Network configurations in the backup.\n */\n loadBackup({\n networkConfigurations,\n }: {\n networkConfigurations: NetworkState['networkConfigurations'];\n }): void {\n this.update((state) => {\n state.networkConfigurations = {\n ...state.networkConfigurations,\n ...networkConfigurations,\n };\n });\n }\n\n /**\n * Searches for a network configuration ID with the given ChainID and returns it.\n *\n * @param chainId - ChainId to search for\n * @returns networkClientId of the network configuration with the given chainId\n */\n findNetworkClientIdByChainId(chainId: Hex): NetworkClientId {\n const networkClients = this.getNetworkClientRegistry();\n const networkClientEntry = Object.entries(networkClients).find(\n ([_, networkClient]) => networkClient.configuration.chainId === chainId,\n );\n if (networkClientEntry === undefined) {\n throw new Error(\"Couldn't find networkClientId for chainId\");\n }\n return networkClientEntry[0];\n }\n\n /**\n * Before accessing or switching the network, the registry of network clients\n * needs to be populated. Otherwise, `#applyNetworkSelection` and\n * `getNetworkClientRegistry` will throw an error. This method checks to see if the\n * population step has happened yet, and if not, makes it happen.\n *\n * @returns The populated network client registry.\n */\n #ensureAutoManagedNetworkClientRegistryPopulated(): AutoManagedNetworkClientRegistry {\n const autoManagedNetworkClientRegistry =\n this.#autoManagedNetworkClientRegistry ??\n this.#createAutoManagedNetworkClientRegistry();\n this.#autoManagedNetworkClientRegistry = autoManagedNetworkClientRegistry;\n return autoManagedNetworkClientRegistry;\n }\n\n /**\n * Constructs the registry of network clients based on the set of built-in\n * networks as well as the custom networks in state.\n *\n * @returns The network clients keyed by ID.\n */\n #createAutoManagedNetworkClientRegistry(): AutoManagedNetworkClientRegistry {\n return [\n ...this.#buildIdentifiedInfuraNetworkClientConfigurations(),\n ...this.#buildIdentifiedCustomNetworkClientConfigurations(),\n ...this.#buildIdentifiedNetworkClientConfigurationsFromProviderConfig(),\n ].reduce(\n (\n registry,\n [networkClientType, networkClientId, networkClientConfiguration],\n ) => {\n const autoManagedNetworkClient = createAutoManagedNetworkClient(\n networkClientConfiguration,\n );\n if (networkClientId in registry[networkClientType]) {\n return registry;\n }\n return {\n ...registry,\n [networkClientType]: {\n ...registry[networkClientType],\n [networkClientId]: autoManagedNetworkClient,\n },\n };\n },\n {\n [NetworkClientType.Infura]: {},\n [NetworkClientType.Custom]: {},\n },\n ) as AutoManagedNetworkClientRegistry;\n }\n\n /**\n * Constructs the list of network clients for built-in networks (that is,\n * the subset of the networks we know Infura supports that consumers do not\n * need to explicitly add).\n *\n * @returns The network clients.\n */\n #buildIdentifiedInfuraNetworkClientConfigurations(): [\n NetworkClientType.Infura,\n BuiltInNetworkClientId,\n InfuraNetworkClientConfiguration,\n ][] {\n return knownKeysOf(InfuraNetworkType).map((network) => {\n const networkClientId = buildInfuraNetworkClientId(network);\n const networkClientConfiguration: InfuraNetworkClientConfiguration = {\n type: NetworkClientType.Infura,\n network,\n infuraProjectId: this.#infuraProjectId,\n chainId: BUILT_IN_NETWORKS[network].chainId,\n ticker: BUILT_IN_NETWORKS[network].ticker,\n };\n return [\n NetworkClientType.Infura,\n networkClientId,\n networkClientConfiguration,\n ];\n });\n }\n\n /**\n * Constructs the list of network clients for custom networks (that is, those\n * which consumers have added via `networkConfigurations`).\n *\n * @returns The network clients.\n */\n #buildIdentifiedCustomNetworkClientConfigurations(): [\n NetworkClientType.Custom,\n CustomNetworkClientId,\n CustomNetworkClientConfiguration,\n ][] {\n return Object.entries(this.state.networkConfigurations).map(\n ([networkConfigurationId, networkConfiguration]) => {\n if (networkConfiguration.chainId === undefined) {\n throw new Error('chainId must be provided for custom RPC endpoints');\n }\n if (networkConfiguration.rpcUrl === undefined) {\n throw new Error('rpcUrl must be provided for custom RPC endpoints');\n }\n const networkClientId = buildCustomNetworkClientId(\n networkConfigurationId,\n );\n const networkClientConfiguration: CustomNetworkClientConfiguration = {\n type: NetworkClientType.Custom,\n chainId: networkConfiguration.chainId,\n rpcUrl: networkConfiguration.rpcUrl,\n ticker: networkConfiguration.ticker,\n };\n return [\n NetworkClientType.Custom,\n networkClientId,\n networkClientConfiguration,\n ];\n },\n );\n }\n\n /**\n * Converts the provider config object in state to a network client\n * configuration object.\n *\n * @returns The network client config.\n * @throws If the provider config is of type \"rpc\" and lacks either a\n * `chainId` or an `rpcUrl`.\n */\n #buildIdentifiedNetworkClientConfigurationsFromProviderConfig():\n | [\n [\n NetworkClientType.Custom,\n CustomNetworkClientId,\n CustomNetworkClientConfiguration,\n ],\n ]\n | [] {\n const { providerConfig } = this.state;\n\n if (isCustomProviderConfig(providerConfig)) {\n validateCustomProviderConfig(providerConfig);\n const networkClientId = buildCustomNetworkClientId(\n providerConfig,\n this.state.networkConfigurations,\n );\n const networkClientConfiguration: CustomNetworkClientConfiguration = {\n chainId: providerConfig.chainId,\n rpcUrl: providerConfig.rpcUrl,\n type: NetworkClientType.Custom,\n ticker: providerConfig.ticker,\n };\n return [\n [NetworkClientType.Custom, networkClientId, networkClientConfiguration],\n ];\n }\n\n if (isInfuraProviderConfig(providerConfig)) {\n return [];\n }\n\n throw new Error(`Unrecognized network type: '${providerConfig.type}'`);\n }\n\n /**\n * Uses the information in the provider config object to look up a known and\n * preinitialized network client. Once a network client is found, updates the\n * provider and block tracker proxy to point to those from the network client,\n * then finally creates an EthQuery that points to the provider proxy.\n *\n * @throws If no network client could be found matching the current provider\n * config.\n */\n #applyNetworkSelection() {\n if (!this.#autoManagedNetworkClientRegistry) {\n throw new Error(\n 'initializeProvider must be called first in order to switch the network',\n );\n }\n\n const { providerConfig } = this.state;\n\n let autoManagedNetworkClient: AutoManagedNetworkClient<NetworkClientConfiguration>;\n\n let networkClientId: NetworkClientId;\n if (isInfuraProviderConfig(providerConfig)) {\n const networkClientType = NetworkClientType.Infura;\n networkClientId = buildInfuraNetworkClientId(providerConfig);\n const builtInNetworkClientRegistry =\n this.#autoManagedNetworkClientRegistry[networkClientType];\n autoManagedNetworkClient =\n builtInNetworkClientRegistry[networkClientId as BuiltInNetworkClientId];\n if (!autoManagedNetworkClient) {\n throw new Error(\n `Could not find custom network matching ${networkClientId}`,\n );\n }\n } else if (isCustomProviderConfig(providerConfig)) {\n validateCustomProviderConfig(providerConfig);\n const networkClientType = NetworkClientType.Custom;\n networkClientId = buildCustomNetworkClientId(\n providerConfig,\n this.state.networkConfigurations,\n );\n const customNetworkClientRegistry =\n this.#autoManagedNetworkClientRegistry[networkClientType];\n autoManagedNetworkClient = customNetworkClientRegistry[networkClientId];\n if (!autoManagedNetworkClient) {\n throw new Error(\n `Could not find built-in network matching ${networkClientId}`,\n );\n }\n } else {\n throw new Error('Could not determine type of provider config');\n }\n\n this.update((state) => {\n state.selectedNetworkClientId = networkClientId;\n if (state.networksMetadata[networkClientId] === undefined) {\n state.networksMetadata[networkClientId] = {\n status: NetworkStatus.Unknown,\n EIPS: {},\n };\n }\n });\n\n const { provider, blockTracker } = autoManagedNetworkClient;\n\n if (this.#providerProxy) {\n this.#providerProxy.setTarget(provider);\n } else {\n this.#providerProxy = createEventEmitterProxy(provider);\n }\n\n if (this.#blockTrackerProxy) {\n this.#blockTrackerProxy.setTarget(blockTracker);\n } else {\n this.#blockTrackerProxy = createEventEmitterProxy(blockTracker, {\n eventFilter: 'skipInternal',\n });\n }\n\n this.#ethQuery = new EthQuery(this.#providerProxy);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"create-auto-managed-network-client.d.ts","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,QAAA,MAAM,wBAAwB,eAAe,CAAC;AAE9C;;;;;;;;GAQG;AACH,oBAAY,yBAAyB,CAAC,UAAU,IAAI,UAAU,GAAG;IAC/D,CAAC,wBAAwB,CAAC,EAAE,UAAU,CAAC;CACxC,CAAC;AAEF;;;;GAIG;AACH,oBAAY,wBAAwB,CAClC,aAAa,SAAS,0BAA0B,IAC9C;IACF,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC9C,YAAY,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AASF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,SAAS,0BAA0B,EAEhD,0BAA0B,EAAE,aAAa,GACxC,wBAAwB,CAAC,aAAa,CAAC,CA0GzC"}
1
+ {"version":3,"file":"create-auto-managed-network-client.d.ts","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,QAAA,MAAM,wBAAwB,eAAe,CAAC;AAE9C;;;;;;;;GAQG;AACH,oBAAY,yBAAyB,CAAC,UAAU,IAAI,UAAU,GAAG;IAC/D,CAAC,wBAAwB,CAAC,EAAE,UAAU,CAAC;CACxC,CAAC;AAEF;;;;GAIG;AACH,oBAAY,wBAAwB,CAClC,aAAa,SAAS,0BAA0B,IAC9C;IACF,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC9C,YAAY,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AASF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,SAAS,0BAA0B,EAEhD,0BAA0B,EAAE,aAAa,GACxC,wBAAwB,CAAC,aAAa,CAAC,CAsHzC"}
@@ -31,6 +31,8 @@ const UNINITIALIZED_TARGET = { __UNINITIALIZED__: true };
31
31
  function createAutoManagedNetworkClient(networkClientConfiguration) {
32
32
  let networkClient;
33
33
  const providerProxy = new Proxy(UNINITIALIZED_TARGET, {
34
+ // TODO: Replace `any` with type
35
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
36
  get(_target, propertyName, receiver) {
35
37
  if (propertyName === REFLECTIVE_PROPERTY_NAME) {
36
38
  return networkClient === null || networkClient === void 0 ? void 0 : networkClient.provider;
@@ -48,6 +50,8 @@ function createAutoManagedNetworkClient(networkClientConfiguration) {
48
50
  // Ensure that the method on the provider is called with `this` as
49
51
  // the target, *not* the proxy (which happens by default) —
50
52
  // this allows private properties to be accessed
53
+ // TODO: Replace `any` with type
54
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
55
  return function (...args) {
52
56
  // @ts-expect-error We don't care that `this` may not be compatible
53
57
  // with the signature of the method being called, as technically
@@ -59,6 +63,8 @@ function createAutoManagedNetworkClient(networkClientConfiguration) {
59
63
  }
60
64
  return undefined;
61
65
  },
66
+ // TODO: Replace `any` with type
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
68
  has(_target, propertyName) {
63
69
  if (propertyName === REFLECTIVE_PROPERTY_NAME) {
64
70
  return true;
@@ -69,6 +75,8 @@ function createAutoManagedNetworkClient(networkClientConfiguration) {
69
75
  },
70
76
  });
71
77
  const blockTrackerProxy = new Proxy(UNINITIALIZED_TARGET, {
78
+ // TODO: Replace `any` with type
79
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
80
  get(_target, propertyName, receiver) {
73
81
  if (propertyName === REFLECTIVE_PROPERTY_NAME) {
74
82
  return networkClient === null || networkClient === void 0 ? void 0 : networkClient.blockTracker;
@@ -86,6 +94,8 @@ function createAutoManagedNetworkClient(networkClientConfiguration) {
86
94
  // Ensure that the method on the provider is called with `this` as
87
95
  // the target, *not* the proxy (which happens by default) —
88
96
  // this allows private properties to be accessed
97
+ // TODO: Replace `any` with type
98
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
99
  return function (...args) {
90
100
  // @ts-expect-error We don't care that `this` may not be
91
101
  // compatible with the signature of the method being called, as
@@ -97,6 +107,8 @@ function createAutoManagedNetworkClient(networkClientConfiguration) {
97
107
  }
98
108
  return undefined;
99
109
  },
110
+ // TODO: Replace `any` with type
111
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
112
  has(_target, propertyName) {
101
113
  if (propertyName === REFLECTIVE_PROPERTY_NAME) {
102
114
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"create-auto-managed-network-client.js","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClient } from './create-network-client';\nimport { createNetworkClient } from './create-network-client';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\n\n/**\n * The name of the method on both the provider and block tracker proxy which can\n * be used to get the underlying provider or block tracker from the network\n * client, when it is initialized.\n */\nconst REFLECTIVE_PROPERTY_NAME = '__target__';\n\n/**\n * Represents a proxy object which wraps a target object. As a proxy, it allows\n * for accessing and setting all of the properties that the target object\n * supports, but also supports an extra propertyName (`__target__`) to access\n * the target itself.\n *\n * @template Type - The type of the target object. It is assumed that this type\n * will be constant even when the target is swapped.\n */\nexport type ProxyWithAccessibleTarget<TargetType> = TargetType & {\n [REFLECTIVE_PROPERTY_NAME]: TargetType;\n};\n\n/**\n * An object that provides the same interface as a network client but where the\n * network client is not initialized until either the provider or block tracker\n * is first accessed.\n */\nexport type AutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n> = {\n configuration: Configuration;\n provider: ProxyWithAccessibleTarget<Provider>;\n blockTracker: ProxyWithAccessibleTarget<BlockTracker>;\n destroy: () => void;\n};\n\n/**\n * By default, the provider and block provider proxies will point to nothing.\n * This is impossible when using the Proxy API, as the target object has to be\n * something, so this object represents that \"something\".\n */\nconst UNINITIALIZED_TARGET = { __UNINITIALIZED__: true };\n\n/**\n * This function creates two proxies, one that wraps a provider and another that\n * wraps a block tracker. These proxies are unique in that both will be \"empty\"\n * at first; that is, neither will point to a functional provider or block\n * tracker. Instead, as soon as a method or event is accessed on either object\n * that requires a network request to function, a network client is created on\n * the fly and the method or event in question is then forwarded to whichever\n * part of the network client is serving as the receiver. The network client is\n * then cached for subsequent usages.\n *\n * @param networkClientConfiguration - The configuration object that will be\n * used to instantiate the network client when it is needed.\n * @returns The auto-managed network client.\n */\nexport function createAutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n>(\n networkClientConfiguration: Configuration,\n): AutoManagedNetworkClient<Configuration> {\n let networkClient: NetworkClient | undefined;\n\n const providerProxy = new Proxy(UNINITIALIZED_TARGET, {\n get(_target: any, propertyName: PropertyKey, receiver: unknown) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.provider;\n }\n\n networkClient ??= createNetworkClient(networkClientConfiguration);\n if (networkClient === undefined) {\n throw new Error(\n \"It looks like `createNetworkClient` didn't return anything. Perhaps it's being mocked?\",\n );\n }\n const { provider } = networkClient;\n\n if (propertyName in provider) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = provider[propertyName as keyof typeof provider];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n return function (this: unknown, ...args: any[]) {\n // @ts-expect-error We don't care that `this` may not be compatible\n // with the signature of the method being called, as technically\n // it can be anything.\n return value.apply(this === receiver ? provider : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n has(_target: any, propertyName: PropertyKey) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n networkClient ??= createNetworkClient(networkClientConfiguration);\n const { provider } = networkClient;\n return propertyName in provider;\n },\n });\n\n const blockTrackerProxy: ProxyWithAccessibleTarget<BlockTracker> = new Proxy(\n UNINITIALIZED_TARGET,\n {\n get(_target: any, propertyName: PropertyKey, receiver: unknown) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.blockTracker;\n }\n\n networkClient ??= createNetworkClient(networkClientConfiguration);\n if (networkClient === undefined) {\n throw new Error(\n \"It looks like createNetworkClient returned undefined. Perhaps it's mocked?\",\n );\n }\n const { blockTracker } = networkClient;\n\n if (propertyName in blockTracker) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = blockTracker[propertyName as keyof typeof blockTracker];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n return function (this: unknown, ...args: any[]) {\n // @ts-expect-error We don't care that `this` may not be\n // compatible with the signature of the method being called, as\n // technically it can be anything.\n return value.apply(this === receiver ? blockTracker : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n has(_target: any, propertyName: PropertyKey) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n networkClient ??= createNetworkClient(networkClientConfiguration);\n const { blockTracker } = networkClient;\n return propertyName in blockTracker;\n },\n },\n );\n\n const destroy = () => {\n networkClient?.destroy();\n };\n\n return {\n configuration: networkClientConfiguration,\n provider: providerProxy,\n blockTracker: blockTrackerProxy,\n destroy,\n };\n}\n"]}
1
+ {"version":3,"file":"create-auto-managed-network-client.js","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClient } from './create-network-client';\nimport { createNetworkClient } from './create-network-client';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\n\n/**\n * The name of the method on both the provider and block tracker proxy which can\n * be used to get the underlying provider or block tracker from the network\n * client, when it is initialized.\n */\nconst REFLECTIVE_PROPERTY_NAME = '__target__';\n\n/**\n * Represents a proxy object which wraps a target object. As a proxy, it allows\n * for accessing and setting all of the properties that the target object\n * supports, but also supports an extra propertyName (`__target__`) to access\n * the target itself.\n *\n * @template Type - The type of the target object. It is assumed that this type\n * will be constant even when the target is swapped.\n */\nexport type ProxyWithAccessibleTarget<TargetType> = TargetType & {\n [REFLECTIVE_PROPERTY_NAME]: TargetType;\n};\n\n/**\n * An object that provides the same interface as a network client but where the\n * network client is not initialized until either the provider or block tracker\n * is first accessed.\n */\nexport type AutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n> = {\n configuration: Configuration;\n provider: ProxyWithAccessibleTarget<Provider>;\n blockTracker: ProxyWithAccessibleTarget<BlockTracker>;\n destroy: () => void;\n};\n\n/**\n * By default, the provider and block provider proxies will point to nothing.\n * This is impossible when using the Proxy API, as the target object has to be\n * something, so this object represents that \"something\".\n */\nconst UNINITIALIZED_TARGET = { __UNINITIALIZED__: true };\n\n/**\n * This function creates two proxies, one that wraps a provider and another that\n * wraps a block tracker. These proxies are unique in that both will be \"empty\"\n * at first; that is, neither will point to a functional provider or block\n * tracker. Instead, as soon as a method or event is accessed on either object\n * that requires a network request to function, a network client is created on\n * the fly and the method or event in question is then forwarded to whichever\n * part of the network client is serving as the receiver. The network client is\n * then cached for subsequent usages.\n *\n * @param networkClientConfiguration - The configuration object that will be\n * used to instantiate the network client when it is needed.\n * @returns The auto-managed network client.\n */\nexport function createAutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n>(\n networkClientConfiguration: Configuration,\n): AutoManagedNetworkClient<Configuration> {\n let networkClient: NetworkClient | undefined;\n\n const providerProxy = new Proxy(UNINITIALIZED_TARGET, {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(_target: any, propertyName: PropertyKey, receiver: unknown) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.provider;\n }\n\n networkClient ??= createNetworkClient(networkClientConfiguration);\n if (networkClient === undefined) {\n throw new Error(\n \"It looks like `createNetworkClient` didn't return anything. Perhaps it's being mocked?\",\n );\n }\n const { provider } = networkClient;\n\n if (propertyName in provider) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = provider[propertyName as keyof typeof provider];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (this: unknown, ...args: any[]) {\n // @ts-expect-error We don't care that `this` may not be compatible\n // with the signature of the method being called, as technically\n // it can be anything.\n return value.apply(this === receiver ? provider : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n has(_target: any, propertyName: PropertyKey) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n networkClient ??= createNetworkClient(networkClientConfiguration);\n const { provider } = networkClient;\n return propertyName in provider;\n },\n });\n\n const blockTrackerProxy: ProxyWithAccessibleTarget<BlockTracker> = new Proxy(\n UNINITIALIZED_TARGET,\n {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(_target: any, propertyName: PropertyKey, receiver: unknown) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.blockTracker;\n }\n\n networkClient ??= createNetworkClient(networkClientConfiguration);\n if (networkClient === undefined) {\n throw new Error(\n \"It looks like createNetworkClient returned undefined. Perhaps it's mocked?\",\n );\n }\n const { blockTracker } = networkClient;\n\n if (propertyName in blockTracker) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = blockTracker[propertyName as keyof typeof blockTracker];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (this: unknown, ...args: any[]) {\n // @ts-expect-error We don't care that `this` may not be\n // compatible with the signature of the method being called, as\n // technically it can be anything.\n return value.apply(this === receiver ? blockTracker : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n has(_target: any, propertyName: PropertyKey) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n networkClient ??= createNetworkClient(networkClientConfiguration);\n const { blockTracker } = networkClient;\n return propertyName in blockTracker;\n },\n },\n );\n\n const destroy = () => {\n networkClient?.destroy();\n };\n\n return {\n configuration: networkClientConfiguration,\n provider: providerProxy,\n blockTracker: blockTrackerProxy,\n destroy,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/network-controller",
3
- "version": "17.0.0",
3
+ "version": "17.2.0",
4
4
  "description": "Provides an interface to the currently selected network via a MetaMask-compatible provider object",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -22,6 +22,7 @@
22
22
  ],
23
23
  "scripts": {
24
24
  "build:docs": "typedoc",
25
+ "changelog:update": "../../scripts/update-changelog.sh @metamask/network-controller",
25
26
  "changelog:validate": "../../scripts/validate-changelog.sh @metamask/network-controller",
26
27
  "publish:preview": "yarn npm publish --tag preview",
27
28
  "test": "jest --reporters=jest-silent-reporter",
@@ -30,16 +31,16 @@
30
31
  "test:watch": "jest --watch"
31
32
  },
32
33
  "dependencies": {
33
- "@metamask/base-controller": "^4.0.0",
34
- "@metamask/controller-utils": "^6.0.0",
34
+ "@metamask/base-controller": "^4.1.1",
35
+ "@metamask/controller-utils": "^8.0.2",
35
36
  "@metamask/eth-json-rpc-infura": "^9.0.0",
36
37
  "@metamask/eth-json-rpc-middleware": "^12.0.1",
37
- "@metamask/eth-json-rpc-provider": "^2.3.0",
38
+ "@metamask/eth-json-rpc-provider": "^2.3.2",
38
39
  "@metamask/eth-query": "^4.0.0",
39
- "@metamask/json-rpc-engine": "^7.3.0",
40
+ "@metamask/json-rpc-engine": "^7.3.2",
40
41
  "@metamask/rpc-errors": "^6.1.0",
41
- "@metamask/swappable-obj-proxy": "^2.1.0",
42
- "@metamask/utils": "^8.2.0",
42
+ "@metamask/swappable-obj-proxy": "^2.2.0",
43
+ "@metamask/utils": "^8.3.0",
43
44
  "async-mutex": "^0.2.6",
44
45
  "eth-block-tracker": "^8.0.0",
45
46
  "immer": "^9.0.6",
@@ -47,7 +48,7 @@
47
48
  },
48
49
  "devDependencies": {
49
50
  "@json-rpc-specification/meta-schema": "^1.0.6",
50
- "@metamask/auto-changelog": "^3.4.3",
51
+ "@metamask/auto-changelog": "^3.4.4",
51
52
  "@types/jest": "^27.4.1",
52
53
  "@types/jest-when": "^2.7.3",
53
54
  "@types/lodash": "^4.14.191",