@metamask/network-controller 26.0.0 → 27.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +51 -1
  2. package/dist/NetworkController.cjs +61 -38
  3. package/dist/NetworkController.cjs.map +1 -1
  4. package/dist/NetworkController.d.cts +137 -14
  5. package/dist/NetworkController.d.cts.map +1 -1
  6. package/dist/NetworkController.d.mts +137 -14
  7. package/dist/NetworkController.d.mts.map +1 -1
  8. package/dist/NetworkController.mjs +61 -38
  9. package/dist/NetworkController.mjs.map +1 -1
  10. package/dist/constants.cjs +18 -10
  11. package/dist/constants.cjs.map +1 -1
  12. package/dist/constants.d.cts +18 -10
  13. package/dist/constants.d.cts.map +1 -1
  14. package/dist/constants.d.mts +18 -10
  15. package/dist/constants.d.mts.map +1 -1
  16. package/dist/constants.mjs +18 -10
  17. package/dist/constants.mjs.map +1 -1
  18. package/dist/create-auto-managed-network-client.cjs +4 -9
  19. package/dist/create-auto-managed-network-client.cjs.map +1 -1
  20. package/dist/create-auto-managed-network-client.d.cts +5 -2
  21. package/dist/create-auto-managed-network-client.d.cts.map +1 -1
  22. package/dist/create-auto-managed-network-client.d.mts +5 -2
  23. package/dist/create-auto-managed-network-client.d.mts.map +1 -1
  24. package/dist/create-auto-managed-network-client.mjs +4 -9
  25. package/dist/create-auto-managed-network-client.mjs.map +1 -1
  26. package/dist/create-network-client.cjs +138 -43
  27. package/dist/create-network-client.cjs.map +1 -1
  28. package/dist/create-network-client.d.cts +5 -2
  29. package/dist/create-network-client.d.cts.map +1 -1
  30. package/dist/create-network-client.d.mts +5 -2
  31. package/dist/create-network-client.d.mts.map +1 -1
  32. package/dist/create-network-client.mjs +138 -43
  33. package/dist/create-network-client.mjs.map +1 -1
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +1 -1
  36. package/dist/index.d.cts.map +1 -1
  37. package/dist/index.d.mts +1 -1
  38. package/dist/index.d.mts.map +1 -1
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/rpc-service/rpc-service-chain.cjs +247 -39
  41. package/dist/rpc-service/rpc-service-chain.cjs.map +1 -1
  42. package/dist/rpc-service/rpc-service-chain.d.cts +107 -29
  43. package/dist/rpc-service/rpc-service-chain.d.cts.map +1 -1
  44. package/dist/rpc-service/rpc-service-chain.d.mts +107 -29
  45. package/dist/rpc-service/rpc-service-chain.d.mts.map +1 -1
  46. package/dist/rpc-service/rpc-service-chain.mjs +247 -39
  47. package/dist/rpc-service/rpc-service-chain.mjs.map +1 -1
  48. package/dist/rpc-service/rpc-service-requestable.cjs.map +1 -1
  49. package/dist/rpc-service/rpc-service-requestable.d.cts +15 -5
  50. package/dist/rpc-service/rpc-service-requestable.d.cts.map +1 -1
  51. package/dist/rpc-service/rpc-service-requestable.d.mts +15 -5
  52. package/dist/rpc-service/rpc-service-requestable.d.mts.map +1 -1
  53. package/dist/rpc-service/rpc-service-requestable.mjs.map +1 -1
  54. package/dist/rpc-service/rpc-service.cjs +66 -33
  55. package/dist/rpc-service/rpc-service.cjs.map +1 -1
  56. package/dist/rpc-service/rpc-service.d.cts +35 -26
  57. package/dist/rpc-service/rpc-service.d.cts.map +1 -1
  58. package/dist/rpc-service/rpc-service.d.mts +35 -26
  59. package/dist/rpc-service/rpc-service.d.mts.map +1 -1
  60. package/dist/rpc-service/rpc-service.mjs +67 -34
  61. package/dist/rpc-service/rpc-service.mjs.map +1 -1
  62. package/dist/rpc-service/shared.cjs.map +1 -1
  63. package/dist/rpc-service/shared.d.cts +25 -3
  64. package/dist/rpc-service/shared.d.cts.map +1 -1
  65. package/dist/rpc-service/shared.d.mts +25 -3
  66. package/dist/rpc-service/shared.d.mts.map +1 -1
  67. package/dist/rpc-service/shared.mjs.map +1 -1
  68. package/dist/types.cjs.map +1 -1
  69. package/dist/types.d.cts +1 -1
  70. package/dist/types.d.cts.map +1 -1
  71. package/dist/types.d.mts +1 -1
  72. package/dist/types.d.mts.map +1 -1
  73. package/dist/types.mjs.map +1 -1
  74. package/package.json +5 -7
