@metamask-previews/network-enablement-controller 3.1.0-preview-5460dce → 3.1.0-preview-e8e08ff

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.
@@ -1,128 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getNativeCaip19 = exports.getSlip44ByChainId = void 0;
7
- const controller_utils_1 = require("@metamask/controller-utils");
8
- // @ts-expect-error - JSON imports need resolveJsonModule
9
- const slip44_json_1 = __importDefault(require("@metamask/slip44/slip44.json"));
10
- const utils_1 = require("@metamask/utils");
11
- /** ---- Constants / Cache ---- */
12
- const CHAINS_JSON_URL = 'https://chainid.network/chains.json';
13
- const CACHE_DURATION_MS = 30 * 60 * 1000; // 30 min
14
- let chainsCache = null;
15
- let chainsFetchedAt = 0;
16
- let inflight = null;
17
- /** Build a quick symbol -> coinType map from slip44 dataset */
18
- const SLIP44_BY_SYMBOL = (() => {
19
- const map = {};
20
- slip44_json_1.default.forEach((e) => {
21
- const sym = e.symbol?.toUpperCase();
22
- if (sym && typeof e.index === 'number' && !(sym in map)) {
23
- map[sym] = e.index;
24
- }
25
- });
26
- return map;
27
- })();
28
- /** Fallbacks for common native symbols */
29
- const COMMON_SYMBOL_DEFAULTS = {
30
- SOL: 501,
31
- BTC: 0,
32
- ETH: 60,
33
- POL: 966,
34
- MATIC: 966,
35
- BNB: 714,
36
- AVAX: 9000,
37
- SEI: 19000118,
38
- MON: 268435779,
39
- FTM: 1007,
40
- XDAI: 700,
41
- };
42
- /**
43
- * Fetch with cache + in-flight dedupe.
44
- *
45
- * @returns The chains JSON data.
46
- */
47
- async function fetchChains() {
48
- const now = Date.now();
49
- if (chainsCache && now - chainsFetchedAt < CACHE_DURATION_MS) {
50
- return chainsCache;
51
- }
52
- if (inflight) {
53
- return inflight;
54
- }
55
- inflight = (async () => {
56
- const data = (await (0, controller_utils_1.handleFetch)(CHAINS_JSON_URL));
57
- if (!Array.isArray(data)) {
58
- throw new Error('chains.json: unexpected shape');
59
- }
60
- // Minimal validation; keep what we need
61
- const parsed = data
62
- .filter((x) => x && typeof x === 'object')
63
- .map((x) => {
64
- const nativeCurrency = x.nativeCurrency;
65
- return {
66
- chainId: Number(x.chainId),
67
- name: x.name,
68
- nativeCurrency,
69
- };
70
- })
71
- .filter((x) => Number.isFinite(x.chainId));
72
- chainsCache = parsed;
73
- chainsFetchedAt = now;
74
- inflight = null; // clear in-flight marker
75
- return parsed;
76
- })();
77
- try {
78
- return await inflight;
79
- }
80
- catch (e) {
81
- inflight = null;
82
- throw e;
83
- }
84
- }
85
- /**
86
- * Resolve SLIP-44 coinType for a given chainId (EVM only).
87
- *
88
- * @param chainId - The chain ID to resolve.
89
- * @returns The SLIP-44 coin type as a string, or null if not found.
90
- */
91
- async function getSlip44ByChainId(chainId) {
92
- try {
93
- // 1) Lookup by native symbol from chains.json
94
- const chains = await fetchChains();
95
- const chain = chains.find((c) => c.chainId === chainId);
96
- const symbol = chain?.nativeCurrency?.symbol?.toUpperCase();
97
- if (symbol) {
98
- // Exact symbol match from slip44 dataset
99
- const coinType = SLIP44_BY_SYMBOL[symbol] ?? COMMON_SYMBOL_DEFAULTS[symbol];
100
- if (coinType !== undefined) {
101
- return String(coinType);
102
- }
103
- }
104
- // 2) Heuristic for ETH-based L2s: default to ETH coin type
105
- // Many L2s (Arbitrum, Optimism, Base, Linea, Scroll, zkSync, etc.) use ETH as native
106
- return '60';
107
- }
108
- catch (err) {
109
- // Prefer null for ergonomics (callers can fallback silently)
110
- console.error(`getSlip44ByChainId(${chainId}) failed:`, err);
111
- return null;
112
- }
113
- }
114
- exports.getSlip44ByChainId = getSlip44ByChainId;
115
- /**
116
- * Convenience: native CAIP-19 for an EVM chain.
117
- *
118
- * @param chainId - The chain ID to generate CAIP-19 for.
119
- * @returns The CAIP-19 asset type string, or null if not found.
120
- */
121
- async function getNativeCaip19(chainId) {
122
- const coinType = await getSlip44ByChainId(chainId);
123
- return coinType
124
- ? (0, utils_1.toCaipAssetType)('eip155', String(chainId), 'slip44', coinType)
125
- : null;
126
- }
127
- exports.getNativeCaip19 = getNativeCaip19;
128
- //# sourceMappingURL=ChainService.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChainService.cjs","sourceRoot":"","sources":["../src/ChainService.ts"],"names":[],"mappings":";;;;;;AAAA,iEAAyD;AACzD,yDAAyD;AACzD,+EAAkD;AAClD,2CAAkD;AAelD,kCAAkC;AAClC,MAAM,eAAe,GAAG,qCAAqC,CAAC;AAC9D,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAEnD,IAAI,WAAW,GAA4B,IAAI,CAAC;AAChD,IAAI,eAAe,GAAG,CAAC,CAAC;AACxB,IAAI,QAAQ,GAAqC,IAAI,CAAC;AAEtD,+DAA+D;AAC/D,MAAM,gBAAgB,GAA2B,CAAC,GAAG,EAAE;IACrD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACtC,qBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;QACpC,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;YACvD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;SACpB;IACH,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,EAAE,CAAC;AAEL,0CAA0C;AAC1C,MAAM,sBAAsB,GAA2B;IACrD,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,GAAG;IACR,KAAK,EAAE,GAAG;IACV,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,GAAG;CACV,CAAC;AAEF;;;;GAIG;AACH,KAAK,UAAU,WAAW;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,WAAW,IAAI,GAAG,GAAG,eAAe,GAAG,iBAAiB,EAAE;QAC5D,OAAO,WAAW,CAAC;KACpB;IACD,IAAI,QAAQ,EAAE;QACZ,OAAO,QAAQ,CAAC;KACjB;IAED,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE;QACrB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAA,8BAAW,EAAC,eAAe,CAAC,CAAY,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QACD,wCAAwC;QACxC,MAAM,MAAM,GAAG,IAAI;aAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;aACzC,GAAG,CAAC,CAAC,CAA0B,EAAkB,EAAE;YAClD,MAAM,cAAc,GAAG,CAAC,CAAC,cAEZ,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAc;gBACtB,cAAc;aACf,CAAC;QACJ,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAE7C,WAAW,GAAG,MAAM,CAAC;QACrB,eAAe,GAAG,GAAG,CAAC;QACtB,QAAQ,GAAG,IAAI,CAAC,CAAC,yBAAyB;QAC1C,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI;QACF,OAAO,MAAM,QAAQ,CAAC;KACvB;IAAC,OAAO,CAAC,EAAE;QACV,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,CAAC,CAAC;KACT;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CACtC,OAAe;IAEf,IAAI;QACF,8CAA8C;QAC9C,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAE5D,IAAI,MAAM,EAAE;YACV,yCAAyC;YACzC,MAAM,QAAQ,GACZ,gBAAgB,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC1B,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;aACzB;SACF;QAED,2DAA2D;QAC3D,qFAAqF;QACrF,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,GAAG,EAAE;QACZ,6DAA6D;QAC7D,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,WAAW,EAAE,GAAG,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AA1BD,gDA0BC;AAED;;;;;GAKG;AACI,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,QAAQ;QACb,CAAC,CAAC,IAAA,uBAAe,EAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAChE,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AALD,0CAKC","sourcesContent":["import { handleFetch } from '@metamask/controller-utils';\n// @ts-expect-error - JSON imports need resolveJsonModule\nimport slip44 from '@metamask/slip44/slip44.json';\nimport { toCaipAssetType } from '@metamask/utils';\n\n/** ---- Types ---- */\ntype ChainsJsonItem = {\n chainId: number;\n name: string;\n nativeCurrency?: { symbol?: string; name?: string; decimals?: number };\n};\n\ntype Slip44Entry = {\n index: number; // the coin type (e.g., 60)\n symbol?: string; // e.g., 'ETH', 'BNB'\n name?: string; // e.g., 'Ethereum'\n};\n\n/** ---- Constants / Cache ---- */\nconst CHAINS_JSON_URL = 'https://chainid.network/chains.json';\nconst CACHE_DURATION_MS = 30 * 60 * 1000; // 30 min\n\nlet chainsCache: ChainsJsonItem[] | null = null;\nlet chainsFetchedAt = 0;\nlet inflight: Promise<ChainsJsonItem[]> | null = null;\n\n/** Build a quick symbol -> coinType map from slip44 dataset */\nconst SLIP44_BY_SYMBOL: Record<string, number> = (() => {\n const map: Record<string, number> = {};\n (slip44 as Slip44Entry[]).forEach((e) => {\n const sym = e.symbol?.toUpperCase();\n if (sym && typeof e.index === 'number' && !(sym in map)) {\n map[sym] = e.index;\n }\n });\n return map;\n})();\n\n/** Fallbacks for common native symbols */\nconst COMMON_SYMBOL_DEFAULTS: Record<string, number> = {\n SOL: 501,\n BTC: 0,\n ETH: 60,\n POL: 966,\n MATIC: 966,\n BNB: 714,\n AVAX: 9000,\n SEI: 19000118,\n MON: 268435779,\n FTM: 1007,\n XDAI: 700,\n};\n\n/**\n * Fetch with cache + in-flight dedupe.\n *\n * @returns The chains JSON data.\n */\nasync function fetchChains(): Promise<ChainsJsonItem[]> {\n const now = Date.now();\n if (chainsCache && now - chainsFetchedAt < CACHE_DURATION_MS) {\n return chainsCache;\n }\n if (inflight) {\n return inflight;\n }\n\n inflight = (async () => {\n const data = (await handleFetch(CHAINS_JSON_URL)) as unknown;\n if (!Array.isArray(data)) {\n throw new Error('chains.json: unexpected shape');\n }\n // Minimal validation; keep what we need\n const parsed = data\n .filter((x) => x && typeof x === 'object')\n .map((x: Record<string, unknown>): ChainsJsonItem => {\n const nativeCurrency = x.nativeCurrency as\n | { symbol?: string; name?: string; decimals?: number }\n | undefined;\n return {\n chainId: Number(x.chainId),\n name: x.name as string,\n nativeCurrency,\n };\n })\n .filter((x) => Number.isFinite(x.chainId));\n\n chainsCache = parsed;\n chainsFetchedAt = now;\n inflight = null; // clear in-flight marker\n return parsed;\n })();\n\n try {\n return await inflight;\n } catch (e) {\n inflight = null;\n throw e;\n }\n}\n\n/**\n * Resolve SLIP-44 coinType for a given chainId (EVM only).\n *\n * @param chainId - The chain ID to resolve.\n * @returns The SLIP-44 coin type as a string, or null if not found.\n */\nexport async function getSlip44ByChainId(\n chainId: number,\n): Promise<string | null> {\n try {\n // 1) Lookup by native symbol from chains.json\n const chains = await fetchChains();\n const chain = chains.find((c) => c.chainId === chainId);\n const symbol = chain?.nativeCurrency?.symbol?.toUpperCase();\n\n if (symbol) {\n // Exact symbol match from slip44 dataset\n const coinType =\n SLIP44_BY_SYMBOL[symbol] ?? COMMON_SYMBOL_DEFAULTS[symbol];\n if (coinType !== undefined) {\n return String(coinType);\n }\n }\n\n // 2) Heuristic for ETH-based L2s: default to ETH coin type\n // Many L2s (Arbitrum, Optimism, Base, Linea, Scroll, zkSync, etc.) use ETH as native\n return '60';\n } catch (err) {\n // Prefer null for ergonomics (callers can fallback silently)\n console.error(`getSlip44ByChainId(${chainId}) failed:`, err);\n return null;\n }\n}\n\n/**\n * Convenience: native CAIP-19 for an EVM chain.\n *\n * @param chainId - The chain ID to generate CAIP-19 for.\n * @returns The CAIP-19 asset type string, or null if not found.\n */\nexport async function getNativeCaip19(chainId: number): Promise<string | null> {\n const coinType = await getSlip44ByChainId(chainId);\n return coinType\n ? toCaipAssetType('eip155', String(chainId), 'slip44', coinType)\n : null;\n}\n"]}
@@ -1,15 +0,0 @@
1
- /**
2
- * Resolve SLIP-44 coinType for a given chainId (EVM only).
3
- *
4
- * @param chainId - The chain ID to resolve.
5
- * @returns The SLIP-44 coin type as a string, or null if not found.
6
- */
7
- export declare function getSlip44ByChainId(chainId: number): Promise<string | null>;
8
- /**
9
- * Convenience: native CAIP-19 for an EVM chain.
10
- *
11
- * @param chainId - The chain ID to generate CAIP-19 for.
12
- * @returns The CAIP-19 asset type string, or null if not found.
13
- */
14
- export declare function getNativeCaip19(chainId: number): Promise<string | null>;
15
- //# sourceMappingURL=ChainService.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChainService.d.cts","sourceRoot":"","sources":["../src/ChainService.ts"],"names":[],"mappings":"AAqGA;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBxB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK7E"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Resolve SLIP-44 coinType for a given chainId (EVM only).
3
- *
4
- * @param chainId - The chain ID to resolve.
5
- * @returns The SLIP-44 coin type as a string, or null if not found.
6
- */
7
- export declare function getSlip44ByChainId(chainId: number): Promise<string | null>;
8
- /**
9
- * Convenience: native CAIP-19 for an EVM chain.
10
- *
11
- * @param chainId - The chain ID to generate CAIP-19 for.
12
- * @returns The CAIP-19 asset type string, or null if not found.
13
- */
14
- export declare function getNativeCaip19(chainId: number): Promise<string | null>;
15
- //# sourceMappingURL=ChainService.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChainService.d.mts","sourceRoot":"","sources":["../src/ChainService.ts"],"names":[],"mappings":"AAqGA;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBxB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK7E"}
@@ -1,120 +0,0 @@
1
- import { handleFetch } from "@metamask/controller-utils";
2
- // @ts-expect-error - JSON imports need resolveJsonModule
3
- import slip44 from "@metamask/slip44/slip44.json" assert { type: "json" };
4
- import { toCaipAssetType } from "@metamask/utils";
5
- /** ---- Constants / Cache ---- */
6
- const CHAINS_JSON_URL = 'https://chainid.network/chains.json';
7
- const CACHE_DURATION_MS = 30 * 60 * 1000; // 30 min
8
- let chainsCache = null;
9
- let chainsFetchedAt = 0;
10
- let inflight = null;
11
- /** Build a quick symbol -> coinType map from slip44 dataset */
12
- const SLIP44_BY_SYMBOL = (() => {
13
- const map = {};
14
- slip44.forEach((e) => {
15
- const sym = e.symbol?.toUpperCase();
16
- if (sym && typeof e.index === 'number' && !(sym in map)) {
17
- map[sym] = e.index;
18
- }
19
- });
20
- return map;
21
- })();
22
- /** Fallbacks for common native symbols */
23
- const COMMON_SYMBOL_DEFAULTS = {
24
- SOL: 501,
25
- BTC: 0,
26
- ETH: 60,
27
- POL: 966,
28
- MATIC: 966,
29
- BNB: 714,
30
- AVAX: 9000,
31
- SEI: 19000118,
32
- MON: 268435779,
33
- FTM: 1007,
34
- XDAI: 700,
35
- };
36
- /**
37
- * Fetch with cache + in-flight dedupe.
38
- *
39
- * @returns The chains JSON data.
40
- */
41
- async function fetchChains() {
42
- const now = Date.now();
43
- if (chainsCache && now - chainsFetchedAt < CACHE_DURATION_MS) {
44
- return chainsCache;
45
- }
46
- if (inflight) {
47
- return inflight;
48
- }
49
- inflight = (async () => {
50
- const data = (await handleFetch(CHAINS_JSON_URL));
51
- if (!Array.isArray(data)) {
52
- throw new Error('chains.json: unexpected shape');
53
- }
54
- // Minimal validation; keep what we need
55
- const parsed = data
56
- .filter((x) => x && typeof x === 'object')
57
- .map((x) => {
58
- const nativeCurrency = x.nativeCurrency;
59
- return {
60
- chainId: Number(x.chainId),
61
- name: x.name,
62
- nativeCurrency,
63
- };
64
- })
65
- .filter((x) => Number.isFinite(x.chainId));
66
- chainsCache = parsed;
67
- chainsFetchedAt = now;
68
- inflight = null; // clear in-flight marker
69
- return parsed;
70
- })();
71
- try {
72
- return await inflight;
73
- }
74
- catch (e) {
75
- inflight = null;
76
- throw e;
77
- }
78
- }
79
- /**
80
- * Resolve SLIP-44 coinType for a given chainId (EVM only).
81
- *
82
- * @param chainId - The chain ID to resolve.
83
- * @returns The SLIP-44 coin type as a string, or null if not found.
84
- */
85
- export async function getSlip44ByChainId(chainId) {
86
- try {
87
- // 1) Lookup by native symbol from chains.json
88
- const chains = await fetchChains();
89
- const chain = chains.find((c) => c.chainId === chainId);
90
- const symbol = chain?.nativeCurrency?.symbol?.toUpperCase();
91
- if (symbol) {
92
- // Exact symbol match from slip44 dataset
93
- const coinType = SLIP44_BY_SYMBOL[symbol] ?? COMMON_SYMBOL_DEFAULTS[symbol];
94
- if (coinType !== undefined) {
95
- return String(coinType);
96
- }
97
- }
98
- // 2) Heuristic for ETH-based L2s: default to ETH coin type
99
- // Many L2s (Arbitrum, Optimism, Base, Linea, Scroll, zkSync, etc.) use ETH as native
100
- return '60';
101
- }
102
- catch (err) {
103
- // Prefer null for ergonomics (callers can fallback silently)
104
- console.error(`getSlip44ByChainId(${chainId}) failed:`, err);
105
- return null;
106
- }
107
- }
108
- /**
109
- * Convenience: native CAIP-19 for an EVM chain.
110
- *
111
- * @param chainId - The chain ID to generate CAIP-19 for.
112
- * @returns The CAIP-19 asset type string, or null if not found.
113
- */
114
- export async function getNativeCaip19(chainId) {
115
- const coinType = await getSlip44ByChainId(chainId);
116
- return coinType
117
- ? toCaipAssetType('eip155', String(chainId), 'slip44', coinType)
118
- : null;
119
- }
120
- //# sourceMappingURL=ChainService.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChainService.mjs","sourceRoot":"","sources":["../src/ChainService.ts"],"names":[],"mappings":"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","sourcesContent":["import { handleFetch } from '@metamask/controller-utils';\n// @ts-expect-error - JSON imports need resolveJsonModule\nimport slip44 from '@metamask/slip44/slip44.json';\nimport { toCaipAssetType } from '@metamask/utils';\n\n/** ---- Types ---- */\ntype ChainsJsonItem = {\n chainId: number;\n name: string;\n nativeCurrency?: { symbol?: string; name?: string; decimals?: number };\n};\n\ntype Slip44Entry = {\n index: number; // the coin type (e.g., 60)\n symbol?: string; // e.g., 'ETH', 'BNB'\n name?: string; // e.g., 'Ethereum'\n};\n\n/** ---- Constants / Cache ---- */\nconst CHAINS_JSON_URL = 'https://chainid.network/chains.json';\nconst CACHE_DURATION_MS = 30 * 60 * 1000; // 30 min\n\nlet chainsCache: ChainsJsonItem[] | null = null;\nlet chainsFetchedAt = 0;\nlet inflight: Promise<ChainsJsonItem[]> | null = null;\n\n/** Build a quick symbol -> coinType map from slip44 dataset */\nconst SLIP44_BY_SYMBOL: Record<string, number> = (() => {\n const map: Record<string, number> = {};\n (slip44 as Slip44Entry[]).forEach((e) => {\n const sym = e.symbol?.toUpperCase();\n if (sym && typeof e.index === 'number' && !(sym in map)) {\n map[sym] = e.index;\n }\n });\n return map;\n})();\n\n/** Fallbacks for common native symbols */\nconst COMMON_SYMBOL_DEFAULTS: Record<string, number> = {\n SOL: 501,\n BTC: 0,\n ETH: 60,\n POL: 966,\n MATIC: 966,\n BNB: 714,\n AVAX: 9000,\n SEI: 19000118,\n MON: 268435779,\n FTM: 1007,\n XDAI: 700,\n};\n\n/**\n * Fetch with cache + in-flight dedupe.\n *\n * @returns The chains JSON data.\n */\nasync function fetchChains(): Promise<ChainsJsonItem[]> {\n const now = Date.now();\n if (chainsCache && now - chainsFetchedAt < CACHE_DURATION_MS) {\n return chainsCache;\n }\n if (inflight) {\n return inflight;\n }\n\n inflight = (async () => {\n const data = (await handleFetch(CHAINS_JSON_URL)) as unknown;\n if (!Array.isArray(data)) {\n throw new Error('chains.json: unexpected shape');\n }\n // Minimal validation; keep what we need\n const parsed = data\n .filter((x) => x && typeof x === 'object')\n .map((x: Record<string, unknown>): ChainsJsonItem => {\n const nativeCurrency = x.nativeCurrency as\n | { symbol?: string; name?: string; decimals?: number }\n | undefined;\n return {\n chainId: Number(x.chainId),\n name: x.name as string,\n nativeCurrency,\n };\n })\n .filter((x) => Number.isFinite(x.chainId));\n\n chainsCache = parsed;\n chainsFetchedAt = now;\n inflight = null; // clear in-flight marker\n return parsed;\n })();\n\n try {\n return await inflight;\n } catch (e) {\n inflight = null;\n throw e;\n }\n}\n\n/**\n * Resolve SLIP-44 coinType for a given chainId (EVM only).\n *\n * @param chainId - The chain ID to resolve.\n * @returns The SLIP-44 coin type as a string, or null if not found.\n */\nexport async function getSlip44ByChainId(\n chainId: number,\n): Promise<string | null> {\n try {\n // 1) Lookup by native symbol from chains.json\n const chains = await fetchChains();\n const chain = chains.find((c) => c.chainId === chainId);\n const symbol = chain?.nativeCurrency?.symbol?.toUpperCase();\n\n if (symbol) {\n // Exact symbol match from slip44 dataset\n const coinType =\n SLIP44_BY_SYMBOL[symbol] ?? COMMON_SYMBOL_DEFAULTS[symbol];\n if (coinType !== undefined) {\n return String(coinType);\n }\n }\n\n // 2) Heuristic for ETH-based L2s: default to ETH coin type\n // Many L2s (Arbitrum, Optimism, Base, Linea, Scroll, zkSync, etc.) use ETH as native\n return '60';\n } catch (err) {\n // Prefer null for ergonomics (callers can fallback silently)\n console.error(`getSlip44ByChainId(${chainId}) failed:`, err);\n return null;\n }\n}\n\n/**\n * Convenience: native CAIP-19 for an EVM chain.\n *\n * @param chainId - The chain ID to generate CAIP-19 for.\n * @returns The CAIP-19 asset type string, or null if not found.\n */\nexport async function getNativeCaip19(chainId: number): Promise<string | null> {\n const coinType = await getSlip44ByChainId(chainId);\n return coinType\n ? toCaipAssetType('eip155', String(chainId), 'slip44', coinType)\n : null;\n}\n"]}