@metamask/multichain-network-controller 0.3.0 → 0.5.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 (70) hide show
  1. package/CHANGELOG.md +33 -2
  2. package/dist/{MultichainNetworkController.cjs → MultichainNetworkController/MultichainNetworkController.cjs} +82 -11
  3. package/dist/MultichainNetworkController/MultichainNetworkController.cjs.map +1 -0
  4. package/dist/MultichainNetworkController/MultichainNetworkController.d.cts +41 -0
  5. package/dist/MultichainNetworkController/MultichainNetworkController.d.cts.map +1 -0
  6. package/dist/MultichainNetworkController/MultichainNetworkController.d.mts +41 -0
  7. package/dist/MultichainNetworkController/MultichainNetworkController.d.mts.map +1 -0
  8. package/dist/{MultichainNetworkController.mjs → MultichainNetworkController/MultichainNetworkController.mjs} +82 -11
  9. package/dist/MultichainNetworkController/MultichainNetworkController.mjs.map +1 -0
  10. package/dist/MultichainNetworkService/AbstractMultichainNetworkService.cjs +3 -0
  11. package/dist/MultichainNetworkService/AbstractMultichainNetworkService.cjs.map +1 -0
  12. package/dist/MultichainNetworkService/AbstractMultichainNetworkService.d.cts +7 -0
  13. package/dist/MultichainNetworkService/AbstractMultichainNetworkService.d.cts.map +1 -0
  14. package/dist/MultichainNetworkService/AbstractMultichainNetworkService.d.mts +7 -0
  15. package/dist/MultichainNetworkService/AbstractMultichainNetworkService.d.mts.map +1 -0
  16. package/dist/MultichainNetworkService/AbstractMultichainNetworkService.mjs +2 -0
  17. package/dist/MultichainNetworkService/AbstractMultichainNetworkService.mjs.map +1 -0
  18. package/dist/MultichainNetworkService/MultichainNetworkService.cjs +63 -0
  19. package/dist/MultichainNetworkService/MultichainNetworkService.cjs.map +1 -0
  20. package/dist/MultichainNetworkService/MultichainNetworkService.d.cts +20 -0
  21. package/dist/MultichainNetworkService/MultichainNetworkService.d.cts.map +1 -0
  22. package/dist/MultichainNetworkService/MultichainNetworkService.d.mts +20 -0
  23. package/dist/MultichainNetworkService/MultichainNetworkService.d.mts.map +1 -0
  24. package/dist/MultichainNetworkService/MultichainNetworkService.mjs +59 -0
  25. package/dist/MultichainNetworkService/MultichainNetworkService.mjs.map +1 -0
  26. package/dist/api/accounts-api.cjs +82 -0
  27. package/dist/api/accounts-api.cjs.map +1 -0
  28. package/dist/api/accounts-api.d.cts +55 -0
  29. package/dist/api/accounts-api.d.cts.map +1 -0
  30. package/dist/api/accounts-api.d.mts +55 -0
  31. package/dist/api/accounts-api.d.mts.map +1 -0
  32. package/dist/api/accounts-api.mjs +76 -0
  33. package/dist/api/accounts-api.mjs.map +1 -0
  34. package/dist/constants.cjs +69 -4
  35. package/dist/constants.cjs.map +1 -1
  36. package/dist/constants.d.cts +26 -1
  37. package/dist/constants.d.cts.map +1 -1
  38. package/dist/constants.d.mts +26 -1
  39. package/dist/constants.d.mts.map +1 -1
  40. package/dist/constants.mjs +68 -3
  41. package/dist/constants.mjs.map +1 -1
  42. package/dist/index.cjs +8 -2
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.cts +4 -2
  45. package/dist/index.d.cts.map +1 -1
  46. package/dist/index.d.mts +4 -2
  47. package/dist/index.d.mts.map +1 -1
  48. package/dist/index.mjs +3 -2
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/types.cjs.map +1 -1
  51. package/dist/types.d.cts +16 -6
  52. package/dist/types.d.cts.map +1 -1
  53. package/dist/types.d.mts +16 -6
  54. package/dist/types.d.mts.map +1 -1
  55. package/dist/types.mjs.map +1 -1
  56. package/dist/utils.cjs +43 -6
  57. package/dist/utils.cjs.map +1 -1
  58. package/dist/utils.d.cts +22 -1
  59. package/dist/utils.d.cts.map +1 -1
  60. package/dist/utils.d.mts +22 -1
  61. package/dist/utils.d.mts.map +1 -1
  62. package/dist/utils.mjs +40 -6
  63. package/dist/utils.mjs.map +1 -1
  64. package/package.json +7 -4
  65. package/dist/MultichainNetworkController.cjs.map +0 -1
  66. package/dist/MultichainNetworkController.d.cts +0 -22
  67. package/dist/MultichainNetworkController.d.cts.map +0 -1
  68. package/dist/MultichainNetworkController.d.mts +0 -22
  69. package/dist/MultichainNetworkController.d.mts.map +0 -1
  70. package/dist/MultichainNetworkController.mjs.map +0 -1
package/dist/utils.cjs CHANGED
@@ -1,10 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toMultichainNetworkConfigurationsByChainId = exports.toMultichainNetworkConfiguration = exports.toEvmCaipChainId = exports.checkIfSupportedCaipChainId = exports.getChainIdForNonEvmAddress = void 0;
3
+ exports.isKnownCaipNamespace = exports.toMultichainNetworkConfigurationsByChainId = exports.toMultichainNetworkConfiguration = exports.convertEvmCaipToHexChainId = exports.toEvmCaipChainId = exports.checkIfSupportedCaipChainId = exports.getChainIdForNonEvmAddress = exports.isEvmCaipChainId = void 0;
4
4
  const keyring_api_1 = require("@metamask/keyring-api");
5
5
  const utils_1 = require("@metamask/utils");
6
6
  const addresses_1 = require("@solana/addresses");
7
7
  const constants_1 = require("./constants.cjs");
8
+ /**
9
+ * Checks if the chain ID is EVM.
10
+ *
11
+ * @param chainId - The account type to check.
12
+ * @returns Whether the network is EVM.
13
+ */
14
+ function isEvmCaipChainId(chainId) {
15
+ const { namespace } = (0, utils_1.parseCaipChainId)(chainId);
16
+ return namespace === utils_1.KnownCaipNamespace.Eip155;
17
+ }
18
+ exports.isEvmCaipChainId = isEvmCaipChainId;
8
19
  /**
9
20
  * Returns the chain id of the non-EVM network based on the account address.
10
21
  *
@@ -38,6 +49,20 @@ exports.checkIfSupportedCaipChainId = checkIfSupportedCaipChainId;
38
49
  */
39
50
  const toEvmCaipChainId = (chainId) => (0, utils_1.toCaipChainId)(utils_1.KnownCaipNamespace.Eip155, (0, utils_1.hexToNumber)(chainId).toString());
40
51
  exports.toEvmCaipChainId = toEvmCaipChainId;
52
+ /**
53
+ * Convert an eip155 CAIP chain ID to a hex chain ID.
54
+ *
55
+ * @param chainId - The CAIP chain ID to convert.
56
+ * @returns The hex chain ID.
57
+ */
58
+ function convertEvmCaipToHexChainId(chainId) {
59
+ const { namespace, reference } = (0, utils_1.parseCaipChainId)(chainId);
60
+ if (namespace === utils_1.KnownCaipNamespace.Eip155) {
61
+ return (0, utils_1.add0x)(parseInt(reference, 10).toString(16));
62
+ }
63
+ throw new Error(`Unsupported CAIP chain ID namespace: ${namespace}. Only eip155 is supported.`);
64
+ }
65
+ exports.convertEvmCaipToHexChainId = convertEvmCaipToHexChainId;
41
66
  /**
42
67
  * Updates a network configuration to the format used by the MultichainNetworkController.
43
68
  * This method is exclusive for EVM networks with hex identifiers from the NetworkController.
@@ -46,13 +71,14 @@ exports.toEvmCaipChainId = toEvmCaipChainId;
46
71
  * @returns The updated network configuration.
47
72
  */
