@metamask/client-utils 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +6 -0
  3. package/LICENSE.APACHE2 +201 -0
  4. package/LICENSE.MIT +21 -0
  5. package/README.md +15 -0
  6. package/dist/index.cjs +10 -0
  7. package/dist/index.cjs.map +1 -0
  8. package/dist/index.d.cts +5 -0
  9. package/dist/index.d.cts.map +1 -0
  10. package/dist/index.d.mts +5 -0
  11. package/dist/index.d.mts.map +1 -0
  12. package/dist/index.mjs +4 -0
  13. package/dist/index.mjs.map +1 -0
  14. package/dist/mappers/api-transaction-mapper.cjs +300 -0
  15. package/dist/mappers/api-transaction-mapper.cjs.map +1 -0
  16. package/dist/mappers/api-transaction-mapper.d.cts +15 -0
  17. package/dist/mappers/api-transaction-mapper.d.cts.map +1 -0
  18. package/dist/mappers/api-transaction-mapper.d.mts +15 -0
  19. package/dist/mappers/api-transaction-mapper.d.mts.map +1 -0
  20. package/dist/mappers/api-transaction-mapper.mjs +296 -0
  21. package/dist/mappers/api-transaction-mapper.mjs.map +1 -0
  22. package/dist/mappers/constants.cjs +46 -0
  23. package/dist/mappers/constants.cjs.map +1 -0
  24. package/dist/mappers/constants.d.cts +25 -0
  25. package/dist/mappers/constants.d.cts.map +1 -0
  26. package/dist/mappers/constants.d.mts +25 -0
  27. package/dist/mappers/constants.d.mts.map +1 -0
  28. package/dist/mappers/constants.mjs +43 -0
  29. package/dist/mappers/constants.mjs.map +1 -0
  30. package/dist/mappers/helpers/caip.cjs +100 -0
  31. package/dist/mappers/helpers/caip.cjs.map +1 -0
  32. package/dist/mappers/helpers/caip.d.cts +32 -0
  33. package/dist/mappers/helpers/caip.d.cts.map +1 -0
  34. package/dist/mappers/helpers/caip.d.mts +32 -0
  35. package/dist/mappers/helpers/caip.d.mts.map +1 -0
  36. package/dist/mappers/helpers/caip.mjs +94 -0
  37. package/dist/mappers/helpers/caip.mjs.map +1 -0
  38. package/dist/mappers/helpers/token-metadata.cjs +31 -0
  39. package/dist/mappers/helpers/token-metadata.cjs.map +1 -0
  40. package/dist/mappers/helpers/token-metadata.d.cts +8 -0
  41. package/dist/mappers/helpers/token-metadata.d.cts.map +1 -0
  42. package/dist/mappers/helpers/token-metadata.d.mts +8 -0
  43. package/dist/mappers/helpers/token-metadata.d.mts.map +1 -0
  44. package/dist/mappers/helpers/token-metadata.mjs +31 -0
  45. package/dist/mappers/helpers/token-metadata.mjs.map +1 -0
  46. package/dist/mappers/helpers/transactions.cjs +240 -0
  47. package/dist/mappers/helpers/transactions.cjs.map +1 -0
  48. package/dist/mappers/helpers/transactions.d.cts +59 -0
  49. package/dist/mappers/helpers/transactions.d.cts.map +1 -0
  50. package/dist/mappers/helpers/transactions.d.mts +59 -0
  51. package/dist/mappers/helpers/transactions.d.mts.map +1 -0
  52. package/dist/mappers/helpers/transactions.mjs +228 -0
  53. package/dist/mappers/helpers/transactions.mjs.map +1 -0
  54. package/dist/mappers/keyring-transaction-mapper.cjs +143 -0
  55. package/dist/mappers/keyring-transaction-mapper.cjs.map +1 -0
  56. package/dist/mappers/keyring-transaction-mapper.d.cts +15 -0
  57. package/dist/mappers/keyring-transaction-mapper.d.cts.map +1 -0
  58. package/dist/mappers/keyring-transaction-mapper.d.mts +15 -0
  59. package/dist/mappers/keyring-transaction-mapper.d.mts.map +1 -0
  60. package/dist/mappers/keyring-transaction-mapper.mjs +139 -0
  61. package/dist/mappers/keyring-transaction-mapper.mjs.map +1 -0
  62. package/dist/mappers/local-transaction-mapper.cjs +420 -0
  63. package/dist/mappers/local-transaction-mapper.cjs.map +1 -0
  64. package/dist/mappers/local-transaction-mapper.d.cts +20 -0
  65. package/dist/mappers/local-transaction-mapper.d.cts.map +1 -0
  66. package/dist/mappers/local-transaction-mapper.d.mts +20 -0
  67. package/dist/mappers/local-transaction-mapper.d.mts.map +1 -0
  68. package/dist/mappers/local-transaction-mapper.mjs +416 -0
  69. package/dist/mappers/local-transaction-mapper.mjs.map +1 -0
  70. package/dist/types.cjs +3 -0
  71. package/dist/types.cjs.map +1 -0
  72. package/dist/types.d.cts +73 -0
  73. package/dist/types.d.cts.map +1 -0
  74. package/dist/types.d.mts +73 -0
  75. package/dist/types.d.mts.map +1 -0
  76. package/dist/types.mjs +2 -0
  77. package/dist/types.mjs.map +1 -0
  78. package/package.json +79 -0
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatAddressToAssetId = exports.getNativeAsset = exports.formatChainIdToCaip = void 0;
4
+ const controller_utils_1 = require("@metamask/controller-utils");
5
+ const utils_1 = require("@metamask/utils");
6
+ const constants_1 = require("../constants.cjs");
7
+ const nativeAssetsByCaipChainId = {
8
+ 'eip155:1': { symbol: 'ETH', decimals: 18, slip44: 60 },
9
+ 'eip155:10': { symbol: 'ETH', decimals: 18, slip44: 60 },
10
+ 'eip155:56': { symbol: 'BNB', decimals: 18, slip44: 714 },
11
+ 'eip155:137': { symbol: 'POL', decimals: 18, slip44: 966 },
12
+ 'eip155:324': { symbol: 'ETH', decimals: 18, slip44: 60 },
13
+ 'eip155:1329': { symbol: 'SEI', decimals: 18, slip44: 19000118 },
14
+ 'eip155:8453': { symbol: 'ETH', decimals: 18, slip44: 60 },
15
+ 'eip155:42161': { symbol: 'ETH', decimals: 18, slip44: 60 },
16
+ 'eip155:43114': { symbol: 'AVAX', decimals: 18, slip44: 9005 },
17
+ 'eip155:59144': { symbol: 'ETH', decimals: 18, slip44: 60 },
18
+ };
19
+ /**
20
+ * Normalizes a hex, decimal, numeric, or CAIP chain id to its CAIP-2 form.
21
+ * Only EVM (eip155) chains are normalized here; CAIP ids are returned as-is.
22
+ *
23
+ * @param chainId - Hex (`0x1`), numeric, decimal string, or CAIP chain id.
24
+ * @returns The CAIP-2 chain id, or `undefined` when it can't be normalized.
25
+ */
26
+ function formatChainIdToCaip(chainId) {
27
+ if (typeof chainId === 'number') {
28
+ return `eip155:${chainId}`;
29
+ }
30
+ if (chainId.includes(':')) {
31
+ return chainId;
32
+ }
33
+ if (chainId.startsWith('0x')) {
34
+ const reference = Number.parseInt(chainId, 16);
35
+ return Number.isNaN(reference) ? undefined : `eip155:${reference}`;
36
+ }
37
+ const reference = Number(chainId);
38
+ return Number.isNaN(reference) ? undefined : `eip155:${reference}`;
39
+ }
40
+ exports.formatChainIdToCaip = formatChainIdToCaip;
41
+ /**
42
+ * Looks up the native asset metadata for a chain from the canonical table.
43
+ * Returns `undefined` (never throws) for chains outside the table — callers
44
+ * degrade gracefully, matching the previous bridge-controller behaviour.
45
+ *
46
+ * @param chainId - Hex, numeric, decimal, or CAIP chain id.
47
+ * @returns Native asset symbol/decimals/assetId, or `undefined` if unsupported.
48
+ */
49
+ function getNativeAsset(chainId) {
50
+ const caipChainId = formatChainIdToCaip(chainId);
51
+ if (!caipChainId) {
52
+ return undefined;
53
+ }
54
+ const entry = nativeAssetsByCaipChainId[caipChainId];
55
+ if (!entry) {
56
+ return undefined;
57
+ }
58
+ return {
59
+ symbol: entry.symbol,
60
+ decimals: entry.decimals,
61
+ assetId: `${caipChainId}/slip44:${entry.slip44}`,
62
+ };
63
+ }
64
+ exports.getNativeAsset = getNativeAsset;
65
+ function isNativeAddress(address) {
66
+ const normalized = address.toLowerCase();
67
+ return (normalized === constants_1.nativeTokenAddress ||
68
+ normalized === '0x0' ||
69
+ /^0x0+$/u.test(normalized));
70
+ }
71
+ /**
72
+ * Encodes an EVM token address + chain id into a CAIP-19 asset id.
73
+ *
74
+ * @param address - Hex contract address, native sentinel, or CAIP asset id.
75
+ * @param chainId - CAIP-2 or hex chain id.
76
+ * @returns The CAIP-19 asset id, or `undefined` when it can't be encoded.
77
+ */
78
+ function formatAddressToAssetId(address, chainId) {
79
+ if ((0, utils_1.isCaipAssetType)(address)) {
80
+ return address;
81
+ }
82
+ const caipChainId = chainId ? formatChainIdToCaip(chainId) : undefined;
83
+ if (!caipChainId) {
84
+ return undefined;
85
+ }
86
+ if (isNativeAddress(address)) {
87
+ const nativeAssetId = getNativeAsset(caipChainId)?.assetId;
88
+ if (nativeAssetId) {
89
+ return nativeAssetId;
90
+ }
91
+ }
92
+ const checksummedAddress = (0, controller_utils_1.toChecksumHexAddress)(address);
93
+ if (!(0, utils_1.isStrictHexString)(checksummedAddress)) {
94
+ return undefined;
95
+ }
96
+ const { namespace, reference } = (0, utils_1.parseCaipChainId)(caipChainId);
97
+ return (0, utils_1.toCaipAssetType)(namespace, reference, 'erc20', checksummedAddress);
98
+ }
99
+ exports.formatAddressToAssetId = formatAddressToAssetId;
100
+ //# sourceMappingURL=caip.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caip.cjs","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":";;;AAAA,iEAAkE;AAElE,2CAKyB;AAEzB,gDAAkD;AAclD,MAAM,yBAAyB,GAAqC;IAClE,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IACvD,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IACxD,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;IACzD,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;IAC1D,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IACzD,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;IAChE,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAC1D,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAC3D,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9D,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;CAC5D,CAAC;AAEF;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,OAAwB;IAExB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,UAAU,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAsB,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,SAAS,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,SAAS,EAAE,CAAC;AACrE,CAAC;AAlBD,kDAkBC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC5B,OAAwB;IAExB,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAEjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAErD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,GAAG,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE;KACjD,CAAC;AACJ,CAAC;AApBD,wCAoBC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,CACL,UAAU,KAAK,8BAAkB;QACjC,UAAU,KAAK,KAAK;QACpB,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,sBAAsB,CACpC,OAAqC,EACrC,OAA2B;IAE3B,IAAI,IAAA,uBAAe,EAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAE3D,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,aAA8B,CAAC;QACxC,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAA,uCAAoB,EAAC,OAAO,CAAC,CAAC;IAEzD,IAAI,CAAC,IAAA,yBAAiB,EAAC,kBAAkB,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC;IAE/D,OAAO,IAAA,uBAAe,EAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAC5E,CAAC;AA/BD,wDA+BC","sourcesContent":["import { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils';\nimport {\n isCaipAssetType,\n isStrictHexString,\n parseCaipChainId,\n toCaipAssetType,\n} from '@metamask/utils';\n\nimport { nativeTokenAddress } from '../constants';\n\nexport type NativeAssetMetadata = {\n symbol: string;\n decimals: number;\n assetId: CaipChainId | string;\n};\n\ntype NativeAssetEntry = {\n symbol: string;\n decimals: number;\n slip44: number;\n};\n\nconst nativeAssetsByCaipChainId: Record<string, NativeAssetEntry> = {\n 'eip155:1': { symbol: 'ETH', decimals: 18, slip44: 60 },\n 'eip155:10': { symbol: 'ETH', decimals: 18, slip44: 60 },\n 'eip155:56': { symbol: 'BNB', decimals: 18, slip44: 714 },\n 'eip155:137': { symbol: 'POL', decimals: 18, slip44: 966 },\n 'eip155:324': { symbol: 'ETH', decimals: 18, slip44: 60 },\n 'eip155:1329': { symbol: 'SEI', decimals: 18, slip44: 19000118 },\n 'eip155:8453': { symbol: 'ETH', decimals: 18, slip44: 60 },\n 'eip155:42161': { symbol: 'ETH', decimals: 18, slip44: 60 },\n 'eip155:43114': { symbol: 'AVAX', decimals: 18, slip44: 9005 },\n 'eip155:59144': { symbol: 'ETH', decimals: 18, slip44: 60 },\n};\n\n/**\n * Normalizes a hex, decimal, numeric, or CAIP chain id to its CAIP-2 form.\n * Only EVM (eip155) chains are normalized here; CAIP ids are returned as-is.\n *\n * @param chainId - Hex (`0x1`), numeric, decimal string, or CAIP chain id.\n * @returns The CAIP-2 chain id, or `undefined` when it can't be normalized.\n */\nexport function formatChainIdToCaip(\n chainId: string | number,\n): CaipChainId | undefined {\n if (typeof chainId === 'number') {\n return `eip155:${chainId}`;\n }\n\n if (chainId.includes(':')) {\n return chainId as CaipChainId;\n }\n\n if (chainId.startsWith('0x')) {\n const reference = Number.parseInt(chainId, 16);\n return Number.isNaN(reference) ? undefined : `eip155:${reference}`;\n }\n\n const reference = Number(chainId);\n return Number.isNaN(reference) ? undefined : `eip155:${reference}`;\n}\n\n/**\n * Looks up the native asset metadata for a chain from the canonical table.\n * Returns `undefined` (never throws) for chains outside the table — callers\n * degrade gracefully, matching the previous bridge-controller behaviour.\n *\n * @param chainId - Hex, numeric, decimal, or CAIP chain id.\n * @returns Native asset symbol/decimals/assetId, or `undefined` if unsupported.\n */\nexport function getNativeAsset(\n chainId: string | number,\n): NativeAssetMetadata | undefined {\n const caipChainId = formatChainIdToCaip(chainId);\n\n if (!caipChainId) {\n return undefined;\n }\n\n const entry = nativeAssetsByCaipChainId[caipChainId];\n\n if (!entry) {\n return undefined;\n }\n\n return {\n symbol: entry.symbol,\n decimals: entry.decimals,\n assetId: `${caipChainId}/slip44:${entry.slip44}`,\n };\n}\n\nfunction isNativeAddress(address: string): boolean {\n const normalized = address.toLowerCase();\n return (\n normalized === nativeTokenAddress ||\n normalized === '0x0' ||\n /^0x0+$/u.test(normalized)\n );\n}\n\n/**\n * Encodes an EVM token address + chain id into a CAIP-19 asset id.\n *\n * @param address - Hex contract address, native sentinel, or CAIP asset id.\n * @param chainId - CAIP-2 or hex chain id.\n * @returns The CAIP-19 asset id, or `undefined` when it can't be encoded.\n */\nexport function formatAddressToAssetId(\n address: Hex | CaipAssetType | string,\n chainId?: CaipChainId | Hex,\n): CaipAssetType | undefined {\n if (isCaipAssetType(address)) {\n return address;\n }\n\n const caipChainId = chainId ? formatChainIdToCaip(chainId) : undefined;\n\n if (!caipChainId) {\n return undefined;\n }\n\n if (isNativeAddress(address)) {\n const nativeAssetId = getNativeAsset(caipChainId)?.assetId;\n\n if (nativeAssetId) {\n return nativeAssetId as CaipAssetType;\n }\n }\n\n const checksummedAddress = toChecksumHexAddress(address);\n\n if (!isStrictHexString(checksummedAddress)) {\n return undefined;\n }\n\n const { namespace, reference } = parseCaipChainId(caipChainId);\n\n return toCaipAssetType(namespace, reference, 'erc20', checksummedAddress);\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import type { CaipAssetType, CaipChainId, Hex } from "@metamask/utils";
2
+ export type NativeAssetMetadata = {
3
+ symbol: string;
4
+ decimals: number;
5
+ assetId: CaipChainId | string;
6
+ };
7
+ /**
8
+ * Normalizes a hex, decimal, numeric, or CAIP chain id to its CAIP-2 form.
9
+ * Only EVM (eip155) chains are normalized here; CAIP ids are returned as-is.
10
+ *
11
+ * @param chainId - Hex (`0x1`), numeric, decimal string, or CAIP chain id.
12
+ * @returns The CAIP-2 chain id, or `undefined` when it can't be normalized.
13
+ */
14
+ export declare function formatChainIdToCaip(chainId: string | number): CaipChainId | undefined;
15
+ /**
16
+ * Looks up the native asset metadata for a chain from the canonical table.
17
+ * Returns `undefined` (never throws) for chains outside the table — callers
18
+ * degrade gracefully, matching the previous bridge-controller behaviour.
19
+ *
20
+ * @param chainId - Hex, numeric, decimal, or CAIP chain id.
21
+ * @returns Native asset symbol/decimals/assetId, or `undefined` if unsupported.
22
+ */
23
+ export declare function getNativeAsset(chainId: string | number): NativeAssetMetadata | undefined;
24
+ /**
25
+ * Encodes an EVM token address + chain id into a CAIP-19 asset id.
26
+ *
27
+ * @param address - Hex contract address, native sentinel, or CAIP asset id.
28
+ * @param chainId - CAIP-2 or hex chain id.
29
+ * @returns The CAIP-19 asset id, or `undefined` when it can't be encoded.
30
+ */
31
+ export declare function formatAddressToAssetId(address: Hex | CaipAssetType | string, chainId?: CaipChainId | Hex): CaipAssetType | undefined;
32
+ //# sourceMappingURL=caip.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caip.d.cts","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAUvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,WAAW,GAAG,MAAM,CAAC;CAC/B,CAAC;AAqBF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,GAAG,MAAM,GACvB,WAAW,GAAG,SAAS,CAgBzB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,GACvB,mBAAmB,GAAG,SAAS,CAkBjC;AAWD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,GAAG,GAAG,aAAa,GAAG,MAAM,EACrC,OAAO,CAAC,EAAE,WAAW,GAAG,GAAG,GAC1B,aAAa,GAAG,SAAS,CA4B3B"}
@@ -0,0 +1,32 @@
1
+ import type { CaipAssetType, CaipChainId, Hex } from "@metamask/utils";
2
+ export type NativeAssetMetadata = {
3
+ symbol: string;
4
+ decimals: number;
5
+ assetId: CaipChainId | string;
6
+ };
7
+ /**
8
+ * Normalizes a hex, decimal, numeric, or CAIP chain id to its CAIP-2 form.
9
+ * Only EVM (eip155) chains are normalized here; CAIP ids are returned as-is.
10
+ *
11
+ * @param chainId - Hex (`0x1`), numeric, decimal string, or CAIP chain id.
12
+ * @returns The CAIP-2 chain id, or `undefined` when it can't be normalized.
13
+ */
14
+ export declare function formatChainIdToCaip(chainId: string | number): CaipChainId | undefined;
15
+ /**
16
+ * Looks up the native asset metadata for a chain from the canonical table.
17
+ * Returns `undefined` (never throws) for chains outside the table — callers
18
+ * degrade gracefully, matching the previous bridge-controller behaviour.
19
+ *
20
+ * @param chainId - Hex, numeric, decimal, or CAIP chain id.
21
+ * @returns Native asset symbol/decimals/assetId, or `undefined` if unsupported.
22
+ */
23
+ export declare function getNativeAsset(chainId: string | number): NativeAssetMetadata | undefined;
24
+ /**
25
+ * Encodes an EVM token address + chain id into a CAIP-19 asset id.
26
+ *
27
+ * @param address - Hex contract address, native sentinel, or CAIP asset id.
28
+ * @param chainId - CAIP-2 or hex chain id.
29
+ * @returns The CAIP-19 asset id, or `undefined` when it can't be encoded.
30
+ */
31
+ export declare function formatAddressToAssetId(address: Hex | CaipAssetType | string, chainId?: CaipChainId | Hex): CaipAssetType | undefined;
32
+ //# sourceMappingURL=caip.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caip.d.mts","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAUvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,WAAW,GAAG,MAAM,CAAC;CAC/B,CAAC;AAqBF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,GAAG,MAAM,GACvB,WAAW,GAAG,SAAS,CAgBzB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,GACvB,mBAAmB,GAAG,SAAS,CAkBjC;AAWD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,GAAG,GAAG,aAAa,GAAG,MAAM,EACrC,OAAO,CAAC,EAAE,WAAW,GAAG,GAAG,GAC1B,aAAa,GAAG,SAAS,CA4B3B"}
@@ -0,0 +1,94 @@
1
+ import { toChecksumHexAddress } from "@metamask/controller-utils";
2
+ import { isCaipAssetType, isStrictHexString, parseCaipChainId, toCaipAssetType } from "@metamask/utils";
3
+ import { nativeTokenAddress } from "../constants.mjs";
4
+ const nativeAssetsByCaipChainId = {
5
+ 'eip155:1': { symbol: 'ETH', decimals: 18, slip44: 60 },
6
+ 'eip155:10': { symbol: 'ETH', decimals: 18, slip44: 60 },
7
+ 'eip155:56': { symbol: 'BNB', decimals: 18, slip44: 714 },
8
+ 'eip155:137': { symbol: 'POL', decimals: 18, slip44: 966 },
9
+ 'eip155:324': { symbol: 'ETH', decimals: 18, slip44: 60 },
10
+ 'eip155:1329': { symbol: 'SEI', decimals: 18, slip44: 19000118 },
11
+ 'eip155:8453': { symbol: 'ETH', decimals: 18, slip44: 60 },
12
+ 'eip155:42161': { symbol: 'ETH', decimals: 18, slip44: 60 },
13
+ 'eip155:43114': { symbol: 'AVAX', decimals: 18, slip44: 9005 },
14
+ 'eip155:59144': { symbol: 'ETH', decimals: 18, slip44: 60 },
15
+ };
16
+ /**
17
+ * Normalizes a hex, decimal, numeric, or CAIP chain id to its CAIP-2 form.
18
+ * Only EVM (eip155) chains are normalized here; CAIP ids are returned as-is.
19
+ *
20
+ * @param chainId - Hex (`0x1`), numeric, decimal string, or CAIP chain id.
21
+ * @returns The CAIP-2 chain id, or `undefined` when it can't be normalized.
22
+ */
23
+ export function formatChainIdToCaip(chainId) {
24
+ if (typeof chainId === 'number') {
25
+ return `eip155:${chainId}`;
26
+ }
27
+ if (chainId.includes(':')) {
28
+ return chainId;
29
+ }
30
+ if (chainId.startsWith('0x')) {
31
+ const reference = Number.parseInt(chainId, 16);
32
+ return Number.isNaN(reference) ? undefined : `eip155:${reference}`;
33
+ }
34
+ const reference = Number(chainId);
35
+ return Number.isNaN(reference) ? undefined : `eip155:${reference}`;
36
+ }
37
+ /**
38
+ * Looks up the native asset metadata for a chain from the canonical table.
39
+ * Returns `undefined` (never throws) for chains outside the table — callers
40
+ * degrade gracefully, matching the previous bridge-controller behaviour.
41
+ *
42
+ * @param chainId - Hex, numeric, decimal, or CAIP chain id.
43
+ * @returns Native asset symbol/decimals/assetId, or `undefined` if unsupported.
44
+ */
45
+ export function getNativeAsset(chainId) {
46
+ const caipChainId = formatChainIdToCaip(chainId);
47
+ if (!caipChainId) {
48
+ return undefined;
49
+ }
50
+ const entry = nativeAssetsByCaipChainId[caipChainId];
51
+ if (!entry) {
52
+ return undefined;
53
+ }
54
+ return {
55
+ symbol: entry.symbol,
56
+ decimals: entry.decimals,
57
+ assetId: `${caipChainId}/slip44:${entry.slip44}`,
58
+ };
59
+ }
60
+ function isNativeAddress(address) {
61
+ const normalized = address.toLowerCase();
62
+ return (normalized === nativeTokenAddress ||
63
+ normalized === '0x0' ||
64
+ /^0x0+$/u.test(normalized));
65
+ }
66
+ /**
67
+ * Encodes an EVM token address + chain id into a CAIP-19 asset id.
68
+ *
69
+ * @param address - Hex contract address, native sentinel, or CAIP asset id.
70
+ * @param chainId - CAIP-2 or hex chain id.
71
+ * @returns The CAIP-19 asset id, or `undefined` when it can't be encoded.
72
+ */
73
+ export function formatAddressToAssetId(address, chainId) {
74
+ if (isCaipAssetType(address)) {
75
+ return address;
76
+ }
77
+ const caipChainId = chainId ? formatChainIdToCaip(chainId) : undefined;
78
+ if (!caipChainId) {
79
+ return undefined;
80
+ }
81
+ if (isNativeAddress(address)) {
82
+ const nativeAssetId = getNativeAsset(caipChainId)?.assetId;
83
+ if (nativeAssetId) {
84
+ return nativeAssetId;
85
+ }
86
+ }
87
+ const checksummedAddress = toChecksumHexAddress(address);
88
+ if (!isStrictHexString(checksummedAddress)) {
89
+ return undefined;
90
+ }
91
+ const { namespace, reference } = parseCaipChainId(caipChainId);
92
+ return toCaipAssetType(namespace, reference, 'erc20', checksummedAddress);
93
+ }
94
+ //# sourceMappingURL=caip.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caip.mjs","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,mCAAmC;AAElE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAChB,wBAAwB;AAEzB,OAAO,EAAE,kBAAkB,EAAE,yBAAqB;AAclD,MAAM,yBAAyB,GAAqC;IAClE,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IACvD,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IACxD,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;IACzD,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;IAC1D,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IACzD,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;IAChE,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAC1D,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAC3D,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9D,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;CAC5D,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAwB;IAExB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,UAAU,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAsB,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,SAAS,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,SAAS,EAAE,CAAC;AACrE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAwB;IAExB,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAEjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAErD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,GAAG,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,CACL,UAAU,KAAK,kBAAkB;QACjC,UAAU,KAAK,KAAK;QACpB,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAqC,EACrC,OAA2B;IAE3B,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAE3D,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,aAA8B,CAAC;QACxC,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAEzD,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE/D,OAAO,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAC5E,CAAC","sourcesContent":["import { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils';\nimport {\n isCaipAssetType,\n isStrictHexString,\n parseCaipChainId,\n toCaipAssetType,\n} from '@metamask/utils';\n\nimport { nativeTokenAddress } from '../constants';\n\nexport type NativeAssetMetadata = {\n symbol: string;\n decimals: number;\n assetId: CaipChainId | string;\n};\n\ntype NativeAssetEntry = {\n symbol: string;\n decimals: number;\n slip44: number;\n};\n\nconst nativeAssetsByCaipChainId: Record<string, NativeAssetEntry> = {\n 'eip155:1': { symbol: 'ETH', decimals: 18, slip44: 60 },\n 'eip155:10': { symbol: 'ETH', decimals: 18, slip44: 60 },\n 'eip155:56': { symbol: 'BNB', decimals: 18, slip44: 714 },\n 'eip155:137': { symbol: 'POL', decimals: 18, slip44: 966 },\n 'eip155:324': { symbol: 'ETH', decimals: 18, slip44: 60 },\n 'eip155:1329': { symbol: 'SEI', decimals: 18, slip44: 19000118 },\n 'eip155:8453': { symbol: 'ETH', decimals: 18, slip44: 60 },\n 'eip155:42161': { symbol: 'ETH', decimals: 18, slip44: 60 },\n 'eip155:43114': { symbol: 'AVAX', decimals: 18, slip44: 9005 },\n 'eip155:59144': { symbol: 'ETH', decimals: 18, slip44: 60 },\n};\n\n/**\n * Normalizes a hex, decimal, numeric, or CAIP chain id to its CAIP-2 form.\n * Only EVM (eip155) chains are normalized here; CAIP ids are returned as-is.\n *\n * @param chainId - Hex (`0x1`), numeric, decimal string, or CAIP chain id.\n * @returns The CAIP-2 chain id, or `undefined` when it can't be normalized.\n */\nexport function formatChainIdToCaip(\n chainId: string | number,\n): CaipChainId | undefined {\n if (typeof chainId === 'number') {\n return `eip155:${chainId}`;\n }\n\n if (chainId.includes(':')) {\n return chainId as CaipChainId;\n }\n\n if (chainId.startsWith('0x')) {\n const reference = Number.parseInt(chainId, 16);\n return Number.isNaN(reference) ? undefined : `eip155:${reference}`;\n }\n\n const reference = Number(chainId);\n return Number.isNaN(reference) ? undefined : `eip155:${reference}`;\n}\n\n/**\n * Looks up the native asset metadata for a chain from the canonical table.\n * Returns `undefined` (never throws) for chains outside the table — callers\n * degrade gracefully, matching the previous bridge-controller behaviour.\n *\n * @param chainId - Hex, numeric, decimal, or CAIP chain id.\n * @returns Native asset symbol/decimals/assetId, or `undefined` if unsupported.\n */\nexport function getNativeAsset(\n chainId: string | number,\n): NativeAssetMetadata | undefined {\n const caipChainId = formatChainIdToCaip(chainId);\n\n if (!caipChainId) {\n return undefined;\n }\n\n const entry = nativeAssetsByCaipChainId[caipChainId];\n\n if (!entry) {\n return undefined;\n }\n\n return {\n symbol: entry.symbol,\n decimals: entry.decimals,\n assetId: `${caipChainId}/slip44:${entry.slip44}`,\n };\n}\n\nfunction isNativeAddress(address: string): boolean {\n const normalized = address.toLowerCase();\n return (\n normalized === nativeTokenAddress ||\n normalized === '0x0' ||\n /^0x0+$/u.test(normalized)\n );\n}\n\n/**\n * Encodes an EVM token address + chain id into a CAIP-19 asset id.\n *\n * @param address - Hex contract address, native sentinel, or CAIP asset id.\n * @param chainId - CAIP-2 or hex chain id.\n * @returns The CAIP-19 asset id, or `undefined` when it can't be encoded.\n */\nexport function formatAddressToAssetId(\n address: Hex | CaipAssetType | string,\n chainId?: CaipChainId | Hex,\n): CaipAssetType | undefined {\n if (isCaipAssetType(address)) {\n return address;\n }\n\n const caipChainId = chainId ? formatChainIdToCaip(chainId) : undefined;\n\n if (!caipChainId) {\n return undefined;\n }\n\n if (isNativeAddress(address)) {\n const nativeAssetId = getNativeAsset(caipChainId)?.assetId;\n\n if (nativeAssetId) {\n return nativeAssetId as CaipAssetType;\n }\n }\n\n const checksummedAddress = toChecksumHexAddress(address);\n\n if (!isStrictHexString(checksummedAddress)) {\n return undefined;\n }\n\n const { namespace, reference } = parseCaipChainId(caipChainId);\n\n return toCaipAssetType(namespace, reference, 'erc20', checksummedAddress);\n}\n"]}
@@ -0,0 +1,31 @@
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.getKnownTokenMetadata = void 0;
7
+ const contract_metadata_1 = __importDefault(require("@metamask/contract-metadata"));
8
+ const controller_utils_1 = require("@metamask/controller-utils");
9
+ const caip_1 = require("./caip.cjs");
10
+ const mainnetTokens = contract_metadata_1.default;
11
+ const mainnetAssetIdPrefix = 'eip155:1/';
12
+ function getKnownTokenMetadata(chainId, contractAddress) {
13
+ if (!contractAddress) {
14
+ return undefined;
15
+ }
16
+ const assetId = (0, caip_1.formatAddressToAssetId)(contractAddress, chainId);
17
+ if (!assetId?.startsWith(mainnetAssetIdPrefix)) {
18
+ return undefined;
19
+ }
20
+ const entry = mainnetTokens[(0, controller_utils_1.toChecksumHexAddress)(contractAddress)];
21
+ if (!entry) {
22
+ return undefined;
23
+ }
24
+ return {
25
+ symbol: entry.symbol,
26
+ decimals: entry.decimals,
27
+ assetId,
28
+ };
29
+ }
30
+ exports.getKnownTokenMetadata = getKnownTokenMetadata;
31
+ //# sourceMappingURL=token-metadata.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metadata.cjs","sourceRoot":"","sources":["../../../src/mappers/helpers/token-metadata.ts"],"names":[],"mappings":";;;;;;AAAA,oFAAsD;AACtD,iEAAkE;AAGlE,qCAAgD;AAehD,MAAM,aAAa,GAAG,2BAAoD,CAAC;AAE3E,MAAM,oBAAoB,GAAG,WAAW,CAAC;AAEzC,SAAgB,qBAAqB,CACnC,OAA0B,EAC1B,eAAwB;IAExB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,6BAAsB,EAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAEjE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,IAAA,uCAAoB,EAAC,eAAe,CAAC,CAAC,CAAC;IAEnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO;KACR,CAAC;AACJ,CAAC;AAzBD,sDAyBC","sourcesContent":["import contractMap from '@metamask/contract-metadata';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { CaipChainId, Hex } from '@metamask/utils';\n\nimport { formatAddressToAssetId } from './caip';\n\nexport type KnownTokenMetadata = {\n symbol?: string;\n decimals?: number;\n assetId?: string;\n};\n\ntype ContractMetadataEntry = {\n name?: string;\n symbol?: string;\n decimals?: number;\n erc20?: boolean;\n};\n\nconst mainnetTokens = contractMap as Record<string, ContractMetadataEntry>;\n\nconst mainnetAssetIdPrefix = 'eip155:1/';\n\nexport function getKnownTokenMetadata(\n chainId: CaipChainId | Hex,\n contractAddress?: string,\n): KnownTokenMetadata | undefined {\n if (!contractAddress) {\n return undefined;\n }\n\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n if (!assetId?.startsWith(mainnetAssetIdPrefix)) {\n return undefined;\n }\n\n const entry = mainnetTokens[toChecksumHexAddress(contractAddress)];\n\n if (!entry) {\n return undefined;\n }\n\n return {\n symbol: entry.symbol,\n decimals: entry.decimals,\n assetId,\n };\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { CaipChainId, Hex } from "@metamask/utils";
2
+ export type KnownTokenMetadata = {
3
+ symbol?: string;
4
+ decimals?: number;
5
+ assetId?: string;
6
+ };
7
+ export declare function getKnownTokenMetadata(chainId: CaipChainId | Hex, contractAddress?: string): KnownTokenMetadata | undefined;
8
+ //# sourceMappingURL=token-metadata.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metadata.d.cts","sourceRoot":"","sources":["../../../src/mappers/helpers/token-metadata.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAIxD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAaF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,GAAG,GAAG,EAC1B,eAAe,CAAC,EAAE,MAAM,GACvB,kBAAkB,GAAG,SAAS,CAsBhC"}
@@ -0,0 +1,8 @@
1
+ import type { CaipChainId, Hex } from "@metamask/utils";
2
+ export type KnownTokenMetadata = {
3
+ symbol?: string;
4
+ decimals?: number;
5
+ assetId?: string;
6
+ };
7
+ export declare function getKnownTokenMetadata(chainId: CaipChainId | Hex, contractAddress?: string): KnownTokenMetadata | undefined;
8
+ //# sourceMappingURL=token-metadata.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metadata.d.mts","sourceRoot":"","sources":["../../../src/mappers/helpers/token-metadata.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAIxD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAaF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,GAAG,GAAG,EAC1B,eAAe,CAAC,EAAE,MAAM,GACvB,kBAAkB,GAAG,SAAS,CAsBhC"}
@@ -0,0 +1,31 @@
1
+ function $importDefault(module) {
2
+ if (module?.__esModule) {
3
+ return module.default;
4
+ }
5
+ return module;
6
+ }
7
+ import $contractMap from "@metamask/contract-metadata";
8
+ const contractMap = $importDefault($contractMap);
9
+ import { toChecksumHexAddress } from "@metamask/controller-utils";
10
+ import { formatAddressToAssetId } from "./caip.mjs";
11
+ const mainnetTokens = contractMap;
12
+ const mainnetAssetIdPrefix = 'eip155:1/';
13
+ export function getKnownTokenMetadata(chainId, contractAddress) {
14
+ if (!contractAddress) {
15
+ return undefined;
16
+ }
17
+ const assetId = formatAddressToAssetId(contractAddress, chainId);
18
+ if (!assetId?.startsWith(mainnetAssetIdPrefix)) {
19
+ return undefined;
20
+ }
21
+ const entry = mainnetTokens[toChecksumHexAddress(contractAddress)];
22
+ if (!entry) {
23
+ return undefined;
24
+ }
25
+ return {
26
+ symbol: entry.symbol,
27
+ decimals: entry.decimals,
28
+ assetId,
29
+ };
30
+ }
31
+ //# sourceMappingURL=token-metadata.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metadata.mjs","sourceRoot":"","sources":["../../../src/mappers/helpers/token-metadata.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,YAAW,oCAAoC;;AACtD,OAAO,EAAE,oBAAoB,EAAE,mCAAmC;AAGlE,OAAO,EAAE,sBAAsB,EAAE,mBAAe;AAehD,MAAM,aAAa,GAAG,WAAoD,CAAC;AAE3E,MAAM,oBAAoB,GAAG,WAAW,CAAC;AAEzC,MAAM,UAAU,qBAAqB,CACnC,OAA0B,EAC1B,eAAwB;IAExB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAEjE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC;IAEnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO;KACR,CAAC;AACJ,CAAC","sourcesContent":["import contractMap from '@metamask/contract-metadata';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { CaipChainId, Hex } from '@metamask/utils';\n\nimport { formatAddressToAssetId } from './caip';\n\nexport type KnownTokenMetadata = {\n symbol?: string;\n decimals?: number;\n assetId?: string;\n};\n\ntype ContractMetadataEntry = {\n name?: string;\n symbol?: string;\n decimals?: number;\n erc20?: boolean;\n};\n\nconst mainnetTokens = contractMap as Record<string, ContractMetadataEntry>;\n\nconst mainnetAssetIdPrefix = 'eip155:1/';\n\nexport function getKnownTokenMetadata(\n chainId: CaipChainId | Hex,\n contractAddress?: string,\n): KnownTokenMetadata | undefined {\n if (!contractAddress) {\n return undefined;\n }\n\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n if (!assetId?.startsWith(mainnetAssetIdPrefix)) {\n return undefined;\n }\n\n const entry = mainnetTokens[toChecksumHexAddress(contractAddress)];\n\n if (!entry) {\n return undefined;\n }\n\n return {\n symbol: entry.symbol,\n decimals: entry.decimals,\n assetId,\n };\n}\n"]}
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withFallbackTokenAssetId = exports.getTokenMetadataFromKnownToken = exports.getTokenAmountFromTransfer = exports.parseValueTransfers = exports.getNftPaymentTransfer = exports.isNftStandard = exports.getLocalTransactionStatus = exports.getLocalTransactionFees = exports.getFees = void 0;
4
+ const controller_utils_1 = require("@metamask/controller-utils");
5
+ const transaction_controller_1 = require("@metamask/transaction-controller");
6
+ const constants_1 = require("../constants.cjs");
7
+ const caip_1 = require("./caip.cjs");
8
+ const token_metadata_1 = require("./token-metadata.cjs");
9
+ const nativeTokenDecimals = 18;
10
+ function toNetworkFeeAmount(gasUsed, gasPrice) {
11
+ if (gasUsed === undefined || gasPrice === undefined) {
12
+ return undefined;
13
+ }
14
+ try {
15
+ return String(BigInt(gasUsed) * BigInt(gasPrice));
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ }
21
+ function buildBaseNetworkFee(amount, chainId) {
22
+ const nativeAsset = (0, caip_1.getNativeAsset)(chainId);
23
+ return {
24
+ type: 'base',
25
+ amount,
26
+ ...(nativeAsset?.decimals === undefined
27
+ ? { decimals: nativeTokenDecimals }
28
+ : { decimals: nativeAsset.decimals }),
29
+ ...(nativeAsset?.symbol ? { symbol: nativeAsset.symbol } : {}),
30
+ ...(nativeAsset?.assetId ? { assetId: nativeAsset.assetId } : {}),
31
+ };
32
+ }
33
+ function getNetworkFee(transaction, chainId) {
34
+ const amount = toNetworkFeeAmount(transaction.gasUsed, transaction.effectiveGasPrice);
35
+ return amount ? buildBaseNetworkFee(amount, chainId) : undefined;
36
+ }
37
+ function getFees(transaction, chainId) {
38
+ const networkFee = getNetworkFee(transaction, chainId);
39
+ return networkFee ? [networkFee] : undefined;
40
+ }
41
+ exports.getFees = getFees;
42
+ function getLocalTransactionFees(transactionGroup) {
43
+ const { primaryTransaction } = transactionGroup;
44
+ const amount = toNetworkFeeAmount(primaryTransaction.txReceipt?.gasUsed, primaryTransaction.txReceipt?.effectiveGasPrice ??
45
+ primaryTransaction.txParams?.gasPrice);
46
+ return amount
47
+ ? [buildBaseNetworkFee(amount, primaryTransaction.chainId)]
48
+ : undefined;
49
+ }
50
+ exports.getLocalTransactionFees = getLocalTransactionFees;
51
+ const inProgressTransactionStatuses = [
52
+ transaction_controller_1.TransactionStatus.unapproved,
53
+ transaction_controller_1.TransactionStatus.approved,
54
+ transaction_controller_1.TransactionStatus.signed,
55
+ transaction_controller_1.TransactionStatus.submitted,
56
+ ];
57
+ const transactionGroupCancelledStatus = 'cancelled';
58
+ const smartTransactionStatus = {
59
+ cancelled: 'cancelled',
60
+ pending: 'pending',
61
+ success: 'success',
62
+ };
63
+ function getTransactionStatusKey(transaction) {
64
+ const { type, status } = transaction;
65
+ const receiptStatus = transaction.txReceipt?.status;
66
+ if (receiptStatus === '0x0') {
67
+ return transaction_controller_1.TransactionStatus.failed;
68
+ }
69
+ if (status === transaction_controller_1.TransactionStatus.confirmed &&
70
+ type === transaction_controller_1.TransactionType.cancel) {
71
+ return transactionGroupCancelledStatus;
72
+ }
73
+ return transaction.status;
74
+ }
75
+ function getLocalTransactionStatus({ primaryTransaction, initialTransaction, }) {
76
+ if (initialTransaction.isSmartTransaction) {
77
+ const smartStatus = initialTransaction.status;
78
+ if (smartStatus === smartTransactionStatus.pending) {
79
+ return 'pending';
80
+ }
81
+ if (smartStatus === smartTransactionStatus.success) {
82
+ return 'success';
83
+ }
84
+ if (smartStatus === smartTransactionStatus.cancelled) {
85
+ return 'failed';
86
+ }
87
+ return 'pending';
88
+ }
89
+ const statusKey = getTransactionStatusKey(primaryTransaction);
90
+ if (statusKey === transaction_controller_1.TransactionStatus.confirmed) {
91
+ return 'success';
92
+ }
93
+ if (statusKey === transaction_controller_1.TransactionStatus.cancelled ||
94
+ statusKey === transactionGroupCancelledStatus ||
95
+ statusKey === transaction_controller_1.TransactionStatus.dropped ||
96
+ statusKey === transaction_controller_1.TransactionStatus.failed ||
97
+ statusKey === transaction_controller_1.TransactionStatus.rejected) {
98
+ return 'failed';
99
+ }
100
+ if (inProgressTransactionStatuses.includes(statusKey)) {
101
+ return 'pending';
102
+ }
103
+ return 'pending';
104
+ }
105
+ exports.getLocalTransactionStatus = getLocalTransactionStatus;
106
+ function isNftStandard(value) {
107
+ return value === controller_utils_1.ERC721.toLowerCase() || value === controller_utils_1.ERC1155.toLowerCase();
108
+ }
109
+ exports.isNftStandard = isNftStandard;
110
+ function getNftPaymentTransfer({ side, sentTransfer, receivedTransfer, sentNativeTransfer, nftCounterparty, transactionFrom, transactionTo, subjectAddress, }) {
111
+ const isFungible = (transfer) => Boolean(transfer && !isNftStandard(transfer.transferType));
112
+ if (side === 'buy') {
113
+ for (const transfer of [sentNativeTransfer, sentTransfer]) {
114
+ if (!transfer || !isFungible(transfer)) {
115
+ continue;
116
+ }
117
+ // Only count a payment that goes to the NFT counterparty (direct sale) or
118
+ // to the contract being called (marketplace/router). This avoids treating
119
+ // an unrelated native send in the same transaction as the NFT payment.
120
+ if ((0, controller_utils_1.isEqualCaseInsensitive)(transfer.to, nftCounterparty) ||
121
+ (0, controller_utils_1.isEqualCaseInsensitive)(transfer.to, transactionTo)) {
122
+ return transfer;
123
+ }
124
+ }
125
+ return undefined;
126
+ }
127
+ if (!receivedTransfer || !isFungible(receivedTransfer)) {
128
+ return undefined;
129
+ }
130
+ if ((0, controller_utils_1.isEqualCaseInsensitive)(receivedTransfer.from, nftCounterparty) ||
131
+ (transactionFrom &&
132
+ !(0, controller_utils_1.isEqualCaseInsensitive)(transactionFrom, subjectAddress) &&
133
+ (0, controller_utils_1.isEqualCaseInsensitive)(receivedTransfer.from, transactionFrom))) {
134
+ return receivedTransfer;
135
+ }
136
+ return undefined;
137
+ }
138
+ exports.getNftPaymentTransfer = getNftPaymentTransfer;
139
+ const resolveAssetId = (chainId, { contractAddress, transferType, }) => {
140
+ if (contractAddress) {
141
+ return (0, caip_1.formatAddressToAssetId)(contractAddress, chainId);
142
+ }
143
+ if (transferType === 'normal' || transferType === 'internal') {
144
+ return (0, caip_1.formatAddressToAssetId)(constants_1.nativeTokenAddress, chainId);
145
+ }
146
+ return undefined;
147
+ };
148
+ /**
149
+ * Resolves the user's primary send and receive legs from indexed value transfers.
150
+ * Prefers a receive whose symbol differs from the sent leg so dust does not win.
151
+ *
152
+ * @param valueTransfers - Indexed value transfers from the Accounts API.
153
+ * @param subjectAddress - The account address to match transfers against.
154
+ * @returns The primary sent and received transfers for the account.
155
+ */
156
+ function parseValueTransfers(valueTransfers, subjectAddress) {
157
+ const sent = valueTransfers?.filter(({ from }) => (0, controller_utils_1.isEqualCaseInsensitive)(from, subjectAddress));
158
+ const received = valueTransfers?.filter(({ to }) => (0, controller_utils_1.isEqualCaseInsensitive)(to, subjectAddress));
159
+ const sentTransfer = sent?.[0];
160
+ const receivedTransfer = received?.find(({ symbol }) => symbol !== sentTransfer?.symbol) ??
161
+ received?.[0];
162
+ const sentNativeTransfer = sent?.find(({ transferType }) => transferType === 'normal');
163
+ const sentNftTransfer = sent?.find(({ transferType }) => isNftStandard(transferType));
164
+ const receivedNftTransfer = received?.find(({ transferType }) => isNftStandard(transferType));
165
+ return {
166
+ sentTransfer,
167
+ receivedTransfer,
168
+ sentNativeTransfer,
169
+ sentNftTransfer,
170
+ receivedNftTransfer,
171
+ };
172
+ }
173
+ exports.parseValueTransfers = parseValueTransfers;
174
+ function getTokenAmountFromTransfer(transfer, direction, chainId) {
175
+ if (!transfer) {
176
+ return undefined;
177
+ }
178
+ const { transferType, amount } = transfer;
179
+ const isNftTransfer = isNftStandard(transferType);
180
+ const symbol = isNftTransfer
181
+ ? transfer.name || transfer.symbol
182
+ : transfer.symbol;
183
+ if (!symbol && amount === undefined) {
184
+ return undefined;
185
+ }
186
+ const assetId = transfer && !isNftTransfer
187
+ ? resolveAssetId(chainId, {
188
+ contractAddress: transfer.contractAddress,
189
+ transferType: transfer.transferType,
190
+ })
191
+ : undefined;
192
+ const hasTransferAmount = !isNftTransfer && amount !== null && amount !== undefined;
193
+ return {
194
+ direction,
195
+ ...(hasTransferAmount ? { amount: String(amount) } : {}),
196
+ ...(transfer.decimal === undefined ? {} : { decimals: transfer.decimal }),
197
+ ...(symbol ? { symbol } : {}),
198
+ ...(assetId ? { assetId } : {}),
199
+ };
200
+ }
201
+ exports.getTokenAmountFromTransfer = getTokenAmountFromTransfer;
202
+ function getTokenMetadataFromKnownToken(contractAddress, direction, chainId) {
203
+ const tokenMetadata = (0, token_metadata_1.getKnownTokenMetadata)(chainId, contractAddress);
204
+ if (!tokenMetadata) {
205
+ return undefined;
206
+ }
207
+ return {
208
+ direction,
209
+ ...(tokenMetadata.symbol ? { symbol: tokenMetadata.symbol } : {}),
210
+ ...(tokenMetadata.decimals === undefined
211
+ ? {}
212
+ : { decimals: tokenMetadata.decimals }),
213
+ ...(tokenMetadata.assetId ? { assetId: tokenMetadata.assetId } : {}),
214
+ };
215
+ }
216
+ exports.getTokenMetadataFromKnownToken = getTokenMetadataFromKnownToken;
217
+ /**
218
+ * When the transfer omits contractAddress, fall back to the indexed tx `to` field.
219
+ *
220
+ * @param token - Parsed token amount from the value transfer.
221
+ * @param fallbackContractAddress - Indexed transaction `to` address used as ERC-20 fallback.
222
+ * @param transferType - Value transfer type; native (`normal`) transfers skip the fallback.
223
+ * @param chainId - CAIP-2 chain id for asset id encoding.
224
+ * @returns Token amount with `assetId` set when a fallback address applies.
225
+ */
226
+ function withFallbackTokenAssetId(token, fallbackContractAddress, transferType, chainId) {
227
+ if (!token ||
228
+ token.assetId ||
229
+ transferType === 'normal' ||
230
+ !fallbackContractAddress) {
231
+ return token;
232
+ }
233
+ const assetId = (0, caip_1.formatAddressToAssetId)(fallbackContractAddress, chainId);
234
+ if (!assetId) {
235
+ return token;
236
+ }
237
+ return { ...token, assetId };
238
+ }
239
+ exports.withFallbackTokenAssetId = withFallbackTokenAssetId;
240
+ //# sourceMappingURL=transactions.cjs.map