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