48
73
  const toMultichainNetworkConfiguration = (network) => {
74
+ const { chainId, name, rpcEndpoints, defaultRpcEndpointIndex, nativeCurrency, blockExplorerUrls, defaultBlockExplorerUrlIndex, } = network;
49
75
  return {
50
- chainId: (0, exports.toEvmCaipChainId)(network.chainId),
76
+ chainId: (0, exports.toEvmCaipChainId)(chainId),
51
77
  isEvm: true,
52
- name: network.name,
53
- nativeCurrency: network.nativeCurrency,
54
- blockExplorerUrls: network.blockExplorerUrls,
55
- defaultBlockExplorerUrlIndex: network.defaultBlockExplorerUrlIndex || 0,
78
+ name: name || rpcEndpoints[defaultRpcEndpointIndex].url,
79
+ nativeCurrency,
80
+ blockExplorerUrls,
81
+ defaultBlockExplorerUrlIndex: defaultBlockExplorerUrlIndex || 0,
56
82
  };
57
83
  };
58
84
  exports.toMultichainNetworkConfiguration = toMultichainNetworkConfiguration;
@@ -68,4 +94,15 @@ const toMultichainNetworkConfigurationsByChainId = (networkConfigurationsByChain
68
94
  [(0, exports.toEvmCaipChainId)(network.chainId)]: (0, exports.toMultichainNetworkConfiguration)(network),
69
95
  }), {});
70
96
  exports.toMultichainNetworkConfigurationsByChainId = toMultichainNetworkConfigurationsByChainId;
