@metamask/client-utils 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/LICENSE +6 -0
- package/LICENSE.APACHE2 +201 -0
- package/LICENSE.MIT +21 -0
- package/README.md +15 -0
- package/dist/index.cjs +10 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +4 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mappers/api-transaction-mapper.cjs +300 -0
- package/dist/mappers/api-transaction-mapper.cjs.map +1 -0
- package/dist/mappers/api-transaction-mapper.d.cts +15 -0
- package/dist/mappers/api-transaction-mapper.d.cts.map +1 -0
- package/dist/mappers/api-transaction-mapper.d.mts +15 -0
- package/dist/mappers/api-transaction-mapper.d.mts.map +1 -0
- package/dist/mappers/api-transaction-mapper.mjs +296 -0
- package/dist/mappers/api-transaction-mapper.mjs.map +1 -0
- package/dist/mappers/constants.cjs +46 -0
- package/dist/mappers/constants.cjs.map +1 -0
- package/dist/mappers/constants.d.cts +25 -0
- package/dist/mappers/constants.d.cts.map +1 -0
- package/dist/mappers/constants.d.mts +25 -0
- package/dist/mappers/constants.d.mts.map +1 -0
- package/dist/mappers/constants.mjs +43 -0
- package/dist/mappers/constants.mjs.map +1 -0
- package/dist/mappers/helpers/caip.cjs +100 -0
- package/dist/mappers/helpers/caip.cjs.map +1 -0
- package/dist/mappers/helpers/caip.d.cts +32 -0
- package/dist/mappers/helpers/caip.d.cts.map +1 -0
- package/dist/mappers/helpers/caip.d.mts +32 -0
- package/dist/mappers/helpers/caip.d.mts.map +1 -0
- package/dist/mappers/helpers/caip.mjs +94 -0
- package/dist/mappers/helpers/caip.mjs.map +1 -0
- package/dist/mappers/helpers/token-metadata.cjs +31 -0
- package/dist/mappers/helpers/token-metadata.cjs.map +1 -0
- package/dist/mappers/helpers/token-metadata.d.cts +8 -0
- package/dist/mappers/helpers/token-metadata.d.cts.map +1 -0
- package/dist/mappers/helpers/token-metadata.d.mts +8 -0
- package/dist/mappers/helpers/token-metadata.d.mts.map +1 -0
- package/dist/mappers/helpers/token-metadata.mjs +31 -0
- package/dist/mappers/helpers/token-metadata.mjs.map +1 -0
- package/dist/mappers/helpers/transactions.cjs +240 -0
- package/dist/mappers/helpers/transactions.cjs.map +1 -0
- package/dist/mappers/helpers/transactions.d.cts +59 -0
- package/dist/mappers/helpers/transactions.d.cts.map +1 -0
- package/dist/mappers/helpers/transactions.d.mts +59 -0
- package/dist/mappers/helpers/transactions.d.mts.map +1 -0
- package/dist/mappers/helpers/transactions.mjs +228 -0
- package/dist/mappers/helpers/transactions.mjs.map +1 -0
- package/dist/mappers/keyring-transaction-mapper.cjs +143 -0
- package/dist/mappers/keyring-transaction-mapper.cjs.map +1 -0
- package/dist/mappers/keyring-transaction-mapper.d.cts +15 -0
- package/dist/mappers/keyring-transaction-mapper.d.cts.map +1 -0
- package/dist/mappers/keyring-transaction-mapper.d.mts +15 -0
- package/dist/mappers/keyring-transaction-mapper.d.mts.map +1 -0
- package/dist/mappers/keyring-transaction-mapper.mjs +139 -0
- package/dist/mappers/keyring-transaction-mapper.mjs.map +1 -0
- package/dist/mappers/local-transaction-mapper.cjs +420 -0
- package/dist/mappers/local-transaction-mapper.cjs.map +1 -0
- package/dist/mappers/local-transaction-mapper.d.cts +20 -0
- package/dist/mappers/local-transaction-mapper.d.cts.map +1 -0
- package/dist/mappers/local-transaction-mapper.d.mts +20 -0
- package/dist/mappers/local-transaction-mapper.d.mts.map +1 -0
- package/dist/mappers/local-transaction-mapper.mjs +416 -0
- package/dist/mappers/local-transaction-mapper.mjs.map +1 -0
- package/dist/types.cjs +3 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +73 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +73 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +2 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +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';\nimport { nativeTokenAddress } from '../constants';\nimport { formatAddressToAssetId, getNativeAsset } from './caip';\nimport { getKnownTokenMetadata } from './token-metadata';\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"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { V1TransactionByHashResponse } from "@metamask/core-backend";
|
|
2
|
+
import type { TransactionMeta } from "@metamask/transaction-controller";
|
|
3
|
+
import type { CaipChainId, Hex } from "@metamask/utils";
|
|
4
|
+
import type { Fee, Status, TokenAmount, ValueTransfer } from "../../types.cjs";
|
|
5
|
+
export type TransactionGroup = {
|
|
6
|
+
hasCancelled: boolean;
|
|
7
|
+
hasRetried: boolean;
|
|
8
|
+
initialTransaction: TransactionMeta & {
|
|
9
|
+
isSmartTransaction?: boolean;
|
|
10
|
+
};
|
|
11
|
+
nonce: Hex;
|
|
12
|
+
primaryTransaction: TransactionMeta;
|
|
13
|
+
transactions: TransactionMeta[];
|
|
14
|
+
};
|
|
15
|
+
export declare function getFees(transaction: V1TransactionByHashResponse, chainId: string): Fee[] | undefined;
|
|
16
|
+
export declare function getLocalTransactionFees(transactionGroup: Pick<TransactionGroup, 'primaryTransaction'>): Fee[] | undefined;
|
|
17
|
+
export declare function getLocalTransactionStatus({ primaryTransaction, initialTransaction, }: {
|
|
18
|
+
primaryTransaction: TransactionGroup['primaryTransaction'];
|
|
19
|
+
initialTransaction: TransactionGroup['initialTransaction'];
|
|
20
|
+
}): Status;
|
|
21
|
+
export declare function isNftStandard(value?: string): boolean;
|
|
22
|
+
export declare function getNftPaymentTransfer({ side, sentTransfer, receivedTransfer, sentNativeTransfer, nftCounterparty, transactionFrom, transactionTo, subjectAddress, }: {
|
|
23
|
+
side: 'buy' | 'sell';
|
|
24
|
+
sentTransfer?: ValueTransfer;
|
|
25
|
+
receivedTransfer?: ValueTransfer;
|
|
26
|
+
sentNativeTransfer?: ValueTransfer;
|
|
27
|
+
nftCounterparty: string;
|
|
28
|
+
transactionFrom?: string;
|
|
29
|
+
transactionTo?: string;
|
|
30
|
+
subjectAddress: string;
|
|
31
|
+
}): ValueTransfer | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Resolves the user's primary send and receive legs from indexed value transfers.
|
|
34
|
+
* Prefers a receive whose symbol differs from the sent leg so dust does not win.
|
|
35
|
+
*
|
|
36
|
+
* @param valueTransfers - Indexed value transfers from the Accounts API.
|
|
37
|
+
* @param subjectAddress - The account address to match transfers against.
|
|
38
|
+
* @returns The primary sent and received transfers for the account.
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseValueTransfers(valueTransfers: ValueTransfer[] | undefined, subjectAddress: string): {
|
|
41
|
+
sentTransfer: ValueTransfer | undefined;
|
|
42
|
+
receivedTransfer: ValueTransfer | undefined;
|
|
43
|
+
sentNativeTransfer: ValueTransfer | undefined;
|
|
44
|
+
sentNftTransfer: ValueTransfer | undefined;
|
|
45
|
+
receivedNftTransfer: ValueTransfer | undefined;
|
|
46
|
+
};
|
|
47
|
+
export declare function getTokenAmountFromTransfer(transfer: ValueTransfer | undefined, direction: TokenAmount['direction'], chainId: CaipChainId): TokenAmount | undefined;
|
|
48
|
+
export declare function getTokenMetadataFromKnownToken(contractAddress: string | undefined, direction: TokenAmount['direction'], chainId: CaipChainId): TokenAmount | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* When the transfer omits contractAddress, fall back to the indexed tx `to` field.
|
|
51
|
+
*
|
|
52
|
+
* @param token - Parsed token amount from the value transfer.
|
|
53
|
+
* @param fallbackContractAddress - Indexed transaction `to` address used as ERC-20 fallback.
|
|
54
|
+
* @param transferType - Value transfer type; native (`normal`) transfers skip the fallback.
|
|
55
|
+
* @param chainId - CAIP-2 chain id for asset id encoding.
|
|
56
|
+
* @returns Token amount with `assetId` set when a fallback address applies.
|
|
57
|
+
*/
|
|
58
|
+
export declare function withFallbackTokenAssetId(token: TokenAmount | undefined, fallbackContractAddress: string | undefined, transferType: string | undefined, chainId: CaipChainId): TokenAmount | undefined;
|
|
59
|
+
//# sourceMappingURL=transactions.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.d.cts","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { V1TransactionByHashResponse } from "@metamask/core-backend";
|
|
2
|
+
import type { TransactionMeta } from "@metamask/transaction-controller";
|
|
3
|
+
import type { CaipChainId, Hex } from "@metamask/utils";
|
|
4
|
+
import type { Fee, Status, TokenAmount, ValueTransfer } from "../../types.mjs";
|
|
5
|
+
export type TransactionGroup = {
|
|
6
|
+
hasCancelled: boolean;
|
|
7
|
+
hasRetried: boolean;
|
|
8
|
+
initialTransaction: TransactionMeta & {
|
|
9
|
+
isSmartTransaction?: boolean;
|
|
10
|
+
};
|
|
11
|
+
nonce: Hex;
|
|
12
|
+
primaryTransaction: TransactionMeta;
|
|
13
|
+
transactions: TransactionMeta[];
|
|
14
|
+
};
|
|
15
|
+
export declare function getFees(transaction: V1TransactionByHashResponse, chainId: string): Fee[] | undefined;
|
|
16
|
+
export declare function getLocalTransactionFees(transactionGroup: Pick<TransactionGroup, 'primaryTransaction'>): Fee[] | undefined;
|
|
17
|
+
export declare function getLocalTransactionStatus({ primaryTransaction, initialTransaction, }: {
|
|
18
|
+
primaryTransaction: TransactionGroup['primaryTransaction'];
|
|
19
|
+
initialTransaction: TransactionGroup['initialTransaction'];
|
|
20
|
+
}): Status;
|
|
21
|
+
export declare function isNftStandard(value?: string): boolean;
|
|
22
|
+
export declare function getNftPaymentTransfer({ side, sentTransfer, receivedTransfer, sentNativeTransfer, nftCounterparty, transactionFrom, transactionTo, subjectAddress, }: {
|
|
23
|
+
side: 'buy' | 'sell';
|
|
24
|
+
sentTransfer?: ValueTransfer;
|
|
25
|
+
receivedTransfer?: ValueTransfer;
|
|
26
|
+
sentNativeTransfer?: ValueTransfer;
|
|
27
|
+
nftCounterparty: string;
|
|
28
|
+
transactionFrom?: string;
|
|
29
|
+
transactionTo?: string;
|
|
30
|
+
subjectAddress: string;
|
|
31
|
+
}): ValueTransfer | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Resolves the user's primary send and receive legs from indexed value transfers.
|
|
34
|
+
* Prefers a receive whose symbol differs from the sent leg so dust does not win.
|
|
35
|
+
*
|
|
36
|
+
* @param valueTransfers - Indexed value transfers from the Accounts API.
|
|
37
|
+
* @param subjectAddress - The account address to match transfers against.
|
|
38
|
+
* @returns The primary sent and received transfers for the account.
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseValueTransfers(valueTransfers: ValueTransfer[] | undefined, subjectAddress: string): {
|
|
41
|
+
sentTransfer: ValueTransfer | undefined;
|
|
42
|
+
receivedTransfer: ValueTransfer | undefined;
|
|
43
|
+
sentNativeTransfer: ValueTransfer | undefined;
|
|
44
|
+
sentNftTransfer: ValueTransfer | undefined;
|
|
45
|
+
receivedNftTransfer: ValueTransfer | undefined;
|
|
46
|
+
};
|
|
47
|
+
export declare function getTokenAmountFromTransfer(transfer: ValueTransfer | undefined, direction: TokenAmount['direction'], chainId: CaipChainId): TokenAmount | undefined;
|
|
48
|
+
export declare function getTokenMetadataFromKnownToken(contractAddress: string | undefined, direction: TokenAmount['direction'], chainId: CaipChainId): TokenAmount | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* When the transfer omits contractAddress, fall back to the indexed tx `to` field.
|
|
51
|
+
*
|
|
52
|
+
* @param token - Parsed token amount from the value transfer.
|
|
53
|
+
* @param fallbackContractAddress - Indexed transaction `to` address used as ERC-20 fallback.
|
|
54
|
+
* @param transferType - Value transfer type; native (`normal`) transfers skip the fallback.
|
|
55
|
+
* @param chainId - CAIP-2 chain id for asset id encoding.
|
|
56
|
+
* @returns Token amount with `assetId` set when a fallback address applies.
|
|
57
|
+
*/
|
|
58
|
+
export declare function withFallbackTokenAssetId(token: TokenAmount | undefined, fallbackContractAddress: string | undefined, transferType: string | undefined, chainId: CaipChainId): TokenAmount | undefined;
|
|
59
|
+
//# sourceMappingURL=transactions.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.d.mts","sourceRoot":"","sources":["../../../src/mappers/helpers/transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { ERC721, ERC1155, isEqualCaseInsensitive as equalsIgnoreCase } from "@metamask/controller-utils";
|
|
2
|
+
import { TransactionStatus, TransactionType } from "@metamask/transaction-controller";
|
|
3
|
+
import { nativeTokenAddress } from "../constants.mjs";
|
|
4
|
+
import { formatAddressToAssetId, getNativeAsset } from "./caip.mjs";
|
|
5
|
+
import { getKnownTokenMetadata } from "./token-metadata.mjs";
|
|
6
|
+
const nativeTokenDecimals = 18;
|
|
7
|
+
function toNetworkFeeAmount(gasUsed, gasPrice) {
|
|
8
|
+
if (gasUsed === undefined || gasPrice === undefined) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
return String(BigInt(gasUsed) * BigInt(gasPrice));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function buildBaseNetworkFee(amount, chainId) {
|
|
19
|
+
const nativeAsset = getNativeAsset(chainId);
|
|
20
|
+
return {
|
|
21
|
+
type: 'base',
|
|
22
|
+
amount,
|
|
23
|
+
...(nativeAsset?.decimals === undefined
|
|
24
|
+
? { decimals: nativeTokenDecimals }
|
|
25
|
+
: { decimals: nativeAsset.decimals }),
|
|
26
|
+
...(nativeAsset?.symbol ? { symbol: nativeAsset.symbol } : {}),
|
|
27
|
+
...(nativeAsset?.assetId ? { assetId: nativeAsset.assetId } : {}),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function getNetworkFee(transaction, chainId) {
|
|
31
|
+
const amount = toNetworkFeeAmount(transaction.gasUsed, transaction.effectiveGasPrice);
|
|
32
|
+
return amount ? buildBaseNetworkFee(amount, chainId) : undefined;
|
|
33
|
+
}
|
|
34
|
+
export function getFees(transaction, chainId) {
|
|
35
|
+
const networkFee = getNetworkFee(transaction, chainId);
|
|
36
|
+
return networkFee ? [networkFee] : undefined;
|
|
37
|
+
}
|
|
38
|
+
export function getLocalTransactionFees(transactionGroup) {
|
|
39
|
+
const { primaryTransaction } = transactionGroup;
|
|
40
|
+
const amount = toNetworkFeeAmount(primaryTransaction.txReceipt?.gasUsed, primaryTransaction.txReceipt?.effectiveGasPrice ??
|
|
41
|
+
primaryTransaction.txParams?.gasPrice);
|
|
42
|
+
return amount
|
|
43
|
+
? [buildBaseNetworkFee(amount, primaryTransaction.chainId)]
|
|
44
|
+
: undefined;
|
|
45
|
+
}
|
|
46
|
+
const inProgressTransactionStatuses = [
|
|
47
|
+
TransactionStatus.unapproved,
|
|
48
|
+
TransactionStatus.approved,
|
|
49
|
+
TransactionStatus.signed,
|
|
50
|
+
TransactionStatus.submitted,
|
|
51
|
+
];
|
|
52
|
+
const transactionGroupCancelledStatus = 'cancelled';
|
|
53
|
+
const smartTransactionStatus = {
|
|
54
|
+
cancelled: 'cancelled',
|
|
55
|
+
pending: 'pending',
|
|
56
|
+
success: 'success',
|
|
57
|
+
};
|
|
58
|
+
function getTransactionStatusKey(transaction) {
|
|
59
|
+
const { type, status } = transaction;
|
|
60
|
+
const receiptStatus = transaction.txReceipt?.status;
|
|
61
|
+
if (receiptStatus === '0x0') {
|
|
62
|
+
return TransactionStatus.failed;
|
|
63
|
+
}
|
|
64
|
+
if (status === TransactionStatus.confirmed &&
|
|
65
|
+
type === TransactionType.cancel) {
|
|
66
|
+
return transactionGroupCancelledStatus;
|
|
67
|
+
}
|
|
68
|
+
return transaction.status;
|
|
69
|
+
}
|
|
70
|
+
export function getLocalTransactionStatus({ primaryTransaction, initialTransaction, }) {
|
|
71
|
+
if (initialTransaction.isSmartTransaction) {
|
|
72
|
+
const smartStatus = initialTransaction.status;
|
|
73
|
+
if (smartStatus === smartTransactionStatus.pending) {
|
|
74
|
+
return 'pending';
|
|
75
|
+
}
|
|
76
|
+
if (smartStatus === smartTransactionStatus.success) {
|
|
77
|
+
return 'success';
|
|
78
|
+
}
|
|
79
|
+
if (smartStatus === smartTransactionStatus.cancelled) {
|
|
80
|
+
return 'failed';
|
|
81
|
+
}
|
|
82
|
+
return 'pending';
|
|
83
|
+
}
|
|
84
|
+
const statusKey = getTransactionStatusKey(primaryTransaction);
|
|
85
|
+
if (statusKey === TransactionStatus.confirmed) {
|
|
86
|
+
return 'success';
|
|
87
|
+
}
|
|
88
|
+
if (statusKey === TransactionStatus.cancelled ||
|
|
89
|
+
statusKey === transactionGroupCancelledStatus ||
|
|
90
|
+
statusKey === TransactionStatus.dropped ||
|
|
91
|
+
statusKey === TransactionStatus.failed ||
|
|
92
|
+
statusKey === TransactionStatus.rejected) {
|
|
93
|
+
return 'failed';
|
|
94
|
+
}
|
|
95
|
+
if (inProgressTransactionStatuses.includes(statusKey)) {
|
|
96
|
+
return 'pending';
|
|
97
|
+
}
|
|
98
|
+
return 'pending';
|
|
99
|
+
}
|
|
100
|
+
export function isNftStandard(value) {
|
|
101
|
+
return value === ERC721.toLowerCase() || value === ERC1155.toLowerCase();
|
|
102
|
+
}
|
|
103
|
+
export function getNftPaymentTransfer({ side, sentTransfer, receivedTransfer, sentNativeTransfer, nftCounterparty, transactionFrom, transactionTo, subjectAddress, }) {
|
|
104
|
+
const isFungible = (transfer) => Boolean(transfer && !isNftStandard(transfer.transferType));
|
|
105
|
+
if (side === 'buy') {
|
|
106
|
+
for (const transfer of [sentNativeTransfer, sentTransfer]) {
|
|
107
|
+
if (!transfer || !isFungible(transfer)) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
// Only count a payment that goes to the NFT counterparty (direct sale) or
|
|
111
|
+
// to the contract being called (marketplace/router). This avoids treating
|
|
112
|
+
// an unrelated native send in the same transaction as the NFT payment.
|
|
113
|
+
if (equalsIgnoreCase(transfer.to, nftCounterparty) ||
|
|
114
|
+
equalsIgnoreCase(transfer.to, transactionTo)) {
|
|
115
|
+
return transfer;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
if (!receivedTransfer || !isFungible(receivedTransfer)) {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
if (equalsIgnoreCase(receivedTransfer.from, nftCounterparty) ||
|
|
124
|
+
(transactionFrom &&
|
|
125
|
+
!equalsIgnoreCase(transactionFrom, subjectAddress) &&
|
|
126
|
+
equalsIgnoreCase(receivedTransfer.from, transactionFrom))) {
|
|
127
|
+
return receivedTransfer;
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
const resolveAssetId = (chainId, { contractAddress, transferType, }) => {
|
|
132
|
+
if (contractAddress) {
|
|
133
|
+
return formatAddressToAssetId(contractAddress, chainId);
|
|
134
|
+
}
|
|
135
|
+
if (transferType === 'normal' || transferType === 'internal') {
|
|
136
|
+
return formatAddressToAssetId(nativeTokenAddress, chainId);
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Resolves the user's primary send and receive legs from indexed value transfers.
|
|
142
|
+
* Prefers a receive whose symbol differs from the sent leg so dust does not win.
|
|
143
|
+
*
|
|
144
|
+
* @param valueTransfers - Indexed value transfers from the Accounts API.
|
|
145
|
+
* @param subjectAddress - The account address to match transfers against.
|
|
146
|
+
* @returns The primary sent and received transfers for the account.
|
|
147
|
+
*/
|
|
148
|
+
export function parseValueTransfers(valueTransfers, subjectAddress) {
|
|
149
|
+
const sent = valueTransfers?.filter(({ from }) => equalsIgnoreCase(from, subjectAddress));
|
|
150
|
+
const received = valueTransfers?.filter(({ to }) => equalsIgnoreCase(to, subjectAddress));
|
|
151
|
+
const sentTransfer = sent?.[0];
|
|
152
|
+
const receivedTransfer = received?.find(({ symbol }) => symbol !== sentTransfer?.symbol) ??
|
|
153
|
+
received?.[0];
|
|
154
|
+
const sentNativeTransfer = sent?.find(({ transferType }) => transferType === 'normal');
|
|
155
|
+
const sentNftTransfer = sent?.find(({ transferType }) => isNftStandard(transferType));
|
|
156
|
+
const receivedNftTransfer = received?.find(({ transferType }) => isNftStandard(transferType));
|
|
157
|
+
return {
|
|
158
|
+
sentTransfer,
|
|
159
|
+
receivedTransfer,
|
|
160
|
+
sentNativeTransfer,
|
|
161
|
+
sentNftTransfer,
|
|
162
|
+
receivedNftTransfer,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
export function getTokenAmountFromTransfer(transfer, direction, chainId) {
|
|
166
|
+
if (!transfer) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
const { transferType, amount } = transfer;
|
|
170
|
+
const isNftTransfer = isNftStandard(transferType);
|
|
171
|
+
const symbol = isNftTransfer
|
|
172
|
+
? transfer.name || transfer.symbol
|
|
173
|
+
: transfer.symbol;
|
|
174
|
+
if (!symbol && amount === undefined) {
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
const assetId = transfer && !isNftTransfer
|
|
178
|
+
? resolveAssetId(chainId, {
|
|
179
|
+
contractAddress: transfer.contractAddress,
|
|
180
|
+
transferType: transfer.transferType,
|
|
181
|
+
})
|
|
182
|
+
: undefined;
|
|
183
|
+
const hasTransferAmount = !isNftTransfer && amount !== null && amount !== undefined;
|
|
184
|
+
return {
|
|
185
|
+
direction,
|
|
186
|
+
...(hasTransferAmount ? { amount: String(amount) } : {}),
|
|
187
|
+
...(transfer.decimal === undefined ? {} : { decimals: transfer.decimal }),
|
|
188
|
+
...(symbol ? { symbol } : {}),
|
|
189
|
+
...(assetId ? { assetId } : {}),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
export function getTokenMetadataFromKnownToken(contractAddress, direction, chainId) {
|
|
193
|
+
const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);
|
|
194
|
+
if (!tokenMetadata) {
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
direction,
|
|
199
|
+
...(tokenMetadata.symbol ? { symbol: tokenMetadata.symbol } : {}),
|
|
200
|
+
...(tokenMetadata.decimals === undefined
|
|
201
|
+
? {}
|
|
202
|
+
: { decimals: tokenMetadata.decimals }),
|
|
203
|
+
...(tokenMetadata.assetId ? { assetId: tokenMetadata.assetId } : {}),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* When the transfer omits contractAddress, fall back to the indexed tx `to` field.
|
|
208
|
+
*
|
|
209
|
+
* @param token - Parsed token amount from the value transfer.
|
|
210
|
+
* @param fallbackContractAddress - Indexed transaction `to` address used as ERC-20 fallback.
|
|
211
|
+
* @param transferType - Value transfer type; native (`normal`) transfers skip the fallback.
|
|
212
|
+
* @param chainId - CAIP-2 chain id for asset id encoding.
|
|
213
|
+
* @returns Token amount with `assetId` set when a fallback address applies.
|
|
214
|
+
*/
|
|
215
|
+
export function withFallbackTokenAssetId(token, fallbackContractAddress, transferType, chainId) {
|
|
216
|
+
if (!token ||
|
|
217
|
+
token.assetId ||
|
|
218
|
+
transferType === 'normal' ||
|
|
219
|
+
!fallbackContractAddress) {
|
|
220
|
+
return token;
|
|
221
|
+
}
|
|
222
|
+
const assetId = formatAddressToAssetId(fallbackContractAddress, chainId);
|
|
223
|
+
if (!assetId) {
|
|
224
|
+
return token;
|
|
225
|
+
}
|
|
226
|
+
return { ...token, assetId };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=transactions.mjs.map
|
|
@@ -0,0 +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';\nimport { nativeTokenAddress } from '../constants';\nimport { formatAddressToAssetId, getNativeAsset } from './caip';\nimport { getKnownTokenMetadata } from './token-metadata';\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"]}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapKeyringTransaction = void 0;
|
|
4
|
+
const keyring_api_1 = require("@metamask/keyring-api");
|
|
5
|
+
function mapStatus(status) {
|
|
6
|
+
switch (status) {
|
|
7
|
+
case keyring_api_1.TransactionStatus.Confirmed:
|
|
8
|
+
return 'success';
|
|
9
|
+
case keyring_api_1.TransactionStatus.Failed:
|
|
10
|
+
return 'failed';
|
|
11
|
+
case keyring_api_1.TransactionStatus.Submitted:
|
|
12
|
+
case keyring_api_1.TransactionStatus.Unconfirmed:
|
|
13
|
+
default:
|
|
14
|
+
return 'pending';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function getAddress(movements) {
|
|
18
|
+
return movements[0]?.address ?? '';
|
|
19
|
+
}
|
|
20
|
+
function hasFungibleAsset(movement) {
|
|
21
|
+
return movement.asset?.fungible === true;
|
|
22
|
+
}
|
|
23
|
+
function getToken(movements, direction) {
|
|
24
|
+
const movement = movements.find(hasFungibleAsset);
|
|
25
|
+
if (!movement) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
amount: movement.asset.amount,
|
|
30
|
+
symbol: movement.asset.unit,
|
|
31
|
+
assetId: movement.asset.type,
|
|
32
|
+
direction,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function getFee(fee) {
|
|
36
|
+
const { asset } = fee;
|
|
37
|
+
if (!asset.fungible) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
type: fee.type,
|
|
42
|
+
amount: asset.amount,
|
|
43
|
+
symbol: asset.unit,
|
|
44
|
+
assetId: asset.type,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function getFees(transaction) {
|
|
48
|
+
return transaction.fees.flatMap((fee) => {
|
|
49
|
+
const mappedFee = getFee(fee);
|
|
50
|
+
return mappedFee ? [mappedFee] : [];
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const approveAmountMaxIntegerDigits = 15;
|
|
54
|
+
/**
|
|
55
|
+
* Maps a keyring transaction into the shared activity item shape.
|
|
56
|
+
*
|
|
57
|
+
* @param options - The mapping options.
|
|
58
|
+
* @param options.transaction - The keyring transaction to map.
|
|
59
|
+
* @param options.subjectAddress - Account address used for send/receive attribution.
|
|
60
|
+
* @returns The normalized activity item.
|
|
61
|
+
*/
|
|
62
|
+
function mapKeyringTransaction({ transaction, subjectAddress, }) {
|
|
63
|
+
const { type, id } = transaction;
|
|
64
|
+
const status = mapStatus(transaction.status);
|
|
65
|
+
const timestamp = transaction.timestamp ? transaction.timestamp * 1000 : 0;
|
|
66
|
+
const chainId = transaction.chain;
|
|
67
|
+
const from = type === keyring_api_1.TransactionType.Send && subjectAddress
|
|
68
|
+
? subjectAddress
|
|
69
|
+
: getAddress(transaction.from);
|
|
70
|
+
const to = type === keyring_api_1.TransactionType.Receive && subjectAddress
|
|
71
|
+
? subjectAddress
|
|
72
|
+
: getAddress(transaction.to);
|
|
73
|
+
const fees = getFees(transaction);
|
|
74
|
+
const common = { chainId, status, timestamp, hash: id };
|
|
75
|
+
switch (type) {
|
|
76
|
+
case keyring_api_1.TransactionType.Send: {
|
|
77
|
+
const fromToken = getToken(transaction.from, 'out');
|
|
78
|
+
const token = !fromToken && chainId.startsWith('bip122:')
|
|
79
|
+
? getToken(transaction.to, 'out')
|
|
80
|
+
: fromToken;
|
|
81
|
+
return {
|
|
82
|
+
type: 'send',
|
|
83
|
+
...common,
|
|
84
|
+
data: {
|
|
85
|
+
from,
|
|
86
|
+
to,
|
|
87
|
+
token,
|
|
88
|
+
fees,
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
case keyring_api_1.TransactionType.Receive:
|
|
93
|
+
return {
|
|
94
|
+
type: 'receive',
|
|
95
|
+
...common,
|
|
96
|
+
data: {
|
|
97
|
+
from,
|
|
98
|
+
to,
|
|
99
|
+
token: getToken(transaction.to, 'in'),
|
|
100
|
+
fees,
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
case keyring_api_1.TransactionType.Swap:
|
|
104
|
+
return {
|
|
105
|
+
type: 'swap',
|
|
106
|
+
...common,
|
|
107
|
+
data: {
|
|
108
|
+
from,
|
|
109
|
+
destinationToken: getToken(transaction.to, 'in'),
|
|
110
|
+
sourceToken: getToken(transaction.from, 'out'),
|
|
111
|
+
fees,
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
case keyring_api_1.TransactionType.TokenApprove: {
|
|
115
|
+
const rawToken = getToken(transaction.from, 'out');
|
|
116
|
+
const isUnlimited = rawToken?.amount !== undefined &&
|
|
117
|
+
rawToken.amount.split('.')[0].length > approveAmountMaxIntegerDigits;
|
|
118
|
+
return {
|
|
119
|
+
type: 'approveSpendingCap',
|
|
120
|
+
...common,
|
|
121
|
+
data: {
|
|
122
|
+
from,
|
|
123
|
+
token: rawToken
|
|
124
|
+
? { ...rawToken, amount: isUnlimited ? undefined : rawToken.amount }
|
|
125
|
+
: rawToken,
|
|
126
|
+
fees,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
default:
|
|
131
|
+
return {
|
|
132
|
+
type: 'contractInteraction',
|
|
133
|
+
...common,
|
|
134
|
+
data: {
|
|
135
|
+
from,
|
|
136
|
+
to,
|
|
137
|
+
fees,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.mapKeyringTransaction = mapKeyringTransaction;
|
|
143
|
+
//# sourceMappingURL=keyring-transaction-mapper.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyring-transaction-mapper.cjs","sourceRoot":"","sources":["../../src/mappers/keyring-transaction-mapper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Transaction as KeyringTransaction } from '@metamask/keyring-api';\nimport {\n TransactionStatus,\n TransactionType as KeyringTransactionType,\n} from '@metamask/keyring-api';\n\nimport type { Fee, ActivityItem, Status, TokenAmount } from '../types';\n\ntype Movement = KeyringTransaction['from'][number];\ntype KeyringFee = KeyringTransaction['fees'][number];\ntype FungibleAsset = Extract<\n NonNullable<Movement['asset']>,\n { fungible: true }\n>;\n\nfunction mapStatus(status: KeyringTransaction['status']): Status {\n switch (status) {\n case TransactionStatus.Confirmed:\n return 'success';\n case TransactionStatus.Failed:\n return 'failed';\n case TransactionStatus.Submitted:\n case TransactionStatus.Unconfirmed:\n default:\n return 'pending';\n }\n}\n\nfunction getAddress(movements: Movement[]): string {\n return movements[0]?.address ?? '';\n}\n\nfunction hasFungibleAsset(\n movement: Movement,\n): movement is Movement & { asset: FungibleAsset } {\n return movement.asset?.fungible === true;\n}\n\nfunction getToken(\n movements: Movement[],\n direction: TokenAmount['direction'],\n): TokenAmount | undefined {\n const movement = movements.find(hasFungibleAsset);\n\n if (!movement) {\n return undefined;\n }\n\n return {\n amount: movement.asset.amount,\n symbol: movement.asset.unit,\n assetId: movement.asset.type,\n direction,\n };\n}\n\nfunction getFee(fee: KeyringFee): Fee | undefined {\n const { asset } = fee;\n\n if (!asset.fungible) {\n return undefined;\n }\n\n return {\n type: fee.type,\n amount: asset.amount,\n symbol: asset.unit,\n assetId: asset.type,\n };\n}\n\nfunction getFees(transaction: KeyringTransaction): Fee[] {\n return transaction.fees.flatMap((fee) => {\n const mappedFee = getFee(fee);\n\n return mappedFee ? [mappedFee] : [];\n });\n}\n\nconst approveAmountMaxIntegerDigits = 15;\n\n/**\n * Maps a keyring transaction into the shared activity item shape.\n *\n * @param options - The mapping options.\n * @param options.transaction - The keyring transaction to map.\n * @param options.subjectAddress - Account address used for send/receive attribution.\n * @returns The normalized activity item.\n */\nexport function mapKeyringTransaction({\n transaction,\n subjectAddress,\n}: {\n transaction: KeyringTransaction;\n subjectAddress?: string;\n}): ActivityItem {\n const { type, id } = transaction;\n const status = mapStatus(transaction.status);\n const timestamp = transaction.timestamp ? transaction.timestamp * 1000 : 0;\n const chainId = transaction.chain;\n\n const from =\n type === KeyringTransactionType.Send && subjectAddress\n ? subjectAddress\n : getAddress(transaction.from);\n\n const to =\n type === KeyringTransactionType.Receive && subjectAddress\n ? subjectAddress\n : getAddress(transaction.to);\n\n const fees = getFees(transaction);\n const common = { chainId, status, timestamp, hash: id };\n\n switch (type) {\n case KeyringTransactionType.Send: {\n const fromToken = getToken(transaction.from, 'out');\n const token =\n !fromToken && chainId.startsWith('bip122:')\n ? getToken(transaction.to, 'out')\n : fromToken;\n\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token,\n fees,\n },\n };\n }\n\n case KeyringTransactionType.Receive:\n return {\n type: 'receive',\n ...common,\n data: {\n from,\n to,\n token: getToken(transaction.to, 'in'),\n fees,\n },\n };\n\n case KeyringTransactionType.Swap:\n return {\n type: 'swap',\n ...common,\n data: {\n from,\n destinationToken: getToken(transaction.to, 'in'),\n sourceToken: getToken(transaction.from, 'out'),\n fees,\n },\n };\n\n case KeyringTransactionType.TokenApprove: {\n const rawToken = getToken(transaction.from, 'out');\n const isUnlimited =\n rawToken?.amount !== undefined &&\n rawToken.amount.split('.')[0].length > approveAmountMaxIntegerDigits;\n\n return {\n type: 'approveSpendingCap',\n ...common,\n data: {\n from,\n token: rawToken\n ? { ...rawToken, amount: isUnlimited ? undefined : rawToken.amount }\n : rawToken,\n fees,\n },\n };\n }\n\n default:\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n fees,\n },\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Transaction as KeyringTransaction } from "@metamask/keyring-api";
|
|
2
|
+
import type { ActivityItem } from "../types.cjs";
|
|
3
|
+
/**
|
|
4
|
+
* Maps a keyring transaction into the shared activity item shape.
|
|
5
|
+
*
|
|
6
|
+
* @param options - The mapping options.
|
|
7
|
+
* @param options.transaction - The keyring transaction to map.
|
|
8
|
+
* @param options.subjectAddress - Account address used for send/receive attribution.
|
|
9
|
+
* @returns The normalized activity item.
|
|
10
|
+
*/
|
|
11
|
+
export declare function mapKeyringTransaction({ transaction, subjectAddress, }: {
|
|
12
|
+
transaction: KeyringTransaction;
|
|
13
|
+
subjectAddress?: string;
|
|
14
|
+
}): ActivityItem;
|
|
15
|
+
//# sourceMappingURL=keyring-transaction-mapper.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyring-transaction-mapper.d.cts","sourceRoot":"","sources":["../../src/mappers/keyring-transaction-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,kBAAkB,EAAE,8BAA8B;AAM/E,OAAO,KAAK,EAAO,YAAY,EAAuB,qBAAiB;AA2EvE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,WAAW,EACX,cAAc,GACf,EAAE;IACD,WAAW,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,CA6Ff"}
|