@metamask-previews/client-utils 1.2.1-preview-6cd1bb2f5 → 1.3.0-preview-0b2e3c9b4
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 +20 -1
- package/README.md +4 -0
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/mappers/api-transaction-mapper.cjs +64 -74
- package/dist/mappers/api-transaction-mapper.cjs.map +1 -1
- package/dist/mappers/api-transaction-mapper.d.cts.map +1 -1
- package/dist/mappers/api-transaction-mapper.d.mts.map +1 -1
- package/dist/mappers/api-transaction-mapper.mjs +65 -75
- package/dist/mappers/api-transaction-mapper.mjs.map +1 -1
- package/dist/mappers/helpers/caip.cjs +5 -41
- package/dist/mappers/helpers/caip.cjs.map +1 -1
- package/dist/mappers/helpers/caip.d.cts +0 -14
- package/dist/mappers/helpers/caip.d.cts.map +1 -1
- package/dist/mappers/helpers/caip.d.mts +0 -14
- package/dist/mappers/helpers/caip.d.mts.map +1 -1
- package/dist/mappers/helpers/caip.mjs +4 -39
- package/dist/mappers/helpers/caip.mjs.map +1 -1
- package/dist/mappers/helpers/transactions.cjs +37 -27
- package/dist/mappers/helpers/transactions.cjs.map +1 -1
- package/dist/mappers/helpers/transactions.d.cts +1 -1
- package/dist/mappers/helpers/transactions.d.cts.map +1 -1
- package/dist/mappers/helpers/transactions.d.mts +1 -1
- package/dist/mappers/helpers/transactions.d.mts.map +1 -1
- package/dist/mappers/helpers/transactions.mjs +38 -28
- package/dist/mappers/helpers/transactions.mjs.map +1 -1
- package/dist/mappers/local-transaction-mapper.cjs +26 -12
- 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 +27 -13
- package/dist/mappers/local-transaction-mapper.mjs.map +1 -1
- package/dist/mappers/ramps-order-mapper.cjs +94 -0
- package/dist/mappers/ramps-order-mapper.cjs.map +1 -0
- package/dist/mappers/ramps-order-mapper.d.cts +48 -0
- package/dist/mappers/ramps-order-mapper.d.cts.map +1 -0
- package/dist/mappers/ramps-order-mapper.d.mts +48 -0
- package/dist/mappers/ramps-order-mapper.d.mts.map +1 -0
- package/dist/mappers/ramps-order-mapper.mjs +90 -0
- package/dist/mappers/ramps-order-mapper.mjs.map +1 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +34 -4
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +34 -4
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.withFallbackTokenAssetId = exports.getTokenMetadataFromKnownToken = exports.getTokenAmountFromTransfer = exports.parseValueTransfers = exports.getNftPaymentTransfer = exports.isNftStandard = exports.getLocalTransactionStatus = exports.getLocalTransactionFees = exports.getFees = void 0;
|
|
4
4
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
5
5
|
const transaction_controller_1 = require("@metamask/transaction-controller");
|
|
6
|
-
const constants_js_1 = require("../constants.cjs");
|
|
7
6
|
const caip_js_1 = require("./caip.cjs");
|
|
8
7
|
const token_metadata_js_1 = require("./token-metadata.cjs");
|
|
9
8
|
const nativeTokenDecimals = 18;
|
|
@@ -18,24 +17,35 @@ function toNetworkFeeAmount(gasUsed, gasPrice) {
|
|
|
18
17
|
return undefined;
|
|
19
18
|
}
|
|
20
19
|
}
|
|
21
|
-
function buildBaseNetworkFee(amount
|
|
22
|
-
const nativeAsset = (0, caip_js_1.getNativeAsset)(chainId);
|
|
20
|
+
function buildBaseNetworkFee(amount) {
|
|
23
21
|
return {
|
|
24
22
|
type: 'base',
|
|
25
23
|
amount,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
: { decimals: nativeAsset.decimals }),
|
|
29
|
-
...(nativeAsset?.symbol ? { symbol: nativeAsset.symbol } : {}),
|
|
30
|
-
...(nativeAsset?.assetId ? { assetId: nativeAsset.assetId } : {}),
|
|
24
|
+
decimals: nativeTokenDecimals,
|
|
25
|
+
assetType: 'native',
|
|
31
26
|
};
|
|
32
27
|
}
|
|
33
|
-
function
|
|
28
|
+
function getAssetTypeFromTransferType(transferType) {
|
|
29
|
+
if (transferType === 'normal' || transferType === 'internal') {
|
|
30
|
+
return 'native';
|
|
31
|
+
}
|
|
32
|
+
if (transferType === 'erc20') {
|
|
33
|
+
return 'erc20';
|
|
34
|
+
}
|
|
35
|
+
if (transferType === controller_utils_1.ERC721.toLowerCase() || transferType === 'erc721') {
|
|
36
|
+
return 'erc721';
|
|
37
|
+
}
|
|
38
|
+
if (transferType === controller_utils_1.ERC1155.toLowerCase() || transferType === 'erc1155') {
|
|
39
|
+
return 'erc1155';
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
function getNetworkFee(transaction) {
|
|
34
44
|
const amount = toNetworkFeeAmount(transaction.gasUsed, transaction.effectiveGasPrice);
|
|
35
|
-
return amount ? buildBaseNetworkFee(amount
|
|
45
|
+
return amount ? buildBaseNetworkFee(amount) : undefined;
|
|
36
46
|
}
|
|
37
|
-
function getFees(transaction
|
|
38
|
-
const networkFee = getNetworkFee(transaction
|
|
47
|
+
function getFees(transaction) {
|
|
48
|
+
const networkFee = getNetworkFee(transaction);
|
|
39
49
|
return networkFee ? [networkFee] : undefined;
|
|
40
50
|
}
|
|
41
51
|
exports.getFees = getFees;
|
|
@@ -43,9 +53,7 @@ function getLocalTransactionFees(transactionGroup) {
|
|
|
43
53
|
const { primaryTransaction } = transactionGroup;
|
|
44
54
|
const amount = toNetworkFeeAmount(primaryTransaction.txReceipt?.gasUsed, primaryTransaction.txReceipt?.effectiveGasPrice ??
|
|
45
55
|
primaryTransaction.txParams?.gasPrice);
|
|
46
|
-
return amount
|
|
47
|
-
? [buildBaseNetworkFee(amount, primaryTransaction.chainId)]
|
|
48
|
-
: undefined;
|
|
56
|
+
return amount ? [buildBaseNetworkFee(amount)] : undefined;
|
|
49
57
|
}
|
|
50
58
|
exports.getLocalTransactionFees = getLocalTransactionFees;
|
|
51
59
|
const inProgressTransactionStatuses = [
|
|
@@ -136,14 +144,11 @@ function getNftPaymentTransfer({ side, sentTransfer, receivedTransfer, sentNativ
|
|
|
136
144
|
return undefined;
|
|
137
145
|
}
|
|
138
146
|
exports.getNftPaymentTransfer = getNftPaymentTransfer;
|
|
139
|
-
const resolveAssetId = (chainId,
|
|
140
|
-
if (contractAddress) {
|
|
141
|
-
return
|
|
142
|
-
}
|
|
143
|
-
if (transferType === 'normal' || transferType === 'internal') {
|
|
144
|
-
return (0, caip_js_1.formatAddressToAssetId)(constants_js_1.nativeTokenAddress, chainId);
|
|
147
|
+
const resolveAssetId = (chainId, contractAddress) => {
|
|
148
|
+
if (!contractAddress) {
|
|
149
|
+
return undefined;
|
|
145
150
|
}
|
|
146
|
-
return
|
|
151
|
+
return (0, caip_js_1.formatAddressToAssetId)(contractAddress, chainId);
|
|
147
152
|
};
|
|
148
153
|
/**
|
|
149
154
|
* Resolves the user's primary send and receive legs from indexed value transfers.
|
|
@@ -184,18 +189,17 @@ function getTokenAmountFromTransfer(transfer, direction, chainId) {
|
|
|
184
189
|
return undefined;
|
|
185
190
|
}
|
|
186
191
|
const assetId = transfer && !isNftTransfer
|
|
187
|
-
? resolveAssetId(chainId,
|
|
188
|
-
contractAddress: transfer.contractAddress,
|
|
189
|
-
transferType: transfer.transferType,
|
|
190
|
-
})
|
|
192
|
+
? resolveAssetId(chainId, transfer.contractAddress)
|
|
191
193
|
: undefined;
|
|
192
194
|
const hasTransferAmount = !isNftTransfer && amount !== null && amount !== undefined;
|
|
195
|
+
const assetType = getAssetTypeFromTransferType(transferType);
|
|
193
196
|
return {
|
|
194
197
|
direction,
|
|
195
198
|
...(hasTransferAmount ? { amount: String(amount) } : {}),
|
|
196
199
|
...(transfer.decimal === undefined ? {} : { decimals: transfer.decimal }),
|
|
197
200
|
...(symbol ? { symbol } : {}),
|
|
198
201
|
...(assetId ? { assetId } : {}),
|
|
202
|
+
...(assetType ? { assetType } : {}),
|
|
199
203
|
};
|
|
200
204
|
}
|
|
201
205
|
exports.getTokenAmountFromTransfer = getTokenAmountFromTransfer;
|
|
@@ -206,6 +210,7 @@ function getTokenMetadataFromKnownToken(contractAddress, direction, chainId) {
|
|
|
206
210
|
}
|
|
207
211
|
return {
|
|
208
212
|
direction,
|
|
213
|
+
assetType: 'erc20',
|
|
209
214
|
...(tokenMetadata.symbol ? { symbol: tokenMetadata.symbol } : {}),
|
|
210
215
|
...(tokenMetadata.decimals === undefined
|
|
211
216
|
? {}
|
|
@@ -227,6 +232,7 @@ function withFallbackTokenAssetId(token, fallbackContractAddress, transferType,
|
|
|
227
232
|
if (!token ||
|
|
228
233
|
token.assetId ||
|
|
229
234
|
transferType === 'normal' ||
|
|
235
|
+
transferType === 'internal' ||
|
|
230
236
|
!fallbackContractAddress) {
|
|
231
237
|
return token;
|
|
232
238
|
}
|
|
@@ -234,7 +240,11 @@ function withFallbackTokenAssetId(token, fallbackContractAddress, transferType,
|
|
|
234
240
|
if (!assetId) {
|
|
235
241
|
return token;
|
|
236
242
|
}
|
|
237
|
-
return {
|
|
243
|
+
return {
|
|
244
|
+
...token,
|
|
245
|
+
assetId,
|
|
246
|
+
assetType: token.assetType,
|
|
247
|
+
};
|
|
238
248
|
}
|
|
239
249
|
exports.withFallbackTokenAssetId = withFallbackTokenAssetId;
|
|
240
250
|
//# sourceMappingURL=transactions.cjs.map
|
|
@@ -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 { Fee, Status, TokenAmount, ValueTransfer } from '../../types.js';\nimport { nativeTokenAddress } from '../constants.js';\nimport { formatAddressToAssetId, getNativeAsset } 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, chainId: string | number): Fee {\n const nativeAsset = getNativeAsset(chainId);\n\n return {\n type: 'base',\n amount,\n ...(nativeAsset?.decimals === undefined\n ? { decimals: nativeTokenDecimals }\n : { decimals: nativeAsset.decimals }),\n ...(nativeAsset?.symbol ? { symbol: nativeAsset.symbol } : {}),\n ...(nativeAsset?.assetId ? { assetId: nativeAsset.assetId } : {}),\n };\n}\n\nfunction getNetworkFee(\n transaction: V1TransactionByHashResponse,\n chainId: string,\n): Fee | undefined {\n const amount = toNetworkFeeAmount(\n transaction.gasUsed,\n transaction.effectiveGasPrice,\n );\n\n return amount ? buildBaseNetworkFee(amount, chainId) : undefined;\n}\n\nexport function getFees(\n transaction: V1TransactionByHashResponse,\n chainId: string,\n): Fee[] | undefined {\n const networkFee = getNetworkFee(transaction, chainId);\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\n ? [buildBaseNetworkFee(amount, primaryTransaction.chainId)]\n : 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 {\n contractAddress,\n transferType,\n }: {\n contractAddress?: string;\n transferType?: string;\n },\n): string | undefined => {\n if (contractAddress) {\n return formatAddressToAssetId(contractAddress, chainId);\n }\n\n if (transferType === 'normal' || transferType === 'internal') {\n return formatAddressToAssetId(nativeTokenAddress, chainId);\n }\n\n return undefined;\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, {\n contractAddress: transfer.contractAddress,\n transferType: transfer.transferType,\n })\n : undefined;\n\n const hasTransferAmount =\n !isNftTransfer && amount !== null && amount !== undefined;\n\n return {\n direction,\n ...(hasTransferAmount ? { amount: String(amount) } : {}),\n ...(transfer.decimal === undefined ? {} : { decimals: transfer.decimal }),\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\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 ...(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 !fallbackContractAddress\n ) {\n return token;\n }\n\n const assetId = formatAddressToAssetId(fallbackContractAddress, chainId);\n if (!assetId) {\n return token;\n }\n\n return { ...token, assetId };\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 { 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"]}
|
|
@@ -12,7 +12,7 @@ export type TransactionGroup = {
|
|
|
12
12
|
primaryTransaction: TransactionMeta;
|
|
13
13
|
transactions: TransactionMeta[];
|
|
14
14
|
};
|
|
15
|
-
export declare function getFees(transaction: V1TransactionByHashResponse
|
|
15
|
+
export declare function getFees(transaction: V1TransactionByHashResponse): Fee[] | undefined;
|
|
16
16
|
export declare function getLocalTransactionFees(transactionGroup: Pick<TransactionGroup, 'primaryTransaction'>): Fee[] | undefined;
|
|
17
17
|
export declare function getLocalTransactionStatus({ primaryTransaction, initialTransaction, }: {
|
|
18
18
|
primaryTransaction: TransactionGroup['primaryTransaction'];
|
|
@@ -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,
|
|
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;AAKxB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,eAAe,GAAG;QAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACvE,KAAK,EAAE,GAAG,CAAC;IACX,kBAAkB,EAAE,eAAe,CAAC;IACpC,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AA6DF,wBAAgB,OAAO,CACrB,WAAW,EAAE,2BAA2B,GACvC,GAAG,EAAE,GAAG,SAAS,CAInB;AAED,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,GAC7D,GAAG,EAAE,GAAG,SAAS,CASnB;AAqCD,wBAAgB,yBAAyB,CAAC,EACxC,kBAAkB,EAClB,kBAAkB,GACnB,EAAE;IACD,kBAAkB,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IAC3D,kBAAkB,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;CAC5D,GAAG,MAAM,CA4CT;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EACJ,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,GACf,EAAE;IACD,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,gBAAgB,CAAC,EAAE,aAAa,CAAC;IACjC,kBAAkB,CAAC,EAAE,aAAa,CAAC;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,aAAa,GAAG,SAAS,CAsC5B;AAaD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,aAAa,EAAE,GAAG,SAAS,EAC3C,cAAc,EAAE,MAAM,GACrB;IACD,YAAY,EAAE,aAAa,GAAG,SAAS,CAAC;IACxC,gBAAgB,EAAE,aAAa,GAAG,SAAS,CAAC;IAC5C,kBAAkB,EAAE,aAAa,GAAG,SAAS,CAAC;IAC9C,eAAe,EAAE,aAAa,GAAG,SAAS,CAAC;IAC3C,mBAAmB,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD,CAgCA;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,EACnC,OAAO,EAAE,WAAW,GACnB,WAAW,GAAG,SAAS,CAgCzB;AAED,wBAAgB,8BAA8B,CAC5C,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,EACnC,OAAO,EAAE,WAAW,GACnB,WAAW,GAAG,SAAS,CAgBzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,WAAW,GAAG,SAAS,EAC9B,uBAAuB,EAAE,MAAM,GAAG,SAAS,EAC3C,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,OAAO,EAAE,WAAW,GACnB,WAAW,GAAG,SAAS,CAqBzB"}
|
|
@@ -12,7 +12,7 @@ export type TransactionGroup = {
|
|
|
12
12
|
primaryTransaction: TransactionMeta;
|
|
13
13
|
transactions: TransactionMeta[];
|
|
14
14
|
};
|
|
15
|
-
export declare function getFees(transaction: V1TransactionByHashResponse
|
|
15
|
+
export declare function getFees(transaction: V1TransactionByHashResponse): Fee[] | undefined;
|
|
16
16
|
export declare function getLocalTransactionFees(transactionGroup: Pick<TransactionGroup, 'primaryTransaction'>): Fee[] | undefined;
|
|
17
17
|
export declare function getLocalTransactionStatus({ primaryTransaction, initialTransaction, }: {
|
|
18
18
|
primaryTransaction: TransactionGroup['primaryTransaction'];
|
|
@@ -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,
|
|
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;AAKxB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,eAAe,GAAG;QAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACvE,KAAK,EAAE,GAAG,CAAC;IACX,kBAAkB,EAAE,eAAe,CAAC;IACpC,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AA6DF,wBAAgB,OAAO,CACrB,WAAW,EAAE,2BAA2B,GACvC,GAAG,EAAE,GAAG,SAAS,CAInB;AAED,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,GAC7D,GAAG,EAAE,GAAG,SAAS,CASnB;AAqCD,wBAAgB,yBAAyB,CAAC,EACxC,kBAAkB,EAClB,kBAAkB,GACnB,EAAE;IACD,kBAAkB,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IAC3D,kBAAkB,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;CAC5D,GAAG,MAAM,CA4CT;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EACJ,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,GACf,EAAE;IACD,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,gBAAgB,CAAC,EAAE,aAAa,CAAC;IACjC,kBAAkB,CAAC,EAAE,aAAa,CAAC;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,aAAa,GAAG,SAAS,CAsC5B;AAaD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,aAAa,EAAE,GAAG,SAAS,EAC3C,cAAc,EAAE,MAAM,GACrB;IACD,YAAY,EAAE,aAAa,GAAG,SAAS,CAAC;IACxC,gBAAgB,EAAE,aAAa,GAAG,SAAS,CAAC;IAC5C,kBAAkB,EAAE,aAAa,GAAG,SAAS,CAAC;IAC9C,eAAe,EAAE,aAAa,GAAG,SAAS,CAAC;IAC3C,mBAAmB,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD,CAgCA;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,EACnC,OAAO,EAAE,WAAW,GACnB,WAAW,GAAG,SAAS,CAgCzB;AAED,wBAAgB,8BAA8B,CAC5C,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,EACnC,OAAO,EAAE,WAAW,GACnB,WAAW,GAAG,SAAS,CAgBzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,WAAW,GAAG,SAAS,EAC9B,uBAAuB,EAAE,MAAM,GAAG,SAAS,EAC3C,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,OAAO,EAAE,WAAW,GACnB,WAAW,GAAG,SAAS,CAqBzB"}
|
|
@@ -1,7 +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 {
|
|
4
|
-
import { formatAddressToAssetId, getNativeAsset } from "./caip.mjs";
|
|
3
|
+
import { formatAddressToAssetId } from "./caip.mjs";
|
|
5
4
|
import { getKnownTokenMetadata } from "./token-metadata.mjs";
|
|
6
5
|
const nativeTokenDecimals = 18;
|
|
7
6
|
function toNetworkFeeAmount(gasUsed, gasPrice) {
|
|
@@ -15,33 +14,42 @@ function toNetworkFeeAmount(gasUsed, gasPrice) {
|
|
|
15
14
|
return undefined;
|
|
16
15
|
}
|
|
17
16
|
}
|
|
18
|
-
function buildBaseNetworkFee(amount
|
|
19
|
-
const nativeAsset = getNativeAsset(chainId);
|
|
17
|
+
function buildBaseNetworkFee(amount) {
|
|
20
18
|
return {
|
|
21
19
|
type: 'base',
|
|
22
20
|
amount,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
: { decimals: nativeAsset.decimals }),
|
|
26
|
-
...(nativeAsset?.symbol ? { symbol: nativeAsset.symbol } : {}),
|
|
27
|
-
...(nativeAsset?.assetId ? { assetId: nativeAsset.assetId } : {}),
|
|
21
|
+
decimals: nativeTokenDecimals,
|
|
22
|
+
assetType: 'native',
|
|
28
23
|
};
|
|
29
24
|
}
|
|
30
|
-
function
|
|
25
|
+
function getAssetTypeFromTransferType(transferType) {
|
|
26
|
+
if (transferType === 'normal' || transferType === 'internal') {
|
|
27
|
+
return 'native';
|
|
28
|
+
}
|
|
29
|
+
if (transferType === 'erc20') {
|
|
30
|
+
return 'erc20';
|
|
31
|
+
}
|
|
32
|
+
if (transferType === ERC721.toLowerCase() || transferType === 'erc721') {
|
|
33
|
+
return 'erc721';
|
|
34
|
+
}
|
|
35
|
+
if (transferType === ERC1155.toLowerCase() || transferType === 'erc1155') {
|
|
36
|
+
return 'erc1155';
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
function getNetworkFee(transaction) {
|
|
31
41
|
const amount = toNetworkFeeAmount(transaction.gasUsed, transaction.effectiveGasPrice);
|
|
32
|
-
return amount ? buildBaseNetworkFee(amount
|
|
42
|
+
return amount ? buildBaseNetworkFee(amount) : undefined;
|
|
33
43
|
}
|
|
34
|
-
export function getFees(transaction
|
|
35
|
-
const networkFee = getNetworkFee(transaction
|
|
44
|
+
export function getFees(transaction) {
|
|
45
|
+
const networkFee = getNetworkFee(transaction);
|
|
36
46
|
return networkFee ? [networkFee] : undefined;
|
|
37
47
|
}
|
|
38
48
|
export function getLocalTransactionFees(transactionGroup) {
|
|
39
49
|
const { primaryTransaction } = transactionGroup;
|
|
40
50
|
const amount = toNetworkFeeAmount(primaryTransaction.txReceipt?.gasUsed, primaryTransaction.txReceipt?.effectiveGasPrice ??
|
|
41
51
|
primaryTransaction.txParams?.gasPrice);
|
|
42
|
-
return amount
|
|
43
|
-
? [buildBaseNetworkFee(amount, primaryTransaction.chainId)]
|
|
44
|
-
: undefined;
|
|
52
|
+
return amount ? [buildBaseNetworkFee(amount)] : undefined;
|
|
45
53
|
}
|
|
46
54
|
const inProgressTransactionStatuses = [
|
|
47
55
|
TransactionStatus.unapproved,
|
|
@@ -128,14 +136,11 @@ export function getNftPaymentTransfer({ side, sentTransfer, receivedTransfer, se
|
|
|
128
136
|
}
|
|
129
137
|
return undefined;
|
|
130
138
|
}
|
|
131
|
-
const resolveAssetId = (chainId,
|
|
132
|
-
if (contractAddress) {
|
|
133
|
-
return
|
|
134
|
-
}
|
|
135
|
-
if (transferType === 'normal' || transferType === 'internal') {
|
|
136
|
-
return formatAddressToAssetId(nativeTokenAddress, chainId);
|
|
139
|
+
const resolveAssetId = (chainId, contractAddress) => {
|
|
140
|
+
if (!contractAddress) {
|
|
141
|
+
return undefined;
|
|
137
142
|
}
|
|
138
|
-
return
|
|
143
|
+
return formatAddressToAssetId(contractAddress, chainId);
|
|
139
144
|
};
|
|
140
145
|
/**
|
|
141
146
|
* Resolves the user's primary send and receive legs from indexed value transfers.
|
|
@@ -175,18 +180,17 @@ export function getTokenAmountFromTransfer(transfer, direction, chainId) {
|
|
|
175
180
|
return undefined;
|
|
176
181
|
}
|
|
177
182
|
const assetId = transfer && !isNftTransfer
|
|
178
|
-
? resolveAssetId(chainId,
|
|
179
|
-
contractAddress: transfer.contractAddress,
|
|
180
|
-
transferType: transfer.transferType,
|
|
181
|
-
})
|
|
183
|
+
? resolveAssetId(chainId, transfer.contractAddress)
|
|
182
184
|
: undefined;
|
|
183
185
|
const hasTransferAmount = !isNftTransfer && amount !== null && amount !== undefined;
|
|
186
|
+
const assetType = getAssetTypeFromTransferType(transferType);
|
|
184
187
|
return {
|
|
185
188
|
direction,
|
|
186
189
|
...(hasTransferAmount ? { amount: String(amount) } : {}),
|
|
187
190
|
...(transfer.decimal === undefined ? {} : { decimals: transfer.decimal }),
|
|
188
191
|
...(symbol ? { symbol } : {}),
|
|
189
192
|
...(assetId ? { assetId } : {}),
|
|
193
|
+
...(assetType ? { assetType } : {}),
|
|
190
194
|
};
|
|
191
195
|
}
|
|
192
196
|
export function getTokenMetadataFromKnownToken(contractAddress, direction, chainId) {
|
|
@@ -196,6 +200,7 @@ export function getTokenMetadataFromKnownToken(contractAddress, direction, chain
|
|
|
196
200
|
}
|
|
197
201
|
return {
|
|
198
202
|
direction,
|
|
203
|
+
assetType: 'erc20',
|
|
199
204
|
...(tokenMetadata.symbol ? { symbol: tokenMetadata.symbol } : {}),
|
|
200
205
|
...(tokenMetadata.decimals === undefined
|
|
201
206
|
? {}
|
|
@@ -216,6 +221,7 @@ export function withFallbackTokenAssetId(token, fallbackContractAddress, transfe
|
|
|
216
221
|
if (!token ||
|
|
217
222
|
token.assetId ||
|
|
218
223
|
transferType === 'normal' ||
|
|
224
|
+
transferType === 'internal' ||
|
|
219
225
|
!fallbackContractAddress) {
|
|
220
226
|
return token;
|
|
221
227
|
}
|
|
@@ -223,6 +229,10 @@ export function withFallbackTokenAssetId(token, fallbackContractAddress, transfe
|
|
|
223
229
|
if (!assetId) {
|
|
224
230
|
return token;
|
|
225
231
|
}
|
|
226
|
-
return {
|
|
232
|
+
return {
|
|
233
|
+
...token,
|
|
234
|
+
assetId,
|
|
235
|
+
assetType: token.assetType,
|
|
236
|
+
};
|
|
227
237
|
}
|
|
228
238
|
//# sourceMappingURL=transactions.mjs.map
|
|
@@ -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 { Fee, Status, TokenAmount, ValueTransfer } from '../../types.js';\nimport { nativeTokenAddress } from '../constants.js';\nimport { formatAddressToAssetId, getNativeAsset } 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, chainId: string | number): Fee {\n const nativeAsset = getNativeAsset(chainId);\n\n return {\n type: 'base',\n amount,\n ...(nativeAsset?.decimals === undefined\n ? { decimals: nativeTokenDecimals }\n : { decimals: nativeAsset.decimals }),\n ...(nativeAsset?.symbol ? { symbol: nativeAsset.symbol } : {}),\n ...(nativeAsset?.assetId ? { assetId: nativeAsset.assetId } : {}),\n };\n}\n\nfunction getNetworkFee(\n transaction: V1TransactionByHashResponse,\n chainId: string,\n): Fee | undefined {\n const amount = toNetworkFeeAmount(\n transaction.gasUsed,\n transaction.effectiveGasPrice,\n );\n\n return amount ? buildBaseNetworkFee(amount, chainId) : undefined;\n}\n\nexport function getFees(\n transaction: V1TransactionByHashResponse,\n chainId: string,\n): Fee[] | undefined {\n const networkFee = getNetworkFee(transaction, chainId);\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\n ? [buildBaseNetworkFee(amount, primaryTransaction.chainId)]\n : 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 {\n contractAddress,\n transferType,\n }: {\n contractAddress?: string;\n transferType?: string;\n },\n): string | undefined => {\n if (contractAddress) {\n return formatAddressToAssetId(contractAddress, chainId);\n }\n\n if (transferType === 'normal' || transferType === 'internal') {\n return formatAddressToAssetId(nativeTokenAddress, chainId);\n }\n\n return undefined;\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, {\n contractAddress: transfer.contractAddress,\n transferType: transfer.transferType,\n })\n : undefined;\n\n const hasTransferAmount =\n !isNftTransfer && amount !== null && amount !== undefined;\n\n return {\n direction,\n ...(hasTransferAmount ? { amount: String(amount) } : {}),\n ...(transfer.decimal === undefined ? {} : { decimals: transfer.decimal }),\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\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 ...(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 !fallbackContractAddress\n ) {\n return token;\n }\n\n const assetId = formatAddressToAssetId(fallbackContractAddress, chainId);\n if (!assetId) {\n return token;\n }\n\n return { ...token, assetId };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transactions.mjs","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,OAAO,EACP,sBAAsB,IAAI,gBAAgB,EAC3C,mCAAmC;AAGpC,OAAO,EACL,iBAAiB,EACjB,eAAe,EAChB,yCAAyC;AAU1C,OAAO,EAAE,sBAAsB,EAAE,mBAAkB;AACnD,OAAO,EAAE,qBAAqB,EAAE,6BAA4B;AAY5D,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,SAAS,kBAAkB,CACzB,OAAoC,EACpC,QAAqC;IAErC,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,MAAM;QACN,QAAQ,EAAE,mBAAmB;QAC7B,SAAS,EAAE,QAAQ;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CACnC,YAAgC;IAEhC,IAAI,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAC7D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,YAAY,KAAK,MAAM,CAAC,WAAW,EAAE,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QACvE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,YAAY,KAAK,OAAO,CAAC,WAAW,EAAE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CACpB,WAAwC;IAExC,MAAM,MAAM,GAAG,kBAAkB,CAC/B,WAAW,CAAC,OAAO,EACnB,WAAW,CAAC,iBAAiB,CAC9B,CAAC;IAEF,OAAO,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,WAAwC;IAExC,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE9C,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,gBAA8D;IAE9D,MAAM,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,CAAC;IAChD,MAAM,MAAM,GAAG,kBAAkB,CAC/B,kBAAkB,CAAC,SAAS,EAAE,OAAO,EACrC,kBAAkB,CAAC,SAAS,EAAE,iBAAiB;QAC7C,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CACxC,CAAC;IAEF,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,MAAM,6BAA6B,GAAG;IACpC,iBAAiB,CAAC,UAAU;IAC5B,iBAAiB,CAAC,QAAQ;IAC1B,iBAAiB,CAAC,MAAM;IACxB,iBAAiB,CAAC,SAAS;CAC5B,CAAC;AAEF,MAAM,+BAA+B,GAAG,WAAW,CAAC;AAEpD,MAAM,sBAAsB,GAAG;IAC7B,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACV,CAAC;AAEX,SAAS,uBAAuB,CAC9B,WAAmD;IAEnD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;IACrC,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC;IAEpD,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QAC5B,OAAO,iBAAiB,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,IACE,MAAM,KAAK,iBAAiB,CAAC,SAAS;QACtC,IAAI,KAAK,eAAe,CAAC,MAAM,EAC/B,CAAC;QACD,OAAO,+BAA+B,CAAC;IACzC,CAAC;IAED,OAAO,WAAW,CAAC,MAAM,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,EACxC,kBAAkB,EAClB,kBAAkB,GAInB;IACC,IAAI,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAA4B,CAAC;QAEpE,IAAI,WAAW,KAAK,sBAAsB,CAAC,OAAO,EAAE,CAAC;YACnD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,WAAW,KAAK,sBAAsB,CAAC,OAAO,EAAE,CAAC;YACnD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,WAAW,KAAK,sBAAsB,CAAC,SAAS,EAAE,CAAC;YACrD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IAE9D,IAAI,SAAS,KAAK,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IACE,SAAS,KAAK,iBAAiB,CAAC,SAAS;QACzC,SAAS,KAAK,+BAA+B;QAC7C,SAAS,KAAK,iBAAiB,CAAC,OAAO;QACvC,SAAS,KAAK,iBAAiB,CAAC,MAAM;QACtC,SAAS,KAAK,iBAAiB,CAAC,QAAQ,EACxC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IACE,6BAA6B,CAAC,QAAQ,CACpC,SAA2D,CAC5D,EACD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,KAAK,MAAM,CAAC,WAAW,EAAE,IAAI,KAAK,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EACpC,IAAI,EACJ,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,GAUf;IACC,MAAM,UAAU,GAAG,CAAC,QAAwB,EAAW,EAAE,CACvD,OAAO,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAE7D,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,KAAK,MAAM,QAAQ,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvC,SAAS;YACX,CAAC;YAED,0EAA0E;YAC1E,0EAA0E;YAC1E,uEAAuE;YACvE,IACE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;gBAC9C,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,aAAuB,CAAC,EACtD,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,gBAAgB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IACE,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,EAAE,eAAe,CAAC;QACxD,CAAC,eAAe;YACd,CAAC,gBAAgB,CAAC,eAAe,EAAE,cAAc,CAAC;YAClD,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,EAC3D,CAAC;QACD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,cAAc,GAAG,CACrB,OAAoB,EACpB,eAAmC,EACf,EAAE;IACtB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,sBAAsB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,cAA2C,EAC3C,cAAsB;IAQtB,MAAM,IAAI,GAAG,cAAc,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAC/C,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,CACvC,CAAC;IACF,MAAM,QAAQ,GAAG,cAAc,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CACjD,gBAAgB,CAAC,EAAE,EAAE,cAAc,CAAC,CACrC,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/B,MAAM,gBAAgB,GACpB,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,KAAK,YAAY,EAAE,MAAM,CAAC;QAC/D,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAEhB,MAAM,kBAAkB,GAAG,IAAI,EAAE,IAAI,CACnC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,YAAY,KAAK,QAAQ,CAChD,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CACtD,aAAa,CAAC,YAAY,CAAC,CAC5B,CAAC;IACF,MAAM,mBAAmB,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAC9D,aAAa,CAAC,YAAY,CAAC,CAC5B,CAAC;IAEF,OAAO;QACL,YAAY;QACZ,gBAAgB;QAChB,kBAAkB;QAClB,eAAe;QACf,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAAmC,EACnC,SAAmC,EACnC,OAAoB;IAEpB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAC1C,MAAM,aAAa,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,aAAa;QAC1B,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM;QAClC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IAEpB,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GACX,QAAQ,IAAI,CAAC,aAAa;QACxB,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC;QACnD,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,iBAAiB,GACrB,CAAC,aAAa,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,CAAC;IAC5D,MAAM,SAAS,GAAG,4BAA4B,CAAC,YAAY,CAAC,CAAC;IAE7D,OAAO;QACL,SAAS;QACT,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,eAAmC,EACnC,SAAmC,EACnC,OAAoB;IAEpB,MAAM,aAAa,GAAG,qBAAqB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAEtE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,SAAS;QACT,SAAS,EAAE,OAAO;QAClB,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,aAAa,CAAC,QAAQ,KAAK,SAAS;YACtC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC;QACzC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAA8B,EAC9B,uBAA2C,EAC3C,YAAgC,EAChC,OAAoB;IAEpB,IACE,CAAC,KAAK;QACN,KAAK,CAAC,OAAO;QACb,YAAY,KAAK,QAAQ;QACzB,YAAY,KAAK,UAAU;QAC3B,CAAC,uBAAuB,EACxB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IACzE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,GAAG,KAAK;QACR,OAAO;QACP,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;AACJ,CAAC","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"]}
|
|
@@ -30,20 +30,27 @@ function mapLocalTransaction(transactionGroup) {
|
|
|
30
30
|
? undefined
|
|
31
31
|
: (transferInformation?.contractAddress ?? (to || undefined));
|
|
32
32
|
const chainId = (0, utils_1.toCaipChainId)(utils_1.KnownCaipNamespace.Eip155, Number.parseInt(initialTransaction.chainId, 16).toString());
|
|
33
|
-
const
|
|
34
|
-
const nativeSymbol = transactionGroup.nativeAssetSymbol ?? nativeAsset?.symbol;
|
|
33
|
+
const nativeSymbol = transactionGroup.nativeAssetSymbol;
|
|
35
34
|
const getNativeToken = (transaction, direction) => {
|
|
36
|
-
|
|
35
|
+
const rawAmount = transaction.txParams.value;
|
|
36
|
+
let amount;
|
|
37
|
+
if (rawAmount) {
|
|
38
|
+
try {
|
|
39
|
+
amount = BigInt(rawAmount) > 0n ? rawAmount : undefined;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
amount = undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (!amount && nativeSymbol === undefined) {
|
|
37
46
|
return undefined;
|
|
38
47
|
}
|
|
39
48
|
return {
|
|
40
49
|
direction,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
...(nativeAsset?.assetId ? { assetId: nativeAsset.assetId } : {}),
|
|
46
|
-
decimals: nativeAsset?.decimals ?? evmNativeDecimals,
|
|
50
|
+
assetType: 'native',
|
|
51
|
+
decimals: evmNativeDecimals,
|
|
52
|
+
...(amount ? { amount } : {}),
|
|
53
|
+
...(nativeSymbol === undefined ? {} : { symbol: nativeSymbol }),
|
|
47
54
|
};
|
|
48
55
|
};
|
|
49
56
|
const getContractTokenFromTransaction = ({ contractAddress, direction, transaction, }) => {
|
|
@@ -71,7 +78,7 @@ function mapLocalTransaction(transactionGroup) {
|
|
|
71
78
|
const tokenMetadata = (0, token_metadata_js_1.getKnownTokenMetadata)(chainId, contractAddress);
|
|
72
79
|
const isWrappedNativeToken = (0, controller_utils_1.isEqualCaseInsensitive)(contractAddress, constants_js_1.swapsWrappedTokensAddresses[initialTransaction.chainId] || '');
|
|
73
80
|
const wrappedNativeTokenDecimals = isWrappedNativeToken
|
|
74
|
-
?
|
|
81
|
+
? evmNativeDecimals
|
|
75
82
|
: undefined;
|
|
76
83
|
const decimals = transaction.transferInformation?.amount === undefined
|
|
77
84
|
? (tokenMetadata?.decimals ??
|
|
@@ -382,8 +389,15 @@ function mapLocalTransaction(transactionGroup) {
|
|
|
382
389
|
direction: 'out',
|
|
383
390
|
contractAddress: wrappedTokenAddress,
|
|
384
391
|
}),
|
|
385
|
-
destinationToken:
|
|
386
|
-
? {
|
|
392
|
+
destinationToken: unwrapAmount
|
|
393
|
+
? {
|
|
394
|
+
...(nativeToken ?? {
|
|
395
|
+
direction: 'in',
|
|
396
|
+
assetType: 'native',
|
|
397
|
+
decimals: evmNativeDecimals,
|
|
398
|
+
}),
|
|
399
|
+
amount: unwrapAmount,
|
|
400
|
+
}
|
|
387
401
|
: nativeToken,
|
|
388
402
|
},
|
|
389
403
|
};
|