97
+ // TODO: This currently isn't being used anymore but could benefit from being moved to @metamask/utils
98
+ /**
99
+ * Type guard to check if a namespace is a known CAIP namespace.
100
+ *
101
+ * @param namespace - The namespace to check
102
+ * @returns Whether the namespace is a known CAIP namespace
103
+ */
104
+ function isKnownCaipNamespace(namespace) {
105
+ return Object.values(utils_1.KnownCaipNamespace).includes(namespace);
106
+ }
107
+ exports.isKnownCaipNamespace = isKnownCaipNamespace;
71
108
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,uDAA2D;AAE3D,2CAMyB;AACzB,iDAAiE;AAEjE,+CAA0E;AAM1E;;;;;GAKG;AACH,SAAgB,0BAA0B,CACxC,OAAe;IAEf,2GAA2G;IAC3G,IAAI,IAAA,qBAAe,EAAC,OAAO,CAAC,EAAE;QAC5B,OAAO,sBAAQ,CAAC,OAAO,CAAC;KACzB;IACD,OAAO,sBAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC;AARD,gEAQC;AAED;;;;;GAKG;AACH,SAAgB,2BAA2B,CACzC,EAAe;IAEf,qCAAqC;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,uDAA2C,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC;AALD,kEAKC;AAED;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,OAAY,EAAe,EAAE,CAC5D,IAAA,qBAAa,EAAC,0BAAkB,CAAC,MAAM,EAAE,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAD/D,QAAA,gBAAgB,oBAC+C;AAE5E;;;;;;GAMG;AACI,MAAM,gCAAgC,GAAG,CAC9C,OAA6B,EACG,EAAE;IAClC,OAAO;QACL,OAAO,EAAE,IAAA,wBAAgB,EAAC,OAAO,CAAC,OAAO,CAAC;QAC1C,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,4BAA4B,EAAE,OAAO,CAAC,4BAA4B,IAAI,CAAC;KACxE,CAAC;AACJ,CAAC,CAAC;AAXW,QAAA,gCAAgC,oCAW3C;AAEF;;;;;;GAMG;AACI,MAAM,0CAA0C,GAAG,CACxD,8BAAoE,EACf,EAAE,CACvD,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,MAAM,CACnD,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACrB,GAAG,GAAG;IACN,CAAC,IAAA,wBAAgB,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EACjC,IAAA,wCAAgC,EAAC,OAAO,CAAC;CAC5C,CAAC,EACF,EAAE,CACH,CAAC;AAVS,QAAA,0CAA0C,8CAUnD","sourcesContent":["import { BtcScope, SolScope } from '@metamask/keyring-api';\nimport type { NetworkConfiguration } from '@metamask/network-controller';\nimport {\n type Hex,\n type CaipChainId,\n KnownCaipNamespace,\n toCaipChainId,\n hexToNumber,\n} from '@metamask/utils';\nimport { isAddress as isSolanaAddress } from '@solana/addresses';\n\nimport { AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS } from './constants';\nimport type {\n SupportedCaipChainId,\n MultichainNetworkConfiguration,\n} from './types';\n\n/**\n * Returns the chain id of the non-EVM network based on the account address.\n *\n * @param address - The address to check.\n * @returns The caip chain id of the non-EVM network.\n */\nexport function getChainIdForNonEvmAddress(\n address: string,\n): SupportedCaipChainId {\n // This condition is not the most robust. Once we support more networks, we will need to update this logic.\n if (isSolanaAddress(address)) {\n return SolScope.Mainnet;\n }\n return BtcScope.Mainnet;\n}\n\n/**\n * Checks if the Caip chain ID is supported.\n *\n * @param id - The Caip chain IDto check.\n * @returns Whether the chain ID is supported.\n */\nexport function checkIfSupportedCaipChainId(\n id: CaipChainId,\n): id is SupportedCaipChainId {\n // Check if the chain id is supported\n return Object.keys(AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS).includes(id);\n}\n\n/**\n * Converts a hex chain ID to a Caip chain ID.\n *\n * @param chainId - The hex chain ID to convert.\n * @returns The Caip chain ID.\n */\nexport const toEvmCaipChainId = (chainId: Hex): CaipChainId =>\n toCaipChainId(KnownCaipNamespace.Eip155, hexToNumber(chainId).toString());\n\n/**\n * Updates a network configuration to the format used by the MultichainNetworkController.\n * This method is exclusive for EVM networks with hex identifiers from the NetworkController.\n *\n * @param network - The network configuration to update.\n * @returns The updated network configuration.\n */\nexport const toMultichainNetworkConfiguration = (\n network: NetworkConfiguration,\n): MultichainNetworkConfiguration => {\n return {\n chainId: toEvmCaipChainId(network.chainId),\n isEvm: true,\n name: network.name,\n nativeCurrency: network.nativeCurrency,\n blockExplorerUrls: network.blockExplorerUrls,\n defaultBlockExplorerUrlIndex: network.defaultBlockExplorerUrlIndex || 0,\n };\n};\n\n/**\n * Updates a record of network configurations to the format used by the MultichainNetworkController.\n * This method is exclusive for EVM networks with hex identifiers from the NetworkController.\n *\n * @param networkConfigurationsByChainId - The network configurations to update.\n * @returns The updated network configurations.\n */\nexport const toMultichainNetworkConfigurationsByChainId = (\n networkConfigurationsByChainId: Record<string, NetworkConfiguration>,\n): Record<CaipChainId, MultichainNetworkConfiguration> =>\n Object.entries(networkConfigurationsByChainId).reduce(\n (acc, [, network]) => ({\n ...acc,\n [toEvmCaipChainId(network.chainId)]:\n toMultichainNetworkConfiguration(network),\n }),\n {},\n );\n"]}
1
+ {"version":3,"file":"utils.cjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,uDAA2D;AAE3D,2CAQyB;AACzB,iDAAiE;AAEjE,+CAA0E;AAM1E;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,OAAoB;IACnD,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAC;IAChD,OAAO,SAAS,KAAM,0BAAkB,CAAC,MAAiB,CAAC;AAC7D,CAAC;AAHD,4CAGC;AAED;;;;;GAKG;AACH,SAAgB,0BAA0B,CACxC,OAAe;IAEf,2GAA2G;IAC3G,IAAI,IAAA,qBAAe,EAAC,OAAO,CAAC,EAAE;QAC5B,OAAO,sBAAQ,CAAC,OAAO,CAAC;KACzB;IACD,OAAO,sBAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC;AARD,gEAQC;AAED;;;;;GAKG;AACH,SAAgB,2BAA2B,CACzC,EAAe;IAEf,qCAAqC;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,uDAA2C,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC;AALD,kEAKC;AAED;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,OAAY,EAAe,EAAE,CAC5D,IAAA,qBAAa,EAAC,0BAAkB,CAAC,MAAM,EAAE,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAD/D,QAAA,gBAAgB,oBAC+C;AAE5E;;;;;GAKG;AACH,SAAgB,0BAA0B,CAAC,OAAoB;IAC7D,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,SAAS,KAAM,0BAAkB,CAAC,MAAiB,EAAE;QACvD,OAAO,IAAA,aAAK,EAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;KACpD;IAED,MAAM,IAAI,KAAK,CACb,wCAAwC,SAAS,6BAA6B,CAC/E,CAAC;AACJ,CAAC;AATD,gEASC;AAED;;;;;;GAMG;AACI,MAAM,gCAAgC,GAAG,CAC9C,OAA6B,EACG,EAAE;IAClC,MAAM,EACJ,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,4BAA4B,GAC7B,GAAG,OAAO,CAAC;IACZ,OAAO;QACL,OAAO,EAAE,IAAA,wBAAgB,EAAC,OAAO,CAAC;QAClC,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC,uBAAuB,CAAC,CAAC,GAAG;QACvD,cAAc;QACd,iBAAiB;QACjB,4BAA4B,EAAE,4BAA4B,IAAI,CAAC;KAChE,CAAC;AACJ,CAAC,CAAC;AApBW,QAAA,gCAAgC,oCAoB3C;AAEF;;;;;;GAMG;AACI,MAAM,0CAA0C,GAAG,CACxD,8BAAoE,EACf,EAAE,CACvD,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,MAAM,CACnD,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACrB,GAAG,GAAG;IACN,CAAC,IAAA,wBAAgB,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EACjC,IAAA,wCAAgC,EAAC,OAAO,CAAC;CAC5C,CAAC,EACF,EAAE,CACH,CAAC;AAVS,QAAA,0CAA0C,8CAUnD;AAEJ,sGAAsG;AACtG;;;;;GAKG;AACH,SAAgB,oBAAoB,CAClC,SAAiB;IAEjB,OAAO,MAAM,CAAC,MAAM,CAAS,0BAAkB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACvE,CAAC;AAJD,oDAIC","sourcesContent":["import { BtcScope, SolScope } from '@metamask/keyring-api';\nimport type { NetworkConfiguration } from '@metamask/network-controller';\nimport {\n type Hex,\n type CaipChainId,\n KnownCaipNamespace,\n toCaipChainId,\n parseCaipChainId,\n hexToNumber,\n add0x,\n} from '@metamask/utils';\nimport { isAddress as isSolanaAddress } from '@solana/addresses';\n\nimport { AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS } from './constants';\nimport type {\n SupportedCaipChainId,\n MultichainNetworkConfiguration,\n} from './types';\n\n/**\n * Checks if the chain ID is EVM.\n *\n * @param chainId - The account type to check.\n * @returns Whether the network is EVM.\n */\nexport function isEvmCaipChainId(chainId: CaipChainId): boolean {\n const { namespace } = parseCaipChainId(chainId);\n return namespace === (KnownCaipNamespace.Eip155 as string);\n}\n\n/**\n * Returns the chain id of the non-EVM network based on the account address.\n *\n * @param address - The address to check.\n * @returns The caip chain id of the non-EVM network.\n */\nexport function getChainIdForNonEvmAddress(\n address: string,\n): SupportedCaipChainId {\n // This condition is not the most robust. Once we support more networks, we will need to update this logic.\n if (isSolanaAddress(address)) {\n return SolScope.Mainnet;\n }\n return BtcScope.Mainnet;\n}\n\n/**\n * Checks if the Caip chain ID is supported.\n *\n * @param id - The Caip chain IDto check.\n * @returns Whether the chain ID is supported.\n */\nexport function checkIfSupportedCaipChainId(\n id: CaipChainId,\n): id is SupportedCaipChainId {\n // Check if the chain id is supported\n return Object.keys(AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS).includes(id);\n}\n\n/**\n * Converts a hex chain ID to a Caip chain ID.\n *\n * @param chainId - The hex chain ID to convert.\n * @returns The Caip chain ID.\n */\nexport const toEvmCaipChainId = (chainId: Hex): CaipChainId =>\n toCaipChainId(KnownCaipNamespace.Eip155, hexToNumber(chainId).toString());\n\n/**\n * Convert an eip155 CAIP chain ID to a hex chain ID.\n *\n * @param chainId - The CAIP chain ID to convert.\n * @returns The hex chain ID.\n */\nexport function convertEvmCaipToHexChainId(chainId: CaipChainId): Hex {\n const { namespace, reference } = parseCaipChainId(chainId);\n if (namespace === (KnownCaipNamespace.Eip155 as string)) {\n return add0x(parseInt(reference, 10).toString(16));\n }\n\n throw new Error(\n `Unsupported CAIP chain ID namespace: ${namespace}. Only eip155 is supported.`,\n );\n}\n\n/**\n * Updates a network configuration to the format used by the MultichainNetworkController.\n * This method is exclusive for EVM networks with hex identifiers from the NetworkController.\n *\n * @param network - The network configuration to update.\n * @returns The updated network configuration.\n */\nexport const toMultichainNetworkConfiguration = (\n network: NetworkConfiguration,\n): MultichainNetworkConfiguration => {\n const {\n chainId,\n name,\n rpcEndpoints,\n defaultRpcEndpointIndex,\n nativeCurrency,\n blockExplorerUrls,\n defaultBlockExplorerUrlIndex,\n } = network;\n return {\n chainId: toEvmCaipChainId(chainId),\n isEvm: true,\n name: name || rpcEndpoints[defaultRpcEndpointIndex].url,\n nativeCurrency,\n blockExplorerUrls,\n defaultBlockExplorerUrlIndex: defaultBlockExplorerUrlIndex || 0,\n };\n};\n\n/**\n * Updates a record of network configurations to the format used by the MultichainNetworkController.\n * This method is exclusive for EVM networks with hex identifiers from the NetworkController.\n *\n * @param networkConfigurationsByChainId - The network configurations to update.\n * @returns The updated network configurations.\n */\nexport const toMultichainNetworkConfigurationsByChainId = (\n networkConfigurationsByChainId: Record<string, NetworkConfiguration>,\n): Record<CaipChainId, MultichainNetworkConfiguration> =>\n Object.entries(networkConfigurationsByChainId).reduce(\n (acc, [, network]) => ({\n ...acc,\n [toEvmCaipChainId(network.chainId)]:\n toMultichainNetworkConfiguration(network),\n }),\n {},\n );\n\n// TODO: This currently isn't being used anymore but could benefit from being moved to @metamask/utils\n/**\n * Type guard to check if a namespace is a known CAIP namespace.\n *\n * @param namespace - The namespace to check\n * @returns Whether the namespace is a known CAIP namespace\n */\nexport function isKnownCaipNamespace(\n namespace: string,\n): namespace is KnownCaipNamespace {\n return Object.values<string>(KnownCaipNamespace).includes(namespace);\n}\n"]}
package/dist/utils.d.cts CHANGED
@@ -1,6 +1,13 @@
1
1
  import type { NetworkConfiguration } from "@metamask/network-controller";
2
- import { type Hex, type CaipChainId } from "@metamask/utils";
2
+ import { type Hex, type CaipChainId, KnownCaipNamespace } from "@metamask/utils";
3
3
  import type { SupportedCaipChainId, MultichainNetworkConfiguration } from "./types.cjs";
4
+ /**
5
+ * Checks if the chain ID is EVM.
6
+ *
7
+ * @param chainId - The account type to check.
8
+ * @returns Whether the network is EVM.
9
+ */
10
+ export declare function isEvmCaipChainId(chainId: CaipChainId): boolean;
4
11
  /**
5
12
  * Returns the chain id of the non-EVM network based on the account address.
6
13
  *
@@ -22,6 +29,13 @@ export declare function checkIfSupportedCaipChainId(id: CaipChainId): id is Supp
22
29
  * @returns The Caip chain ID.
23
30
  */
24
31
  export declare const toEvmCaipChainId: (chainId: Hex) => CaipChainId;
32
+ /**
33
+ * Convert an eip155 CAIP chain ID to a hex chain ID.
34
+ *
35
+ * @param chainId - The CAIP chain ID to convert.
36
+ * @returns The hex chain ID.
37
+ */
38
+ export declare function convertEvmCaipToHexChainId(chainId: CaipChainId): Hex;
25
39
  /**
26
40
  * Updates a network configuration to the format used by the MultichainNetworkController.
27
41
  * This method is exclusive for EVM networks with hex identifiers from the NetworkController.
@@ -38,4 +52,11 @@ export declare const toMultichainNetworkConfiguration: (network: NetworkConfigur
38
52
  * @returns The updated network configurations.
39
53
  */
40
54
  export declare const toMultichainNetworkConfigurationsByChainId: (networkConfigurationsByChainId: Record<string, NetworkConfiguration>) => Record<CaipChainId, MultichainNetworkConfiguration>;
55
+ /**
56
+ * Type guard to check if a namespace is a known CAIP namespace.
57
+ *
58
+ * @param namespace - The namespace to check
59
+ * @returns Whether the namespace is a known CAIP namespace
60
+ */
61
+ export declare function isKnownCaipNamespace(namespace: string): namespace is KnownCaipNamespace;
41
62
  //# sourceMappingURL=utils.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.cts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qCAAqC;AACzE,OAAO,EACL,KAAK,GAAG,EACR,KAAK,WAAW,EAIjB,wBAAwB;AAIzB,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC/B,oBAAgB;AAEjB;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GACd,oBAAoB,CAMtB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,WAAW,GACd,EAAE,IAAI,oBAAoB,CAG5B;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,YAAa,GAAG,KAAG,WAC2B,CAAC;AAE5E;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,YAClC,oBAAoB,KAC5B,8BASF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,0CAA0C,mCACrB,OAAO,MAAM,EAAE,oBAAoB,CAAC,KACnE,OAAO,WAAW,EAAE,8BAA8B,CAQlD,CAAC"}
1
+ {"version":3,"file":"utils.d.cts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qCAAqC;AACzE,OAAO,EACL,KAAK,GAAG,EACR,KAAK,WAAW,EAChB,kBAAkB,EAKnB,wBAAwB;AAIzB,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC/B,oBAAgB;AAEjB;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAG9D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GACd,oBAAoB,CAMtB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,WAAW,GACd,EAAE,IAAI,oBAAoB,CAG5B;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,YAAa,GAAG,KAAG,WAC2B,CAAC;AAE5E;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,WAAW,GAAG,GAAG,CASpE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,YAClC,oBAAoB,KAC5B,8BAkBF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,0CAA0C,mCACrB,OAAO,MAAM,EAAE,oBAAoB,CAAC,KACnE,OAAO,WAAW,EAAE,8BAA8B,CAQlD,CAAC;AAGJ;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,GAChB,SAAS,IAAI,kBAAkB,CAEjC"}
package/dist/utils.d.mts CHANGED
@@ -1,6 +1,13 @@
1
1
  import type { NetworkConfiguration } from "@metamask/network-controller";
2
- import { type Hex, type CaipChainId } from "@metamask/utils";
2
+ import { type Hex, type CaipChainId, KnownCaipNamespace } from "@metamask/utils";
3
3
  import type { SupportedCaipChainId, MultichainNetworkConfiguration } from "./types.mjs";
4
+ /**
5
+ * Checks if the chain ID is EVM.
6
+ *
7
+ * @param chainId - The account type to check.
8
+ * @returns Whether the network is EVM.
9
+ */
10
+ export declare function isEvmCaipChainId(chainId: CaipChainId): boolean;
4
11
  /**
5
12
  * Returns the chain id of the non-EVM network based on the account address.
6
13
  *
@@ -22,6 +29,13 @@ export declare function checkIfSupportedCaipChainId(id: CaipChainId): id is Supp
22
29
  * @returns The Caip chain ID.
23
30
  */
24
31
  export declare const toEvmCaipChainId: (chainId: Hex) => CaipChainId;
32
+ /**
33
+ * Convert an eip155 CAIP chain ID to a hex chain ID.
34
+ *
35
+ * @param chainId - The CAIP chain ID to convert.
36
+ * @returns The hex chain ID.
37
+ */
38
+ export declare function convertEvmCaipToHexChainId(chainId: CaipChainId): Hex;
25
39
  /**
26
40
  * Updates a network configuration to the format used by the MultichainNetworkController.
27
41
  * This method is exclusive for EVM networks with hex identifiers from the NetworkController.
@@ -38,4 +52,11 @@ export declare const toMultichainNetworkConfiguration: (network: NetworkConfigur
38
52
  * @returns The updated network configurations.
39
53
  */
40
54
  export declare const toMultichainNetworkConfigurationsByChainId: (networkConfigurationsByChainId: Record<string, NetworkConfiguration>) => Record<CaipChainId, MultichainNetworkConfiguration>;
55
+ /**
56
+ * Type guard to check if a namespace is a known CAIP namespace.
57
+ *
58
+ * @param namespace - The namespace to check
59
+ * @returns Whether the namespace is a known CAIP namespace
60
+ */
61
+ export declare function isKnownCaipNamespace(namespace: string): namespace is KnownCaipNamespace;
41
62
  //# sourceMappingURL=utils.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.mts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qCAAqC;AACzE,OAAO,EACL,KAAK,GAAG,EACR,KAAK,WAAW,EAIjB,wBAAwB;AAIzB,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC/B,oBAAgB;AAEjB;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GACd,oBAAoB,CAMtB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,WAAW,GACd,EAAE,IAAI,oBAAoB,CAG5B;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,YAAa,GAAG,KAAG,WAC2B,CAAC;AAE5E;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,YAClC,oBAAoB,KAC5B,8BASF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,0CAA0C,mCACrB,OAAO,MAAM,EAAE,oBAAoB,CAAC,KACnE,OAAO,WAAW,EAAE,8BAA8B,CAQlD,CAAC"}
1
+ {"version":3,"file":"utils.d.mts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qCAAqC;AACzE,OAAO,EACL,KAAK,GAAG,EACR,KAAK,WAAW,EAChB,kBAAkB,EAKnB,wBAAwB;AAIzB,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC/B,oBAAgB;AAEjB;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAG9D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GACd,oBAAoB,CAMtB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,WAAW,GACd,EAAE,IAAI,oBAAoB,CAG5B;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,YAAa,GAAG,KAAG,WAC2B,CAAC;AAE5E;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,WAAW,GAAG,GAAG,CASpE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,YAClC,oBAAoB,KAC5B,8BAkBF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,0CAA0C,mCACrB,OAAO,MAAM,EAAE,oBAAoB,CAAC,KACnE,OAAO,WAAW,EAAE,8BAA8B,CAQlD,CAAC;AAGJ;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,GAChB,SAAS,IAAI,kBAAkB,CAEjC"}
package/dist/utils.mjs CHANGED
@@ -1,7 +1,17 @@
1
1
  import { BtcScope, SolScope } from "@metamask/keyring-api";
2
- import { KnownCaipNamespace, toCaipChainId, hexToNumber } from "@metamask/utils";
2
+ import { KnownCaipNamespace, toCaipChainId, parseCaipChainId, hexToNumber, add0x } from "@metamask/utils";
3
3
  import { isAddress as isSolanaAddress } from "@solana/addresses";
4
4
  import { AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS } from "./constants.mjs";
5
+ /**
6
+ * Checks if the chain ID is EVM.
7
+ *
8
+ * @param chainId - The account type to check.
9
+ * @returns Whether the network is EVM.
10
+ */
11
+ export function isEvmCaipChainId(chainId) {
12
+ const { namespace } = parseCaipChainId(chainId);
13
+ return namespace === KnownCaipNamespace.Eip155;
14
+ }
5
15
  /**
6
16
  * Returns the chain id of the non-EVM network based on the account address.
7
17
  *
@@ -32,6 +42,19 @@ export function checkIfSupportedCaipChainId(id) {
32
42
  * @returns The Caip chain ID.
33
43
  */
34
44
  export const toEvmCaipChainId = (chainId) => toCaipChainId(KnownCaipNamespace.Eip155, hexToNumber(chainId).toString());
45
+ /**
46
+ * Convert an eip155 CAIP chain ID to a hex chain ID.
47
+ *
48
+ * @param chainId - The CAIP chain ID to convert.
49
+ * @returns The hex chain ID.
50
+ */
51
+ export function convertEvmCaipToHexChainId(chainId) {
52
+ const { namespace, reference } = parseCaipChainId(chainId);
53
+ if (namespace === KnownCaipNamespace.Eip155) {
54
+ return add0x(parseInt(reference, 10).toString(16));
55
+ }
56
+ throw new Error(`Unsupported CAIP chain ID namespace: ${namespace}. Only eip155 is supported.`);
57
+ }
35
58
  /**
36
59
  * Updates a network configuration to the format used by the MultichainNetworkController.
37
60
  * This method is exclusive for EVM networks with hex identifiers from the NetworkController.
@@ -40,13 +63,14 @@ export const toEvmCaipChainId = (chainId) => toCaipChainId(KnownCaipNamespace.Ei
40
63
  * @returns The updated network configuration.
41
64
  */
42
65
  export const toMultichainNetworkConfiguration = (network) => {
66
+ const { chainId, name, rpcEndpoints, defaultRpcEndpointIndex, nativeCurrency, blockExplorerUrls, defaultBlockExplorerUrlIndex, } = network;
43
67
  return {
44
- chainId: toEvmCaipChainId(network.chainId),
68
+ chainId: toEvmCaipChainId(chainId),
45
69
  isEvm: true,
46
- name: network.name,
47
- nativeCurrency: network.nativeCurrency,
48
- blockExplorerUrls: network.blockExplorerUrls,
49
- defaultBlockExplorerUrlIndex: network.defaultBlockExplorerUrlIndex || 0,
70
+ name: name || rpcEndpoints[defaultRpcEndpointIndex].url,
71
+ nativeCurrency,
72
+ blockExplorerUrls,
73
+ defaultBlockExplorerUrlIndex: defaultBlockExplorerUrlIndex || 0,
50
74
  };
51
75
  };
52
76
  /**
@@ -60,4 +84,14 @@ export const toMultichainNetworkConfigurationsByChainId = (networkConfigurations
60
84
  ...acc,
61
85
  [toEvmCaipChainId(network.chainId)]: toMultichainNetworkConfiguration(network),
62
86
  }), {});
87
+ // TODO: This currently isn't being used anymore but could benefit from being moved to @metamask/utils
88
+ /**
89
+ * Type guard to check if a namespace is a known CAIP namespace.
90
+ *
91
+ * @param namespace - The namespace to check
92
+ * @returns Whether the namespace is a known CAIP namespace
93
+ */
94
+ export function isKnownCaipNamespace(namespace) {
95
+ return Object.values(KnownCaipNamespace).includes(namespace);
96
+ }
63
97
  //# sourceMappingURL=utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,8BAA8B;AAE3D,OAAO,EAGL,kBAAkB,EAClB,aAAa,EACb,WAAW,EACZ,wBAAwB;AACzB,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,0BAA0B;AAEjE,OAAO,EAAE,2CAA2C,EAAE,wBAAoB;AAM1E;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAe;IAEf,2GAA2G;IAC3G,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE;QAC5B,OAAO,QAAQ,CAAC,OAAO,CAAC;KACzB;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,EAAe;IAEf,qCAAqC;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAY,EAAe,EAAE,CAC5D,aAAa,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,OAA6B,EACG,EAAE;IAClC,OAAO;QACL,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;QAC1C,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,4BAA4B,EAAE,OAAO,CAAC,4BAA4B,IAAI,CAAC;KACxE,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0CAA0C,GAAG,CACxD,8BAAoE,EACf,EAAE,CACvD,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,MAAM,CACnD,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACrB,GAAG,GAAG;IACN,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EACjC,gCAAgC,CAAC,OAAO,CAAC;CAC5C,CAAC,EACF,EAAE,CACH,CAAC","sourcesContent":["import { BtcScope, SolScope } from '@metamask/keyring-api';\nimport type { NetworkConfiguration } from '@metamask/network-controller';\nimport {\n type Hex,\n type CaipChainId,\n KnownCaipNamespace,\n toCaipChainId,\n hexToNumber,\n} from '@metamask/utils';\nimport { isAddress as isSolanaAddress } from '@solana/addresses';\n\nimport { AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS } from './constants';\nimport type {\n SupportedCaipChainId,\n MultichainNetworkConfiguration,\n} from './types';\n\n/**\n * Returns the chain id of the non-EVM network based on the account address.\n *\n * @param address - The address to check.\n * @returns The caip chain id of the non-EVM network.\n */\nexport function getChainIdForNonEvmAddress(\n address: string,\n): SupportedCaipChainId {\n // This condition is not the most robust. Once we support more networks, we will need to update this logic.\n if (isSolanaAddress(address)) {\n return SolScope.Mainnet;\n }\n return BtcScope.Mainnet;\n}\n\n/**\n * Checks if the Caip chain ID is supported.\n *\n * @param id - The Caip chain IDto check.\n * @returns Whether the chain ID is supported.\n */\nexport function checkIfSupportedCaipChainId(\n id: CaipChainId,\n): id is SupportedCaipChainId {\n // Check if the chain id is supported\n return Object.keys(AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS).includes(id);\n}\n\n/**\n * Converts a hex chain ID to a Caip chain ID.\n *\n * @param chainId - The hex chain ID to convert.\n * @returns The Caip chain ID.\n */\nexport const toEvmCaipChainId = (chainId: Hex): CaipChainId =>\n toCaipChainId(KnownCaipNamespace.Eip155, hexToNumber(chainId).toString());\n\n/**\n * Updates a network configuration to the format used by the MultichainNetworkController.\n * This method is exclusive for EVM networks with hex identifiers from the NetworkController.\n *\n * @param network - The network configuration to update.\n * @returns The updated network configuration.\n */\nexport const toMultichainNetworkConfiguration = (\n network: NetworkConfiguration,\n): MultichainNetworkConfiguration => {\n return {\n chainId: toEvmCaipChainId(network.chainId),\n isEvm: true,\n name: network.name,\n nativeCurrency: network.nativeCurrency,\n blockExplorerUrls: network.blockExplorerUrls,\n defaultBlockExplorerUrlIndex: network.defaultBlockExplorerUrlIndex || 0,\n };\n};\n\n/**\n * Updates a record of network configurations to the format used by the MultichainNetworkController.\n * This method is exclusive for EVM networks with hex identifiers from the NetworkController.\n *\n * @param networkConfigurationsByChainId - The network configurations to update.\n * @returns The updated network configurations.\n */\nexport const toMultichainNetworkConfigurationsByChainId = (\n networkConfigurationsByChainId: Record<string, NetworkConfiguration>,\n): Record<CaipChainId, MultichainNetworkConfiguration> =>\n Object.entries(networkConfigurationsByChainId).reduce(\n (acc, [, network]) => ({\n ...acc,\n [toEvmCaipChainId(network.chainId)]:\n toMultichainNetworkConfiguration(network),\n }),\n {},\n );\n"]}
1
+ {"version":3,"file":"utils.mjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,8BAA8B;AAE3D,OAAO,EAGL,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,KAAK,EACN,wBAAwB;AACzB,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,0BAA0B;AAEjE,OAAO,EAAE,2CAA2C,EAAE,wBAAoB;AAM1E;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,MAAM,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,SAAS,KAAM,kBAAkB,CAAC,MAAiB,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAe;IAEf,2GAA2G;IAC3G,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE;QAC5B,OAAO,QAAQ,CAAC,OAAO,CAAC;KACzB;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,EAAe;IAEf,qCAAqC;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAY,EAAe,EAAE,CAC5D,aAAa,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAoB;IAC7D,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,SAAS,KAAM,kBAAkB,CAAC,MAAiB,EAAE;QACvD,OAAO,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;KACpD;IAED,MAAM,IAAI,KAAK,CACb,wCAAwC,SAAS,6BAA6B,CAC/E,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,OAA6B,EACG,EAAE;IAClC,MAAM,EACJ,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,4BAA4B,GAC7B,GAAG,OAAO,CAAC;IACZ,OAAO;QACL,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;QAClC,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC,uBAAuB,CAAC,CAAC,GAAG;QACvD,cAAc;QACd,iBAAiB;QACjB,4BAA4B,EAAE,4BAA4B,IAAI,CAAC;KAChE,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0CAA0C,GAAG,CACxD,8BAAoE,EACf,EAAE,CACvD,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,MAAM,CACnD,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACrB,GAAG,GAAG;IACN,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EACjC,gCAAgC,CAAC,OAAO,CAAC;CAC5C,CAAC,EACF,EAAE,CACH,CAAC;AAEJ,sGAAsG;AACtG;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB;IAEjB,OAAO,MAAM,CAAC,MAAM,CAAS,kBAAkB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACvE,CAAC","sourcesContent":["import { BtcScope, SolScope } from '@metamask/keyring-api';\nimport type { NetworkConfiguration } from '@metamask/network-controller';\nimport {\n type Hex,\n type CaipChainId,\n KnownCaipNamespace,\n toCaipChainId,\n parseCaipChainId,\n hexToNumber,\n add0x,\n} from '@metamask/utils';\nimport { isAddress as isSolanaAddress } from '@solana/addresses';\n\nimport { AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS } from './constants';\nimport type {\n SupportedCaipChainId,\n MultichainNetworkConfiguration,\n} from './types';\n\n/**\n * Checks if the chain ID is EVM.\n *\n * @param chainId - The account type to check.\n * @returns Whether the network is EVM.\n */\nexport function isEvmCaipChainId(chainId: CaipChainId): boolean {\n const { namespace } = parseCaipChainId(chainId);\n return namespace === (KnownCaipNamespace.Eip155 as string);\n}\n\n/**\n * Returns the chain id of the non-EVM network based on the account address.\n *\n * @param address - The address to check.\n * @returns The caip chain id of the non-EVM network.\n */\nexport function getChainIdForNonEvmAddress(\n address: string,\n): SupportedCaipChainId {\n // This condition is not the most robust. Once we support more networks, we will need to update this logic.\n if (isSolanaAddress(address)) {\n return SolScope.Mainnet;\n }\n return BtcScope.Mainnet;\n}\n\n/**\n * Checks if the Caip chain ID is supported.\n *\n * @param id - The Caip chain IDto check.\n * @returns Whether the chain ID is supported.\n */\nexport function checkIfSupportedCaipChainId(\n id: CaipChainId,\n): id is SupportedCaipChainId {\n // Check if the chain id is supported\n return Object.keys(AVAILABLE_MULTICHAIN_NETWORK_CONFIGURATIONS).includes(id);\n}\n\n/**\n * Converts a hex chain ID to a Caip chain ID.\n *\n * @param chainId - The hex chain ID to convert.\n * @returns The Caip chain ID.\n */\nexport const toEvmCaipChainId = (chainId: Hex): CaipChainId =>\n toCaipChainId(KnownCaipNamespace.Eip155, hexToNumber(chainId).toString());\n\n/**\n * Convert an eip155 CAIP chain ID to a hex chain ID.\n *\n * @param chainId - The CAIP chain ID to convert.\n * @returns The hex chain ID.\n */\nexport function convertEvmCaipToHexChainId(chainId: CaipChainId): Hex {\n const { namespace, reference } = parseCaipChainId(chainId);\n if (namespace === (KnownCaipNamespace.Eip155 as string)) {\n return add0x(parseInt(reference, 10).toString(16));\n }\n\n throw new Error(\n `Unsupported CAIP chain ID namespace: ${namespace}. Only eip155 is supported.`,\n );\n}\n\n/**\n * Updates a network configuration to the format used by the MultichainNetworkController.\n * This method is exclusive for EVM networks with hex identifiers from the NetworkController.\n *\n * @param network - The network configuration to update.\n * @returns The updated network configuration.\n */\nexport const toMultichainNetworkConfiguration = (\n network: NetworkConfiguration,\n): MultichainNetworkConfiguration => {\n const {\n chainId,\n name,\n rpcEndpoints,\n defaultRpcEndpointIndex,\n nativeCurrency,\n blockExplorerUrls,\n defaultBlockExplorerUrlIndex,\n } = network;\n return {\n chainId: toEvmCaipChainId(chainId),\n isEvm: true,\n name: name || rpcEndpoints[defaultRpcEndpointIndex].url,\n nativeCurrency,\n blockExplorerUrls,\n defaultBlockExplorerUrlIndex: defaultBlockExplorerUrlIndex || 0,\n };\n};\n\n/**\n * Updates a record of network configurations to the format used by the MultichainNetworkController.\n * This method is exclusive for EVM networks with hex identifiers from the NetworkController.\n *\n * @param networkConfigurationsByChainId - The network configurations to update.\n * @returns The updated network configurations.\n */\nexport const toMultichainNetworkConfigurationsByChainId = (\n networkConfigurationsByChainId: Record<string, NetworkConfiguration>,\n): Record<CaipChainId, MultichainNetworkConfiguration> =>\n Object.entries(networkConfigurationsByChainId).reduce(\n (acc, [, network]) => ({\n ...acc,\n [toEvmCaipChainId(network.chainId)]:\n toMultichainNetworkConfiguration(network),\n }),\n {},\n );\n\n// TODO: This currently isn't being used anymore but could benefit from being moved to @metamask/utils\n/**\n * Type guard to check if a namespace is a known CAIP namespace.\n *\n * @param namespace - The namespace to check\n * @returns Whether the namespace is a known CAIP namespace\n */\nexport function isKnownCaipNamespace(\n namespace: string,\n): namespace is KnownCaipNamespace {\n return Object.values<string>(KnownCaipNamespace).includes(namespace);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/multichain-network-controller",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Multichain network controller",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -48,15 +48,18 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "@metamask/base-controller": "^8.0.0",
51
- "@metamask/keyring-api": "^17.2.0",
51
+ "@metamask/controller-utils": "^11.7.0",
52
+ "@metamask/keyring-api": "^17.4.0",
53
+ "@metamask/keyring-internal-api": "^6.0.1",
54
+ "@metamask/superstruct": "^3.1.0",
52
55
  "@metamask/utils": "^11.2.0",
53
56
  "@solana/addresses": "^2.0.0"
54
57
  },
55
58
  "devDependencies": {
56
59
  "@metamask/accounts-controller": "^27.0.0",
57
60
  "@metamask/auto-changelog": "^3.4.4",
58
- "@metamask/keyring-controller": "^21.0.0",
59
- "@metamask/network-controller": "^23.0.0",
61
+ "@metamask/keyring-controller": "^21.0.3",
62
+ "@metamask/network-controller": "^23.2.0",
60
63
  "@types/jest": "^27.4.1",
61
64
  "@types/uuid": "^8.3.0",
62
65
  "deepmerge": "^4.2.2",
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainNetworkController.cjs","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { isCaipChainId } from '@metamask/utils';\n\nimport {\n MULTICHAIN_NETWORK_CONTROLLER_METADATA,\n getDefaultMultichainNetworkControllerState,\n} from './constants';\nimport {\n MULTICHAIN_NETWORK_CONTROLLER_NAME,\n type MultichainNetworkControllerState,\n type MultichainNetworkControllerMessenger,\n type SupportedCaipChainId,\n} from './types';\nimport {\n checkIfSupportedCaipChainId,\n getChainIdForNonEvmAddress,\n} from './utils';\n\n/**\n * The MultichainNetworkController is responsible for fetching and caching account\n * balances.\n */\nexport class MultichainNetworkController extends BaseController<\n typeof MULTICHAIN_NETWORK_CONTROLLER_NAME,\n MultichainNetworkControllerState,\n MultichainNetworkControllerMessenger\n> {\n constructor({\n messenger,\n state,\n }: {\n messenger: MultichainNetworkControllerMessenger;\n state?: Omit<\n Partial<MultichainNetworkControllerState>,\n 'multichainNetworkConfigurationsByChainId'\n >;\n }) {\n super({\n messenger,\n name: MULTICHAIN_NETWORK_CONTROLLER_NAME,\n metadata: MULTICHAIN_NETWORK_CONTROLLER_METADATA,\n state: {\n ...getDefaultMultichainNetworkControllerState(),\n ...state,\n },\n });\n\n this.#subscribeToMessageEvents();\n this.#registerMessageHandlers();\n }\n\n /**\n * Sets the active EVM network.\n *\n * @param id - The client ID of the EVM network to set active.\n */\n async #setActiveEvmNetwork(id: NetworkClientId): Promise<void> {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n\n const shouldSetEvmActive = !this.state.isEvmSelected;\n const shouldNotifyNetworkChange = id !== selectedNetworkClientId;\n\n // No changes needed if EVM is active and network is already selected\n if (!shouldSetEvmActive && !shouldNotifyNetworkChange) {\n return;\n }\n\n // Update EVM selection state if needed\n if (shouldSetEvmActive) {\n this.update((state) => {\n state.isEvmSelected = true;\n });\n }\n\n // Only notify the network controller if the selected evm network is different\n if (shouldNotifyNetworkChange) {\n await this.messagingSystem.call('NetworkController:setActiveNetwork', id);\n }\n\n // Only publish the networkDidChange event if either the EVM network is different or we're switching between EVM and non-EVM networks\n if (shouldSetEvmActive || shouldNotifyNetworkChange) {\n this.messagingSystem.publish(\n 'MultichainNetworkController:networkDidChange',\n id,\n );\n }\n }\n\n /**\n * Sets the active non-EVM network.\n *\n * @param id - The chain ID of the non-EVM network to set active.\n */\n #setActiveNonEvmNetwork(id: SupportedCaipChainId): void {\n if (\n id === this.state.selectedMultichainNetworkChainId &&\n !this.state.isEvmSelected\n ) {\n // Same non-EVM network is already selected, no need to update\n return;\n }\n\n this.update((state) => {\n state.selectedMultichainNetworkChainId = id;\n state.isEvmSelected = false;\n });\n\n // Notify listeners that the network changed\n this.messagingSystem.publish(\n 'MultichainNetworkController:networkDidChange',\n id,\n );\n }\n\n /**\n * Sets the active network.\n *\n * @param id - The non-EVM Caip chain ID or EVM client ID of the network to set active.\n * @returns - A promise that resolves when the network is set active.\n */\n async setActiveNetwork(\n id: SupportedCaipChainId | NetworkClientId,\n ): Promise<void> {\n if (isCaipChainId(id)) {\n const isSupportedCaipChainId = checkIfSupportedCaipChainId(id);\n if (!isSupportedCaipChainId) {\n throw new Error(`Unsupported Caip chain ID: ${String(id)}`);\n }\n return this.#setActiveNonEvmNetwork(id);\n }\n\n return await this.#setActiveEvmNetwork(id);\n }\n\n /**\n * Handles switching between EVM and non-EVM networks when an account is changed\n *\n * @param account - The account that was changed\n */\n #handleOnSelectedAccountChange(account: InternalAccount) {\n const { type: accountType, address: accountAddress } = account;\n const isEvmAccount = isEvmAccountType(accountType);\n\n // Handle switching to EVM network\n if (isEvmAccount) {\n if (this.state.isEvmSelected) {\n // No need to update if already on evm network\n return;\n }\n\n // Make EVM network active\n this.update((state) => {\n state.isEvmSelected = true;\n });\n\n return;\n }\n\n // Handle switching to non-EVM network\n const nonEvmChainId = getChainIdForNonEvmAddress(accountAddress);\n const isSameNonEvmNetwork =\n nonEvmChainId === this.state.selectedMultichainNetworkChainId;\n\n if (isSameNonEvmNetwork) {\n // No need to update if already on the same non-EVM network\n this.update((state) => {\n state.isEvmSelected = false;\n });\n return;\n }\n\n this.update((state) => {\n state.selectedMultichainNetworkChainId = nonEvmChainId;\n state.isEvmSelected = false;\n });\n\n // No need to publish NetworkController:setActiveNetwork because EVM accounts falls back to use the last selected EVM network\n // DO NOT publish MultichainNetworkController:networkDidChange to prevent circular listener loops\n }\n\n /**\n * Subscribes to message events.\n */\n #subscribeToMessageEvents() {\n // Handle network switch when account is changed\n this.messagingSystem.subscribe(\n 'AccountsController:selectedAccountChange',\n (account) => this.#handleOnSelectedAccountChange(account),\n );\n }\n\n /**\n * Registers message handlers.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n 'MultichainNetworkController:setActiveNetwork',\n this.setActiveNetwork.bind(this),\n );\n }\n}\n"]}
@@ -1,22 +0,0 @@
1
- import { BaseController } from "@metamask/base-controller";
2
- import type { NetworkClientId } from "@metamask/network-controller";
3
- import { MULTICHAIN_NETWORK_CONTROLLER_NAME, type MultichainNetworkControllerState, type MultichainNetworkControllerMessenger, type SupportedCaipChainId } from "./types.cjs";
4
- /**
5
- * The MultichainNetworkController is responsible for fetching and caching account
6
- * balances.
7
- */
8
- export declare class MultichainNetworkController extends BaseController<typeof MULTICHAIN_NETWORK_CONTROLLER_NAME, MultichainNetworkControllerState, MultichainNetworkControllerMessenger> {
9
- #private;
10
- constructor({ messenger, state, }: {
11
- messenger: MultichainNetworkControllerMessenger;
12
- state?: Omit<Partial<MultichainNetworkControllerState>, 'multichainNetworkConfigurationsByChainId'>;
13
- });
14
- /**
15
- * Sets the active network.
16
- *
17
- * @param id - The non-EVM Caip chain ID or EVM client ID of the network to set active.
18
- * @returns - A promise that resolves when the network is set active.
19
- */
20
- setActiveNetwork(id: SupportedCaipChainId | NetworkClientId): Promise<void>;
21
- }
22
- //# sourceMappingURL=MultichainNetworkController.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainNetworkController.d.cts","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAG3D,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AAOpE,OAAO,EACL,kCAAkC,EAClC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,oBAAoB,EAC1B,oBAAgB;AAMjB;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,cAAc,CAC7D,OAAO,kCAAkC,EACzC,gCAAgC,EAChC,oCAAoC,CACrC;;gBACa,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,oCAAoC,CAAC;QAChD,KAAK,CAAC,EAAE,IAAI,CACV,OAAO,CAAC,gCAAgC,CAAC,EACzC,0CAA0C,CAC3C,CAAC;KACH;IAgFD;;;;;OAKG;IACG,gBAAgB,CACpB,EAAE,EAAE,oBAAoB,GAAG,eAAe,GACzC,OAAO,CAAC,IAAI,CAAC;CA8EjB"}
@@ -1,22 +0,0 @@
1
- import { BaseController } from "@metamask/base-controller";
2
- import type { NetworkClientId } from "@metamask/network-controller";
3
- import { MULTICHAIN_NETWORK_CONTROLLER_NAME, type MultichainNetworkControllerState, type MultichainNetworkControllerMessenger, type SupportedCaipChainId } from "./types.mjs";
4
- /**
5
- * The MultichainNetworkController is responsible for fetching and caching account
6
- * balances.
7
- */
8
- export declare class MultichainNetworkController extends BaseController<typeof MULTICHAIN_NETWORK_CONTROLLER_NAME, MultichainNetworkControllerState, MultichainNetworkControllerMessenger> {
9
- #private;
10
- constructor({ messenger, state, }: {
11
- messenger: MultichainNetworkControllerMessenger;
12
- state?: Omit<Partial<MultichainNetworkControllerState>, 'multichainNetworkConfigurationsByChainId'>;
13
- });
14
- /**
15
- * Sets the active network.
16
- *
17
- * @param id - The non-EVM Caip chain ID or EVM client ID of the network to set active.
18
- * @returns - A promise that resolves when the network is set active.
19
- */
20
- setActiveNetwork(id: SupportedCaipChainId | NetworkClientId): Promise<void>;
21
- }
22
- //# sourceMappingURL=MultichainNetworkController.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainNetworkController.d.mts","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAG3D,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AAOpE,OAAO,EACL,kCAAkC,EAClC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,oBAAoB,EAC1B,oBAAgB;AAMjB;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,cAAc,CAC7D,OAAO,kCAAkC,EACzC,gCAAgC,EAChC,oCAAoC,CACrC;;gBACa,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,oCAAoC,CAAC;QAChD,KAAK,CAAC,EAAE,IAAI,CACV,OAAO,CAAC,gCAAgC,CAAC,EACzC,0CAA0C,CAC3C,CAAC;KACH;IAgFD;;;;;OAKG;IACG,gBAAgB,CACpB,EAAE,EAAE,oBAAoB,GAAG,eAAe,GACzC,OAAO,CAAC,IAAI,CAAC;CA8EjB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultichainNetworkController.mjs","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { isCaipChainId } from '@metamask/utils';\n\nimport {\n MULTICHAIN_NETWORK_CONTROLLER_METADATA,\n getDefaultMultichainNetworkControllerState,\n} from './constants';\nimport {\n MULTICHAIN_NETWORK_CONTROLLER_NAME,\n type MultichainNetworkControllerState,\n type MultichainNetworkControllerMessenger,\n type SupportedCaipChainId,\n} from './types';\nimport {\n checkIfSupportedCaipChainId,\n getChainIdForNonEvmAddress,\n} from './utils';\n\n/**\n * The MultichainNetworkController is responsible for fetching and caching account\n * balances.\n */\nexport class MultichainNetworkController extends BaseController<\n typeof MULTICHAIN_NETWORK_CONTROLLER_NAME,\n MultichainNetworkControllerState,\n MultichainNetworkControllerMessenger\n> {\n constructor({\n messenger,\n state,\n }: {\n messenger: MultichainNetworkControllerMessenger;\n state?: Omit<\n Partial<MultichainNetworkControllerState>,\n 'multichainNetworkConfigurationsByChainId'\n >;\n }) {\n super({\n messenger,\n name: MULTICHAIN_NETWORK_CONTROLLER_NAME,\n metadata: MULTICHAIN_NETWORK_CONTROLLER_METADATA,\n state: {\n ...getDefaultMultichainNetworkControllerState(),\n ...state,\n },\n });\n\n this.#subscribeToMessageEvents();\n this.#registerMessageHandlers();\n }\n\n /**\n * Sets the active EVM network.\n *\n * @param id - The client ID of the EVM network to set active.\n */\n async #setActiveEvmNetwork(id: NetworkClientId): Promise<void> {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n\n const shouldSetEvmActive = !this.state.isEvmSelected;\n const shouldNotifyNetworkChange = id !== selectedNetworkClientId;\n\n // No changes needed if EVM is active and network is already selected\n if (!shouldSetEvmActive && !shouldNotifyNetworkChange) {\n return;\n }\n\n // Update EVM selection state if needed\n if (shouldSetEvmActive) {\n this.update((state) => {\n state.isEvmSelected = true;\n });\n }\n\n // Only notify the network controller if the selected evm network is different\n if (shouldNotifyNetworkChange) {\n await this.messagingSystem.call('NetworkController:setActiveNetwork', id);\n }\n\n // Only publish the networkDidChange event if either the EVM network is different or we're switching between EVM and non-EVM networks\n if (shouldSetEvmActive || shouldNotifyNetworkChange) {\n this.messagingSystem.publish(\n 'MultichainNetworkController:networkDidChange',\n id,\n );\n }\n }\n\n /**\n * Sets the active non-EVM network.\n *\n * @param id - The chain ID of the non-EVM network to set active.\n */\n #setActiveNonEvmNetwork(id: SupportedCaipChainId): void {\n if (\n id === this.state.selectedMultichainNetworkChainId &&\n !this.state.isEvmSelected\n ) {\n // Same non-EVM network is already selected, no need to update\n return;\n }\n\n this.update((state) => {\n state.selectedMultichainNetworkChainId = id;\n state.isEvmSelected = false;\n });\n\n // Notify listeners that the network changed\n this.messagingSystem.publish(\n 'MultichainNetworkController:networkDidChange',\n id,\n );\n }\n\n /**\n * Sets the active network.\n *\n * @param id - The non-EVM Caip chain ID or EVM client ID of the network to set active.\n * @returns - A promise that resolves when the network is set active.\n */\n async setActiveNetwork(\n id: SupportedCaipChainId | NetworkClientId,\n ): Promise<void> {\n if (isCaipChainId(id)) {\n const isSupportedCaipChainId = checkIfSupportedCaipChainId(id);\n if (!isSupportedCaipChainId) {\n throw new Error(`Unsupported Caip chain ID: ${String(id)}`);\n }\n return this.#setActiveNonEvmNetwork(id);\n }\n\n return await this.#setActiveEvmNetwork(id);\n }\n\n /**\n * Handles switching between EVM and non-EVM networks when an account is changed\n *\n * @param account - The account that was changed\n */\n #handleOnSelectedAccountChange(account: InternalAccount) {\n const { type: accountType, address: accountAddress } = account;\n const isEvmAccount = isEvmAccountType(accountType);\n\n // Handle switching to EVM network\n if (isEvmAccount) {\n if (this.state.isEvmSelected) {\n // No need to update if already on evm network\n return;\n }\n\n // Make EVM network active\n this.update((state) => {\n state.isEvmSelected = true;\n });\n\n return;\n }\n\n // Handle switching to non-EVM network\n const nonEvmChainId = getChainIdForNonEvmAddress(accountAddress);\n const isSameNonEvmNetwork =\n nonEvmChainId === this.state.selectedMultichainNetworkChainId;\n\n if (isSameNonEvmNetwork) {\n // No need to update if already on the same non-EVM network\n this.update((state) => {\n state.isEvmSelected = false;\n });\n return;\n }\n\n this.update((state) => {\n state.selectedMultichainNetworkChainId = nonEvmChainId;\n state.isEvmSelected = false;\n });\n\n // No need to publish NetworkController:setActiveNetwork because EVM accounts falls back to use the last selected EVM network\n // DO NOT publish MultichainNetworkController:networkDidChange to prevent circular listener loops\n }\n\n /**\n * Subscribes to message events.\n */\n #subscribeToMessageEvents() {\n // Handle network switch when account is changed\n this.messagingSystem.subscribe(\n 'AccountsController:selectedAccountChange',\n (account) => this.#handleOnSelectedAccountChange(account),\n );\n }\n\n /**\n * Registers message handlers.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n 'MultichainNetworkController:setActiveNetwork',\n this.setActiveNetwork.bind(this),\n );\n }\n}\n"]}