@metamask-previews/client-utils 1.4.0-preview-5da60b6 → 1.5.0-preview-f48a87ac7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -1
- package/dist/mappers/helpers/caip.cjs +39 -1
- package/dist/mappers/helpers/caip.cjs.map +1 -1
- package/dist/mappers/helpers/caip.d.cts +1 -0
- package/dist/mappers/helpers/caip.d.cts.map +1 -1
- package/dist/mappers/helpers/caip.d.mts +1 -0
- package/dist/mappers/helpers/caip.d.mts.map +1 -1
- package/dist/mappers/helpers/caip.mjs +34 -0
- package/dist/mappers/helpers/caip.mjs.map +1 -1
- package/dist/mappers/helpers/transactions.cjs +39 -7
- package/dist/mappers/helpers/transactions.cjs.map +1 -1
- package/dist/mappers/helpers/transactions.d.cts +3 -1
- package/dist/mappers/helpers/transactions.d.cts.map +1 -1
- package/dist/mappers/helpers/transactions.d.mts +3 -1
- package/dist/mappers/helpers/transactions.d.mts.map +1 -1
- package/dist/mappers/helpers/transactions.mjs +40 -8
- package/dist/mappers/helpers/transactions.mjs.map +1 -1
- package/dist/mappers/local-transaction-mapper.cjs +5 -3
- package/dist/mappers/local-transaction-mapper.cjs.map +1 -1
- package/dist/mappers/local-transaction-mapper.d.cts.map +1 -1
- package/dist/mappers/local-transaction-mapper.d.mts.map +1 -1
- package/dist/mappers/local-transaction-mapper.mjs +6 -4
- package/dist/mappers/local-transaction-mapper.mjs.map +1 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.5.0]
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Add `@metamask/slip44` dependency for native token symbol lookup ([#9701](https://github.com/MetaMask/core/pull/9701))
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Restore native `assetId` on activity tokens and network fees when a symbol is available, using `@metamask/slip44` symbol lookup instead of the removed chain registry ([#9701](https://github.com/MetaMask/core/pull/9701))
|
|
19
|
+
- Native tokens from indexed value transfers use the transfer symbol
|
|
20
|
+
- Local native tokens and fees include slip44 `assetId` only when a native symbol is already present on the mapped data
|
|
21
|
+
- API network fees derive the symbol from native value transfers when present
|
|
22
|
+
- `assetId` is still omitted when no symbol is available (for example ERC-20-only transactions with no native transfer)
|
|
23
|
+
|
|
10
24
|
## [1.4.0]
|
|
11
25
|
|
|
12
26
|
### Added
|
|
@@ -73,7 +87,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
73
87
|
- Bump `@metamask/transaction-controller` from `^68.2.2` to `^68.3.0` ([#9421](https://github.com/MetaMask/core/pull/9421))
|
|
74
88
|
- Bump `@metamask/keyring-api` from `^23.3.0` to `^23.5.0` ([#9390](https://github.com/MetaMask/core/pull/9390))
|
|
75
89
|
|
|
76
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/client-utils@1.
|
|
90
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/client-utils@1.5.0...HEAD
|
|
91
|
+
[1.5.0]: https://github.com/MetaMask/core/compare/@metamask/client-utils@1.4.0...@metamask/client-utils@1.5.0
|
|
77
92
|
[1.4.0]: https://github.com/MetaMask/core/compare/@metamask/client-utils@1.3.1...@metamask/client-utils@1.4.0
|
|
78
93
|
[1.3.1]: https://github.com/MetaMask/core/compare/@metamask/client-utils@1.3.0...@metamask/client-utils@1.3.1
|
|
79
94
|
[1.3.0]: https://github.com/MetaMask/core/compare/@metamask/client-utils@1.2.1...@metamask/client-utils@1.3.0
|
|
@@ -1,9 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.formatAddressToAssetId = exports.formatChainIdToCaip = void 0;
|
|
6
|
+
exports.formatAddressToAssetId = exports.resolveNativeAssetId = exports.formatChainIdToCaip = void 0;
|
|
4
7
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
8
|
+
// @ts-expect-error: No type definitions for '@metamask/slip44'
|
|
9
|
+
const slip44_1 = __importDefault(require("@metamask/slip44"));
|
|
5
10
|
const utils_1 = require("@metamask/utils");
|
|
6
11
|
const constants_js_1 = require("../constants.cjs");
|
|
12
|
+
const slip44CoinTypeBySymbol = (() => {
|
|
13
|
+
const coinTypeBySymbol = new Map();
|
|
14
|
+
for (const [coinType, entry] of Object.entries(slip44_1.default)) {
|
|
15
|
+
const normalizedSymbol = entry.symbol.toUpperCase();
|
|
16
|
+
if (!coinTypeBySymbol.has(normalizedSymbol)) {
|
|
17
|
+
coinTypeBySymbol.set(normalizedSymbol, coinType);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const maticCoinType = coinTypeBySymbol.get('MATIC');
|
|
21
|
+
if (maticCoinType) {
|
|
22
|
+
coinTypeBySymbol.set('POL', maticCoinType);
|
|
23
|
+
}
|
|
24
|
+
return coinTypeBySymbol;
|
|
25
|
+
})();
|
|
26
|
+
function slip44CoinTypeForSymbol(symbol) {
|
|
27
|
+
return slip44CoinTypeBySymbol.get(symbol.toUpperCase());
|
|
28
|
+
}
|
|
7
29
|
/**
|
|
8
30
|
* Normalizes a hex, decimal, numeric, or CAIP chain id to its CAIP-2 form.
|
|
9
31
|
* Only EVM (eip155) chains are normalized here; CAIP ids are returned as-is.
|
|
@@ -29,6 +51,22 @@ function formatChainIdToCaip(chainId) {
|
|
|
29
51
|
return Number.isNaN(reference) ? undefined : `eip155:${reference}`;
|
|
30
52
|
}
|
|
31
53
|
exports.formatChainIdToCaip = formatChainIdToCaip;
|
|
54
|
+
function resolveNativeAssetId(chainId, symbol) {
|
|
55
|
+
if (chainId === undefined || !symbol) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
const caipChainId = formatChainIdToCaip(chainId);
|
|
59
|
+
if (!caipChainId) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const coinType = slip44CoinTypeForSymbol(symbol);
|
|
63
|
+
if (!coinType) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const { namespace, reference } = (0, utils_1.parseCaipChainId)(caipChainId);
|
|
67
|
+
return (0, utils_1.toCaipAssetType)(namespace, reference, 'slip44', coinType);
|
|
68
|
+
}
|
|
69
|
+
exports.resolveNativeAssetId = resolveNativeAssetId;
|
|
32
70
|
function isNativeAddress(address) {
|
|
33
71
|
const normalized = address.toLowerCase();
|
|
34
72
|
return (normalized === constants_js_1.nativeTokenAddress ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caip.cjs","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"caip.cjs","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"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","sourcesContent":["import { toChecksumHexAddress } from '@metamask/controller-utils';\n// @ts-expect-error: No type definitions for '@metamask/slip44'\nimport slip44 from '@metamask/slip44';\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.js';\n\nconst slip44CoinTypeBySymbol = ((): Map<string, string> => {\n const coinTypeBySymbol = new Map<string, string>();\n\n for (const [coinType, entry] of Object.entries(\n slip44 as Record<string, { symbol: string }>,\n )) {\n const normalizedSymbol = entry.symbol.toUpperCase();\n\n if (!coinTypeBySymbol.has(normalizedSymbol)) {\n coinTypeBySymbol.set(normalizedSymbol, coinType);\n }\n }\n\n const maticCoinType = coinTypeBySymbol.get('MATIC');\n\n if (maticCoinType) {\n coinTypeBySymbol.set('POL', maticCoinType);\n }\n\n return coinTypeBySymbol;\n})();\n\nfunction slip44CoinTypeForSymbol(symbol: string): string | undefined {\n return slip44CoinTypeBySymbol.get(symbol.toUpperCase());\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 if (chainId === '') {\n return undefined;\n }\n\n const reference = Number(chainId);\n return Number.isNaN(reference) ? undefined : `eip155:${reference}`;\n}\n\nexport function resolveNativeAssetId(\n chainId: string | number | undefined,\n symbol: string | undefined,\n): CaipAssetType | undefined {\n if (chainId === undefined || !symbol) {\n return undefined;\n }\n\n const caipChainId = formatChainIdToCaip(chainId);\n\n if (!caipChainId) {\n return undefined;\n }\n\n const coinType = slip44CoinTypeForSymbol(symbol);\n\n if (!coinType) {\n return undefined;\n }\n\n const { namespace, reference } = parseCaipChainId(caipChainId);\n\n return toCaipAssetType(namespace, reference, 'slip44', coinType);\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 return undefined;\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"]}
|
|
@@ -7,6 +7,7 @@ import type { CaipAssetType, CaipChainId, Hex } from "@metamask/utils";
|
|
|
7
7
|
* @returns The CAIP-2 chain id, or `undefined` when it can't be normalized.
|
|
8
8
|
*/
|
|
9
9
|
export declare function formatChainIdToCaip(chainId: string | number): CaipChainId | undefined;
|
|
10
|
+
export declare function resolveNativeAssetId(chainId: string | number | undefined, symbol: string | undefined): CaipAssetType | undefined;
|
|
10
11
|
/**
|
|
11
12
|
* Encodes an EVM token address + chain id into a CAIP-19 asset id.
|
|
12
13
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caip.d.cts","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"caip.d.cts","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAoCvE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,GAAG,MAAM,GACvB,WAAW,GAAG,SAAS,CAoBzB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACpC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,aAAa,GAAG,SAAS,CAoB3B;AAWD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,GAAG,GAAG,aAAa,GAAG,MAAM,EACrC,OAAO,CAAC,EAAE,WAAW,GAAG,GAAG,GAC1B,aAAa,GAAG,SAAS,CAwB3B"}
|
|
@@ -7,6 +7,7 @@ import type { CaipAssetType, CaipChainId, Hex } from "@metamask/utils";
|
|
|
7
7
|
* @returns The CAIP-2 chain id, or `undefined` when it can't be normalized.
|
|
8
8
|
*/
|
|
9
9
|
export declare function formatChainIdToCaip(chainId: string | number): CaipChainId | undefined;
|
|
10
|
+
export declare function resolveNativeAssetId(chainId: string | number | undefined, symbol: string | undefined): CaipAssetType | undefined;
|
|
10
11
|
/**
|
|
11
12
|
* Encodes an EVM token address + chain id into a CAIP-19 asset id.
|
|
12
13
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caip.d.mts","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"caip.d.mts","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAoCvE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,GAAG,MAAM,GACvB,WAAW,GAAG,SAAS,CAoBzB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACpC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,aAAa,GAAG,SAAS,CAoB3B;AAWD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,GAAG,GAAG,aAAa,GAAG,MAAM,EACrC,OAAO,CAAC,EAAE,WAAW,GAAG,GAAG,GAC1B,aAAa,GAAG,SAAS,CAwB3B"}
|
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
import { toChecksumHexAddress } from "@metamask/controller-utils";
|
|
2
|
+
// @ts-expect-error: No type definitions for '@metamask/slip44'
|
|
3
|
+
import slip44 from "@metamask/slip44" with { type: "json" };
|
|
2
4
|
import { isCaipAssetType, isStrictHexString, parseCaipChainId, toCaipAssetType } from "@metamask/utils";
|
|
3
5
|
import { nativeTokenAddress } from "../constants.mjs";
|
|
6
|
+
const slip44CoinTypeBySymbol = (() => {
|
|
7
|
+
const coinTypeBySymbol = new Map();
|
|
8
|
+
for (const [coinType, entry] of Object.entries(slip44)) {
|
|
9
|
+
const normalizedSymbol = entry.symbol.toUpperCase();
|
|
10
|
+
if (!coinTypeBySymbol.has(normalizedSymbol)) {
|
|
11
|
+
coinTypeBySymbol.set(normalizedSymbol, coinType);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const maticCoinType = coinTypeBySymbol.get('MATIC');
|
|
15
|
+
if (maticCoinType) {
|
|
16
|
+
coinTypeBySymbol.set('POL', maticCoinType);
|
|
17
|
+
}
|
|
18
|
+
return coinTypeBySymbol;
|
|
19
|
+
})();
|
|
20
|
+
function slip44CoinTypeForSymbol(symbol) {
|
|
21
|
+
return slip44CoinTypeBySymbol.get(symbol.toUpperCase());
|
|
22
|
+
}
|
|
4
23
|
/**
|
|
5
24
|
* Normalizes a hex, decimal, numeric, or CAIP chain id to its CAIP-2 form.
|
|
6
25
|
* Only EVM (eip155) chains are normalized here; CAIP ids are returned as-is.
|
|
@@ -25,6 +44,21 @@ export function formatChainIdToCaip(chainId) {
|
|
|
25
44
|
const reference = Number(chainId);
|
|
26
45
|
return Number.isNaN(reference) ? undefined : `eip155:${reference}`;
|
|
27
46
|
}
|
|
47
|
+
export function resolveNativeAssetId(chainId, symbol) {
|
|
48
|
+
if (chainId === undefined || !symbol) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
const caipChainId = formatChainIdToCaip(chainId);
|
|
52
|
+
if (!caipChainId) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const coinType = slip44CoinTypeForSymbol(symbol);
|
|
56
|
+
if (!coinType) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const { namespace, reference } = parseCaipChainId(caipChainId);
|
|
60
|
+
return toCaipAssetType(namespace, reference, 'slip44', coinType);
|
|
61
|
+
}
|
|
28
62
|
function isNativeAddress(address) {
|
|
29
63
|
const normalized = address.toLowerCase();
|
|
30
64
|
return (normalized === nativeTokenAddress ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caip.mjs","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,mCAAmC;
|
|
1
|
+
{"version":3,"file":"caip.mjs","sourceRoot":"","sources":["../../../src/mappers/helpers/caip.ts"],"names":[],"mappings":"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","sourcesContent":["import { toChecksumHexAddress } from '@metamask/controller-utils';\n// @ts-expect-error: No type definitions for '@metamask/slip44'\nimport slip44 from '@metamask/slip44';\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.js';\n\nconst slip44CoinTypeBySymbol = ((): Map<string, string> => {\n const coinTypeBySymbol = new Map<string, string>();\n\n for (const [coinType, entry] of Object.entries(\n slip44 as Record<string, { symbol: string }>,\n )) {\n const normalizedSymbol = entry.symbol.toUpperCase();\n\n if (!coinTypeBySymbol.has(normalizedSymbol)) {\n coinTypeBySymbol.set(normalizedSymbol, coinType);\n }\n }\n\n const maticCoinType = coinTypeBySymbol.get('MATIC');\n\n if (maticCoinType) {\n coinTypeBySymbol.set('POL', maticCoinType);\n }\n\n return coinTypeBySymbol;\n})();\n\nfunction slip44CoinTypeForSymbol(symbol: string): string | undefined {\n return slip44CoinTypeBySymbol.get(symbol.toUpperCase());\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 if (chainId === '') {\n return undefined;\n }\n\n const reference = Number(chainId);\n return Number.isNaN(reference) ? undefined : `eip155:${reference}`;\n}\n\nexport function resolveNativeAssetId(\n chainId: string | number | undefined,\n symbol: string | undefined,\n): CaipAssetType | undefined {\n if (chainId === undefined || !symbol) {\n return undefined;\n }\n\n const caipChainId = formatChainIdToCaip(chainId);\n\n if (!caipChainId) {\n return undefined;\n }\n\n const coinType = slip44CoinTypeForSymbol(symbol);\n\n if (!coinType) {\n return undefined;\n }\n\n const { namespace, reference } = parseCaipChainId(caipChainId);\n\n return toCaipAssetType(namespace, reference, 'slip44', coinType);\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 return undefined;\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"]}
|
|
@@ -17,12 +17,15 @@ function toNetworkFeeAmount(gasUsed, gasPrice) {
|
|
|
17
17
|
return undefined;
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
function buildBaseNetworkFee(amount) {
|
|
20
|
+
function buildBaseNetworkFee(amount, chainId, symbol) {
|
|
21
|
+
const assetId = (0, caip_js_1.resolveNativeAssetId)(chainId, symbol);
|
|
21
22
|
return {
|
|
22
23
|
type: 'base',
|
|
23
24
|
amount,
|
|
24
25
|
decimals: nativeTokenDecimals,
|
|
25
26
|
assetType: 'native',
|
|
27
|
+
...(symbol ? { symbol } : {}),
|
|
28
|
+
...(assetId ? { assetId } : {}),
|
|
26
29
|
};
|
|
27
30
|
}
|
|
28
31
|
function getAssetTypeFromTransferType(transferType) {
|
|
@@ -40,9 +43,27 @@ function getAssetTypeFromTransferType(transferType) {
|
|
|
40
43
|
}
|
|
41
44
|
return undefined;
|
|
42
45
|
}
|
|
46
|
+
function getNativeSymbolFromValueTransfers(valueTransfers) {
|
|
47
|
+
for (const transfer of valueTransfers ?? []) {
|
|
48
|
+
const transferType = transfer.transferType?.toLowerCase();
|
|
49
|
+
if ((transferType === 'normal' || transferType === 'internal') &&
|
|
50
|
+
transfer.symbol) {
|
|
51
|
+
return transfer.symbol;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
43
56
|
function getNetworkFee(transaction) {
|
|
57
|
+
const chainId = (0, caip_js_1.formatChainIdToCaip)(transaction.chainId);
|
|
58
|
+
if (!chainId) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
44
61
|
const amount = toNetworkFeeAmount(transaction.gasUsed, transaction.effectiveGasPrice);
|
|
45
|
-
|
|
62
|
+
if (!amount) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
const symbol = getNativeSymbolFromValueTransfers(transaction.valueTransfers);
|
|
66
|
+
return buildBaseNetworkFee(amount, chainId, symbol);
|
|
46
67
|
}
|
|
47
68
|
function getFees(transaction) {
|
|
48
69
|
const networkFee = getNetworkFee(transaction);
|
|
@@ -50,10 +71,17 @@ function getFees(transaction) {
|
|
|
50
71
|
}
|
|
51
72
|
exports.getFees = getFees;
|
|
52
73
|
function getLocalTransactionFees(transactionGroup) {
|
|
53
|
-
const { primaryTransaction } = transactionGroup;
|
|
74
|
+
const { primaryTransaction, nativeAssetSymbol } = transactionGroup;
|
|
75
|
+
const chainId = (0, caip_js_1.formatChainIdToCaip)(primaryTransaction.chainId);
|
|
76
|
+
if (!chainId) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
54
79
|
const amount = toNetworkFeeAmount(primaryTransaction.txReceipt?.gasUsed, primaryTransaction.txReceipt?.effectiveGasPrice ??
|
|
55
80
|
primaryTransaction.txParams?.gasPrice);
|
|
56
|
-
|
|
81
|
+
if (!amount) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
return [buildBaseNetworkFee(amount, chainId, nativeAssetSymbol)];
|
|
57
85
|
}
|
|
58
86
|
exports.getLocalTransactionFees = getLocalTransactionFees;
|
|
59
87
|
const inProgressTransactionStatuses = [
|
|
@@ -188,11 +216,15 @@ function getTokenAmountFromTransfer(transfer, direction, chainId) {
|
|
|
188
216
|
if (!symbol && amount === undefined) {
|
|
189
217
|
return undefined;
|
|
190
218
|
}
|
|
191
|
-
const assetId = transfer && !isNftTransfer
|
|
192
|
-
? resolveAssetId(chainId, transfer.contractAddress)
|
|
193
|
-
: undefined;
|
|
194
219
|
const hasTransferAmount = !isNftTransfer && amount !== null && amount !== undefined;
|
|
195
220
|
const assetType = getAssetTypeFromTransferType(transferType);
|
|
221
|
+
let assetId;
|
|
222
|
+
if (assetType === 'native') {
|
|
223
|
+
assetId = (0, caip_js_1.resolveNativeAssetId)(chainId, symbol);
|
|
224
|
+
}
|
|
225
|
+
else if (transfer && !isNftTransfer) {
|
|
226
|
+
assetId = resolveAssetId(chainId, transfer.contractAddress);
|
|
227
|
+
}
|
|
196
228
|
return {
|
|
197
229
|
direction,
|
|
198
230
|
...(hasTransferAmount ? { amount: String(amount) } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactions.cjs","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ERC721,\n ERC1155,\n isEqualCaseInsensitive as equalsIgnoreCase,\n} from '@metamask/controller-utils';\nimport type { V1TransactionByHashResponse } from '@metamask/core-backend';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n} from '@metamask/transaction-controller';\nimport type { CaipChainId, Hex } from '@metamask/utils';\n\nimport type {\n AssetType,\n Fee,\n Status,\n TokenAmount,\n ValueTransfer,\n} from '../../types.js';\nimport { formatAddressToAssetId } from './caip.js';\nimport { getKnownTokenMetadata } from './token-metadata.js';\n\n// Adds optional `isSmartTransaction` to `TransactionMeta`.\nexport type TransactionGroup = {\n hasCancelled: boolean;\n hasRetried: boolean;\n initialTransaction: TransactionMeta & { isSmartTransaction?: boolean };\n nonce: Hex;\n primaryTransaction: TransactionMeta;\n transactions: TransactionMeta[];\n};\n\nconst nativeTokenDecimals = 18;\n\nfunction toNetworkFeeAmount(\n gasUsed: string | number | undefined,\n gasPrice: string | number | undefined,\n): string | undefined {\n if (gasUsed === undefined || gasPrice === undefined) {\n return undefined;\n }\n\n try {\n return String(BigInt(gasUsed) * BigInt(gasPrice));\n } catch {\n return undefined;\n }\n}\n\nfunction buildBaseNetworkFee(amount: string): Fee {\n return {\n type: 'base',\n amount,\n decimals: nativeTokenDecimals,\n assetType: 'native',\n };\n}\n\nfunction getAssetTypeFromTransferType(\n transferType: string | undefined,\n): AssetType | undefined {\n if (transferType === 'normal' || transferType === 'internal') {\n return 'native';\n }\n\n if (transferType === 'erc20') {\n return 'erc20';\n }\n\n if (transferType === ERC721.toLowerCase() || transferType === 'erc721') {\n return 'erc721';\n }\n\n if (transferType === ERC1155.toLowerCase() || transferType === 'erc1155') {\n return 'erc1155';\n }\n\n return undefined;\n}\n\nfunction getNetworkFee(\n transaction: V1TransactionByHashResponse,\n): Fee | undefined {\n const amount = toNetworkFeeAmount(\n transaction.gasUsed,\n transaction.effectiveGasPrice,\n );\n\n return amount ? buildBaseNetworkFee(amount) : undefined;\n}\n\nexport function getFees(\n transaction: V1TransactionByHashResponse,\n): Fee[] | undefined {\n const networkFee = getNetworkFee(transaction);\n\n return networkFee ? [networkFee] : undefined;\n}\n\nexport function getLocalTransactionFees(\n transactionGroup: Pick<TransactionGroup, 'primaryTransaction'>,\n): Fee[] | undefined {\n const { primaryTransaction } = transactionGroup;\n const amount = toNetworkFeeAmount(\n primaryTransaction.txReceipt?.gasUsed,\n primaryTransaction.txReceipt?.effectiveGasPrice ??\n primaryTransaction.txParams?.gasPrice,\n );\n\n return amount ? [buildBaseNetworkFee(amount)] : undefined;\n}\n\nconst inProgressTransactionStatuses = [\n TransactionStatus.unapproved,\n TransactionStatus.approved,\n TransactionStatus.signed,\n TransactionStatus.submitted,\n];\n\nconst transactionGroupCancelledStatus = 'cancelled';\n\nconst smartTransactionStatus = {\n cancelled: 'cancelled',\n pending: 'pending',\n success: 'success',\n} as const;\n\nfunction getTransactionStatusKey(\n transaction: TransactionGroup['primaryTransaction'],\n): string {\n const { type, status } = transaction;\n const receiptStatus = transaction.txReceipt?.status;\n\n if (receiptStatus === '0x0') {\n return TransactionStatus.failed;\n }\n\n if (\n status === TransactionStatus.confirmed &&\n type === TransactionType.cancel\n ) {\n return transactionGroupCancelledStatus;\n }\n\n return transaction.status;\n}\n\nexport function getLocalTransactionStatus({\n primaryTransaction,\n initialTransaction,\n}: {\n primaryTransaction: TransactionGroup['primaryTransaction'];\n initialTransaction: TransactionGroup['initialTransaction'];\n}): Status {\n if (initialTransaction.isSmartTransaction) {\n const smartStatus = initialTransaction.status as string | undefined;\n\n if (smartStatus === smartTransactionStatus.pending) {\n return 'pending';\n }\n\n if (smartStatus === smartTransactionStatus.success) {\n return 'success';\n }\n\n if (smartStatus === smartTransactionStatus.cancelled) {\n return 'failed';\n }\n\n return 'pending';\n }\n\n const statusKey = getTransactionStatusKey(primaryTransaction);\n\n if (statusKey === TransactionStatus.confirmed) {\n return 'success';\n }\n\n if (\n statusKey === TransactionStatus.cancelled ||\n statusKey === transactionGroupCancelledStatus ||\n statusKey === TransactionStatus.dropped ||\n statusKey === TransactionStatus.failed ||\n statusKey === TransactionStatus.rejected\n ) {\n return 'failed';\n }\n\n if (\n inProgressTransactionStatuses.includes(\n statusKey as (typeof inProgressTransactionStatuses)[number],\n )\n ) {\n return 'pending';\n }\n\n return 'pending';\n}\n\nexport function isNftStandard(value?: string): boolean {\n return value === ERC721.toLowerCase() || value === ERC1155.toLowerCase();\n}\n\nexport function getNftPaymentTransfer({\n side,\n sentTransfer,\n receivedTransfer,\n sentNativeTransfer,\n nftCounterparty,\n transactionFrom,\n transactionTo,\n subjectAddress,\n}: {\n side: 'buy' | 'sell';\n sentTransfer?: ValueTransfer;\n receivedTransfer?: ValueTransfer;\n sentNativeTransfer?: ValueTransfer;\n nftCounterparty: string;\n transactionFrom?: string;\n transactionTo?: string;\n subjectAddress: string;\n}): ValueTransfer | undefined {\n const isFungible = (transfer?: ValueTransfer): boolean =>\n Boolean(transfer && !isNftStandard(transfer.transferType));\n\n if (side === 'buy') {\n for (const transfer of [sentNativeTransfer, sentTransfer]) {\n if (!transfer || !isFungible(transfer)) {\n continue;\n }\n\n // Only count a payment that goes to the NFT counterparty (direct sale) or\n // to the contract being called (marketplace/router). This avoids treating\n // an unrelated native send in the same transaction as the NFT payment.\n if (\n equalsIgnoreCase(transfer.to, nftCounterparty) ||\n equalsIgnoreCase(transfer.to, transactionTo as string)\n ) {\n return transfer;\n }\n }\n\n return undefined;\n }\n\n if (!receivedTransfer || !isFungible(receivedTransfer)) {\n return undefined;\n }\n\n if (\n equalsIgnoreCase(receivedTransfer.from, nftCounterparty) ||\n (transactionFrom &&\n !equalsIgnoreCase(transactionFrom, subjectAddress) &&\n equalsIgnoreCase(receivedTransfer.from, transactionFrom))\n ) {\n return receivedTransfer;\n }\n\n return undefined;\n}\n\nconst resolveAssetId = (\n chainId: CaipChainId,\n contractAddress: string | undefined,\n): string | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n return formatAddressToAssetId(contractAddress, chainId);\n};\n\n/**\n * Resolves the user's primary send and receive legs from indexed value transfers.\n * Prefers a receive whose symbol differs from the sent leg so dust does not win.\n *\n * @param valueTransfers - Indexed value transfers from the Accounts API.\n * @param subjectAddress - The account address to match transfers against.\n * @returns The primary sent and received transfers for the account.\n */\nexport function parseValueTransfers(\n valueTransfers: ValueTransfer[] | undefined,\n subjectAddress: string,\n): {\n sentTransfer: ValueTransfer | undefined;\n receivedTransfer: ValueTransfer | undefined;\n sentNativeTransfer: ValueTransfer | undefined;\n sentNftTransfer: ValueTransfer | undefined;\n receivedNftTransfer: ValueTransfer | undefined;\n} {\n const sent = valueTransfers?.filter(({ from }) =>\n equalsIgnoreCase(from, subjectAddress),\n );\n const received = valueTransfers?.filter(({ to }) =>\n equalsIgnoreCase(to, subjectAddress),\n );\n\n const sentTransfer = sent?.[0];\n\n const receivedTransfer =\n received?.find(({ symbol }) => symbol !== sentTransfer?.symbol) ??\n received?.[0];\n\n const sentNativeTransfer = sent?.find(\n ({ transferType }) => transferType === 'normal',\n );\n\n const sentNftTransfer = sent?.find(({ transferType }) =>\n isNftStandard(transferType),\n );\n const receivedNftTransfer = received?.find(({ transferType }) =>\n isNftStandard(transferType),\n );\n\n return {\n sentTransfer,\n receivedTransfer,\n sentNativeTransfer,\n sentNftTransfer,\n receivedNftTransfer,\n };\n}\n\nexport function getTokenAmountFromTransfer(\n transfer: ValueTransfer | undefined,\n direction: TokenAmount['direction'],\n chainId: CaipChainId,\n): TokenAmount | undefined {\n if (!transfer) {\n return undefined;\n }\n\n const { transferType, amount } = transfer;\n const isNftTransfer = isNftStandard(transferType);\n const symbol = isNftTransfer\n ? transfer.name || transfer.symbol\n : transfer.symbol;\n\n if (!symbol && amount === undefined) {\n return undefined;\n }\n\n const assetId =\n transfer && !isNftTransfer\n ? resolveAssetId(chainId, transfer.contractAddress)\n : undefined;\n\n const hasTransferAmount =\n !isNftTransfer && amount !== null && amount !== undefined;\n const assetType = getAssetTypeFromTransferType(transferType);\n\n return {\n direction,\n ...(hasTransferAmount ? { amount: String(amount) } : {}),\n ...(transfer.decimal === undefined ? {} : { decimals: transfer.decimal }),\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(assetType ? { assetType } : {}),\n };\n}\n\nexport function getTokenMetadataFromKnownToken(\n contractAddress: string | undefined,\n direction: TokenAmount['direction'],\n chainId: CaipChainId,\n): TokenAmount | undefined {\n const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);\n\n if (!tokenMetadata) {\n return undefined;\n }\n\n return {\n direction,\n assetType: 'erc20',\n ...(tokenMetadata.symbol ? { symbol: tokenMetadata.symbol } : {}),\n ...(tokenMetadata.decimals === undefined\n ? {}\n : { decimals: tokenMetadata.decimals }),\n ...(tokenMetadata.assetId ? { assetId: tokenMetadata.assetId } : {}),\n };\n}\n\n/**\n * When the transfer omits contractAddress, fall back to the indexed tx `to` field.\n *\n * @param token - Parsed token amount from the value transfer.\n * @param fallbackContractAddress - Indexed transaction `to` address used as ERC-20 fallback.\n * @param transferType - Value transfer type; native (`normal`) transfers skip the fallback.\n * @param chainId - CAIP-2 chain id for asset id encoding.\n * @returns Token amount with `assetId` set when a fallback address applies.\n */\nexport function withFallbackTokenAssetId(\n token: TokenAmount | undefined,\n fallbackContractAddress: string | undefined,\n transferType: string | undefined,\n chainId: CaipChainId,\n): TokenAmount | undefined {\n if (\n !token ||\n token.assetId ||\n transferType === 'normal' ||\n transferType === 'internal' ||\n !fallbackContractAddress\n ) {\n return token;\n }\n\n const assetId = formatAddressToAssetId(fallbackContractAddress, chainId);\n if (!assetId) {\n return token;\n }\n\n return {\n ...token,\n assetId,\n assetType: token.assetType,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transactions.cjs","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ERC721,\n ERC1155,\n isEqualCaseInsensitive as equalsIgnoreCase,\n} from '@metamask/controller-utils';\nimport type { V1TransactionByHashResponse } from '@metamask/core-backend';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n} from '@metamask/transaction-controller';\nimport type { CaipChainId, Hex } from '@metamask/utils';\n\nimport type {\n AssetType,\n Fee,\n Status,\n TokenAmount,\n ValueTransfer,\n} from '../../types.js';\nimport {\n formatAddressToAssetId,\n formatChainIdToCaip,\n resolveNativeAssetId,\n} from './caip.js';\nimport { getKnownTokenMetadata } from './token-metadata.js';\n\n// Adds optional `isSmartTransaction` to `TransactionMeta`.\nexport type TransactionGroup = {\n hasCancelled: boolean;\n hasRetried: boolean;\n initialTransaction: TransactionMeta & { isSmartTransaction?: boolean };\n nonce: Hex;\n primaryTransaction: TransactionMeta;\n transactions: TransactionMeta[];\n};\n\nconst nativeTokenDecimals = 18;\n\nfunction toNetworkFeeAmount(\n gasUsed: string | number | undefined,\n gasPrice: string | number | undefined,\n): string | undefined {\n if (gasUsed === undefined || gasPrice === undefined) {\n return undefined;\n }\n\n try {\n return String(BigInt(gasUsed) * BigInt(gasPrice));\n } catch {\n return undefined;\n }\n}\n\nfunction buildBaseNetworkFee(\n amount: string,\n chainId: CaipChainId,\n symbol?: string,\n): Fee {\n const assetId = resolveNativeAssetId(chainId, symbol);\n\n return {\n type: 'base',\n amount,\n decimals: nativeTokenDecimals,\n assetType: 'native',\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n };\n}\n\nfunction getAssetTypeFromTransferType(\n transferType: string | undefined,\n): AssetType | undefined {\n if (transferType === 'normal' || transferType === 'internal') {\n return 'native';\n }\n\n if (transferType === 'erc20') {\n return 'erc20';\n }\n\n if (transferType === ERC721.toLowerCase() || transferType === 'erc721') {\n return 'erc721';\n }\n\n if (transferType === ERC1155.toLowerCase() || transferType === 'erc1155') {\n return 'erc1155';\n }\n\n return undefined;\n}\n\nfunction getNativeSymbolFromValueTransfers(\n valueTransfers: V1TransactionByHashResponse['valueTransfers'],\n): string | undefined {\n for (const transfer of valueTransfers ?? []) {\n const transferType = transfer.transferType?.toLowerCase();\n\n if (\n (transferType === 'normal' || transferType === 'internal') &&\n transfer.symbol\n ) {\n return transfer.symbol;\n }\n }\n\n return undefined;\n}\n\nfunction getNetworkFee(\n transaction: V1TransactionByHashResponse,\n): Fee | undefined {\n const chainId = formatChainIdToCaip(transaction.chainId);\n\n if (!chainId) {\n return undefined;\n }\n\n const amount = toNetworkFeeAmount(\n transaction.gasUsed,\n transaction.effectiveGasPrice,\n );\n\n if (!amount) {\n return undefined;\n }\n\n const symbol = getNativeSymbolFromValueTransfers(transaction.valueTransfers);\n\n return buildBaseNetworkFee(amount, chainId, symbol);\n}\n\nexport function getFees(\n transaction: V1TransactionByHashResponse,\n): Fee[] | undefined {\n const networkFee = getNetworkFee(transaction);\n\n return networkFee ? [networkFee] : undefined;\n}\n\nexport function getLocalTransactionFees(\n transactionGroup: Pick<TransactionGroup, 'primaryTransaction'> & {\n nativeAssetSymbol?: string;\n },\n): Fee[] | undefined {\n const { primaryTransaction, nativeAssetSymbol } = transactionGroup;\n const chainId = formatChainIdToCaip(primaryTransaction.chainId);\n\n if (!chainId) {\n return undefined;\n }\n\n const amount = toNetworkFeeAmount(\n primaryTransaction.txReceipt?.gasUsed,\n primaryTransaction.txReceipt?.effectiveGasPrice ??\n primaryTransaction.txParams?.gasPrice,\n );\n\n if (!amount) {\n return undefined;\n }\n\n return [buildBaseNetworkFee(amount, chainId, nativeAssetSymbol)];\n}\n\nconst inProgressTransactionStatuses = [\n TransactionStatus.unapproved,\n TransactionStatus.approved,\n TransactionStatus.signed,\n TransactionStatus.submitted,\n];\n\nconst transactionGroupCancelledStatus = 'cancelled';\n\nconst smartTransactionStatus = {\n cancelled: 'cancelled',\n pending: 'pending',\n success: 'success',\n} as const;\n\nfunction getTransactionStatusKey(\n transaction: TransactionGroup['primaryTransaction'],\n): string {\n const { type, status } = transaction;\n const receiptStatus = transaction.txReceipt?.status;\n\n if (receiptStatus === '0x0') {\n return TransactionStatus.failed;\n }\n\n if (\n status === TransactionStatus.confirmed &&\n type === TransactionType.cancel\n ) {\n return transactionGroupCancelledStatus;\n }\n\n return transaction.status;\n}\n\nexport function getLocalTransactionStatus({\n primaryTransaction,\n initialTransaction,\n}: {\n primaryTransaction: TransactionGroup['primaryTransaction'];\n initialTransaction: TransactionGroup['initialTransaction'];\n}): Status {\n if (initialTransaction.isSmartTransaction) {\n const smartStatus = initialTransaction.status as string | undefined;\n\n if (smartStatus === smartTransactionStatus.pending) {\n return 'pending';\n }\n\n if (smartStatus === smartTransactionStatus.success) {\n return 'success';\n }\n\n if (smartStatus === smartTransactionStatus.cancelled) {\n return 'failed';\n }\n\n return 'pending';\n }\n\n const statusKey = getTransactionStatusKey(primaryTransaction);\n\n if (statusKey === TransactionStatus.confirmed) {\n return 'success';\n }\n\n if (\n statusKey === TransactionStatus.cancelled ||\n statusKey === transactionGroupCancelledStatus ||\n statusKey === TransactionStatus.dropped ||\n statusKey === TransactionStatus.failed ||\n statusKey === TransactionStatus.rejected\n ) {\n return 'failed';\n }\n\n if (\n inProgressTransactionStatuses.includes(\n statusKey as (typeof inProgressTransactionStatuses)[number],\n )\n ) {\n return 'pending';\n }\n\n return 'pending';\n}\n\nexport function isNftStandard(value?: string): boolean {\n return value === ERC721.toLowerCase() || value === ERC1155.toLowerCase();\n}\n\nexport function getNftPaymentTransfer({\n side,\n sentTransfer,\n receivedTransfer,\n sentNativeTransfer,\n nftCounterparty,\n transactionFrom,\n transactionTo,\n subjectAddress,\n}: {\n side: 'buy' | 'sell';\n sentTransfer?: ValueTransfer;\n receivedTransfer?: ValueTransfer;\n sentNativeTransfer?: ValueTransfer;\n nftCounterparty: string;\n transactionFrom?: string;\n transactionTo?: string;\n subjectAddress: string;\n}): ValueTransfer | undefined {\n const isFungible = (transfer?: ValueTransfer): boolean =>\n Boolean(transfer && !isNftStandard(transfer.transferType));\n\n if (side === 'buy') {\n for (const transfer of [sentNativeTransfer, sentTransfer]) {\n if (!transfer || !isFungible(transfer)) {\n continue;\n }\n\n // Only count a payment that goes to the NFT counterparty (direct sale) or\n // to the contract being called (marketplace/router). This avoids treating\n // an unrelated native send in the same transaction as the NFT payment.\n if (\n equalsIgnoreCase(transfer.to, nftCounterparty) ||\n equalsIgnoreCase(transfer.to, transactionTo as string)\n ) {\n return transfer;\n }\n }\n\n return undefined;\n }\n\n if (!receivedTransfer || !isFungible(receivedTransfer)) {\n return undefined;\n }\n\n if (\n equalsIgnoreCase(receivedTransfer.from, nftCounterparty) ||\n (transactionFrom &&\n !equalsIgnoreCase(transactionFrom, subjectAddress) &&\n equalsIgnoreCase(receivedTransfer.from, transactionFrom))\n ) {\n return receivedTransfer;\n }\n\n return undefined;\n}\n\nconst resolveAssetId = (\n chainId: CaipChainId,\n contractAddress: string | undefined,\n): string | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n return formatAddressToAssetId(contractAddress, chainId);\n};\n\n/**\n * Resolves the user's primary send and receive legs from indexed value transfers.\n * Prefers a receive whose symbol differs from the sent leg so dust does not win.\n *\n * @param valueTransfers - Indexed value transfers from the Accounts API.\n * @param subjectAddress - The account address to match transfers against.\n * @returns The primary sent and received transfers for the account.\n */\nexport function parseValueTransfers(\n valueTransfers: ValueTransfer[] | undefined,\n subjectAddress: string,\n): {\n sentTransfer: ValueTransfer | undefined;\n receivedTransfer: ValueTransfer | undefined;\n sentNativeTransfer: ValueTransfer | undefined;\n sentNftTransfer: ValueTransfer | undefined;\n receivedNftTransfer: ValueTransfer | undefined;\n} {\n const sent = valueTransfers?.filter(({ from }) =>\n equalsIgnoreCase(from, subjectAddress),\n );\n const received = valueTransfers?.filter(({ to }) =>\n equalsIgnoreCase(to, subjectAddress),\n );\n\n const sentTransfer = sent?.[0];\n\n const receivedTransfer =\n received?.find(({ symbol }) => symbol !== sentTransfer?.symbol) ??\n received?.[0];\n\n const sentNativeTransfer = sent?.find(\n ({ transferType }) => transferType === 'normal',\n );\n\n const sentNftTransfer = sent?.find(({ transferType }) =>\n isNftStandard(transferType),\n );\n const receivedNftTransfer = received?.find(({ transferType }) =>\n isNftStandard(transferType),\n );\n\n return {\n sentTransfer,\n receivedTransfer,\n sentNativeTransfer,\n sentNftTransfer,\n receivedNftTransfer,\n };\n}\n\nexport function getTokenAmountFromTransfer(\n transfer: ValueTransfer | undefined,\n direction: TokenAmount['direction'],\n chainId: CaipChainId,\n): TokenAmount | undefined {\n if (!transfer) {\n return undefined;\n }\n\n const { transferType, amount } = transfer;\n const isNftTransfer = isNftStandard(transferType);\n const symbol = isNftTransfer\n ? transfer.name || transfer.symbol\n : transfer.symbol;\n\n if (!symbol && amount === undefined) {\n return undefined;\n }\n\n const hasTransferAmount =\n !isNftTransfer && amount !== null && amount !== undefined;\n const assetType = getAssetTypeFromTransferType(transferType);\n\n let assetId: string | undefined;\n if (assetType === 'native') {\n assetId = resolveNativeAssetId(chainId, symbol);\n } else if (transfer && !isNftTransfer) {\n assetId = resolveAssetId(chainId, transfer.contractAddress);\n }\n\n return {\n direction,\n ...(hasTransferAmount ? { amount: String(amount) } : {}),\n ...(transfer.decimal === undefined ? {} : { decimals: transfer.decimal }),\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(assetType ? { assetType } : {}),\n };\n}\n\nexport function getTokenMetadataFromKnownToken(\n contractAddress: string | undefined,\n direction: TokenAmount['direction'],\n chainId: CaipChainId,\n): TokenAmount | undefined {\n const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);\n\n if (!tokenMetadata) {\n return undefined;\n }\n\n return {\n direction,\n assetType: 'erc20',\n ...(tokenMetadata.symbol ? { symbol: tokenMetadata.symbol } : {}),\n ...(tokenMetadata.decimals === undefined\n ? {}\n : { decimals: tokenMetadata.decimals }),\n ...(tokenMetadata.assetId ? { assetId: tokenMetadata.assetId } : {}),\n };\n}\n\n/**\n * When the transfer omits contractAddress, fall back to the indexed tx `to` field.\n *\n * @param token - Parsed token amount from the value transfer.\n * @param fallbackContractAddress - Indexed transaction `to` address used as ERC-20 fallback.\n * @param transferType - Value transfer type; native (`normal`) transfers skip the fallback.\n * @param chainId - CAIP-2 chain id for asset id encoding.\n * @returns Token amount with `assetId` set when a fallback address applies.\n */\nexport function withFallbackTokenAssetId(\n token: TokenAmount | undefined,\n fallbackContractAddress: string | undefined,\n transferType: string | undefined,\n chainId: CaipChainId,\n): TokenAmount | undefined {\n if (\n !token ||\n token.assetId ||\n transferType === 'normal' ||\n transferType === 'internal' ||\n !fallbackContractAddress\n ) {\n return token;\n }\n\n const assetId = formatAddressToAssetId(fallbackContractAddress, chainId);\n if (!assetId) {\n return token;\n }\n\n return {\n ...token,\n assetId,\n assetType: token.assetType,\n };\n}\n"]}
|
|
@@ -13,7 +13,9 @@ export type TransactionGroup = {
|
|
|
13
13
|
transactions: TransactionMeta[];
|
|
14
14
|
};
|
|
15
15
|
export declare function getFees(transaction: V1TransactionByHashResponse): Fee[] | undefined;
|
|
16
|
-
export declare function getLocalTransactionFees(transactionGroup: Pick<TransactionGroup, 'primaryTransaction'>
|
|
16
|
+
export declare function getLocalTransactionFees(transactionGroup: Pick<TransactionGroup, 'primaryTransaction'> & {
|
|
17
|
+
nativeAssetSymbol?: string;
|
|
18
|
+
}): Fee[] | undefined;
|
|
17
19
|
export declare function getLocalTransactionStatus({ primaryTransaction, initialTransaction, }: {
|
|
18
20
|
primaryTransaction: TransactionGroup['primaryTransaction'];
|
|
19
21
|
initialTransaction: TransactionGroup['initialTransaction'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactions.d.cts","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,2BAA2B,EAAE,+BAA+B;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAKxE,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAExD,OAAO,KAAK,EAEV,GAAG,EACH,MAAM,EACN,WAAW,EACX,aAAa,EACd,wBAAuB;
|
|
1
|
+
{"version":3,"file":"transactions.d.cts","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,9 @@ export type TransactionGroup = {
|
|
|
13
13
|
transactions: TransactionMeta[];
|
|
14
14
|
};
|
|
15
15
|
export declare function getFees(transaction: V1TransactionByHashResponse): Fee[] | undefined;
|
|
16
|
-
export declare function getLocalTransactionFees(transactionGroup: Pick<TransactionGroup, 'primaryTransaction'>
|
|
16
|
+
export declare function getLocalTransactionFees(transactionGroup: Pick<TransactionGroup, 'primaryTransaction'> & {
|
|
17
|
+
nativeAssetSymbol?: string;
|
|
18
|
+
}): Fee[] | undefined;
|
|
17
19
|
export declare function getLocalTransactionStatus({ primaryTransaction, initialTransaction, }: {
|
|
18
20
|
primaryTransaction: TransactionGroup['primaryTransaction'];
|
|
19
21
|
initialTransaction: TransactionGroup['initialTransaction'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactions.d.mts","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,2BAA2B,EAAE,+BAA+B;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAKxE,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAExD,OAAO,KAAK,EAEV,GAAG,EACH,MAAM,EACN,WAAW,EACX,aAAa,EACd,wBAAuB;
|
|
1
|
+
{"version":3,"file":"transactions.d.mts","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ERC721, ERC1155, isEqualCaseInsensitive as equalsIgnoreCase } from "@metamask/controller-utils";
|
|
2
2
|
import { TransactionStatus, TransactionType } from "@metamask/transaction-controller";
|
|
3
|
-
import { formatAddressToAssetId } from "./caip.mjs";
|
|
3
|
+
import { formatAddressToAssetId, formatChainIdToCaip, resolveNativeAssetId } from "./caip.mjs";
|
|
4
4
|
import { getKnownTokenMetadata } from "./token-metadata.mjs";
|
|
5
5
|
const nativeTokenDecimals = 18;
|
|
6
6
|
function toNetworkFeeAmount(gasUsed, gasPrice) {
|
|
@@ -14,12 +14,15 @@ function toNetworkFeeAmount(gasUsed, gasPrice) {
|
|
|
14
14
|
return undefined;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
function buildBaseNetworkFee(amount) {
|
|
17
|
+
function buildBaseNetworkFee(amount, chainId, symbol) {
|
|
18
|
+
const assetId = resolveNativeAssetId(chainId, symbol);
|
|
18
19
|
return {
|
|
19
20
|
type: 'base',
|
|
20
21
|
amount,
|
|
21
22
|
decimals: nativeTokenDecimals,
|
|
22
23
|
assetType: 'native',
|
|
24
|
+
...(symbol ? { symbol } : {}),
|
|
25
|
+
...(assetId ? { assetId } : {}),
|
|
23
26
|
};
|
|
24
27
|
}
|
|
25
28
|
function getAssetTypeFromTransferType(transferType) {
|
|
@@ -37,19 +40,44 @@ function getAssetTypeFromTransferType(transferType) {
|
|
|
37
40
|
}
|
|
38
41
|
return undefined;
|
|
39
42
|
}
|
|
43
|
+
function getNativeSymbolFromValueTransfers(valueTransfers) {
|
|
44
|
+
for (const transfer of valueTransfers ?? []) {
|
|
45
|
+
const transferType = transfer.transferType?.toLowerCase();
|
|
46
|
+
if ((transferType === 'normal' || transferType === 'internal') &&
|
|
47
|
+
transfer.symbol) {
|
|
48
|
+
return transfer.symbol;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
40
53
|
function getNetworkFee(transaction) {
|
|
54
|
+
const chainId = formatChainIdToCaip(transaction.chainId);
|
|
55
|
+
if (!chainId) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
41
58
|
const amount = toNetworkFeeAmount(transaction.gasUsed, transaction.effectiveGasPrice);
|
|
42
|
-
|
|
59
|
+
if (!amount) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const symbol = getNativeSymbolFromValueTransfers(transaction.valueTransfers);
|
|
63
|
+
return buildBaseNetworkFee(amount, chainId, symbol);
|
|
43
64
|
}
|
|
44
65
|
export function getFees(transaction) {
|
|
45
66
|
const networkFee = getNetworkFee(transaction);
|
|
46
67
|
return networkFee ? [networkFee] : undefined;
|
|
47
68
|
}
|
|
48
69
|
export function getLocalTransactionFees(transactionGroup) {
|
|
49
|
-
const { primaryTransaction } = transactionGroup;
|
|
70
|
+
const { primaryTransaction, nativeAssetSymbol } = transactionGroup;
|
|
71
|
+
const chainId = formatChainIdToCaip(primaryTransaction.chainId);
|
|
72
|
+
if (!chainId) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
50
75
|
const amount = toNetworkFeeAmount(primaryTransaction.txReceipt?.gasUsed, primaryTransaction.txReceipt?.effectiveGasPrice ??
|
|
51
76
|
primaryTransaction.txParams?.gasPrice);
|
|
52
|
-
|
|
77
|
+
if (!amount) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
return [buildBaseNetworkFee(amount, chainId, nativeAssetSymbol)];
|
|
53
81
|
}
|
|
54
82
|
const inProgressTransactionStatuses = [
|
|
55
83
|
TransactionStatus.unapproved,
|
|
@@ -179,11 +207,15 @@ export function getTokenAmountFromTransfer(transfer, direction, chainId) {
|
|
|
179
207
|
if (!symbol && amount === undefined) {
|
|
180
208
|
return undefined;
|
|
181
209
|
}
|
|
182
|
-
const assetId = transfer && !isNftTransfer
|
|
183
|
-
? resolveAssetId(chainId, transfer.contractAddress)
|
|
184
|
-
: undefined;
|
|
185
210
|
const hasTransferAmount = !isNftTransfer && amount !== null && amount !== undefined;
|
|
186
211
|
const assetType = getAssetTypeFromTransferType(transferType);
|
|
212
|
+
let assetId;
|
|
213
|
+
if (assetType === 'native') {
|
|
214
|
+
assetId = resolveNativeAssetId(chainId, symbol);
|
|
215
|
+
}
|
|
216
|
+
else if (transfer && !isNftTransfer) {
|
|
217
|
+
assetId = resolveAssetId(chainId, transfer.contractAddress);
|
|
218
|
+
}
|
|
187
219
|
return {
|
|
188
220
|
direction,
|
|
189
221
|
...(hasTransferAmount ? { amount: String(amount) } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactions.mjs","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ERC721,\n ERC1155,\n isEqualCaseInsensitive as equalsIgnoreCase,\n} from '@metamask/controller-utils';\nimport type { V1TransactionByHashResponse } from '@metamask/core-backend';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n} from '@metamask/transaction-controller';\nimport type { CaipChainId, Hex } from '@metamask/utils';\n\nimport type {\n AssetType,\n Fee,\n Status,\n TokenAmount,\n ValueTransfer,\n} from '../../types.js';\nimport { formatAddressToAssetId } from './caip.js';\nimport { getKnownTokenMetadata } from './token-metadata.js';\n\n// Adds optional `isSmartTransaction` to `TransactionMeta`.\nexport type TransactionGroup = {\n hasCancelled: boolean;\n hasRetried: boolean;\n initialTransaction: TransactionMeta & { isSmartTransaction?: boolean };\n nonce: Hex;\n primaryTransaction: TransactionMeta;\n transactions: TransactionMeta[];\n};\n\nconst nativeTokenDecimals = 18;\n\nfunction toNetworkFeeAmount(\n gasUsed: string | number | undefined,\n gasPrice: string | number | undefined,\n): string | undefined {\n if (gasUsed === undefined || gasPrice === undefined) {\n return undefined;\n }\n\n try {\n return String(BigInt(gasUsed) * BigInt(gasPrice));\n } catch {\n return undefined;\n }\n}\n\nfunction buildBaseNetworkFee(amount: string): Fee {\n return {\n type: 'base',\n amount,\n decimals: nativeTokenDecimals,\n assetType: 'native',\n };\n}\n\nfunction getAssetTypeFromTransferType(\n transferType: string | undefined,\n): AssetType | undefined {\n if (transferType === 'normal' || transferType === 'internal') {\n return 'native';\n }\n\n if (transferType === 'erc20') {\n return 'erc20';\n }\n\n if (transferType === ERC721.toLowerCase() || transferType === 'erc721') {\n return 'erc721';\n }\n\n if (transferType === ERC1155.toLowerCase() || transferType === 'erc1155') {\n return 'erc1155';\n }\n\n return undefined;\n}\n\nfunction getNetworkFee(\n transaction: V1TransactionByHashResponse,\n): Fee | undefined {\n const amount = toNetworkFeeAmount(\n transaction.gasUsed,\n transaction.effectiveGasPrice,\n );\n\n return amount ? buildBaseNetworkFee(amount) : undefined;\n}\n\nexport function getFees(\n transaction: V1TransactionByHashResponse,\n): Fee[] | undefined {\n const networkFee = getNetworkFee(transaction);\n\n return networkFee ? [networkFee] : undefined;\n}\n\nexport function getLocalTransactionFees(\n transactionGroup: Pick<TransactionGroup, 'primaryTransaction'>,\n): Fee[] | undefined {\n const { primaryTransaction } = transactionGroup;\n const amount = toNetworkFeeAmount(\n primaryTransaction.txReceipt?.gasUsed,\n primaryTransaction.txReceipt?.effectiveGasPrice ??\n primaryTransaction.txParams?.gasPrice,\n );\n\n return amount ? [buildBaseNetworkFee(amount)] : undefined;\n}\n\nconst inProgressTransactionStatuses = [\n TransactionStatus.unapproved,\n TransactionStatus.approved,\n TransactionStatus.signed,\n TransactionStatus.submitted,\n];\n\nconst transactionGroupCancelledStatus = 'cancelled';\n\nconst smartTransactionStatus = {\n cancelled: 'cancelled',\n pending: 'pending',\n success: 'success',\n} as const;\n\nfunction getTransactionStatusKey(\n transaction: TransactionGroup['primaryTransaction'],\n): string {\n const { type, status } = transaction;\n const receiptStatus = transaction.txReceipt?.status;\n\n if (receiptStatus === '0x0') {\n return TransactionStatus.failed;\n }\n\n if (\n status === TransactionStatus.confirmed &&\n type === TransactionType.cancel\n ) {\n return transactionGroupCancelledStatus;\n }\n\n return transaction.status;\n}\n\nexport function getLocalTransactionStatus({\n primaryTransaction,\n initialTransaction,\n}: {\n primaryTransaction: TransactionGroup['primaryTransaction'];\n initialTransaction: TransactionGroup['initialTransaction'];\n}): Status {\n if (initialTransaction.isSmartTransaction) {\n const smartStatus = initialTransaction.status as string | undefined;\n\n if (smartStatus === smartTransactionStatus.pending) {\n return 'pending';\n }\n\n if (smartStatus === smartTransactionStatus.success) {\n return 'success';\n }\n\n if (smartStatus === smartTransactionStatus.cancelled) {\n return 'failed';\n }\n\n return 'pending';\n }\n\n const statusKey = getTransactionStatusKey(primaryTransaction);\n\n if (statusKey === TransactionStatus.confirmed) {\n return 'success';\n }\n\n if (\n statusKey === TransactionStatus.cancelled ||\n statusKey === transactionGroupCancelledStatus ||\n statusKey === TransactionStatus.dropped ||\n statusKey === TransactionStatus.failed ||\n statusKey === TransactionStatus.rejected\n ) {\n return 'failed';\n }\n\n if (\n inProgressTransactionStatuses.includes(\n statusKey as (typeof inProgressTransactionStatuses)[number],\n )\n ) {\n return 'pending';\n }\n\n return 'pending';\n}\n\nexport function isNftStandard(value?: string): boolean {\n return value === ERC721.toLowerCase() || value === ERC1155.toLowerCase();\n}\n\nexport function getNftPaymentTransfer({\n side,\n sentTransfer,\n receivedTransfer,\n sentNativeTransfer,\n nftCounterparty,\n transactionFrom,\n transactionTo,\n subjectAddress,\n}: {\n side: 'buy' | 'sell';\n sentTransfer?: ValueTransfer;\n receivedTransfer?: ValueTransfer;\n sentNativeTransfer?: ValueTransfer;\n nftCounterparty: string;\n transactionFrom?: string;\n transactionTo?: string;\n subjectAddress: string;\n}): ValueTransfer | undefined {\n const isFungible = (transfer?: ValueTransfer): boolean =>\n Boolean(transfer && !isNftStandard(transfer.transferType));\n\n if (side === 'buy') {\n for (const transfer of [sentNativeTransfer, sentTransfer]) {\n if (!transfer || !isFungible(transfer)) {\n continue;\n }\n\n // Only count a payment that goes to the NFT counterparty (direct sale) or\n // to the contract being called (marketplace/router). This avoids treating\n // an unrelated native send in the same transaction as the NFT payment.\n if (\n equalsIgnoreCase(transfer.to, nftCounterparty) ||\n equalsIgnoreCase(transfer.to, transactionTo as string)\n ) {\n return transfer;\n }\n }\n\n return undefined;\n }\n\n if (!receivedTransfer || !isFungible(receivedTransfer)) {\n return undefined;\n }\n\n if (\n equalsIgnoreCase(receivedTransfer.from, nftCounterparty) ||\n (transactionFrom &&\n !equalsIgnoreCase(transactionFrom, subjectAddress) &&\n equalsIgnoreCase(receivedTransfer.from, transactionFrom))\n ) {\n return receivedTransfer;\n }\n\n return undefined;\n}\n\nconst resolveAssetId = (\n chainId: CaipChainId,\n contractAddress: string | undefined,\n): string | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n return formatAddressToAssetId(contractAddress, chainId);\n};\n\n/**\n * Resolves the user's primary send and receive legs from indexed value transfers.\n * Prefers a receive whose symbol differs from the sent leg so dust does not win.\n *\n * @param valueTransfers - Indexed value transfers from the Accounts API.\n * @param subjectAddress - The account address to match transfers against.\n * @returns The primary sent and received transfers for the account.\n */\nexport function parseValueTransfers(\n valueTransfers: ValueTransfer[] | undefined,\n subjectAddress: string,\n): {\n sentTransfer: ValueTransfer | undefined;\n receivedTransfer: ValueTransfer | undefined;\n sentNativeTransfer: ValueTransfer | undefined;\n sentNftTransfer: ValueTransfer | undefined;\n receivedNftTransfer: ValueTransfer | undefined;\n} {\n const sent = valueTransfers?.filter(({ from }) =>\n equalsIgnoreCase(from, subjectAddress),\n );\n const received = valueTransfers?.filter(({ to }) =>\n equalsIgnoreCase(to, subjectAddress),\n );\n\n const sentTransfer = sent?.[0];\n\n const receivedTransfer =\n received?.find(({ symbol }) => symbol !== sentTransfer?.symbol) ??\n received?.[0];\n\n const sentNativeTransfer = sent?.find(\n ({ transferType }) => transferType === 'normal',\n );\n\n const sentNftTransfer = sent?.find(({ transferType }) =>\n isNftStandard(transferType),\n );\n const receivedNftTransfer = received?.find(({ transferType }) =>\n isNftStandard(transferType),\n );\n\n return {\n sentTransfer,\n receivedTransfer,\n sentNativeTransfer,\n sentNftTransfer,\n receivedNftTransfer,\n };\n}\n\nexport function getTokenAmountFromTransfer(\n transfer: ValueTransfer | undefined,\n direction: TokenAmount['direction'],\n chainId: CaipChainId,\n): TokenAmount | undefined {\n if (!transfer) {\n return undefined;\n }\n\n const { transferType, amount } = transfer;\n const isNftTransfer = isNftStandard(transferType);\n const symbol = isNftTransfer\n ? transfer.name || transfer.symbol\n : transfer.symbol;\n\n if (!symbol && amount === undefined) {\n return undefined;\n }\n\n const assetId =\n transfer && !isNftTransfer\n ? resolveAssetId(chainId, transfer.contractAddress)\n : undefined;\n\n const hasTransferAmount =\n !isNftTransfer && amount !== null && amount !== undefined;\n const assetType = getAssetTypeFromTransferType(transferType);\n\n return {\n direction,\n ...(hasTransferAmount ? { amount: String(amount) } : {}),\n ...(transfer.decimal === undefined ? {} : { decimals: transfer.decimal }),\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(assetType ? { assetType } : {}),\n };\n}\n\nexport function getTokenMetadataFromKnownToken(\n contractAddress: string | undefined,\n direction: TokenAmount['direction'],\n chainId: CaipChainId,\n): TokenAmount | undefined {\n const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);\n\n if (!tokenMetadata) {\n return undefined;\n }\n\n return {\n direction,\n assetType: 'erc20',\n ...(tokenMetadata.symbol ? { symbol: tokenMetadata.symbol } : {}),\n ...(tokenMetadata.decimals === undefined\n ? {}\n : { decimals: tokenMetadata.decimals }),\n ...(tokenMetadata.assetId ? { assetId: tokenMetadata.assetId } : {}),\n };\n}\n\n/**\n * When the transfer omits contractAddress, fall back to the indexed tx `to` field.\n *\n * @param token - Parsed token amount from the value transfer.\n * @param fallbackContractAddress - Indexed transaction `to` address used as ERC-20 fallback.\n * @param transferType - Value transfer type; native (`normal`) transfers skip the fallback.\n * @param chainId - CAIP-2 chain id for asset id encoding.\n * @returns Token amount with `assetId` set when a fallback address applies.\n */\nexport function withFallbackTokenAssetId(\n token: TokenAmount | undefined,\n fallbackContractAddress: string | undefined,\n transferType: string | undefined,\n chainId: CaipChainId,\n): TokenAmount | undefined {\n if (\n !token ||\n token.assetId ||\n transferType === 'normal' ||\n transferType === 'internal' ||\n !fallbackContractAddress\n ) {\n return token;\n }\n\n const assetId = formatAddressToAssetId(fallbackContractAddress, chainId);\n if (!assetId) {\n return token;\n }\n\n return {\n ...token,\n assetId,\n assetType: token.assetType,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transactions.mjs","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ERC721,\n ERC1155,\n isEqualCaseInsensitive as equalsIgnoreCase,\n} from '@metamask/controller-utils';\nimport type { V1TransactionByHashResponse } from '@metamask/core-backend';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n} from '@metamask/transaction-controller';\nimport type { CaipChainId, Hex } from '@metamask/utils';\n\nimport type {\n AssetType,\n Fee,\n Status,\n TokenAmount,\n ValueTransfer,\n} from '../../types.js';\nimport {\n formatAddressToAssetId,\n formatChainIdToCaip,\n resolveNativeAssetId,\n} from './caip.js';\nimport { getKnownTokenMetadata } from './token-metadata.js';\n\n// Adds optional `isSmartTransaction` to `TransactionMeta`.\nexport type TransactionGroup = {\n hasCancelled: boolean;\n hasRetried: boolean;\n initialTransaction: TransactionMeta & { isSmartTransaction?: boolean };\n nonce: Hex;\n primaryTransaction: TransactionMeta;\n transactions: TransactionMeta[];\n};\n\nconst nativeTokenDecimals = 18;\n\nfunction toNetworkFeeAmount(\n gasUsed: string | number | undefined,\n gasPrice: string | number | undefined,\n): string | undefined {\n if (gasUsed === undefined || gasPrice === undefined) {\n return undefined;\n }\n\n try {\n return String(BigInt(gasUsed) * BigInt(gasPrice));\n } catch {\n return undefined;\n }\n}\n\nfunction buildBaseNetworkFee(\n amount: string,\n chainId: CaipChainId,\n symbol?: string,\n): Fee {\n const assetId = resolveNativeAssetId(chainId, symbol);\n\n return {\n type: 'base',\n amount,\n decimals: nativeTokenDecimals,\n assetType: 'native',\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n };\n}\n\nfunction getAssetTypeFromTransferType(\n transferType: string | undefined,\n): AssetType | undefined {\n if (transferType === 'normal' || transferType === 'internal') {\n return 'native';\n }\n\n if (transferType === 'erc20') {\n return 'erc20';\n }\n\n if (transferType === ERC721.toLowerCase() || transferType === 'erc721') {\n return 'erc721';\n }\n\n if (transferType === ERC1155.toLowerCase() || transferType === 'erc1155') {\n return 'erc1155';\n }\n\n return undefined;\n}\n\nfunction getNativeSymbolFromValueTransfers(\n valueTransfers: V1TransactionByHashResponse['valueTransfers'],\n): string | undefined {\n for (const transfer of valueTransfers ?? []) {\n const transferType = transfer.transferType?.toLowerCase();\n\n if (\n (transferType === 'normal' || transferType === 'internal') &&\n transfer.symbol\n ) {\n return transfer.symbol;\n }\n }\n\n return undefined;\n}\n\nfunction getNetworkFee(\n transaction: V1TransactionByHashResponse,\n): Fee | undefined {\n const chainId = formatChainIdToCaip(transaction.chainId);\n\n if (!chainId) {\n return undefined;\n }\n\n const amount = toNetworkFeeAmount(\n transaction.gasUsed,\n transaction.effectiveGasPrice,\n );\n\n if (!amount) {\n return undefined;\n }\n\n const symbol = getNativeSymbolFromValueTransfers(transaction.valueTransfers);\n\n return buildBaseNetworkFee(amount, chainId, symbol);\n}\n\nexport function getFees(\n transaction: V1TransactionByHashResponse,\n): Fee[] | undefined {\n const networkFee = getNetworkFee(transaction);\n\n return networkFee ? [networkFee] : undefined;\n}\n\nexport function getLocalTransactionFees(\n transactionGroup: Pick<TransactionGroup, 'primaryTransaction'> & {\n nativeAssetSymbol?: string;\n },\n): Fee[] | undefined {\n const { primaryTransaction, nativeAssetSymbol } = transactionGroup;\n const chainId = formatChainIdToCaip(primaryTransaction.chainId);\n\n if (!chainId) {\n return undefined;\n }\n\n const amount = toNetworkFeeAmount(\n primaryTransaction.txReceipt?.gasUsed,\n primaryTransaction.txReceipt?.effectiveGasPrice ??\n primaryTransaction.txParams?.gasPrice,\n );\n\n if (!amount) {\n return undefined;\n }\n\n return [buildBaseNetworkFee(amount, chainId, nativeAssetSymbol)];\n}\n\nconst inProgressTransactionStatuses = [\n TransactionStatus.unapproved,\n TransactionStatus.approved,\n TransactionStatus.signed,\n TransactionStatus.submitted,\n];\n\nconst transactionGroupCancelledStatus = 'cancelled';\n\nconst smartTransactionStatus = {\n cancelled: 'cancelled',\n pending: 'pending',\n success: 'success',\n} as const;\n\nfunction getTransactionStatusKey(\n transaction: TransactionGroup['primaryTransaction'],\n): string {\n const { type, status } = transaction;\n const receiptStatus = transaction.txReceipt?.status;\n\n if (receiptStatus === '0x0') {\n return TransactionStatus.failed;\n }\n\n if (\n status === TransactionStatus.confirmed &&\n type === TransactionType.cancel\n ) {\n return transactionGroupCancelledStatus;\n }\n\n return transaction.status;\n}\n\nexport function getLocalTransactionStatus({\n primaryTransaction,\n initialTransaction,\n}: {\n primaryTransaction: TransactionGroup['primaryTransaction'];\n initialTransaction: TransactionGroup['initialTransaction'];\n}): Status {\n if (initialTransaction.isSmartTransaction) {\n const smartStatus = initialTransaction.status as string | undefined;\n\n if (smartStatus === smartTransactionStatus.pending) {\n return 'pending';\n }\n\n if (smartStatus === smartTransactionStatus.success) {\n return 'success';\n }\n\n if (smartStatus === smartTransactionStatus.cancelled) {\n return 'failed';\n }\n\n return 'pending';\n }\n\n const statusKey = getTransactionStatusKey(primaryTransaction);\n\n if (statusKey === TransactionStatus.confirmed) {\n return 'success';\n }\n\n if (\n statusKey === TransactionStatus.cancelled ||\n statusKey === transactionGroupCancelledStatus ||\n statusKey === TransactionStatus.dropped ||\n statusKey === TransactionStatus.failed ||\n statusKey === TransactionStatus.rejected\n ) {\n return 'failed';\n }\n\n if (\n inProgressTransactionStatuses.includes(\n statusKey as (typeof inProgressTransactionStatuses)[number],\n )\n ) {\n return 'pending';\n }\n\n return 'pending';\n}\n\nexport function isNftStandard(value?: string): boolean {\n return value === ERC721.toLowerCase() || value === ERC1155.toLowerCase();\n}\n\nexport function getNftPaymentTransfer({\n side,\n sentTransfer,\n receivedTransfer,\n sentNativeTransfer,\n nftCounterparty,\n transactionFrom,\n transactionTo,\n subjectAddress,\n}: {\n side: 'buy' | 'sell';\n sentTransfer?: ValueTransfer;\n receivedTransfer?: ValueTransfer;\n sentNativeTransfer?: ValueTransfer;\n nftCounterparty: string;\n transactionFrom?: string;\n transactionTo?: string;\n subjectAddress: string;\n}): ValueTransfer | undefined {\n const isFungible = (transfer?: ValueTransfer): boolean =>\n Boolean(transfer && !isNftStandard(transfer.transferType));\n\n if (side === 'buy') {\n for (const transfer of [sentNativeTransfer, sentTransfer]) {\n if (!transfer || !isFungible(transfer)) {\n continue;\n }\n\n // Only count a payment that goes to the NFT counterparty (direct sale) or\n // to the contract being called (marketplace/router). This avoids treating\n // an unrelated native send in the same transaction as the NFT payment.\n if (\n equalsIgnoreCase(transfer.to, nftCounterparty) ||\n equalsIgnoreCase(transfer.to, transactionTo as string)\n ) {\n return transfer;\n }\n }\n\n return undefined;\n }\n\n if (!receivedTransfer || !isFungible(receivedTransfer)) {\n return undefined;\n }\n\n if (\n equalsIgnoreCase(receivedTransfer.from, nftCounterparty) ||\n (transactionFrom &&\n !equalsIgnoreCase(transactionFrom, subjectAddress) &&\n equalsIgnoreCase(receivedTransfer.from, transactionFrom))\n ) {\n return receivedTransfer;\n }\n\n return undefined;\n}\n\nconst resolveAssetId = (\n chainId: CaipChainId,\n contractAddress: string | undefined,\n): string | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n return formatAddressToAssetId(contractAddress, chainId);\n};\n\n/**\n * Resolves the user's primary send and receive legs from indexed value transfers.\n * Prefers a receive whose symbol differs from the sent leg so dust does not win.\n *\n * @param valueTransfers - Indexed value transfers from the Accounts API.\n * @param subjectAddress - The account address to match transfers against.\n * @returns The primary sent and received transfers for the account.\n */\nexport function parseValueTransfers(\n valueTransfers: ValueTransfer[] | undefined,\n subjectAddress: string,\n): {\n sentTransfer: ValueTransfer | undefined;\n receivedTransfer: ValueTransfer | undefined;\n sentNativeTransfer: ValueTransfer | undefined;\n sentNftTransfer: ValueTransfer | undefined;\n receivedNftTransfer: ValueTransfer | undefined;\n} {\n const sent = valueTransfers?.filter(({ from }) =>\n equalsIgnoreCase(from, subjectAddress),\n );\n const received = valueTransfers?.filter(({ to }) =>\n equalsIgnoreCase(to, subjectAddress),\n );\n\n const sentTransfer = sent?.[0];\n\n const receivedTransfer =\n received?.find(({ symbol }) => symbol !== sentTransfer?.symbol) ??\n received?.[0];\n\n const sentNativeTransfer = sent?.find(\n ({ transferType }) => transferType === 'normal',\n );\n\n const sentNftTransfer = sent?.find(({ transferType }) =>\n isNftStandard(transferType),\n );\n const receivedNftTransfer = received?.find(({ transferType }) =>\n isNftStandard(transferType),\n );\n\n return {\n sentTransfer,\n receivedTransfer,\n sentNativeTransfer,\n sentNftTransfer,\n receivedNftTransfer,\n };\n}\n\nexport function getTokenAmountFromTransfer(\n transfer: ValueTransfer | undefined,\n direction: TokenAmount['direction'],\n chainId: CaipChainId,\n): TokenAmount | undefined {\n if (!transfer) {\n return undefined;\n }\n\n const { transferType, amount } = transfer;\n const isNftTransfer = isNftStandard(transferType);\n const symbol = isNftTransfer\n ? transfer.name || transfer.symbol\n : transfer.symbol;\n\n if (!symbol && amount === undefined) {\n return undefined;\n }\n\n const hasTransferAmount =\n !isNftTransfer && amount !== null && amount !== undefined;\n const assetType = getAssetTypeFromTransferType(transferType);\n\n let assetId: string | undefined;\n if (assetType === 'native') {\n assetId = resolveNativeAssetId(chainId, symbol);\n } else if (transfer && !isNftTransfer) {\n assetId = resolveAssetId(chainId, transfer.contractAddress);\n }\n\n return {\n direction,\n ...(hasTransferAmount ? { amount: String(amount) } : {}),\n ...(transfer.decimal === undefined ? {} : { decimals: transfer.decimal }),\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(assetType ? { assetType } : {}),\n };\n}\n\nexport function getTokenMetadataFromKnownToken(\n contractAddress: string | undefined,\n direction: TokenAmount['direction'],\n chainId: CaipChainId,\n): TokenAmount | undefined {\n const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);\n\n if (!tokenMetadata) {\n return undefined;\n }\n\n return {\n direction,\n assetType: 'erc20',\n ...(tokenMetadata.symbol ? { symbol: tokenMetadata.symbol } : {}),\n ...(tokenMetadata.decimals === undefined\n ? {}\n : { decimals: tokenMetadata.decimals }),\n ...(tokenMetadata.assetId ? { assetId: tokenMetadata.assetId } : {}),\n };\n}\n\n/**\n * When the transfer omits contractAddress, fall back to the indexed tx `to` field.\n *\n * @param token - Parsed token amount from the value transfer.\n * @param fallbackContractAddress - Indexed transaction `to` address used as ERC-20 fallback.\n * @param transferType - Value transfer type; native (`normal`) transfers skip the fallback.\n * @param chainId - CAIP-2 chain id for asset id encoding.\n * @returns Token amount with `assetId` set when a fallback address applies.\n */\nexport function withFallbackTokenAssetId(\n token: TokenAmount | undefined,\n fallbackContractAddress: string | undefined,\n transferType: string | undefined,\n chainId: CaipChainId,\n): TokenAmount | undefined {\n if (\n !token ||\n token.assetId ||\n transferType === 'normal' ||\n transferType === 'internal' ||\n !fallbackContractAddress\n ) {\n return token;\n }\n\n const assetId = formatAddressToAssetId(fallbackContractAddress, chainId);\n if (!assetId) {\n return token;\n }\n\n return {\n ...token,\n assetId,\n assetType: token.assetType,\n };\n}\n"]}
|
|
@@ -16,8 +16,10 @@ const evmNativeDecimals = 18;
|
|
|
16
16
|
* @returns The normalized activity item.
|
|
17
17
|
*/
|
|
18
18
|
function mapLocalTransaction(transactionGroup) {
|
|
19
|
-
const fees = transactionGroup.fees ?? (0, transactions_js_1.getLocalTransactionFees)(transactionGroup);
|
|
20
19
|
const { initialTransaction, primaryTransaction } = transactionGroup;
|
|
20
|
+
const chainId = (0, utils_1.toCaipChainId)(utils_1.KnownCaipNamespace.Eip155, Number.parseInt(initialTransaction.chainId, 16).toString());
|
|
21
|
+
const nativeSymbol = transactionGroup.nativeAssetSymbol;
|
|
22
|
+
const fees = transactionGroup.fees ?? (0, transactions_js_1.getLocalTransactionFees)(transactionGroup);
|
|
21
23
|
const { transferInformation, type: transactionType, simulationData, txReceipt, metamaskPay, txParams: { from = '', to = '', data: txData, value: txValue } = {}, } = initialTransaction;
|
|
22
24
|
const { time: primaryTime, hash: primaryHash, id: primaryId, } = primaryTransaction;
|
|
23
25
|
const methodId = txData?.slice(0, 10);
|
|
@@ -29,8 +31,6 @@ function mapLocalTransaction(transactionGroup) {
|
|
|
29
31
|
const tokenContractAddress = isPermit2Approve
|
|
30
32
|
? undefined
|
|
31
33
|
: (transferInformation?.contractAddress ?? (to || undefined));
|
|
32
|
-
const chainId = (0, utils_1.toCaipChainId)(utils_1.KnownCaipNamespace.Eip155, Number.parseInt(initialTransaction.chainId, 16).toString());
|
|
33
|
-
const nativeSymbol = transactionGroup.nativeAssetSymbol;
|
|
34
34
|
const getNativeToken = (transaction, direction) => {
|
|
35
35
|
const rawAmount = transaction.txParams.value;
|
|
36
36
|
let amount;
|
|
@@ -45,12 +45,14 @@ function mapLocalTransaction(transactionGroup) {
|
|
|
45
45
|
if (!amount && nativeSymbol === undefined) {
|
|
46
46
|
return undefined;
|
|
47
47
|
}
|
|
48
|
+
const assetId = (0, caip_js_1.resolveNativeAssetId)(chainId, nativeSymbol);
|
|
48
49
|
return {
|
|
49
50
|
direction,
|
|
50
51
|
assetType: 'native',
|
|
51
52
|
decimals: evmNativeDecimals,
|
|
52
53
|
...(amount ? { amount } : {}),
|
|
53
54
|
...(nativeSymbol === undefined ? {} : { symbol: nativeSymbol }),
|
|
55
|
+
...(assetId ? { assetId } : {}),
|
|
54
56
|
};
|
|
55
57
|
};
|
|
56
58
|
const getContractTokenFromTransaction = ({ contractAddress, direction, transaction, }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transaction-mapper.cjs","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":";;;AAAA,iEAAwF;AACxF,6EAAmE;AACnE,2CAAoE;AAGpE,kDAQwB;AACxB,gDAA2D;AAC3D,oEAAoE;AACpE,gEAImC;AAGnC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;;;GAKG;AACH,SAAgB,mBAAmB,CACjC,gBAOC;IAED,MAAM,IAAI,GACR,gBAAgB,CAAC,IAAI,IAAI,IAAA,yCAAuB,EAAC,gBAAgB,CAAC,CAAC;IACrE,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,CAAC;IACpE,MAAM,EACJ,mBAAmB,EACnB,IAAI,EAAE,eAAe,EACrB,cAAc,EACd,SAAS,EACT,WAAW,EACX,QAAQ,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,GACpE,GAAG,kBAAkB,CAAC;IACvB,MAAM,EACJ,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,SAAS,GACd,GAAG,kBAAkB,CAAC;IACvB,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtC,8EAA8E;IAC9E,6EAA6E;IAC7E,0EAA0E;IAC1E,uBAAuB;IACvB,MAAM,gBAAgB,GAAG,QAAQ,KAAK,qCAAsB,CAAC;IAC7D,MAAM,oBAAoB,GAAG,gBAAgB;QAC3C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,mBAAmB,EAAE,eAAe,IAAI,CAAC,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,IAAA,qBAAa,EAC3B,0BAAkB,CAAC,MAAM,EACzB,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAC3D,CAAC;IACF,MAAM,YAAY,GAAG,gBAAgB,CAAC,iBAAiB,CAAC;IAExD,MAAM,cAAc,GAAG,CACrB,WAAmD,EACnD,SAAmC,EACV,EAAE;QAC3B,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC7C,IAAI,MAA0B,CAAC;QAC/B,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO;YACL,SAAS;YACT,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,iBAAiB;YAC3B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;SAChE,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,+BAA+B,GAAG,CAAC,EACvC,eAAe,EACf,SAAS,EACT,WAAW,GAKZ,EAA2B,EAAE;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GACV,WAAW,CAAC,mBAAmB,EAAE,MAAM;YACvC,gBAAgB,CAAC,qBAAqB,EAAE,MAAM,CAAC;QACjD,MAAM,QAAQ,GACZ,WAAW,CAAC,mBAAmB,EAAE,QAAQ;YACzC,gBAAgB,CAAC,qBAAqB,EAAE,QAAQ,CAAC;QACnD,MAAM,MAAM,GAAG,WAAW,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACvD,MAAM,OAAO,GAAG,IAAA,gCAAsB,EAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAEjE,OAAO;YACL,SAAS;YACT,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,iCAAiC,GAAG,CAAC,EACzC,MAAM,EACN,eAAe,EACf,SAAS,EACT,WAAW,GAMZ,EAA2B,EAAE;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,aAAa,GAAG,IAAA,yCAAqB,EAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAEtE,MAAM,oBAAoB,GAAG,IAAA,yCAAgB,EAC3C,eAAe,EACf,0CAA2B,CACzB,kBAAkB,CAAC,OAAmD,CACvE,IAAI,EAAE,CACR,CAAC;QACF,MAAM,0BAA0B,GAAG,oBAAoB;YACrD,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,QAAQ,GACZ,WAAW,CAAC,mBAAmB,EAAE,MAAM,KAAK,SAAS;YACnD,CAAC,CAAC,CAAC,aAAa,EAAE,QAAQ;gBACxB,gBAAgB,CAAC,qBAAqB,EAAE,QAAQ;gBAChD,0BAA0B,CAAC;YAC7B,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC;QAC/C,MAAM,WAAW,GAAG,WAAW,CAAC,mBAAmB,EAAE,MAAM,IAAI,MAAM,CAAC;QACtE,MAAM,MAAM,GACV,WAAW,CAAC,mBAAmB,EAAE,MAAM;YACvC,aAAa,EAAE,MAAM;YACrB,gBAAgB,CAAC,qBAAqB,EAAE,MAAM,CAAC;QACjD,MAAM,OAAO,GAAG,IAAA,gCAAsB,EAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAEjE,OAAO;YACL,SAAS;YACT,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,MAAM,GACV,gBAAgB,CAAC,cAAc;QAC/B,IAAA,2CAAyB,EAAC;YACxB,kBAAkB;YAClB,kBAAkB;SACnB,CAAC,CAAC;IACL,MAAM,SAAS,GAAG,WAAW,IAAI,kBAAkB,CAAC,IAAI,CAAC;IACzD,MAAM,IAAI,GAAG,WAAW,IAAI,kBAAkB,CAAC,IAAI,IAAI,SAAS,CAAC;IACjE,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAEpD,QAAQ,eAAe,EAAE,CAAC;QACxB,KAAK,wCAAe,CAAC,UAAU,CAAC,CAAC,CAAC;YAChC,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,EAAE;oBACF,KAAK,EAAE,cAAc,CAAC,kBAAkB,EAAE,KAAK,CAAC;iBACjD;aACF,CAAC;QACJ,CAAC;QAED,KAAK,wCAAe,CAAC,IAAI,CAAC;QAC1B,KAAK,wCAAe,CAAC,WAAW,CAAC;QACjC,KAAK,wCAAe,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5B,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,CAAC;YAE3D,OAAO;gBACL,IAAI,EAAE,eAAe,KAAK,wCAAe,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;gBACpE,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,WAAW;oBACX,gBAAgB;oBAChB,IAAI;iBACL;aACF,CAAC;QACJ,CAAC;QAED,KAAK,wCAAe,CAAC,2BAA2B,CAAC;QACjD,KAAK,wCAAe,CAAC,mBAAmB,CAAC;QACzC,KAAK,wCAAe,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAC7C,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,EAAE;oBACF,KAAK,EAAE,+BAA+B,CAAC;wBACrC,WAAW,EAAE,kBAAkB;wBAC/B,SAAS,EAAE,KAAK;wBAChB,eAAe,EAAE,oBAAoB;qBACtC,CAAC;iBACH;aACF,CAAC;QACJ,CAAC;QAED,KAAK,wCAAe,CAAC,cAAc,CAAC;QACpC,KAAK,wCAAe,CAAC,cAAc;YACjC,OAAO;gBACL,IAAI,EACF,eAAe,KAAK,wCAAe,CAAC,cAAc;oBAChD,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,gBAAgB;gBACtB,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;iBACL;aACF,CAAC;QAEJ,KAAK,wCAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9B,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,EAAE;oBACF,KAAK,EAAE,mBAAmB,EAAE,eAAe;wBACzC,CAAC,CAAC,+BAA+B,CAAC;4BAC9B,WAAW,EAAE,kBAAkB;4BAC/B,SAAS,EAAE,IAAI;4BACf,eAAe,EAAE,mBAAmB,CAAC,eAAe;yBACrD,CAAC;wBACJ,CAAC,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,CAAC;iBAC7C;aACF,CAAC;QACJ,CAAC;QACD,KAAK,wCAAe,CAAC,SAAS;YAC5B,OAAO;gBACL,IAAI,EAAE,gBAAgB;gBACtB,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;iBACL;aACF,CAAC;QAEJ,KAAK,wCAAe,CAAC,cAAc,CAAC,CAAC,CAAC;YACpC,IAAI,gBAAoC,CAAC;YAEzC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,gBAAgB,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACrE,CAAC;gBAAC,MAAM,CAAC;oBACP,gBAAgB,GAAG,SAAS,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,WAAW,EAAE,gBAAgB,CAAC,WAAW;oBACzC,gBAAgB,EAAE,iCAAiC,CAAC;wBAClD,MAAM,EAAE,gBAAgB;wBACxB,WAAW,EAAE,kBAAkB;wBAC/B,SAAS,EAAE,IAAI;wBACf,eAAe,EAAE,EAAE;qBACpB,CAAC;iBACH;aACF,CAAC;QACJ,CAAC;QAED,KAAK,wCAAe,CAAC,cAAc,CAAC;QACpC,KAAK,wCAAe,CAAC,yBAAyB,CAAC;QAC/C,KAAK,wCAAe,CAAC,YAAY,CAAC;QAClC,KAAK,wCAAe,CAAC,4BAA4B,CAAC;QAClD,KAAK,wCAAe,CAAC,kBAAkB,CAAC;QACxC,KAAK,wCAAe,CAAC,4BAA4B,CAAC,CAAC,CAAC;YAClD,MAAM,aAAa,GAAG,+BAA+B,CAAC;gBACpD,WAAW,EAAE,kBAAkB;gBAC/B,SAAS,EAAE,KAAK;gBAChB,eAAe,EAAE,oBAAoB;aACtC,CAAC,CAAC;YAEH,OAAO;gBACL,IAAI,EACF,eAAe,KAAK,wCAAe,CAAC,4BAA4B;oBAC9D,CAAC,CAAC,qBAAqB;oBACvB,CAAC,CAAC,oBAAoB;gBAC1B,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,KAAK,EAAE,aAAa;iBACrB;aACF,CAAC;QACJ,CAAC;QAED,KAAK,wCAAe,CAAC,YAAY,CAAC;QAClC,KAAK,wCAAe,CAAC,oBAAoB,CAAC;QAC1C,KAAK,wCAAe,CAAC,aAAa,CAAC,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,EAAE;gBACd,CAAC,CAAC;oBACE,SAAS,EAAE,KAAc;oBACzB,OAAO,EAAE,IAAA,gCAAsB,EAAC,EAAE,EAAE,OAAO,CAAC;iBAC7C;gBACH,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,IAAI,GAAG,WAAW,EAAE,UAAU;gBAClC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,UAAU,EAAE;gBACpC,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,UAAU,GACd,OAAO,WAAW,EAAE,cAAc,KAAK,QAAQ;gBAC7C,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,cAAc,EAAE;gBACxC,CAAC,CAAC,SAAS,CAAC;YAEhB,OAAO;gBACL,IAAI,EACF,eAAe,KAAK,wCAAe,CAAC,aAAa;oBAC/C,CAAC,CAAC,eAAe;oBACjB,CAAC,CAAC,eAAe;gBACrB,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,KAAK;oBACL,IAAI;oBACJ,UAAU;iBACX;aACF,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,2BAA2B,GAC/B,eAAe,KAAK,wCAAe,CAAC,mBAAmB;gBACvD,QAAQ;gBACR,8BAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9C,MAAM,6BAA6B,GACjC,eAAe,KAAK,wCAAe,CAAC,mBAAmB;gBACvD,QAAQ;gBACR,gCAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YAEhD,IAAI,cAAc,GAAG,KAAK,CAAC;YAE3B,IAAI,CAAC;gBACH,cAAc,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc,GAAG,KAAK,CAAC;YACzB,CAAC;YAED,2EAA2E;YAC3E,sEAAsE;YACtE,oEAAoE;YACpE,MAAM,QAAQ,GACZ,2BAA2B;gBAC3B,CAAC,cAAc,EAAE,mBAAmB,EAAE,UAAU,KAAK,IAAI;oBACvD,cAAc,EAAE,mBAAmB,EAAE,IAAI,CACvC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,UAAU,IAAI,QAAQ,KAAK,OAAO,CACjE,KAAK,IAAI,CAAC,CAAC;YAChB,MAAM,wBAAwB,GAC5B,eAAe,KAAK,wCAAe,CAAC,mBAAmB;gBACvD,cAAc,EAAE,mBAAmB,EAAE,IAAI,CACvC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,IAAI,IAAA,+BAAa,EAAC,QAAQ,CAAC,CACrE,CAAC;YAEJ,IAAI,wBAAwB,IAAI,cAAc,EAAE,CAAC;gBAC/C,yEAAyE;gBACzE,gDAAgD;gBAChD,OAAO;oBACL,IAAI,EAAE,QAAQ;oBACd,GAAG,MAAM;oBACT,IAAI,EAAE;wBACJ,IAAI;qBACL;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;oBACL,IAAI,EAAE,gBAAgB;oBACtB,GAAG,MAAM;oBACT,IAAI,EAAE;wBACJ,IAAI;qBACL;iBACF,CAAC;YACJ,CAAC;YAED,qDAAqD;YACrD,IAAI,6BAA6B,EAAE,CAAC;gBAClC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvC,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CACnD,CAAC,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,AAAD,EAAG,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE;oBACzC,MAAM,SAAS,GAAG,KAAK;wBACrB,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE;wBACvC,CAAC,CAAC,SAAS,CAAC;oBAEd,OAAO,CACL,UAAU,EAAE,WAAW,EAAE,KAAK,wCAAyB;wBACvD,SAAS,KAAK,WAAW,CAC1B,CAAC;gBACJ,CAAC,CACF,CAAC;gBACF,IAAI,cAAkC,CAAC;gBAEvC,IAAI,gBAAgB,EAAE,CAAC;oBACrB,IAAI,CAAC;wBACH,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACpE,CAAC;oBAAC,MAAM,CAAC;wBACP,cAAc,GAAG,SAAS,CAAC;oBAC7B,CAAC;gBACH,CAAC;gBAED,MAAM,gBAAgB,GAAG,gBAAgB;oBACvC,CAAC,CAAC,iCAAiC,CAAC;wBAChC,MAAM,EAAE,cAAc;wBACtB,WAAW,EAAE,kBAAkB;wBAC/B,SAAS,EAAE,IAAI;wBACf,eAAe,EAAE,gBAAgB,CAAC,OAAO;qBAC1C,CAAC;oBACJ,CAAC,CAAC,SAAS,CAAC;gBAEd,OAAO;oBACL,IAAI,EAAE,mBAAmB;oBACzB,GAAG,MAAM;oBACT,IAAI,EAAE;wBACJ,IAAI;wBACJ,gBAAgB;qBACjB;iBACF,CAAC;YACJ,CAAC;YAED,kBAAkB;YAClB,IAAI,eAAe,KAAK,wCAAe,CAAC,mBAAmB,IAAI,QAAQ,EAAE,CAAC;gBACxE,MAAM,mBAAmB,GACvB,0CAA2B,CACzB,kBAAkB,CAAC,OAAmD,CACvE,CAAC;gBAEJ,IAAI,mBAAmB,IAAI,IAAA,yCAAgB,EAAC,EAAE,EAAE,mBAAmB,CAAC,EAAE,CAAC;oBACrE,MAAM,kBAAkB,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;oBAElD,IAAI,4BAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;wBAC1C,IAAI,CAAC;4BACH,IAAI,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;gCACpC,OAAO;oCACL,IAAI,EAAE,MAAM;oCACZ,GAAG,MAAM;oCACT,IAAI,EAAE;wCACJ,IAAI;wCACJ,WAAW,EAAE,cAAc,CAAC,kBAAkB,EAAE,KAAK,CAAC;wCACtD,gBAAgB,EAAE,iCAAiC,CAAC;4CAClD,MAAM,EAAE,OAAO;4CACf,WAAW,EAAE,kBAAkB;4CAC/B,SAAS,EAAE,IAAI;4CACf,eAAe,EAAE,mBAAmB;yCACrC,CAAC;qCACH;iCACF,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,uCAAuC;wBACzC,CAAC;oBACH,CAAC;oBAED,IAAI,8BAAe,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;wBAC5C,IAAI,YAAgC,CAAC;wBAErC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;4BAClC,IAAI,CAAC;gCACH,YAAY,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;4BAChE,CAAC;4BAAC,MAAM,CAAC;gCACP,YAAY,GAAG,SAAS,CAAC;4BAC3B,CAAC;wBACH,CAAC;wBAED,MAAM,WAAW,GAAG,cAAc,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;wBAE7D,OAAO;4BACL,IAAI,EAAE,QAAQ;4BACd,GAAG,MAAM;4BACT,IAAI,EAAE;gCACJ,IAAI;gCACJ,WAAW,EAAE,iCAAiC,CAAC;oCAC7C,MAAM,EAAE,YAAY;oCACpB,WAAW,EAAE,kBAAkB;oCAC/B,SAAS,EAAE,KAAK;oCAChB,eAAe,EAAE,mBAAmB;iCACrC,CAAC;gCACF,gBAAgB,EAAE,YAAY;oCAC5B,CAAC,CAAC;wCACE,GAAG,CAAC,WAAW,IAAI;4CACjB,SAAS,EAAE,IAAa;4CACxB,SAAS,EAAE,QAAiB;4CAC5B,QAAQ,EAAE,iBAAiB;yCAC5B,CAAC;wCACF,MAAM,EAAE,YAAY;qCACrB;oCACH,CAAC,CAAC,WAAW;6BAChB;yBACF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,KAAK,GAAG,CAAC,GAA4B,EAAE;gBAC3C,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;oBAC5C,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,IAAI,CAAC;oBACH,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;wBACzB,CAAC,CAAC,cAAc,CAAC,kBAAkB,EAAE,KAAK,CAAC;wBAC3C,CAAC,CAAC,SAAS,CAAC;gBAChB,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,OAAO;gBACL,IAAI,EAAE,qBAAqB;gBAC3B,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,EAAE;oBACF,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,QAAQ;iBACT;aACF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAhhBD,kDAghBC","sourcesContent":["import { isEqualCaseInsensitive as equalsIgnoreCase } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport { KnownCaipNamespace, toCaipChainId } from '@metamask/utils';\n\nimport type { Fee, ActivityItem, TokenAmount } from '../types.js';\nimport {\n permit2ApproveMethodId,\n swapsWrappedTokensAddresses,\n supplyMethodIds,\n tokenTransferLogTopicHash,\n unwrapMethodIds,\n withdrawMethodIds,\n wrapMethodIds,\n} from './constants.js';\nimport { formatAddressToAssetId } from './helpers/caip.js';\nimport { getKnownTokenMetadata } from './helpers/token-metadata.js';\nimport {\n getLocalTransactionFees,\n getLocalTransactionStatus,\n isNftStandard,\n} from './helpers/transactions.js';\nimport type { TransactionGroup } from './helpers/transactions.js';\n\nconst evmNativeDecimals = 18;\n\n/**\n * Maps a local TransactionController group into the shared activity item shape.\n *\n * @param transactionGroup - The transaction group to map, optionally enriched by the client.\n * @returns The normalized activity item.\n */\nexport function mapLocalTransaction(\n transactionGroup: TransactionGroup & {\n sourceToken?: TokenAmount;\n destinationToken?: TokenAmount;\n nativeAssetSymbol?: string;\n contractTokenMetadata?: { symbol?: string; decimals?: number };\n activityStatus?: ActivityItem['status'];\n fees?: Fee[];\n },\n): ActivityItem {\n const fees =\n transactionGroup.fees ?? getLocalTransactionFees(transactionGroup);\n const { initialTransaction, primaryTransaction } = transactionGroup;\n const {\n transferInformation,\n type: transactionType,\n simulationData,\n txReceipt,\n metamaskPay,\n txParams: { from = '', to = '', data: txData, value: txValue } = {},\n } = initialTransaction;\n const {\n time: primaryTime,\n hash: primaryHash,\n id: primaryId,\n } = primaryTransaction;\n const methodId = txData?.slice(0, 10);\n // Permit2 approvals use the Permit2 contract as `to`, not the approved token.\n // Keep this mapper thin: still classify the activity as an approve, but omit\n // the token rather than surfacing the wrong one — the API mapper provides\n // accurate token data.\n const isPermit2Approve = methodId === permit2ApproveMethodId;\n const tokenContractAddress = isPermit2Approve\n ? undefined\n : (transferInformation?.contractAddress ?? (to || undefined));\n const chainId = toCaipChainId(\n KnownCaipNamespace.Eip155,\n Number.parseInt(initialTransaction.chainId, 16).toString(),\n );\n const nativeSymbol = transactionGroup.nativeAssetSymbol;\n\n const getNativeToken = (\n transaction: TransactionGroup['initialTransaction'],\n direction: TokenAmount['direction'],\n ): TokenAmount | undefined => {\n const rawAmount = transaction.txParams.value;\n let amount: string | undefined;\n if (rawAmount) {\n try {\n amount = BigInt(rawAmount) > 0n ? rawAmount : undefined;\n } catch {\n amount = undefined;\n }\n }\n\n if (!amount && nativeSymbol === undefined) {\n return undefined;\n }\n\n return {\n direction,\n assetType: 'native',\n decimals: evmNativeDecimals,\n ...(amount ? { amount } : {}),\n ...(nativeSymbol === undefined ? {} : { symbol: nativeSymbol }),\n };\n };\n\n const getContractTokenFromTransaction = ({\n contractAddress,\n direction,\n transaction,\n }: {\n contractAddress?: string;\n direction: TokenAmount['direction'];\n transaction: TransactionGroup['initialTransaction'];\n }): TokenAmount | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n const symbol =\n transaction.transferInformation?.symbol ??\n transactionGroup.contractTokenMetadata?.symbol;\n const decimals =\n transaction.transferInformation?.decimals ??\n transactionGroup.contractTokenMetadata?.decimals;\n const amount = transaction.transferInformation?.amount;\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n return {\n direction,\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(amount ? { amount } : {}),\n ...(decimals === undefined ? {} : { decimals }),\n };\n };\n\n const getContractTokenWithKnownMetadata = ({\n amount,\n contractAddress,\n direction,\n transaction,\n }: {\n amount?: string;\n contractAddress?: string;\n direction: TokenAmount['direction'];\n transaction: TransactionGroup['initialTransaction'];\n }): TokenAmount | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);\n\n const isWrappedNativeToken = equalsIgnoreCase(\n contractAddress,\n swapsWrappedTokensAddresses[\n initialTransaction.chainId as keyof typeof swapsWrappedTokensAddresses\n ] || '',\n );\n const wrappedNativeTokenDecimals = isWrappedNativeToken\n ? evmNativeDecimals\n : undefined;\n\n const decimals =\n transaction.transferInformation?.amount === undefined\n ? (tokenMetadata?.decimals ??\n transactionGroup.contractTokenMetadata?.decimals ??\n wrappedNativeTokenDecimals)\n : transaction.transferInformation.decimals;\n const tokenAmount = transaction.transferInformation?.amount ?? amount;\n const symbol =\n transaction.transferInformation?.symbol ??\n tokenMetadata?.symbol ??\n transactionGroup.contractTokenMetadata?.symbol;\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n return {\n direction,\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(tokenAmount ? { amount: tokenAmount } : {}),\n ...(decimals === undefined ? {} : { decimals }),\n };\n };\n\n const status =\n transactionGroup.activityStatus ??\n getLocalTransactionStatus({\n primaryTransaction,\n initialTransaction,\n });\n const timestamp = primaryTime ?? initialTransaction.time;\n const hash = primaryHash ?? initialTransaction.hash ?? primaryId;\n const common = { chainId, status, timestamp, hash };\n\n switch (transactionType) {\n case TransactionType.simpleSend: {\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token: getNativeToken(initialTransaction, 'out'),\n },\n };\n }\n\n case TransactionType.swap:\n case TransactionType.swapAndSend:\n case TransactionType.bridge: {\n const { sourceToken, destinationToken } = transactionGroup;\n\n return {\n type: transactionType === TransactionType.bridge ? 'bridge' : 'swap',\n ...common,\n data: {\n from,\n sourceToken,\n destinationToken,\n fees,\n },\n };\n }\n\n case TransactionType.tokenMethodSafeTransferFrom:\n case TransactionType.tokenMethodTransfer:\n case TransactionType.tokenMethodTransferFrom: {\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token: getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: tokenContractAddress,\n }),\n },\n };\n }\n\n case TransactionType.lendingDeposit:\n case TransactionType.stakingDeposit:\n return {\n type:\n transactionType === TransactionType.stakingDeposit\n ? 'deposit'\n : 'lendingDeposit',\n ...common,\n data: {\n from,\n },\n };\n\n case TransactionType.incoming: {\n return {\n type: 'receive',\n ...common,\n data: {\n from,\n to,\n token: transferInformation?.contractAddress\n ? getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: transferInformation.contractAddress,\n })\n : getNativeToken(initialTransaction, 'in'),\n },\n };\n }\n case TransactionType.musdClaim:\n return {\n type: 'claimMusdBonus',\n ...common,\n data: {\n from,\n },\n };\n\n case TransactionType.musdConversion: {\n let conversionAmount: string | undefined;\n\n if (txData && txData.length >= 138) {\n try {\n conversionAmount = BigInt(`0x${txData.slice(74, 138)}`).toString();\n } catch {\n conversionAmount = undefined;\n }\n }\n\n return {\n type: 'convert',\n ...common,\n data: {\n from,\n sourceToken: transactionGroup.sourceToken,\n destinationToken: getContractTokenWithKnownMetadata({\n amount: conversionAmount,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: to,\n }),\n },\n };\n }\n\n case TransactionType.bridgeApproval:\n case TransactionType.shieldSubscriptionApprove:\n case TransactionType.swapApproval:\n case TransactionType.tokenMethodSetApprovalForAll:\n case TransactionType.tokenMethodApprove:\n case TransactionType.tokenMethodIncreaseAllowance: {\n const approvalToken = getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: tokenContractAddress,\n });\n\n return {\n type:\n transactionType === TransactionType.tokenMethodIncreaseAllowance\n ? 'increaseSpendingCap'\n : 'approveSpendingCap',\n ...common,\n data: {\n from,\n token: approvalToken,\n },\n };\n }\n\n case TransactionType.perpsDeposit:\n case TransactionType.perpsDepositAndOrder:\n case TransactionType.perpsWithdraw: {\n const token = to\n ? {\n direction: 'out' as const,\n assetId: formatAddressToAssetId(to, chainId),\n }\n : undefined;\n\n const fiat = metamaskPay?.targetFiat\n ? { amount: metamaskPay.targetFiat }\n : undefined;\n const networkFee =\n typeof metamaskPay?.networkFeeFiat === 'string'\n ? { amount: metamaskPay.networkFeeFiat }\n : undefined;\n\n return {\n type:\n transactionType === TransactionType.perpsWithdraw\n ? 'perpsWithdraw'\n : 'perpsAddFunds',\n ...common,\n data: {\n from,\n token,\n fiat,\n networkFee,\n },\n };\n }\n\n default: {\n const isSupplyContractInteraction =\n transactionType === TransactionType.contractInteraction &&\n methodId &&\n supplyMethodIds.has(methodId.toLowerCase());\n const isWithdrawContractInteraction =\n transactionType === TransactionType.contractInteraction &&\n methodId &&\n withdrawMethodIds.has(methodId.toLowerCase());\n\n let hasNativeValue = false;\n\n try {\n hasNativeValue = BigInt(txValue ?? '0') > 0n;\n } catch {\n hasNativeValue = false;\n }\n\n // Confirm an outflow before labelling a supply, mirroring the API mapper's\n // `sentTransfer` guard: native stakes (e.g. Lido) decrease the native\n // balance, while ERC-20 supplies (e.g. Aave) show a token decrease.\n const isSupply =\n isSupplyContractInteraction &&\n (simulationData?.nativeBalanceChange?.isDecrease === true ||\n simulationData?.tokenBalanceChanges?.some(\n ({ isDecrease, standard }) => isDecrease && standard === 'erc20',\n ) === true);\n const incomingNftBalanceChange =\n transactionType === TransactionType.contractInteraction &&\n simulationData?.tokenBalanceChanges?.find(\n ({ isDecrease, standard }) => !isDecrease && isNftStandard(standard),\n );\n\n if (incomingNftBalanceChange && hasNativeValue) {\n // Keep this mapper thin: classify the activity as an NFT buy and let the\n // API mapper provide the token/payment details.\n return {\n type: 'nftBuy',\n ...common,\n data: {\n from,\n },\n };\n }\n\n if (isSupply) {\n return {\n type: 'lendingDeposit',\n ...common,\n data: {\n from,\n },\n };\n }\n\n // lending withdrawal - applies to Earn features only\n if (isWithdrawContractInteraction) {\n const fromAddress = from.toLowerCase();\n const receivedTokenLog = (txReceipt?.logs ?? []).find(\n ({ topics: [eventTopic, , logTo] = [] }) => {\n const toAddress = logTo\n ? `0x${logTo.slice(-40)}`.toLowerCase()\n : undefined;\n\n return (\n eventTopic?.toLowerCase() === tokenTransferLogTopicHash &&\n toAddress === fromAddress\n );\n },\n );\n let receivedAmount: string | undefined;\n\n if (receivedTokenLog) {\n try {\n receivedAmount = BigInt(String(receivedTokenLog.data)).toString();\n } catch {\n receivedAmount = undefined;\n }\n }\n\n const destinationToken = receivedTokenLog\n ? getContractTokenWithKnownMetadata({\n amount: receivedAmount,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: receivedTokenLog.address,\n })\n : undefined;\n\n return {\n type: 'lendingWithdrawal',\n ...common,\n data: {\n from,\n destinationToken,\n },\n };\n }\n\n // wrap and unwrap\n if (transactionType === TransactionType.contractInteraction && methodId) {\n const wrappedTokenAddress =\n swapsWrappedTokensAddresses[\n initialTransaction.chainId as keyof typeof swapsWrappedTokensAddresses\n ];\n\n if (wrappedTokenAddress && equalsIgnoreCase(to, wrappedTokenAddress)) {\n const normalizedMethodId = methodId.toLowerCase();\n\n if (wrapMethodIds.has(normalizedMethodId)) {\n try {\n if (txValue && BigInt(txValue) > 0n) {\n return {\n type: 'wrap',\n ...common,\n data: {\n from,\n sourceToken: getNativeToken(initialTransaction, 'out'),\n destinationToken: getContractTokenWithKnownMetadata({\n amount: txValue,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: wrappedTokenAddress,\n }),\n },\n };\n }\n } catch {\n // Invalid native value — fall through.\n }\n }\n\n if (unwrapMethodIds.has(normalizedMethodId)) {\n let unwrapAmount: string | undefined;\n\n if (txData && txData.length >= 74) {\n try {\n unwrapAmount = BigInt(`0x${txData.slice(10, 74)}`).toString();\n } catch {\n unwrapAmount = undefined;\n }\n }\n\n const nativeToken = getNativeToken(initialTransaction, 'in');\n\n return {\n type: 'unwrap',\n ...common,\n data: {\n from,\n sourceToken: getContractTokenWithKnownMetadata({\n amount: unwrapAmount,\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: wrappedTokenAddress,\n }),\n destinationToken: unwrapAmount\n ? {\n ...(nativeToken ?? {\n direction: 'in' as const,\n assetType: 'native' as const,\n decimals: evmNativeDecimals,\n }),\n amount: unwrapAmount,\n }\n : nativeToken,\n },\n };\n }\n }\n }\n\n const token = ((): TokenAmount | undefined => {\n if (txValue === undefined || txValue === '') {\n return undefined;\n }\n\n try {\n return BigInt(txValue) > 0n\n ? getNativeToken(initialTransaction, 'out')\n : undefined;\n } catch {\n return undefined;\n }\n })();\n\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n ...(token ? { token } : {}),\n methodId,\n },\n };\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"local-transaction-mapper.cjs","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEqualCaseInsensitive as equalsIgnoreCase } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport { KnownCaipNamespace, toCaipChainId } from '@metamask/utils';\n\nimport type { Fee, ActivityItem, TokenAmount } from '../types.js';\nimport {\n permit2ApproveMethodId,\n swapsWrappedTokensAddresses,\n supplyMethodIds,\n tokenTransferLogTopicHash,\n unwrapMethodIds,\n withdrawMethodIds,\n wrapMethodIds,\n} from './constants.js';\nimport {\n formatAddressToAssetId,\n resolveNativeAssetId,\n} from './helpers/caip.js';\nimport { getKnownTokenMetadata } from './helpers/token-metadata.js';\nimport {\n getLocalTransactionFees,\n getLocalTransactionStatus,\n isNftStandard,\n} from './helpers/transactions.js';\nimport type { TransactionGroup } from './helpers/transactions.js';\n\nconst evmNativeDecimals = 18;\n\n/**\n * Maps a local TransactionController group into the shared activity item shape.\n *\n * @param transactionGroup - The transaction group to map, optionally enriched by the client.\n * @returns The normalized activity item.\n */\nexport function mapLocalTransaction(\n transactionGroup: TransactionGroup & {\n sourceToken?: TokenAmount;\n destinationToken?: TokenAmount;\n nativeAssetSymbol?: string;\n contractTokenMetadata?: { symbol?: string; decimals?: number };\n activityStatus?: ActivityItem['status'];\n fees?: Fee[];\n },\n): ActivityItem {\n const { initialTransaction, primaryTransaction } = transactionGroup;\n const chainId = toCaipChainId(\n KnownCaipNamespace.Eip155,\n Number.parseInt(initialTransaction.chainId, 16).toString(),\n );\n const nativeSymbol = transactionGroup.nativeAssetSymbol;\n const fees =\n transactionGroup.fees ?? getLocalTransactionFees(transactionGroup);\n const {\n transferInformation,\n type: transactionType,\n simulationData,\n txReceipt,\n metamaskPay,\n txParams: { from = '', to = '', data: txData, value: txValue } = {},\n } = initialTransaction;\n const {\n time: primaryTime,\n hash: primaryHash,\n id: primaryId,\n } = primaryTransaction;\n const methodId = txData?.slice(0, 10);\n // Permit2 approvals use the Permit2 contract as `to`, not the approved token.\n // Keep this mapper thin: still classify the activity as an approve, but omit\n // the token rather than surfacing the wrong one — the API mapper provides\n // accurate token data.\n const isPermit2Approve = methodId === permit2ApproveMethodId;\n const tokenContractAddress = isPermit2Approve\n ? undefined\n : (transferInformation?.contractAddress ?? (to || undefined));\n\n const getNativeToken = (\n transaction: TransactionGroup['initialTransaction'],\n direction: TokenAmount['direction'],\n ): TokenAmount | undefined => {\n const rawAmount = transaction.txParams.value;\n let amount: string | undefined;\n if (rawAmount) {\n try {\n amount = BigInt(rawAmount) > 0n ? rawAmount : undefined;\n } catch {\n amount = undefined;\n }\n }\n\n if (!amount && nativeSymbol === undefined) {\n return undefined;\n }\n\n const assetId = resolveNativeAssetId(chainId, nativeSymbol);\n\n return {\n direction,\n assetType: 'native',\n decimals: evmNativeDecimals,\n ...(amount ? { amount } : {}),\n ...(nativeSymbol === undefined ? {} : { symbol: nativeSymbol }),\n ...(assetId ? { assetId } : {}),\n };\n };\n\n const getContractTokenFromTransaction = ({\n contractAddress,\n direction,\n transaction,\n }: {\n contractAddress?: string;\n direction: TokenAmount['direction'];\n transaction: TransactionGroup['initialTransaction'];\n }): TokenAmount | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n const symbol =\n transaction.transferInformation?.symbol ??\n transactionGroup.contractTokenMetadata?.symbol;\n const decimals =\n transaction.transferInformation?.decimals ??\n transactionGroup.contractTokenMetadata?.decimals;\n const amount = transaction.transferInformation?.amount;\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n return {\n direction,\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(amount ? { amount } : {}),\n ...(decimals === undefined ? {} : { decimals }),\n };\n };\n\n const getContractTokenWithKnownMetadata = ({\n amount,\n contractAddress,\n direction,\n transaction,\n }: {\n amount?: string;\n contractAddress?: string;\n direction: TokenAmount['direction'];\n transaction: TransactionGroup['initialTransaction'];\n }): TokenAmount | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);\n\n const isWrappedNativeToken = equalsIgnoreCase(\n contractAddress,\n swapsWrappedTokensAddresses[\n initialTransaction.chainId as keyof typeof swapsWrappedTokensAddresses\n ] || '',\n );\n const wrappedNativeTokenDecimals = isWrappedNativeToken\n ? evmNativeDecimals\n : undefined;\n\n const decimals =\n transaction.transferInformation?.amount === undefined\n ? (tokenMetadata?.decimals ??\n transactionGroup.contractTokenMetadata?.decimals ??\n wrappedNativeTokenDecimals)\n : transaction.transferInformation.decimals;\n const tokenAmount = transaction.transferInformation?.amount ?? amount;\n const symbol =\n transaction.transferInformation?.symbol ??\n tokenMetadata?.symbol ??\n transactionGroup.contractTokenMetadata?.symbol;\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n return {\n direction,\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(tokenAmount ? { amount: tokenAmount } : {}),\n ...(decimals === undefined ? {} : { decimals }),\n };\n };\n\n const status =\n transactionGroup.activityStatus ??\n getLocalTransactionStatus({\n primaryTransaction,\n initialTransaction,\n });\n const timestamp = primaryTime ?? initialTransaction.time;\n const hash = primaryHash ?? initialTransaction.hash ?? primaryId;\n const common = { chainId, status, timestamp, hash };\n\n switch (transactionType) {\n case TransactionType.simpleSend: {\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token: getNativeToken(initialTransaction, 'out'),\n },\n };\n }\n\n case TransactionType.swap:\n case TransactionType.swapAndSend:\n case TransactionType.bridge: {\n const { sourceToken, destinationToken } = transactionGroup;\n\n return {\n type: transactionType === TransactionType.bridge ? 'bridge' : 'swap',\n ...common,\n data: {\n from,\n sourceToken,\n destinationToken,\n fees,\n },\n };\n }\n\n case TransactionType.tokenMethodSafeTransferFrom:\n case TransactionType.tokenMethodTransfer:\n case TransactionType.tokenMethodTransferFrom: {\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token: getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: tokenContractAddress,\n }),\n },\n };\n }\n\n case TransactionType.lendingDeposit:\n case TransactionType.stakingDeposit:\n return {\n type:\n transactionType === TransactionType.stakingDeposit\n ? 'deposit'\n : 'lendingDeposit',\n ...common,\n data: {\n from,\n },\n };\n\n case TransactionType.incoming: {\n return {\n type: 'receive',\n ...common,\n data: {\n from,\n to,\n token: transferInformation?.contractAddress\n ? getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: transferInformation.contractAddress,\n })\n : getNativeToken(initialTransaction, 'in'),\n },\n };\n }\n case TransactionType.musdClaim:\n return {\n type: 'claimMusdBonus',\n ...common,\n data: {\n from,\n },\n };\n\n case TransactionType.musdConversion: {\n let conversionAmount: string | undefined;\n\n if (txData && txData.length >= 138) {\n try {\n conversionAmount = BigInt(`0x${txData.slice(74, 138)}`).toString();\n } catch {\n conversionAmount = undefined;\n }\n }\n\n return {\n type: 'convert',\n ...common,\n data: {\n from,\n sourceToken: transactionGroup.sourceToken,\n destinationToken: getContractTokenWithKnownMetadata({\n amount: conversionAmount,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: to,\n }),\n },\n };\n }\n\n case TransactionType.bridgeApproval:\n case TransactionType.shieldSubscriptionApprove:\n case TransactionType.swapApproval:\n case TransactionType.tokenMethodSetApprovalForAll:\n case TransactionType.tokenMethodApprove:\n case TransactionType.tokenMethodIncreaseAllowance: {\n const approvalToken = getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: tokenContractAddress,\n });\n\n return {\n type:\n transactionType === TransactionType.tokenMethodIncreaseAllowance\n ? 'increaseSpendingCap'\n : 'approveSpendingCap',\n ...common,\n data: {\n from,\n token: approvalToken,\n },\n };\n }\n\n case TransactionType.perpsDeposit:\n case TransactionType.perpsDepositAndOrder:\n case TransactionType.perpsWithdraw: {\n const token = to\n ? {\n direction: 'out' as const,\n assetId: formatAddressToAssetId(to, chainId),\n }\n : undefined;\n\n const fiat = metamaskPay?.targetFiat\n ? { amount: metamaskPay.targetFiat }\n : undefined;\n const networkFee =\n typeof metamaskPay?.networkFeeFiat === 'string'\n ? { amount: metamaskPay.networkFeeFiat }\n : undefined;\n\n return {\n type:\n transactionType === TransactionType.perpsWithdraw\n ? 'perpsWithdraw'\n : 'perpsAddFunds',\n ...common,\n data: {\n from,\n token,\n fiat,\n networkFee,\n },\n };\n }\n\n default: {\n const isSupplyContractInteraction =\n transactionType === TransactionType.contractInteraction &&\n methodId &&\n supplyMethodIds.has(methodId.toLowerCase());\n const isWithdrawContractInteraction =\n transactionType === TransactionType.contractInteraction &&\n methodId &&\n withdrawMethodIds.has(methodId.toLowerCase());\n\n let hasNativeValue = false;\n\n try {\n hasNativeValue = BigInt(txValue ?? '0') > 0n;\n } catch {\n hasNativeValue = false;\n }\n\n // Confirm an outflow before labelling a supply, mirroring the API mapper's\n // `sentTransfer` guard: native stakes (e.g. Lido) decrease the native\n // balance, while ERC-20 supplies (e.g. Aave) show a token decrease.\n const isSupply =\n isSupplyContractInteraction &&\n (simulationData?.nativeBalanceChange?.isDecrease === true ||\n simulationData?.tokenBalanceChanges?.some(\n ({ isDecrease, standard }) => isDecrease && standard === 'erc20',\n ) === true);\n const incomingNftBalanceChange =\n transactionType === TransactionType.contractInteraction &&\n simulationData?.tokenBalanceChanges?.find(\n ({ isDecrease, standard }) => !isDecrease && isNftStandard(standard),\n );\n\n if (incomingNftBalanceChange && hasNativeValue) {\n // Keep this mapper thin: classify the activity as an NFT buy and let the\n // API mapper provide the token/payment details.\n return {\n type: 'nftBuy',\n ...common,\n data: {\n from,\n },\n };\n }\n\n if (isSupply) {\n return {\n type: 'lendingDeposit',\n ...common,\n data: {\n from,\n },\n };\n }\n\n // lending withdrawal - applies to Earn features only\n if (isWithdrawContractInteraction) {\n const fromAddress = from.toLowerCase();\n const receivedTokenLog = (txReceipt?.logs ?? []).find(\n ({ topics: [eventTopic, , logTo] = [] }) => {\n const toAddress = logTo\n ? `0x${logTo.slice(-40)}`.toLowerCase()\n : undefined;\n\n return (\n eventTopic?.toLowerCase() === tokenTransferLogTopicHash &&\n toAddress === fromAddress\n );\n },\n );\n let receivedAmount: string | undefined;\n\n if (receivedTokenLog) {\n try {\n receivedAmount = BigInt(String(receivedTokenLog.data)).toString();\n } catch {\n receivedAmount = undefined;\n }\n }\n\n const destinationToken = receivedTokenLog\n ? getContractTokenWithKnownMetadata({\n amount: receivedAmount,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: receivedTokenLog.address,\n })\n : undefined;\n\n return {\n type: 'lendingWithdrawal',\n ...common,\n data: {\n from,\n destinationToken,\n },\n };\n }\n\n // wrap and unwrap\n if (transactionType === TransactionType.contractInteraction && methodId) {\n const wrappedTokenAddress =\n swapsWrappedTokensAddresses[\n initialTransaction.chainId as keyof typeof swapsWrappedTokensAddresses\n ];\n\n if (wrappedTokenAddress && equalsIgnoreCase(to, wrappedTokenAddress)) {\n const normalizedMethodId = methodId.toLowerCase();\n\n if (wrapMethodIds.has(normalizedMethodId)) {\n try {\n if (txValue && BigInt(txValue) > 0n) {\n return {\n type: 'wrap',\n ...common,\n data: {\n from,\n sourceToken: getNativeToken(initialTransaction, 'out'),\n destinationToken: getContractTokenWithKnownMetadata({\n amount: txValue,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: wrappedTokenAddress,\n }),\n },\n };\n }\n } catch {\n // Invalid native value — fall through.\n }\n }\n\n if (unwrapMethodIds.has(normalizedMethodId)) {\n let unwrapAmount: string | undefined;\n\n if (txData && txData.length >= 74) {\n try {\n unwrapAmount = BigInt(`0x${txData.slice(10, 74)}`).toString();\n } catch {\n unwrapAmount = undefined;\n }\n }\n\n const nativeToken = getNativeToken(initialTransaction, 'in');\n\n return {\n type: 'unwrap',\n ...common,\n data: {\n from,\n sourceToken: getContractTokenWithKnownMetadata({\n amount: unwrapAmount,\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: wrappedTokenAddress,\n }),\n destinationToken: unwrapAmount\n ? {\n ...(nativeToken ?? {\n direction: 'in' as const,\n assetType: 'native' as const,\n decimals: evmNativeDecimals,\n }),\n amount: unwrapAmount,\n }\n : nativeToken,\n },\n };\n }\n }\n }\n\n const token = ((): TokenAmount | undefined => {\n if (txValue === undefined || txValue === '') {\n return undefined;\n }\n\n try {\n return BigInt(txValue) > 0n\n ? getNativeToken(initialTransaction, 'out')\n : undefined;\n } catch {\n return undefined;\n }\n })();\n\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n ...(token ? { token } : {}),\n methodId,\n },\n };\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transaction-mapper.d.cts","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAoB;
|
|
1
|
+
{"version":3,"file":"local-transaction-mapper.d.cts","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAoB;AAoBlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,mCAAkC;AAIlE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,gBAAgB,GAAG;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,cAAc,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,GACA,YAAY,CA0gBd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transaction-mapper.d.mts","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAoB;
|
|
1
|
+
{"version":3,"file":"local-transaction-mapper.d.mts","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAoB;AAoBlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,mCAAkC;AAIlE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,gBAAgB,GAAG;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,cAAc,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,GACA,YAAY,CA0gBd"}
|
|
@@ -2,7 +2,7 @@ import { isEqualCaseInsensitive as equalsIgnoreCase } from "@metamask/controller
|
|
|
2
2
|
import { TransactionType } from "@metamask/transaction-controller";
|
|
3
3
|
import { KnownCaipNamespace, toCaipChainId } from "@metamask/utils";
|
|
4
4
|
import { permit2ApproveMethodId, swapsWrappedTokensAddresses, supplyMethodIds, tokenTransferLogTopicHash, unwrapMethodIds, withdrawMethodIds, wrapMethodIds } from "./constants.mjs";
|
|
5
|
-
import { formatAddressToAssetId } from "./helpers/caip.mjs";
|
|
5
|
+
import { formatAddressToAssetId, resolveNativeAssetId } from "./helpers/caip.mjs";
|
|
6
6
|
import { getKnownTokenMetadata } from "./helpers/token-metadata.mjs";
|
|
7
7
|
import { getLocalTransactionFees, getLocalTransactionStatus, isNftStandard } from "./helpers/transactions.mjs";
|
|
8
8
|
const evmNativeDecimals = 18;
|
|
@@ -13,8 +13,10 @@ const evmNativeDecimals = 18;
|
|
|
13
13
|
* @returns The normalized activity item.
|
|
14
14
|
*/
|
|
15
15
|
export function mapLocalTransaction(transactionGroup) {
|
|
16
|
-
const fees = transactionGroup.fees ?? getLocalTransactionFees(transactionGroup);
|
|
17
16
|
const { initialTransaction, primaryTransaction } = transactionGroup;
|
|
17
|
+
const chainId = toCaipChainId(KnownCaipNamespace.Eip155, Number.parseInt(initialTransaction.chainId, 16).toString());
|
|
18
|
+
const nativeSymbol = transactionGroup.nativeAssetSymbol;
|
|
19
|
+
const fees = transactionGroup.fees ?? getLocalTransactionFees(transactionGroup);
|
|
18
20
|
const { transferInformation, type: transactionType, simulationData, txReceipt, metamaskPay, txParams: { from = '', to = '', data: txData, value: txValue } = {}, } = initialTransaction;
|
|
19
21
|
const { time: primaryTime, hash: primaryHash, id: primaryId, } = primaryTransaction;
|
|
20
22
|
const methodId = txData?.slice(0, 10);
|
|
@@ -26,8 +28,6 @@ export function mapLocalTransaction(transactionGroup) {
|
|
|
26
28
|
const tokenContractAddress = isPermit2Approve
|
|
27
29
|
? undefined
|
|
28
30
|
: (transferInformation?.contractAddress ?? (to || undefined));
|
|
29
|
-
const chainId = toCaipChainId(KnownCaipNamespace.Eip155, Number.parseInt(initialTransaction.chainId, 16).toString());
|
|
30
|
-
const nativeSymbol = transactionGroup.nativeAssetSymbol;
|
|
31
31
|
const getNativeToken = (transaction, direction) => {
|
|
32
32
|
const rawAmount = transaction.txParams.value;
|
|
33
33
|
let amount;
|
|
@@ -42,12 +42,14 @@ export function mapLocalTransaction(transactionGroup) {
|
|
|
42
42
|
if (!amount && nativeSymbol === undefined) {
|
|
43
43
|
return undefined;
|
|
44
44
|
}
|
|
45
|
+
const assetId = resolveNativeAssetId(chainId, nativeSymbol);
|
|
45
46
|
return {
|
|
46
47
|
direction,
|
|
47
48
|
assetType: 'native',
|
|
48
49
|
decimals: evmNativeDecimals,
|
|
49
50
|
...(amount ? { amount } : {}),
|
|
50
51
|
...(nativeSymbol === undefined ? {} : { symbol: nativeSymbol }),
|
|
52
|
+
...(assetId ? { assetId } : {}),
|
|
51
53
|
};
|
|
52
54
|
};
|
|
53
55
|
const getContractTokenFromTransaction = ({ contractAddress, direction, transaction, }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transaction-mapper.mjs","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEqualCaseInsensitive as equalsIgnoreCase } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport { KnownCaipNamespace, toCaipChainId } from '@metamask/utils';\n\nimport type { Fee, ActivityItem, TokenAmount } from '../types.js';\nimport {\n permit2ApproveMethodId,\n swapsWrappedTokensAddresses,\n supplyMethodIds,\n tokenTransferLogTopicHash,\n unwrapMethodIds,\n withdrawMethodIds,\n wrapMethodIds,\n} from './constants.js';\nimport { formatAddressToAssetId } from './helpers/caip.js';\nimport { getKnownTokenMetadata } from './helpers/token-metadata.js';\nimport {\n getLocalTransactionFees,\n getLocalTransactionStatus,\n isNftStandard,\n} from './helpers/transactions.js';\nimport type { TransactionGroup } from './helpers/transactions.js';\n\nconst evmNativeDecimals = 18;\n\n/**\n * Maps a local TransactionController group into the shared activity item shape.\n *\n * @param transactionGroup - The transaction group to map, optionally enriched by the client.\n * @returns The normalized activity item.\n */\nexport function mapLocalTransaction(\n transactionGroup: TransactionGroup & {\n sourceToken?: TokenAmount;\n destinationToken?: TokenAmount;\n nativeAssetSymbol?: string;\n contractTokenMetadata?: { symbol?: string; decimals?: number };\n activityStatus?: ActivityItem['status'];\n fees?: Fee[];\n },\n): ActivityItem {\n const fees =\n transactionGroup.fees ?? getLocalTransactionFees(transactionGroup);\n const { initialTransaction, primaryTransaction } = transactionGroup;\n const {\n transferInformation,\n type: transactionType,\n simulationData,\n txReceipt,\n metamaskPay,\n txParams: { from = '', to = '', data: txData, value: txValue } = {},\n } = initialTransaction;\n const {\n time: primaryTime,\n hash: primaryHash,\n id: primaryId,\n } = primaryTransaction;\n const methodId = txData?.slice(0, 10);\n // Permit2 approvals use the Permit2 contract as `to`, not the approved token.\n // Keep this mapper thin: still classify the activity as an approve, but omit\n // the token rather than surfacing the wrong one — the API mapper provides\n // accurate token data.\n const isPermit2Approve = methodId === permit2ApproveMethodId;\n const tokenContractAddress = isPermit2Approve\n ? undefined\n : (transferInformation?.contractAddress ?? (to || undefined));\n const chainId = toCaipChainId(\n KnownCaipNamespace.Eip155,\n Number.parseInt(initialTransaction.chainId, 16).toString(),\n );\n const nativeSymbol = transactionGroup.nativeAssetSymbol;\n\n const getNativeToken = (\n transaction: TransactionGroup['initialTransaction'],\n direction: TokenAmount['direction'],\n ): TokenAmount | undefined => {\n const rawAmount = transaction.txParams.value;\n let amount: string | undefined;\n if (rawAmount) {\n try {\n amount = BigInt(rawAmount) > 0n ? rawAmount : undefined;\n } catch {\n amount = undefined;\n }\n }\n\n if (!amount && nativeSymbol === undefined) {\n return undefined;\n }\n\n return {\n direction,\n assetType: 'native',\n decimals: evmNativeDecimals,\n ...(amount ? { amount } : {}),\n ...(nativeSymbol === undefined ? {} : { symbol: nativeSymbol }),\n };\n };\n\n const getContractTokenFromTransaction = ({\n contractAddress,\n direction,\n transaction,\n }: {\n contractAddress?: string;\n direction: TokenAmount['direction'];\n transaction: TransactionGroup['initialTransaction'];\n }): TokenAmount | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n const symbol =\n transaction.transferInformation?.symbol ??\n transactionGroup.contractTokenMetadata?.symbol;\n const decimals =\n transaction.transferInformation?.decimals ??\n transactionGroup.contractTokenMetadata?.decimals;\n const amount = transaction.transferInformation?.amount;\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n return {\n direction,\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(amount ? { amount } : {}),\n ...(decimals === undefined ? {} : { decimals }),\n };\n };\n\n const getContractTokenWithKnownMetadata = ({\n amount,\n contractAddress,\n direction,\n transaction,\n }: {\n amount?: string;\n contractAddress?: string;\n direction: TokenAmount['direction'];\n transaction: TransactionGroup['initialTransaction'];\n }): TokenAmount | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);\n\n const isWrappedNativeToken = equalsIgnoreCase(\n contractAddress,\n swapsWrappedTokensAddresses[\n initialTransaction.chainId as keyof typeof swapsWrappedTokensAddresses\n ] || '',\n );\n const wrappedNativeTokenDecimals = isWrappedNativeToken\n ? evmNativeDecimals\n : undefined;\n\n const decimals =\n transaction.transferInformation?.amount === undefined\n ? (tokenMetadata?.decimals ??\n transactionGroup.contractTokenMetadata?.decimals ??\n wrappedNativeTokenDecimals)\n : transaction.transferInformation.decimals;\n const tokenAmount = transaction.transferInformation?.amount ?? amount;\n const symbol =\n transaction.transferInformation?.symbol ??\n tokenMetadata?.symbol ??\n transactionGroup.contractTokenMetadata?.symbol;\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n return {\n direction,\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(tokenAmount ? { amount: tokenAmount } : {}),\n ...(decimals === undefined ? {} : { decimals }),\n };\n };\n\n const status =\n transactionGroup.activityStatus ??\n getLocalTransactionStatus({\n primaryTransaction,\n initialTransaction,\n });\n const timestamp = primaryTime ?? initialTransaction.time;\n const hash = primaryHash ?? initialTransaction.hash ?? primaryId;\n const common = { chainId, status, timestamp, hash };\n\n switch (transactionType) {\n case TransactionType.simpleSend: {\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token: getNativeToken(initialTransaction, 'out'),\n },\n };\n }\n\n case TransactionType.swap:\n case TransactionType.swapAndSend:\n case TransactionType.bridge: {\n const { sourceToken, destinationToken } = transactionGroup;\n\n return {\n type: transactionType === TransactionType.bridge ? 'bridge' : 'swap',\n ...common,\n data: {\n from,\n sourceToken,\n destinationToken,\n fees,\n },\n };\n }\n\n case TransactionType.tokenMethodSafeTransferFrom:\n case TransactionType.tokenMethodTransfer:\n case TransactionType.tokenMethodTransferFrom: {\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token: getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: tokenContractAddress,\n }),\n },\n };\n }\n\n case TransactionType.lendingDeposit:\n case TransactionType.stakingDeposit:\n return {\n type:\n transactionType === TransactionType.stakingDeposit\n ? 'deposit'\n : 'lendingDeposit',\n ...common,\n data: {\n from,\n },\n };\n\n case TransactionType.incoming: {\n return {\n type: 'receive',\n ...common,\n data: {\n from,\n to,\n token: transferInformation?.contractAddress\n ? getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: transferInformation.contractAddress,\n })\n : getNativeToken(initialTransaction, 'in'),\n },\n };\n }\n case TransactionType.musdClaim:\n return {\n type: 'claimMusdBonus',\n ...common,\n data: {\n from,\n },\n };\n\n case TransactionType.musdConversion: {\n let conversionAmount: string | undefined;\n\n if (txData && txData.length >= 138) {\n try {\n conversionAmount = BigInt(`0x${txData.slice(74, 138)}`).toString();\n } catch {\n conversionAmount = undefined;\n }\n }\n\n return {\n type: 'convert',\n ...common,\n data: {\n from,\n sourceToken: transactionGroup.sourceToken,\n destinationToken: getContractTokenWithKnownMetadata({\n amount: conversionAmount,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: to,\n }),\n },\n };\n }\n\n case TransactionType.bridgeApproval:\n case TransactionType.shieldSubscriptionApprove:\n case TransactionType.swapApproval:\n case TransactionType.tokenMethodSetApprovalForAll:\n case TransactionType.tokenMethodApprove:\n case TransactionType.tokenMethodIncreaseAllowance: {\n const approvalToken = getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: tokenContractAddress,\n });\n\n return {\n type:\n transactionType === TransactionType.tokenMethodIncreaseAllowance\n ? 'increaseSpendingCap'\n : 'approveSpendingCap',\n ...common,\n data: {\n from,\n token: approvalToken,\n },\n };\n }\n\n case TransactionType.perpsDeposit:\n case TransactionType.perpsDepositAndOrder:\n case TransactionType.perpsWithdraw: {\n const token = to\n ? {\n direction: 'out' as const,\n assetId: formatAddressToAssetId(to, chainId),\n }\n : undefined;\n\n const fiat = metamaskPay?.targetFiat\n ? { amount: metamaskPay.targetFiat }\n : undefined;\n const networkFee =\n typeof metamaskPay?.networkFeeFiat === 'string'\n ? { amount: metamaskPay.networkFeeFiat }\n : undefined;\n\n return {\n type:\n transactionType === TransactionType.perpsWithdraw\n ? 'perpsWithdraw'\n : 'perpsAddFunds',\n ...common,\n data: {\n from,\n token,\n fiat,\n networkFee,\n },\n };\n }\n\n default: {\n const isSupplyContractInteraction =\n transactionType === TransactionType.contractInteraction &&\n methodId &&\n supplyMethodIds.has(methodId.toLowerCase());\n const isWithdrawContractInteraction =\n transactionType === TransactionType.contractInteraction &&\n methodId &&\n withdrawMethodIds.has(methodId.toLowerCase());\n\n let hasNativeValue = false;\n\n try {\n hasNativeValue = BigInt(txValue ?? '0') > 0n;\n } catch {\n hasNativeValue = false;\n }\n\n // Confirm an outflow before labelling a supply, mirroring the API mapper's\n // `sentTransfer` guard: native stakes (e.g. Lido) decrease the native\n // balance, while ERC-20 supplies (e.g. Aave) show a token decrease.\n const isSupply =\n isSupplyContractInteraction &&\n (simulationData?.nativeBalanceChange?.isDecrease === true ||\n simulationData?.tokenBalanceChanges?.some(\n ({ isDecrease, standard }) => isDecrease && standard === 'erc20',\n ) === true);\n const incomingNftBalanceChange =\n transactionType === TransactionType.contractInteraction &&\n simulationData?.tokenBalanceChanges?.find(\n ({ isDecrease, standard }) => !isDecrease && isNftStandard(standard),\n );\n\n if (incomingNftBalanceChange && hasNativeValue) {\n // Keep this mapper thin: classify the activity as an NFT buy and let the\n // API mapper provide the token/payment details.\n return {\n type: 'nftBuy',\n ...common,\n data: {\n from,\n },\n };\n }\n\n if (isSupply) {\n return {\n type: 'lendingDeposit',\n ...common,\n data: {\n from,\n },\n };\n }\n\n // lending withdrawal - applies to Earn features only\n if (isWithdrawContractInteraction) {\n const fromAddress = from.toLowerCase();\n const receivedTokenLog = (txReceipt?.logs ?? []).find(\n ({ topics: [eventTopic, , logTo] = [] }) => {\n const toAddress = logTo\n ? `0x${logTo.slice(-40)}`.toLowerCase()\n : undefined;\n\n return (\n eventTopic?.toLowerCase() === tokenTransferLogTopicHash &&\n toAddress === fromAddress\n );\n },\n );\n let receivedAmount: string | undefined;\n\n if (receivedTokenLog) {\n try {\n receivedAmount = BigInt(String(receivedTokenLog.data)).toString();\n } catch {\n receivedAmount = undefined;\n }\n }\n\n const destinationToken = receivedTokenLog\n ? getContractTokenWithKnownMetadata({\n amount: receivedAmount,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: receivedTokenLog.address,\n })\n : undefined;\n\n return {\n type: 'lendingWithdrawal',\n ...common,\n data: {\n from,\n destinationToken,\n },\n };\n }\n\n // wrap and unwrap\n if (transactionType === TransactionType.contractInteraction && methodId) {\n const wrappedTokenAddress =\n swapsWrappedTokensAddresses[\n initialTransaction.chainId as keyof typeof swapsWrappedTokensAddresses\n ];\n\n if (wrappedTokenAddress && equalsIgnoreCase(to, wrappedTokenAddress)) {\n const normalizedMethodId = methodId.toLowerCase();\n\n if (wrapMethodIds.has(normalizedMethodId)) {\n try {\n if (txValue && BigInt(txValue) > 0n) {\n return {\n type: 'wrap',\n ...common,\n data: {\n from,\n sourceToken: getNativeToken(initialTransaction, 'out'),\n destinationToken: getContractTokenWithKnownMetadata({\n amount: txValue,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: wrappedTokenAddress,\n }),\n },\n };\n }\n } catch {\n // Invalid native value — fall through.\n }\n }\n\n if (unwrapMethodIds.has(normalizedMethodId)) {\n let unwrapAmount: string | undefined;\n\n if (txData && txData.length >= 74) {\n try {\n unwrapAmount = BigInt(`0x${txData.slice(10, 74)}`).toString();\n } catch {\n unwrapAmount = undefined;\n }\n }\n\n const nativeToken = getNativeToken(initialTransaction, 'in');\n\n return {\n type: 'unwrap',\n ...common,\n data: {\n from,\n sourceToken: getContractTokenWithKnownMetadata({\n amount: unwrapAmount,\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: wrappedTokenAddress,\n }),\n destinationToken: unwrapAmount\n ? {\n ...(nativeToken ?? {\n direction: 'in' as const,\n assetType: 'native' as const,\n decimals: evmNativeDecimals,\n }),\n amount: unwrapAmount,\n }\n : nativeToken,\n },\n };\n }\n }\n }\n\n const token = ((): TokenAmount | undefined => {\n if (txValue === undefined || txValue === '') {\n return undefined;\n }\n\n try {\n return BigInt(txValue) > 0n\n ? getNativeToken(initialTransaction, 'out')\n : undefined;\n } catch {\n return undefined;\n }\n })();\n\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n ...(token ? { token } : {}),\n methodId,\n },\n };\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"local-transaction-mapper.mjs","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEqualCaseInsensitive as equalsIgnoreCase } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport { KnownCaipNamespace, toCaipChainId } from '@metamask/utils';\n\nimport type { Fee, ActivityItem, TokenAmount } from '../types.js';\nimport {\n permit2ApproveMethodId,\n swapsWrappedTokensAddresses,\n supplyMethodIds,\n tokenTransferLogTopicHash,\n unwrapMethodIds,\n withdrawMethodIds,\n wrapMethodIds,\n} from './constants.js';\nimport {\n formatAddressToAssetId,\n resolveNativeAssetId,\n} from './helpers/caip.js';\nimport { getKnownTokenMetadata } from './helpers/token-metadata.js';\nimport {\n getLocalTransactionFees,\n getLocalTransactionStatus,\n isNftStandard,\n} from './helpers/transactions.js';\nimport type { TransactionGroup } from './helpers/transactions.js';\n\nconst evmNativeDecimals = 18;\n\n/**\n * Maps a local TransactionController group into the shared activity item shape.\n *\n * @param transactionGroup - The transaction group to map, optionally enriched by the client.\n * @returns The normalized activity item.\n */\nexport function mapLocalTransaction(\n transactionGroup: TransactionGroup & {\n sourceToken?: TokenAmount;\n destinationToken?: TokenAmount;\n nativeAssetSymbol?: string;\n contractTokenMetadata?: { symbol?: string; decimals?: number };\n activityStatus?: ActivityItem['status'];\n fees?: Fee[];\n },\n): ActivityItem {\n const { initialTransaction, primaryTransaction } = transactionGroup;\n const chainId = toCaipChainId(\n KnownCaipNamespace.Eip155,\n Number.parseInt(initialTransaction.chainId, 16).toString(),\n );\n const nativeSymbol = transactionGroup.nativeAssetSymbol;\n const fees =\n transactionGroup.fees ?? getLocalTransactionFees(transactionGroup);\n const {\n transferInformation,\n type: transactionType,\n simulationData,\n txReceipt,\n metamaskPay,\n txParams: { from = '', to = '', data: txData, value: txValue } = {},\n } = initialTransaction;\n const {\n time: primaryTime,\n hash: primaryHash,\n id: primaryId,\n } = primaryTransaction;\n const methodId = txData?.slice(0, 10);\n // Permit2 approvals use the Permit2 contract as `to`, not the approved token.\n // Keep this mapper thin: still classify the activity as an approve, but omit\n // the token rather than surfacing the wrong one — the API mapper provides\n // accurate token data.\n const isPermit2Approve = methodId === permit2ApproveMethodId;\n const tokenContractAddress = isPermit2Approve\n ? undefined\n : (transferInformation?.contractAddress ?? (to || undefined));\n\n const getNativeToken = (\n transaction: TransactionGroup['initialTransaction'],\n direction: TokenAmount['direction'],\n ): TokenAmount | undefined => {\n const rawAmount = transaction.txParams.value;\n let amount: string | undefined;\n if (rawAmount) {\n try {\n amount = BigInt(rawAmount) > 0n ? rawAmount : undefined;\n } catch {\n amount = undefined;\n }\n }\n\n if (!amount && nativeSymbol === undefined) {\n return undefined;\n }\n\n const assetId = resolveNativeAssetId(chainId, nativeSymbol);\n\n return {\n direction,\n assetType: 'native',\n decimals: evmNativeDecimals,\n ...(amount ? { amount } : {}),\n ...(nativeSymbol === undefined ? {} : { symbol: nativeSymbol }),\n ...(assetId ? { assetId } : {}),\n };\n };\n\n const getContractTokenFromTransaction = ({\n contractAddress,\n direction,\n transaction,\n }: {\n contractAddress?: string;\n direction: TokenAmount['direction'];\n transaction: TransactionGroup['initialTransaction'];\n }): TokenAmount | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n const symbol =\n transaction.transferInformation?.symbol ??\n transactionGroup.contractTokenMetadata?.symbol;\n const decimals =\n transaction.transferInformation?.decimals ??\n transactionGroup.contractTokenMetadata?.decimals;\n const amount = transaction.transferInformation?.amount;\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n return {\n direction,\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(amount ? { amount } : {}),\n ...(decimals === undefined ? {} : { decimals }),\n };\n };\n\n const getContractTokenWithKnownMetadata = ({\n amount,\n contractAddress,\n direction,\n transaction,\n }: {\n amount?: string;\n contractAddress?: string;\n direction: TokenAmount['direction'];\n transaction: TransactionGroup['initialTransaction'];\n }): TokenAmount | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);\n\n const isWrappedNativeToken = equalsIgnoreCase(\n contractAddress,\n swapsWrappedTokensAddresses[\n initialTransaction.chainId as keyof typeof swapsWrappedTokensAddresses\n ] || '',\n );\n const wrappedNativeTokenDecimals = isWrappedNativeToken\n ? evmNativeDecimals\n : undefined;\n\n const decimals =\n transaction.transferInformation?.amount === undefined\n ? (tokenMetadata?.decimals ??\n transactionGroup.contractTokenMetadata?.decimals ??\n wrappedNativeTokenDecimals)\n : transaction.transferInformation.decimals;\n const tokenAmount = transaction.transferInformation?.amount ?? amount;\n const symbol =\n transaction.transferInformation?.symbol ??\n tokenMetadata?.symbol ??\n transactionGroup.contractTokenMetadata?.symbol;\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n return {\n direction,\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(tokenAmount ? { amount: tokenAmount } : {}),\n ...(decimals === undefined ? {} : { decimals }),\n };\n };\n\n const status =\n transactionGroup.activityStatus ??\n getLocalTransactionStatus({\n primaryTransaction,\n initialTransaction,\n });\n const timestamp = primaryTime ?? initialTransaction.time;\n const hash = primaryHash ?? initialTransaction.hash ?? primaryId;\n const common = { chainId, status, timestamp, hash };\n\n switch (transactionType) {\n case TransactionType.simpleSend: {\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token: getNativeToken(initialTransaction, 'out'),\n },\n };\n }\n\n case TransactionType.swap:\n case TransactionType.swapAndSend:\n case TransactionType.bridge: {\n const { sourceToken, destinationToken } = transactionGroup;\n\n return {\n type: transactionType === TransactionType.bridge ? 'bridge' : 'swap',\n ...common,\n data: {\n from,\n sourceToken,\n destinationToken,\n fees,\n },\n };\n }\n\n case TransactionType.tokenMethodSafeTransferFrom:\n case TransactionType.tokenMethodTransfer:\n case TransactionType.tokenMethodTransferFrom: {\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token: getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: tokenContractAddress,\n }),\n },\n };\n }\n\n case TransactionType.lendingDeposit:\n case TransactionType.stakingDeposit:\n return {\n type:\n transactionType === TransactionType.stakingDeposit\n ? 'deposit'\n : 'lendingDeposit',\n ...common,\n data: {\n from,\n },\n };\n\n case TransactionType.incoming: {\n return {\n type: 'receive',\n ...common,\n data: {\n from,\n to,\n token: transferInformation?.contractAddress\n ? getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: transferInformation.contractAddress,\n })\n : getNativeToken(initialTransaction, 'in'),\n },\n };\n }\n case TransactionType.musdClaim:\n return {\n type: 'claimMusdBonus',\n ...common,\n data: {\n from,\n },\n };\n\n case TransactionType.musdConversion: {\n let conversionAmount: string | undefined;\n\n if (txData && txData.length >= 138) {\n try {\n conversionAmount = BigInt(`0x${txData.slice(74, 138)}`).toString();\n } catch {\n conversionAmount = undefined;\n }\n }\n\n return {\n type: 'convert',\n ...common,\n data: {\n from,\n sourceToken: transactionGroup.sourceToken,\n destinationToken: getContractTokenWithKnownMetadata({\n amount: conversionAmount,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: to,\n }),\n },\n };\n }\n\n case TransactionType.bridgeApproval:\n case TransactionType.shieldSubscriptionApprove:\n case TransactionType.swapApproval:\n case TransactionType.tokenMethodSetApprovalForAll:\n case TransactionType.tokenMethodApprove:\n case TransactionType.tokenMethodIncreaseAllowance: {\n const approvalToken = getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: tokenContractAddress,\n });\n\n return {\n type:\n transactionType === TransactionType.tokenMethodIncreaseAllowance\n ? 'increaseSpendingCap'\n : 'approveSpendingCap',\n ...common,\n data: {\n from,\n token: approvalToken,\n },\n };\n }\n\n case TransactionType.perpsDeposit:\n case TransactionType.perpsDepositAndOrder:\n case TransactionType.perpsWithdraw: {\n const token = to\n ? {\n direction: 'out' as const,\n assetId: formatAddressToAssetId(to, chainId),\n }\n : undefined;\n\n const fiat = metamaskPay?.targetFiat\n ? { amount: metamaskPay.targetFiat }\n : undefined;\n const networkFee =\n typeof metamaskPay?.networkFeeFiat === 'string'\n ? { amount: metamaskPay.networkFeeFiat }\n : undefined;\n\n return {\n type:\n transactionType === TransactionType.perpsWithdraw\n ? 'perpsWithdraw'\n : 'perpsAddFunds',\n ...common,\n data: {\n from,\n token,\n fiat,\n networkFee,\n },\n };\n }\n\n default: {\n const isSupplyContractInteraction =\n transactionType === TransactionType.contractInteraction &&\n methodId &&\n supplyMethodIds.has(methodId.toLowerCase());\n const isWithdrawContractInteraction =\n transactionType === TransactionType.contractInteraction &&\n methodId &&\n withdrawMethodIds.has(methodId.toLowerCase());\n\n let hasNativeValue = false;\n\n try {\n hasNativeValue = BigInt(txValue ?? '0') > 0n;\n } catch {\n hasNativeValue = false;\n }\n\n // Confirm an outflow before labelling a supply, mirroring the API mapper's\n // `sentTransfer` guard: native stakes (e.g. Lido) decrease the native\n // balance, while ERC-20 supplies (e.g. Aave) show a token decrease.\n const isSupply =\n isSupplyContractInteraction &&\n (simulationData?.nativeBalanceChange?.isDecrease === true ||\n simulationData?.tokenBalanceChanges?.some(\n ({ isDecrease, standard }) => isDecrease && standard === 'erc20',\n ) === true);\n const incomingNftBalanceChange =\n transactionType === TransactionType.contractInteraction &&\n simulationData?.tokenBalanceChanges?.find(\n ({ isDecrease, standard }) => !isDecrease && isNftStandard(standard),\n );\n\n if (incomingNftBalanceChange && hasNativeValue) {\n // Keep this mapper thin: classify the activity as an NFT buy and let the\n // API mapper provide the token/payment details.\n return {\n type: 'nftBuy',\n ...common,\n data: {\n from,\n },\n };\n }\n\n if (isSupply) {\n return {\n type: 'lendingDeposit',\n ...common,\n data: {\n from,\n },\n };\n }\n\n // lending withdrawal - applies to Earn features only\n if (isWithdrawContractInteraction) {\n const fromAddress = from.toLowerCase();\n const receivedTokenLog = (txReceipt?.logs ?? []).find(\n ({ topics: [eventTopic, , logTo] = [] }) => {\n const toAddress = logTo\n ? `0x${logTo.slice(-40)}`.toLowerCase()\n : undefined;\n\n return (\n eventTopic?.toLowerCase() === tokenTransferLogTopicHash &&\n toAddress === fromAddress\n );\n },\n );\n let receivedAmount: string | undefined;\n\n if (receivedTokenLog) {\n try {\n receivedAmount = BigInt(String(receivedTokenLog.data)).toString();\n } catch {\n receivedAmount = undefined;\n }\n }\n\n const destinationToken = receivedTokenLog\n ? getContractTokenWithKnownMetadata({\n amount: receivedAmount,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: receivedTokenLog.address,\n })\n : undefined;\n\n return {\n type: 'lendingWithdrawal',\n ...common,\n data: {\n from,\n destinationToken,\n },\n };\n }\n\n // wrap and unwrap\n if (transactionType === TransactionType.contractInteraction && methodId) {\n const wrappedTokenAddress =\n swapsWrappedTokensAddresses[\n initialTransaction.chainId as keyof typeof swapsWrappedTokensAddresses\n ];\n\n if (wrappedTokenAddress && equalsIgnoreCase(to, wrappedTokenAddress)) {\n const normalizedMethodId = methodId.toLowerCase();\n\n if (wrapMethodIds.has(normalizedMethodId)) {\n try {\n if (txValue && BigInt(txValue) > 0n) {\n return {\n type: 'wrap',\n ...common,\n data: {\n from,\n sourceToken: getNativeToken(initialTransaction, 'out'),\n destinationToken: getContractTokenWithKnownMetadata({\n amount: txValue,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: wrappedTokenAddress,\n }),\n },\n };\n }\n } catch {\n // Invalid native value — fall through.\n }\n }\n\n if (unwrapMethodIds.has(normalizedMethodId)) {\n let unwrapAmount: string | undefined;\n\n if (txData && txData.length >= 74) {\n try {\n unwrapAmount = BigInt(`0x${txData.slice(10, 74)}`).toString();\n } catch {\n unwrapAmount = undefined;\n }\n }\n\n const nativeToken = getNativeToken(initialTransaction, 'in');\n\n return {\n type: 'unwrap',\n ...common,\n data: {\n from,\n sourceToken: getContractTokenWithKnownMetadata({\n amount: unwrapAmount,\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: wrappedTokenAddress,\n }),\n destinationToken: unwrapAmount\n ? {\n ...(nativeToken ?? {\n direction: 'in' as const,\n assetType: 'native' as const,\n decimals: evmNativeDecimals,\n }),\n amount: unwrapAmount,\n }\n : nativeToken,\n },\n };\n }\n }\n }\n\n const token = ((): TokenAmount | undefined => {\n if (txValue === undefined || txValue === '') {\n return undefined;\n }\n\n try {\n return BigInt(txValue) > 0n\n ? getNativeToken(initialTransaction, 'out')\n : undefined;\n } catch {\n return undefined;\n }\n })();\n\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n ...(token ? { token } : {}),\n methodId,\n },\n };\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/client-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0-preview-f48a87ac7",
|
|
4
4
|
"description": "Shared functions and utilities used across MetaMask clients (extension and mobile)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|
|
@@ -59,6 +59,7 @@
|
|
|
59
59
|
"@metamask/controller-utils": "^12.3.0",
|
|
60
60
|
"@metamask/core-backend": "^8.0.0",
|
|
61
61
|
"@metamask/keyring-api": "^23.7.0",
|
|
62
|
+
"@metamask/slip44": "^4.3.0",
|
|
62
63
|
"@metamask/transaction-controller": "^69.3.0",
|
|
63
64
|
"@metamask/utils": "^11.11.0"
|
|
64
65
|
},
|