package/CHANGELOG.md CHANGED
@@ -7,6 +7,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [27.1.0]
11
+
12
+ ### Added
13
+
14
+ - Add MegaETH Testnet "v2" as a default custom network ([#7272](https://github.com/MetaMask/core/pull/7272))
15
+ - The URL for this is `https://timothy.megaeth.com/rpc` rather than `https://carrot.megaeth.com/rpc`, and the chain ID has changed from `0x18c6` to `0x18c7`.
16
+ - "v1" of this network has not been removed.
17
+
18
+ ### Changed
19
+
20
+ - Bump `@metamask/eth-json-rpc-middleware` from `^22.0.0` to `^22.0.1` ([#7330](https://github.com/MetaMask/core/pull/7330))
21
+ - Bump `@metamask/controller-utils` from `^11.16.0` to `^11.17.0` ([#7534](https://github.com/MetaMask/core/pull/7534))
22
+
23
+ ### Fixed
24
+
25
+ - Ensure `get1559CompatibilityWithNetworkClientId` updates network metadata with EIP-1559 compatibility data missing ([#7532](https://github.com/MetaMask/core/pull/7532))
26
+
27
+ ## [27.0.0]
28
+
29
+ ### Added
30
+
31
+ - Add `NetworkController:rpcEndpointChainAvailable` messenger event ([#7166](https://github.com/MetaMask/core/pull/7166))
32
+ - 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.
33
+ - Update `networksMetadata` state property so that networks can now have a possible status of `degraded` ([#7186](https://github.com/MetaMask/core/pull/7186))
34
+
35
+ ### Changed
36
+
37
+ - **BREAKING:** Split up and update payload data for `NetworkController:rpcEndpointDegraded` and `NetworkController:rpcEndpointUnavailable` ([#7166](https://github.com/MetaMask/core/pull/7166))
38
+ - `NetworkController:rpcEndpointDegraded` and `NetworkController:rpcEndpointUnavailable` still exist and retain the same behavior as before.
39
+ - 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.
40
+ - The event payloads have been changed:
41
+ - 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.
42
+ - 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`.
43
+ - **BREAKING:** Rename and update payload data for `NetworkController:rpcEndpointRequestRetried` ([#7166](https://github.com/MetaMask/core/pull/7166))
44
+ - This event is now called `NetworkController:rpcEndpointRetried`.
45
+ - 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.
46
+ - **BREAKING:** Update `AbstractRpcService`/`RpcServiceRequestable` to remove `{ isolated: true }` from the `onBreak` event data type ([#7166](https://github.com/MetaMask/core/pull/7166))
47
+ - 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`)
48
+ - Move peer dependencies for controller and service packages to direct dependencies ([#7209](https://github.com/MetaMask/core/pull/7209))
49
+ - The dependencies moved are:
50
+ - `@metamask/error-reporting-service` (^3.0.0)
51
+ - In clients, it is now possible for multiple versions of these packages to exist in the dependency tree.
52
+ - 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.
53
+ - 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.
54
+ - Automatically update network status metadata when chain-level RPC events are published ([#7186](https://github.com/MetaMask/core/pull/7186))
55
+ - `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.
56
+ - This enables real-time network status updates without requiring explicit `lookupNetwork` calls, providing more accurate and timely network availability information.
57
+
10
58
  ## [26.0.0]
11
59
 
12
60
  ### Added
@@ -1015,7 +1063,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1015
1063
 
1016
1064
  All changes listed after this point were applied to this package following the monorepo conversion.
1017
1065
 
1018
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/network-controller@26.0.0...HEAD
1066
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/network-controller@27.1.0...HEAD
1067
+ [27.1.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@27.0.0...@metamask/network-controller@27.1.0
1068
+ [27.0.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@26.0.0...@metamask/network-controller@27.0.0
1019
1069
  [26.0.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@25.0.0...@metamask/network-controller@26.0.0
1020
1070
  [25.0.0]: https://github.com/MetaMask/core/compare/@metamask/network-controller@24.3.1...@metamask/network-controller@25.0.0
1021
1071
  [24.3.1]: https://github.com/MetaMask/core/compare/@metamask/network-controller@24.3.0...@metamask/network-controller@24.3.1
@@ -162,6 +162,7 @@ function getDefaultCustomNetworkConfigurationsByChainId() {
162
162
  // default networks.
163
163
  return {
164
164
  [controller_utils_1.ChainId['megaeth-testnet']]: getCustomNetworkConfiguration(controller_utils_1.CustomNetworkType['megaeth-testnet']),
165
+ [controller_utils_1.ChainId['megaeth-testnet-v2']]: getCustomNetworkConfiguration(controller_utils_1.CustomNetworkType['megaeth-testnet-v2']),
165
166
  [controller_utils_1.ChainId['monad-testnet']]: getCustomNetworkConfiguration(controller_utils_1.CustomNetworkType['monad-testnet']),
166
167
  };
167
168
  }
@@ -444,6 +445,21 @@ class NetworkController extends base_controller_1.BaseController {
444
445
  this.messenger.registerActionHandler(`${this.name}:addNetwork`, this.addNetwork.bind(this));
445
446
  this.messenger.registerActionHandler(`${this.name}:removeNetwork`, this.removeNetwork.bind(this));
446
447
  this.messenger.registerActionHandler(`${this.name}:updateNetwork`, this.updateNetwork.bind(this));
448
+ this.messenger.subscribe(`${this.name}:rpcEndpointChainUnavailable`, ({ networkClientId }) => {
449
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, networkClientId, {
450
+ networkStatus: constants_1.NetworkStatus.Unavailable,
451
+ });
452
+ });
453
+ this.messenger.subscribe(`${this.name}:rpcEndpointChainDegraded`, ({ networkClientId }) => {
454
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, networkClientId, {
455
+ networkStatus: constants_1.NetworkStatus.Degraded,
456
+ });
457
+ });
458
+ this.messenger.subscribe(`${this.name}:rpcEndpointChainAvailable`, ({ networkClientId }) => {
459
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, networkClientId, {
460
+ networkStatus: constants_1.NetworkStatus.Available,
461
+ });
462
+ });
447
463
  }
448
464
  /**
449
465
  * Enables the RPC failover functionality. That is, if any RPC endpoints are
@@ -636,7 +652,7 @@ class NetworkController extends base_controller_1.BaseController {
636
652
  }
637
653
  async get1559CompatibilityWithNetworkClientId(networkClientId) {
638
654
  let metadata = this.state.networksMetadata[networkClientId];
639
- if (metadata === undefined) {
655
+ if (metadata?.EIPS[1559] === undefined) {
640
656
  await this.lookupNetwork(networkClientId);
641
657
  metadata = this.state.networksMetadata[networkClientId];
642
658
  }
@@ -811,7 +827,17 @@ class NetworkController extends base_controller_1.BaseController {
811
827
  rpcEndpoint: newRpcEndpoint,
812
828
  });
813
829
  }
814
- else if (existingRpcEndpointForReplaceWhenChainNotChanged !== undefined) {
830
+ else if (existingRpcEndpointForReplaceWhenChainNotChanged === undefined) {
831
+ const newRpcEndpoint = newRpcEndpointFields.type === RpcEndpointType.Infura
832
+ ? newRpcEndpointFields
833
+ : { ...newRpcEndpointFields, networkClientId: (0, uuid_1.v4)() };
834
+ const networkClientOperation = {
835
+ type: 'add',
836
+ rpcEndpoint: newRpcEndpoint,
837
+ };
838
+ networkClientOperations.push(networkClientOperation);
839
+ }
840
+ else {
815
841
  let newRpcEndpoint;
816
842
  /* istanbul ignore if */
817
843
  if (newRpcEndpointFields.type === RpcEndpointType.Infura) {
@@ -834,16 +860,6 @@ class NetworkController extends base_controller_1.BaseController {
834
860
  newRpcEndpoint,
835
861
  });
836
862
  }
837
- else {
838
- const newRpcEndpoint = newRpcEndpointFields.type === RpcEndpointType.Infura
839
- ? newRpcEndpointFields
840
- : { ...newRpcEndpointFields, networkClientId: (0, uuid_1.v4)() };
841
- const networkClientOperation = {
842
- type: 'add',
843
- rpcEndpoint: newRpcEndpoint,
844
- };
845
- networkClientOperations.push(networkClientOperation);
846
- }
847
863
  }
848
864
  for (const existingRpcEndpoint of existingNetworkConfiguration.rpcEndpoints) {
849
865
  if (!networkClientOperations.some((networkClientOperation) => {
@@ -1144,7 +1160,10 @@ async function _NetworkController_determineNetworkMetadata(networkClientId) {
1144
1160
  */
1145
1161
  async function _NetworkController_lookupGivenNetwork(networkClientId) {
1146
1162
  const { networkStatus, isEIP1559Compatible } = await __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_determineNetworkMetadata).call(this, networkClientId);
1147
- __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, networkClientId, networkStatus, isEIP1559Compatible);
1163
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, networkClientId, {
1164
+ networkStatus,
1165
+ isEIP1559Compatible,
1166
+ });
1148
1167
  }, _NetworkController_lookupSelectedNetwork =
1149
1168
  /**
1150
1169
  * Uses a request for the latest block to gather the following information on
@@ -1204,7 +1223,10 @@ async function _NetworkController_lookupSelectedNetwork() {
1204
1223
  throw error;
1205
1224
  }
1206
1225
  }
1207
- __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, this.state.selectedNetworkClientId, networkStatus, isEIP1559Compatible);
1226
+ __classPrivateFieldGet(this, _NetworkController_instances, "m", _NetworkController_updateMetadataForNetwork).call(this, this.state.selectedNetworkClientId, {
1227
+ networkStatus,
1228
+ isEIP1559Compatible,
1229
+ });
1208
1230
  if (isInfura) {
1209
1231
  if (networkStatus === constants_1.NetworkStatus.Available) {
1210
1232
  this.messenger.publish('NetworkController:infuraIsUnblocked');
@@ -1219,27 +1241,25 @@ async function _NetworkController_lookupSelectedNetwork() {
1219
1241
  // previously connected to an Infura network that was blocked
1220
1242
  this.messenger.publish('NetworkController:infuraIsUnblocked');
1221
1243
  }
1222
- }, _NetworkController_updateMetadataForNetwork = function _NetworkController_updateMetadataForNetwork(networkClientId, networkStatus, isEIP1559Compatible) {
1244
+ }, _NetworkController_updateMetadataForNetwork = function _NetworkController_updateMetadataForNetwork(networkClientId, metadata) {
1223
1245
  this.update((state) => {
1224
- if (state.networksMetadata[networkClientId] === undefined) {
1225
- state.networksMetadata[networkClientId] = {
1226
- status: constants_1.NetworkStatus.Unknown,
1227
- EIPS: {},
1228
- };
1229
- }
1230
- const meta = state.networksMetadata[networkClientId];
1231
- meta.status = networkStatus;
1232
- if (isEIP1559Compatible === undefined) {
1233
- delete meta.EIPS[1559];
1234
- }
1235
- else {
1236
- meta.EIPS[1559] = isEIP1559Compatible;
1246
+ var _a;
1247
+ (_a = state.networksMetadata)[networkClientId] ?? (_a[networkClientId] = {
1248
+ status: constants_1.NetworkStatus.Unknown,
1249
+ EIPS: {},
1250
+ });
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
+ }
1237
1260
  }
1238
1261
  });
1239
- }, _NetworkController_getLatestBlock = function _NetworkController_getLatestBlock(networkClientId) {
1240
- if (networkClientId === undefined) {
1241
- networkClientId = this.state.selectedNetworkClientId;
1242
- }
1262
+ }, _NetworkController_getLatestBlock = function _NetworkController_getLatestBlock(networkClientId = this.state.selectedNetworkClientId) {
1243
1263
  const networkClient = this.getNetworkClientById(networkClientId);
1244
1264
  const ethQuery = new eth_query_1.default(networkClient.provider);
1245
1265
  return new Promise((resolve, reject) => {
@@ -1399,6 +1419,7 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1399
1419
  for (const addedRpcEndpoint of addedRpcEndpoints) {
1400
1420
  if (addedRpcEndpoint.type === RpcEndpointType.Infura) {
1401
1421
  autoManagedNetworkClientRegistry[types_1.NetworkClientType.Infura][addedRpcEndpoint.networkClientId] = (0, create_auto_managed_network_client_1.createAutoManagedNetworkClient)({
1422
+ networkClientId: addedRpcEndpoint.networkClientId,
1402
1423
  networkClientConfiguration: {
1403
1424
  type: types_1.NetworkClientType.Infura,
1404
1425
  chainId: networkFields.chainId,
@@ -1416,6 +1437,7 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1416
1437
  }
1417
1438
  else {
1418
1439
  autoManagedNetworkClientRegistry[types_1.NetworkClientType.Custom][addedRpcEndpoint.networkClientId] = (0, create_auto_managed_network_client_1.createAutoManagedNetworkClient)({
1440
+ networkClientId: addedRpcEndpoint.networkClientId,
1419
1441
  networkClientConfiguration: {
1420
1442
  type: types_1.NetworkClientType.Custom,
1421
1443
  chainId: networkFields.chainId,
@@ -1475,6 +1497,7 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1475
1497
  return [
1476
1498
  rpcEndpoint.networkClientId,
1477
1499
  (0, create_auto_managed_network_client_1.createAutoManagedNetworkClient)({
1500
+ networkClientId: rpcEndpoint.networkClientId,
1478
1501
  networkClientConfiguration: {
1479
1502
  type: types_1.NetworkClientType.Infura,
1480
1503
  network: infuraNetworkName,
@@ -1494,6 +1517,7 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1494
1517
  return [
1495
1518
  rpcEndpoint.networkClientId,
1496
1519
  (0, create_auto_managed_network_client_1.createAutoManagedNetworkClient)({
1520
+ networkClientId: rpcEndpoint.networkClientId,
1497
1521
  networkClientConfiguration: {
1498
1522
  type: types_1.NetworkClientType.Custom,
1499
1523
  chainId: networkConfiguration.chainId,
@@ -1543,13 +1567,12 @@ async function _NetworkController_determineEIP1559Compatibility(networkClientId)
1543
1567
  }
1544
1568
  __classPrivateFieldSet(this, _NetworkController_autoManagedNetworkClient, autoManagedNetworkClient, "f");
1545
1569
  this.update((state) => {
1570
+ var _a;
1546
1571
  state.selectedNetworkClientId = networkClientId;
1547
- if (state.networksMetadata[networkClientId] === undefined) {
1548
- state.networksMetadata[networkClientId] = {
1549
- status: constants_1.NetworkStatus.Unknown,
1550
- EIPS: {},
1551
- };
1552
- }
1572
+ (_a = state.networksMetadata)[networkClientId] ?? (_a[networkClientId] = {
1573
+ status: constants_1.NetworkStatus.Unknown,
1574
+ EIPS: {},
1575
+ });
1553
1576
  updateState?.(state);
1554
1577
  });
1555
1578
  if (__classPrivateFieldGet(this, _NetworkController_providerProxy, "f")) {