@metamask-previews/client-utils 1.2.1-preview-aa202ec10 → 1.2.1-preview-6cd1bb2f5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +0 -12
  2. package/README.md +0 -4
  3. package/dist/mappers/api-transaction-mapper.cjs +74 -64
  4. package/dist/mappers/api-transaction-mapper.cjs.map +1 -1
  5. package/dist/mappers/api-transaction-mapper.d.cts.map +1 -1
  6. package/dist/mappers/api-transaction-mapper.d.mts.map +1 -1
  7. package/dist/mappers/api-transaction-mapper.mjs +75 -65
  8. package/dist/mappers/api-transaction-mapper.mjs.map +1 -1
  9. package/dist/mappers/helpers/caip.cjs +41 -2
  10. package/dist/mappers/helpers/caip.cjs.map +1 -1
  11. package/dist/mappers/helpers/caip.d.cts +14 -0
  12. package/dist/mappers/helpers/caip.d.cts.map +1 -1
  13. package/dist/mappers/helpers/caip.d.mts +14 -0
  14. package/dist/mappers/helpers/caip.d.mts.map +1 -1
  15. package/dist/mappers/helpers/caip.mjs +39 -1
  16. package/dist/mappers/helpers/caip.mjs.map +1 -1
  17. package/dist/mappers/helpers/transactions.cjs +27 -37
  18. package/dist/mappers/helpers/transactions.cjs.map +1 -1
  19. package/dist/mappers/helpers/transactions.d.cts +1 -1
  20. package/dist/mappers/helpers/transactions.d.cts.map +1 -1
  21. package/dist/mappers/helpers/transactions.d.mts +1 -1
  22. package/dist/mappers/helpers/transactions.d.mts.map +1 -1
  23. package/dist/mappers/helpers/transactions.mjs +28 -38
  24. package/dist/mappers/helpers/transactions.mjs.map +1 -1
  25. package/dist/mappers/local-transaction-mapper.cjs +12 -26
  26. package/dist/mappers/local-transaction-mapper.cjs.map +1 -1
  27. package/dist/mappers/local-transaction-mapper.d.cts.map +1 -1
  28. package/dist/mappers/local-transaction-mapper.d.mts.map +1 -1
  29. package/dist/mappers/local-transaction-mapper.mjs +13 -27
  30. package/dist/mappers/local-transaction-mapper.mjs.map +1 -1
  31. package/dist/types.cjs.map +1 -1
  32. package/dist/types.d.cts +0 -3
  33. package/dist/types.d.cts.map +1 -1
  34. package/dist/types.d.mts +0 -3
  35. package/dist/types.d.mts.map +1 -1
  36. package/dist/types.mjs.map +1 -1
  37. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,18 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ### Added
11
-
12
- - Add optional `assetType` (`'native' | 'erc20' | 'erc721' | 'erc1155'`) on `TokenAmount` and `Fee` so clients can resolve icons when `assetId` is absent ([#9671](https://github.com/MetaMask/core/pull/9671))
13
-
14
- ### Changed
15
-
16
- - Stop inventing native token metadata in activity mappers ([#9671](https://github.com/MetaMask/core/pull/9671))
17
- - Remove the hardcoded `nativeAssetsByCaipChainId` lookup and the `STANDARD` assume-native fallback
18
- - `formatAddressToAssetId` returns `undefined` for native sentinel addresses instead of `erc20:0x0`
19
- - Network fees and native tokens no longer invent `symbol` / slip44 `assetId`
20
- - Bump `@metamask/keyring-api` from `^23.5.0` to `^23.7.0` ([#9676](https://github.com/MetaMask/core/pull/9676))
21
-
22
10
  ## [1.2.1]
23
11
 
24
12
  ### Changed
package/README.md CHANGED
@@ -10,10 +10,6 @@ or
10
10
 
11
11
  `npm install @metamask/client-utils`
12
12
 
13
- ## Activity mappers
14
-
15
- Pure mappers that normalize API, keyring, and local transaction shapes into a shared `ActivityItem`. See [src/mappers/README.md](./src/mappers/README.md).
16
-
17
13
  ## Contributing
18
14
 
19
15
  This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/core#readme).
@@ -30,7 +30,7 @@ function mapApiTransaction({ transaction, subjectAddress, }) {
30
30
  data: {
31
31
  sourceToken: getToken(sentTransfer, 'out'),
32
32
  destinationToken: getToken(receivedTransfer, 'in'),
33
- fees: (0, transactions_js_1.getFees)(transaction),
33
+ fees: (0, transactions_js_1.getFees)(transaction, chainId),
34
34
  from,
35
35
  },
36
36
  };
@@ -61,16 +61,47 @@ function mapApiTransaction({ transaction, subjectAddress, }) {
61
61
  data: {
62
62
  from,
63
63
  token,
64
- fees: (0, transactions_js_1.getFees)(transaction),
64
+ fees: (0, transactions_js_1.getFees)(transaction, chainId),
65
65
  },
66
66
  };
67
67
  }
68
68
  // Note: Categorize NFT in the backend
69
- const isNftExchange = transactionCategory === 'NFT_EXCHANGE';
70
- if (receivedNftTransfer) {
71
- if (receivedNftTransfer.from === constants_js_1.nativeTokenAddress) {
69
+ if (sentNftTransfer || receivedNftTransfer) {
70
+ const isNftExchange = transactionCategory === 'NFT_EXCHANGE';
71
+ if (receivedNftTransfer) {
72
+ if (receivedNftTransfer.from === constants_js_1.nativeTokenAddress) {
73
+ return {
74
+ type: 'nftMint',
75
+ ...common,
76
+ data: {
77
+ from: receivedNftTransfer.from,
78
+ to: receivedNftTransfer.to,
79
+ token: getToken(receivedNftTransfer, 'in'),
80
+ },
81
+ };
82
+ }
83
+ const purchasePaymentTransfer = (0, transactions_js_1.getNftPaymentTransfer)({
84
+ side: 'buy',
85
+ sentTransfer,
86
+ sentNativeTransfer,
87
+ nftCounterparty: receivedNftTransfer.from,
88
+ transactionTo: transaction.to,
89
+ subjectAddress,
90
+ });
91
+ if (isNftExchange || purchasePaymentTransfer) {
92
+ return {
93
+ type: 'nftBuy',
94
+ ...common,
95
+ data: {
96
+ from: receivedNftTransfer.from,
97
+ to: receivedNftTransfer.to,
98
+ token: getToken(receivedNftTransfer, 'in'),
99
+ paymentToken: getToken(purchasePaymentTransfer, 'out'),
100
+ },
101
+ };
102
+ }
72
103
  return {
73
- type: 'nftMint',
104
+ type: 'receive',
74
105
  ...common,
75
106
  data: {
76
107
  from: receivedNftTransfer.from,
@@ -79,65 +110,36 @@ function mapApiTransaction({ transaction, subjectAddress, }) {
79
110
  },
80
111
  };
81
112
  }
82
- const purchasePaymentTransfer = (0, transactions_js_1.getNftPaymentTransfer)({
83
- side: 'buy',
84
- sentTransfer,
85
- sentNativeTransfer,
86
- nftCounterparty: receivedNftTransfer.from,
87
- transactionTo: transaction.to,
88
- subjectAddress,
89
- });
90
- if (isNftExchange || purchasePaymentTransfer) {
113
+ if (sentNftTransfer) {
114
+ const saleProceedsTransfer = (0, transactions_js_1.getNftPaymentTransfer)({
115
+ side: 'sell',
116
+ receivedTransfer,
117
+ nftCounterparty: sentNftTransfer.to,
118
+ transactionFrom: from,
119
+ subjectAddress,
120
+ });
121
+ if (isNftExchange || saleProceedsTransfer) {
122
+ return {
123
+ type: 'nftSell',
124
+ ...common,
125
+ data: {
126
+ from: sentNftTransfer.from,
127
+ to: sentNftTransfer.to,
128
+ token: getToken(sentNftTransfer, 'out'),
129
+ paymentToken: getToken(saleProceedsTransfer, 'in'),
130
+ },
131
+ };
132
+ }
91
133
  return {
92
- type: 'nftBuy',
93
- ...common,
94
- data: {
95
- from: receivedNftTransfer.from,
96
- to: receivedNftTransfer.to,
97
- token: getToken(receivedNftTransfer, 'in'),
98
- paymentToken: getToken(purchasePaymentTransfer, 'out'),
99
- },
100
- };
101
- }
102
- return {
103
- type: 'receive',
104
- ...common,
105
- data: {
106
- from: receivedNftTransfer.from,
107
- to: receivedNftTransfer.to,
108
- token: getToken(receivedNftTransfer, 'in'),
109
- },
110
- };
111
- }
112
- if (sentNftTransfer) {
113
- const saleProceedsTransfer = (0, transactions_js_1.getNftPaymentTransfer)({
114
- side: 'sell',
115
- receivedTransfer,
116
- nftCounterparty: sentNftTransfer.to,
117
- transactionFrom: from,
118
- subjectAddress,
119
- });
120
- if (isNftExchange || saleProceedsTransfer) {
121
- return {
122
- type: 'nftSell',
134
+ type: 'send',
123
135
  ...common,
124
136
  data: {
125
137
  from: sentNftTransfer.from,
126
138
  to: sentNftTransfer.to,
127
139
  token: getToken(sentNftTransfer, 'out'),
128
- paymentToken: getToken(saleProceedsTransfer, 'in'),
129
140
  },
130
141
  };
131
142
  }
132
- return {
133
- type: 'send',
134
- ...common,
135
- data: {
136
- from: sentNftTransfer.from,
137
- to: sentNftTransfer.to,
138
- token: getToken(sentNftTransfer, 'out'),
139
- },
140
- };
141
143
  }
142
144
  const hasNativeTransferWithoutMethod = transactionCategory === 'CONTRACT_CALL' &&
143
145
  !methodId &&
@@ -150,14 +152,22 @@ function mapApiTransaction({ transaction, subjectAddress, }) {
150
152
  !(0, controller_utils_1.isEqualCaseInsensitive)(from, subjectAddress));
151
153
  const transfer = isReceive ? receivedTransfer : sentTransfer;
152
154
  const direction = isReceive ? 'in' : 'out';
155
+ const nativeAsset = (0, caip_js_1.getNativeAsset)(chainId);
156
+ const nativeToken = transactionCategory === 'STANDARD' && nativeAsset
157
+ ? {
158
+ ...nativeAsset,
159
+ amount: transaction.value,
160
+ direction,
161
+ }
162
+ : undefined;
153
163
  return {
154
164
  type: isReceive ? 'receive' : 'send',
155
165
  ...common,
156
166
  data: {
157
167
  from: transfer?.from ?? from,
158
168
  to: transfer?.to ?? transaction.to,
159
- token: (0, transactions_js_1.withFallbackTokenAssetId)(getToken(transfer, direction), transaction.to, transfer?.transferType, chainId),
160
- fees: (0, transactions_js_1.getFees)(transaction),
169
+ token: (0, transactions_js_1.withFallbackTokenAssetId)(getToken(transfer, direction), transaction.to, transfer?.transferType, chainId) ?? nativeToken,
170
+ fees: (0, transactions_js_1.getFees)(transaction, chainId),
161
171
  },
162
172
  };
163
173
  }
@@ -188,7 +198,7 @@ function mapApiTransaction({ transaction, subjectAddress, }) {
188
198
  data: {
189
199
  from,
190
200
  sourceToken: getToken(sentTransfer, 'out'),
191
- fees: (0, transactions_js_1.getFees)(transaction),
201
+ fees: (0, transactions_js_1.getFees)(transaction, chainId),
192
202
  },
193
203
  };
194
204
  }
@@ -201,7 +211,7 @@ function mapApiTransaction({ transaction, subjectAddress, }) {
201
211
  from,
202
212
  sourceToken: getToken(sentTransfer, 'out'),
203
213
  destinationToken: getToken(receivedTransfer, 'in'),
204
- fees: (0, transactions_js_1.getFees)(transaction),
214
+ fees: (0, transactions_js_1.getFees)(transaction, chainId),
205
215
  },
206
216
  };
207
217
  }
@@ -214,7 +224,7 @@ function mapApiTransaction({ transaction, subjectAddress, }) {
214
224
  from,
215
225
  sourceToken: getToken(sentTransfer, 'out'),
216
226
  destinationToken: getToken(receivedTransfer, 'in'),
217
- fees: (0, transactions_js_1.getFees)(transaction),
227
+ fees: (0, transactions_js_1.getFees)(transaction, chainId),
218
228
  },
219
229
  };
220
230
  }
@@ -230,7 +240,7 @@ function mapApiTransaction({ transaction, subjectAddress, }) {
230
240
  from,
231
241
  sourceToken: getToken(sentTransfer, 'out'),
232
242
  destinationToken: getToken(receivedTransfer, 'in'),
233
- fees: (0, transactions_js_1.getFees)(transaction),
243
+ fees: (0, transactions_js_1.getFees)(transaction, chainId),
234
244
  },
235
245
  };
236
246
  }
@@ -242,7 +252,7 @@ function mapApiTransaction({ transaction, subjectAddress, }) {
242
252
  from,
243
253
  sourceToken: getToken(sentTransfer, 'out'),
244
254
  destinationToken: getToken(receivedTransfer, 'in'),
245
- fees: (0, transactions_js_1.getFees)(transaction),
255
+ fees: (0, transactions_js_1.getFees)(transaction, chainId),
246
256
  },
247
257
  };
248
258
  }
@@ -258,7 +268,7 @@ function mapApiTransaction({ transaction, subjectAddress, }) {
258
268
  from,
259
269
  sourceToken: getToken(sentTransfer, 'out'),
260
270
  destinationToken: getToken(receivedTransfer, 'in'),
261
- fees: (0, transactions_js_1.getFees)(transaction),
271
+ fees: (0, transactions_js_1.getFees)(transaction, chainId),
262
272
  },
263
273
  };
264
274
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api-transaction-mapper.cjs","sourceRoot":"","sources":["../../src/mappers/api-transaction-mapper.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isEqualCaseInsensitive as equalsIgnoreCase,\n isValidHexAddress,\n} from '@metamask/controller-utils';\nimport type { V1TransactionByHashResponse } from '@metamask/core-backend';\nimport { KnownCaipNamespace, toCaipChainId } from '@metamask/utils';\n\nimport type {\n ActivityItem,\n Status,\n TokenAmount,\n ValueTransfer,\n} from '../types.js';\nimport {\n nativeTokenAddress,\n supplyMethodIds,\n swapsWrappedTokensAddresses,\n withdrawMethodIds,\n wrapMethodIds,\n} from './constants.js';\nimport { formatAddressToAssetId } from './helpers/caip.js';\nimport {\n getFees,\n getNftPaymentTransfer,\n getTokenAmountFromTransfer,\n getTokenMetadataFromKnownToken,\n parseValueTransfers,\n withFallbackTokenAssetId,\n} from './helpers/transactions.js';\n\n/**\n * Maps an indexed API transaction into the shared activity item shape.\n *\n * @param options - The mapping options.\n * @param options.transaction - The indexed API transaction to map.\n * @param options.subjectAddress - The account the activity is being mapped for.\n * @returns The normalized activity item.\n */\nexport function mapApiTransaction({\n transaction,\n subjectAddress,\n}: {\n transaction: V1TransactionByHashResponse;\n subjectAddress: string;\n}): ActivityItem {\n const { hash, transactionCategory, valueTransfers, from, methodId } =\n transaction;\n const normalizedMethodId = methodId?.toLowerCase() ?? '';\n const status: Status = transaction.isError ? 'failed' : 'success';\n const timestamp = new Date(transaction.timestamp).getTime();\n const chainId = toCaipChainId(\n KnownCaipNamespace.Eip155,\n transaction.chainId.toString(),\n );\n const getToken = (\n transfer: ValueTransfer | undefined,\n direction: TokenAmount['direction'],\n ): TokenAmount | undefined =>\n getTokenAmountFromTransfer(transfer, direction, chainId);\n\n const {\n sentTransfer,\n receivedTransfer,\n sentNativeTransfer,\n sentNftTransfer,\n receivedNftTransfer,\n } = parseValueTransfers(valueTransfers, subjectAddress);\n\n const common = { chainId, status, timestamp, hash };\n\n if (transactionCategory === 'SWAP' || transactionCategory === 'EXCHANGE') {\n return {\n type: 'swap',\n ...common,\n data: {\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction),\n from,\n },\n };\n }\n\n if (transactionCategory === 'APPROVE') {\n // Note: Categorize REVOKE in the backend\n const direction = receivedTransfer && !sentTransfer ? 'in' : 'out';\n const valueTransferContractAddress = valueTransfers?.find(\n ({ contractAddress, transferType }) =>\n contractAddress &&\n transferType !== 'normal' &&\n transferType !== 'internal',\n )?.contractAddress;\n const contractAddress =\n (isValidHexAddress(transaction.to, { allowNonPrefixed: false })\n ? transaction.to\n : undefined) ??\n (valueTransferContractAddress &&\n isValidHexAddress(valueTransferContractAddress, {\n allowNonPrefixed: false,\n })\n ? valueTransferContractAddress\n : undefined);\n const assetId = contractAddress\n ? formatAddressToAssetId(contractAddress, chainId)\n : undefined;\n const token =\n getTokenMetadataFromKnownToken(contractAddress, direction, chainId) ??\n (assetId ? { direction, assetId } : undefined);\n\n return {\n type: 'approveSpendingCap',\n ...common,\n data: {\n from,\n token,\n fees: getFees(transaction),\n },\n };\n }\n\n // Note: Categorize NFT in the backend\n const isNftExchange = transactionCategory === 'NFT_EXCHANGE';\n\n if (receivedNftTransfer) {\n if (receivedNftTransfer.from === nativeTokenAddress) {\n return {\n type: 'nftMint',\n ...common,\n data: {\n from: receivedNftTransfer.from,\n to: receivedNftTransfer.to,\n token: getToken(receivedNftTransfer, 'in'),\n },\n };\n }\n\n const purchasePaymentTransfer = getNftPaymentTransfer({\n side: 'buy',\n sentTransfer,\n sentNativeTransfer,\n nftCounterparty: receivedNftTransfer.from,\n transactionTo: transaction.to,\n subjectAddress,\n });\n\n if (isNftExchange || purchasePaymentTransfer) {\n return {\n type: 'nftBuy',\n ...common,\n data: {\n from: receivedNftTransfer.from,\n to: receivedNftTransfer.to,\n token: getToken(receivedNftTransfer, 'in'),\n paymentToken: getToken(purchasePaymentTransfer, 'out'),\n },\n };\n }\n\n return {\n type: 'receive',\n ...common,\n data: {\n from: receivedNftTransfer.from,\n to: receivedNftTransfer.to,\n token: getToken(receivedNftTransfer, 'in'),\n },\n };\n }\n\n if (sentNftTransfer) {\n const saleProceedsTransfer = getNftPaymentTransfer({\n side: 'sell',\n receivedTransfer,\n nftCounterparty: sentNftTransfer.to,\n transactionFrom: from,\n subjectAddress,\n });\n\n if (isNftExchange || saleProceedsTransfer) {\n return {\n type: 'nftSell',\n ...common,\n data: {\n from: sentNftTransfer.from,\n to: sentNftTransfer.to,\n token: getToken(sentNftTransfer, 'out'),\n paymentToken: getToken(saleProceedsTransfer, 'in'),\n },\n };\n }\n\n return {\n type: 'send',\n ...common,\n data: {\n from: sentNftTransfer.from,\n to: sentNftTransfer.to,\n token: getToken(sentNftTransfer, 'out'),\n },\n };\n }\n\n const hasNativeTransferWithoutMethod =\n transactionCategory === 'CONTRACT_CALL' &&\n !methodId &&\n valueTransfers?.some(({ transferType }) => transferType === 'normal');\n\n if (\n transactionCategory === 'TRANSFER' ||\n transactionCategory === 'STANDARD' ||\n hasNativeTransferWithoutMethod\n ) {\n const isReceive =\n Boolean(receivedTransfer && !sentTransfer) ||\n (equalsIgnoreCase(transaction.to, subjectAddress) &&\n !equalsIgnoreCase(from, subjectAddress));\n\n const transfer = isReceive ? receivedTransfer : sentTransfer;\n const direction = isReceive ? 'in' : 'out';\n\n return {\n type: isReceive ? 'receive' : 'send',\n ...common,\n data: {\n from: transfer?.from ?? from,\n to: transfer?.to ?? transaction.to,\n token: withFallbackTokenAssetId(\n getToken(transfer, direction),\n transaction.to,\n transfer?.transferType,\n chainId,\n ),\n fees: getFees(transaction),\n },\n };\n }\n\n if (transactionCategory === 'CLAIM_BONUS') {\n return {\n type: 'claimMusdBonus',\n ...common,\n data: {\n from,\n token: getToken(receivedTransfer, 'in'),\n },\n };\n }\n\n if (transactionCategory === 'CLAIM') {\n return {\n type: 'claim',\n ...common,\n data: {\n from,\n token: getToken(\n receivedTransfer ?? sentTransfer,\n receivedTransfer ? 'in' : 'out',\n ),\n },\n };\n }\n\n if (transactionCategory === 'BRIDGE_WITHDRAW') {\n return {\n type: 'bridge',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n fees: getFees(transaction),\n },\n };\n }\n\n if (\n transactionCategory === 'WITHDRAW' &&\n withdrawMethodIds.has(normalizedMethodId)\n ) {\n return {\n type: 'lendingWithdrawal',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction),\n },\n };\n }\n\n // Note: Categorize Deposit/Stake in the backend\n if (sentTransfer && supplyMethodIds.has(normalizedMethodId)) {\n return {\n type: 'lendingDeposit',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction),\n },\n };\n }\n\n const wrappedNativeAddress =\n swapsWrappedTokensAddresses[\n `0x${transaction.chainId.toString(\n 16,\n )}` as keyof typeof swapsWrappedTokensAddresses\n ];\n\n if (\n receivedTransfer &&\n wrapMethodIds.has(normalizedMethodId) &&\n wrappedNativeAddress &&\n equalsIgnoreCase(transaction.to, wrappedNativeAddress)\n ) {\n return {\n type: 'wrap',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction),\n },\n };\n }\n\n if (transactionCategory === 'UNWRAP') {\n return {\n type: 'unwrap',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction),\n },\n };\n }\n\n // Note: Categorize these Swaps in the backend\n if (\n transactionCategory === 'CONTRACT_CALL' &&\n sentTransfer?.symbol &&\n receivedTransfer?.symbol &&\n sentTransfer.symbol !== receivedTransfer.symbol\n ) {\n return {\n type: 'swap',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction),\n },\n };\n }\n\n if (transactionCategory === 'DEPOSIT') {\n return {\n type: 'deposit',\n ...common,\n data: {\n from,\n token: getToken(sentTransfer, 'out'),\n },\n };\n }\n\n const token = getToken(\n sentTransfer ?? receivedTransfer,\n sentTransfer ? 'out' : 'in',\n );\n\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n methodId,\n from,\n to: transaction.to,\n transactionCategory,\n transactionProtocol: transaction.transactionProtocol,\n ...(token ? { token } : {}),\n },\n };\n}\n"]}
1
+ {"version":3,"file":"api-transaction-mapper.cjs","sourceRoot":"","sources":["../../src/mappers/api-transaction-mapper.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isEqualCaseInsensitive as equalsIgnoreCase,\n isValidHexAddress,\n} from '@metamask/controller-utils';\nimport type { V1TransactionByHashResponse } from '@metamask/core-backend';\nimport { KnownCaipNamespace, toCaipChainId } from '@metamask/utils';\n\nimport type {\n ActivityItem,\n Status,\n TokenAmount,\n ValueTransfer,\n} from '../types.js';\nimport {\n nativeTokenAddress,\n supplyMethodIds,\n swapsWrappedTokensAddresses,\n withdrawMethodIds,\n wrapMethodIds,\n} from './constants.js';\nimport { formatAddressToAssetId, getNativeAsset } from './helpers/caip.js';\nimport {\n getFees,\n getNftPaymentTransfer,\n getTokenAmountFromTransfer,\n getTokenMetadataFromKnownToken,\n parseValueTransfers,\n withFallbackTokenAssetId,\n} from './helpers/transactions.js';\n\n/**\n * Maps an indexed API transaction into the shared activity item shape.\n *\n * @param options - The mapping options.\n * @param options.transaction - The indexed API transaction to map.\n * @param options.subjectAddress - The account the activity is being mapped for.\n * @returns The normalized activity item.\n */\nexport function mapApiTransaction({\n transaction,\n subjectAddress,\n}: {\n transaction: V1TransactionByHashResponse;\n subjectAddress: string;\n}): ActivityItem {\n const { hash, transactionCategory, valueTransfers, from, methodId } =\n transaction;\n const normalizedMethodId = methodId?.toLowerCase() ?? '';\n const status: Status = transaction.isError ? 'failed' : 'success';\n const timestamp = new Date(transaction.timestamp).getTime();\n const chainId = toCaipChainId(\n KnownCaipNamespace.Eip155,\n transaction.chainId.toString(),\n );\n const getToken = (\n transfer: ValueTransfer | undefined,\n direction: TokenAmount['direction'],\n ): TokenAmount | undefined =>\n getTokenAmountFromTransfer(transfer, direction, chainId);\n\n const {\n sentTransfer,\n receivedTransfer,\n sentNativeTransfer,\n sentNftTransfer,\n receivedNftTransfer,\n } = parseValueTransfers(valueTransfers, subjectAddress);\n\n const common = { chainId, status, timestamp, hash };\n\n if (transactionCategory === 'SWAP' || transactionCategory === 'EXCHANGE') {\n return {\n type: 'swap',\n ...common,\n data: {\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction, chainId),\n from,\n },\n };\n }\n\n if (transactionCategory === 'APPROVE') {\n // Note: Categorize REVOKE in the backend\n const direction = receivedTransfer && !sentTransfer ? 'in' : 'out';\n const valueTransferContractAddress = valueTransfers?.find(\n ({ contractAddress, transferType }) =>\n contractAddress &&\n transferType !== 'normal' &&\n transferType !== 'internal',\n )?.contractAddress;\n const contractAddress =\n (isValidHexAddress(transaction.to, { allowNonPrefixed: false })\n ? transaction.to\n : undefined) ??\n (valueTransferContractAddress &&\n isValidHexAddress(valueTransferContractAddress, {\n allowNonPrefixed: false,\n })\n ? valueTransferContractAddress\n : undefined);\n const assetId = contractAddress\n ? formatAddressToAssetId(contractAddress, chainId)\n : undefined;\n const token =\n getTokenMetadataFromKnownToken(contractAddress, direction, chainId) ??\n (assetId ? { direction, assetId } : undefined);\n\n return {\n type: 'approveSpendingCap',\n ...common,\n data: {\n from,\n token,\n fees: getFees(transaction, chainId),\n },\n };\n }\n\n // Note: Categorize NFT in the backend\n if (sentNftTransfer || receivedNftTransfer) {\n const isNftExchange = transactionCategory === 'NFT_EXCHANGE';\n\n if (receivedNftTransfer) {\n if (receivedNftTransfer.from === nativeTokenAddress) {\n return {\n type: 'nftMint',\n ...common,\n data: {\n from: receivedNftTransfer.from,\n to: receivedNftTransfer.to,\n token: getToken(receivedNftTransfer, 'in'),\n },\n };\n }\n\n const purchasePaymentTransfer = getNftPaymentTransfer({\n side: 'buy',\n sentTransfer,\n sentNativeTransfer,\n nftCounterparty: receivedNftTransfer.from,\n transactionTo: transaction.to,\n subjectAddress,\n });\n\n if (isNftExchange || purchasePaymentTransfer) {\n return {\n type: 'nftBuy',\n ...common,\n data: {\n from: receivedNftTransfer.from,\n to: receivedNftTransfer.to,\n token: getToken(receivedNftTransfer, 'in'),\n paymentToken: getToken(purchasePaymentTransfer, 'out'),\n },\n };\n }\n\n return {\n type: 'receive',\n ...common,\n data: {\n from: receivedNftTransfer.from,\n to: receivedNftTransfer.to,\n token: getToken(receivedNftTransfer, 'in'),\n },\n };\n }\n\n if (sentNftTransfer) {\n const saleProceedsTransfer = getNftPaymentTransfer({\n side: 'sell',\n receivedTransfer,\n nftCounterparty: sentNftTransfer.to,\n transactionFrom: from,\n subjectAddress,\n });\n\n if (isNftExchange || saleProceedsTransfer) {\n return {\n type: 'nftSell',\n ...common,\n data: {\n from: sentNftTransfer.from,\n to: sentNftTransfer.to,\n token: getToken(sentNftTransfer, 'out'),\n paymentToken: getToken(saleProceedsTransfer, 'in'),\n },\n };\n }\n\n return {\n type: 'send',\n ...common,\n data: {\n from: sentNftTransfer.from,\n to: sentNftTransfer.to,\n token: getToken(sentNftTransfer, 'out'),\n },\n };\n }\n }\n\n const hasNativeTransferWithoutMethod =\n transactionCategory === 'CONTRACT_CALL' &&\n !methodId &&\n valueTransfers?.some(({ transferType }) => transferType === 'normal');\n\n if (\n transactionCategory === 'TRANSFER' ||\n transactionCategory === 'STANDARD' ||\n hasNativeTransferWithoutMethod\n ) {\n const isReceive =\n Boolean(receivedTransfer && !sentTransfer) ||\n (equalsIgnoreCase(transaction.to, subjectAddress) &&\n !equalsIgnoreCase(from, subjectAddress));\n\n const transfer = isReceive ? receivedTransfer : sentTransfer;\n const direction = isReceive ? 'in' : 'out';\n const nativeAsset = getNativeAsset(chainId);\n const nativeToken =\n transactionCategory === 'STANDARD' && nativeAsset\n ? ({\n ...nativeAsset,\n amount: transaction.value,\n direction,\n } as TokenAmount)\n : undefined;\n\n return {\n type: isReceive ? 'receive' : 'send',\n ...common,\n data: {\n from: transfer?.from ?? from,\n to: transfer?.to ?? transaction.to,\n token:\n withFallbackTokenAssetId(\n getToken(transfer, direction),\n transaction.to,\n transfer?.transferType,\n chainId,\n ) ?? nativeToken,\n fees: getFees(transaction, chainId),\n },\n };\n }\n\n if (transactionCategory === 'CLAIM_BONUS') {\n return {\n type: 'claimMusdBonus',\n ...common,\n data: {\n from,\n token: getToken(receivedTransfer, 'in'),\n },\n };\n }\n\n if (transactionCategory === 'CLAIM') {\n return {\n type: 'claim',\n ...common,\n data: {\n from,\n token: getToken(\n receivedTransfer ?? sentTransfer,\n receivedTransfer ? 'in' : 'out',\n ),\n },\n };\n }\n\n if (transactionCategory === 'BRIDGE_WITHDRAW') {\n return {\n type: 'bridge',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n fees: getFees(transaction, chainId),\n },\n };\n }\n\n if (\n transactionCategory === 'WITHDRAW' &&\n withdrawMethodIds.has(normalizedMethodId)\n ) {\n return {\n type: 'lendingWithdrawal',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction, chainId),\n },\n };\n }\n\n // Note: Categorize Deposit/Stake in the backend\n if (sentTransfer && supplyMethodIds.has(normalizedMethodId)) {\n return {\n type: 'lendingDeposit',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction, chainId),\n },\n };\n }\n\n const wrappedNativeAddress =\n swapsWrappedTokensAddresses[\n `0x${transaction.chainId.toString(\n 16,\n )}` as keyof typeof swapsWrappedTokensAddresses\n ];\n\n if (\n receivedTransfer &&\n wrapMethodIds.has(normalizedMethodId) &&\n wrappedNativeAddress &&\n equalsIgnoreCase(transaction.to, wrappedNativeAddress)\n ) {\n return {\n type: 'wrap',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction, chainId),\n },\n };\n }\n\n if (transactionCategory === 'UNWRAP') {\n return {\n type: 'unwrap',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction, chainId),\n },\n };\n }\n\n // Note: Categorize these Swaps in the backend\n if (\n transactionCategory === 'CONTRACT_CALL' &&\n sentTransfer?.symbol &&\n receivedTransfer?.symbol &&\n sentTransfer.symbol !== receivedTransfer.symbol\n ) {\n return {\n type: 'swap',\n ...common,\n data: {\n from,\n sourceToken: getToken(sentTransfer, 'out'),\n destinationToken: getToken(receivedTransfer, 'in'),\n fees: getFees(transaction, chainId),\n },\n };\n }\n\n if (transactionCategory === 'DEPOSIT') {\n return {\n type: 'deposit',\n ...common,\n data: {\n from,\n token: getToken(sentTransfer, 'out'),\n },\n };\n }\n\n const token = getToken(\n sentTransfer ?? receivedTransfer,\n sentTransfer ? 'out' : 'in',\n );\n\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n methodId,\n from,\n to: transaction.to,\n transactionCategory,\n transactionProtocol: transaction.transactionProtocol,\n ...(token ? { token } : {}),\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"api-transaction-mapper.d.cts","sourceRoot":"","sources":["../../src/mappers/api-transaction-mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,+BAA+B;AAG1E,OAAO,KAAK,EACV,YAAY,EAIb,qBAAoB;AAkBrB;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,cAAc,GACf,EAAE;IACD,WAAW,EAAE,2BAA2B,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,YAAY,CAyVf"}
1
+ {"version":3,"file":"api-transaction-mapper.d.cts","sourceRoot":"","sources":["../../src/mappers/api-transaction-mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,+BAA+B;AAG1E,OAAO,KAAK,EACV,YAAY,EAIb,qBAAoB;AAkBrB;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,cAAc,GACf,EAAE;IACD,WAAW,EAAE,2BAA2B,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,YAAY,CAqWf"}
@@ -1 +1 @@
1
- {"version":3,"file":"api-transaction-mapper.d.mts","sourceRoot":"","sources":["../../src/mappers/api-transaction-mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,+BAA+B;AAG1E,OAAO,KAAK,EACV,YAAY,EAIb,qBAAoB;AAkBrB;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,cAAc,GACf,EAAE;IACD,WAAW,EAAE,2BAA2B,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,YAAY,CAyVf"}
1
+ {"version":3,"file":"api-transaction-mapper.d.mts","sourceRoot":"","sources":["../../src/mappers/api-transaction-mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,+BAA+B;AAG1E,OAAO,KAAK,EACV,YAAY,EAIb,qBAAoB;AAkBrB;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,cAAc,GACf,EAAE;IACD,WAAW,EAAE,2BAA2B,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,YAAY,CAqWf"}
@@ -1,7 +1,7 @@
1
1
  import { isEqualCaseInsensitive as equalsIgnoreCase, isValidHexAddress } from "@metamask/controller-utils";
2
2
  import { KnownCaipNamespace, toCaipChainId } from "@metamask/utils";
3
3
  import { nativeTokenAddress, supplyMethodIds, swapsWrappedTokensAddresses, withdrawMethodIds, wrapMethodIds } from "./constants.mjs";
4
- import { formatAddressToAssetId } from "./helpers/caip.mjs";
4
+ import { formatAddressToAssetId, getNativeAsset } from "./helpers/caip.mjs";
5
5
  import { getFees, getNftPaymentTransfer, getTokenAmountFromTransfer, getTokenMetadataFromKnownToken, parseValueTransfers, withFallbackTokenAssetId } from "./helpers/transactions.mjs";
6
6
  /**
7
7
  * Maps an indexed API transaction into the shared activity item shape.
@@ -27,7 +27,7 @@ export function mapApiTransaction({ transaction, subjectAddress, }) {
27
27
  data: {
28
28
  sourceToken: getToken(sentTransfer, 'out'),
29
29
  destinationToken: getToken(receivedTransfer, 'in'),
30
- fees: getFees(transaction),
30
+ fees: getFees(transaction, chainId),
31
31
  from,
32
32
  },
33
33
  };
@@ -58,16 +58,47 @@ export function mapApiTransaction({ transaction, subjectAddress, }) {
58
58
  data: {
59
59
  from,
60
60
  token,
61
- fees: getFees(transaction),
61
+ fees: getFees(transaction, chainId),
62
62
  },
63
63
  };
64
64
  }
65
65
  // Note: Categorize NFT in the backend
66
- const isNftExchange = transactionCategory === 'NFT_EXCHANGE';
67
- if (receivedNftTransfer) {
68
- if (receivedNftTransfer.from === nativeTokenAddress) {
66
+ if (sentNftTransfer || receivedNftTransfer) {
67
+ const isNftExchange = transactionCategory === 'NFT_EXCHANGE';
68
+ if (receivedNftTransfer) {
69
+ if (receivedNftTransfer.from === nativeTokenAddress) {
70
+ return {
71
+ type: 'nftMint',
72
+ ...common,
73
+ data: {
74
+ from: receivedNftTransfer.from,
75
+ to: receivedNftTransfer.to,
76
+ token: getToken(receivedNftTransfer, 'in'),
77
+ },
78
+ };
79
+ }
80
+ const purchasePaymentTransfer = getNftPaymentTransfer({
81
+ side: 'buy',
82
+ sentTransfer,
83
+ sentNativeTransfer,
84
+ nftCounterparty: receivedNftTransfer.from,
85
+ transactionTo: transaction.to,
86
+ subjectAddress,
87
+ });
88
+ if (isNftExchange || purchasePaymentTransfer) {
89
+ return {
90
+ type: 'nftBuy',
91
+ ...common,
92
+ data: {
93
+ from: receivedNftTransfer.from,
94
+ to: receivedNftTransfer.to,
95
+ token: getToken(receivedNftTransfer, 'in'),
96
+ paymentToken: getToken(purchasePaymentTransfer, 'out'),
97
+ },
98
+ };
99
+ }
69
100
  return {
70
- type: 'nftMint',
101
+ type: 'receive',
71
102
  ...common,
72
103
  data: {
73
104
  from: receivedNftTransfer.from,
@@ -76,65 +107,36 @@ export function mapApiTransaction({ transaction, subjectAddress, }) {
76
107
  },
77
108
  };
78
109
  }
79
- const purchasePaymentTransfer = getNftPaymentTransfer({
80
- side: 'buy',
81
- sentTransfer,
82
- sentNativeTransfer,
83
- nftCounterparty: receivedNftTransfer.from,
84
- transactionTo: transaction.to,
85
- subjectAddress,
86
- });
87
- if (isNftExchange || purchasePaymentTransfer) {
110
+ if (sentNftTransfer) {
111
+ const saleProceedsTransfer = getNftPaymentTransfer({
112
+ side: 'sell',
113
+ receivedTransfer,
114
+ nftCounterparty: sentNftTransfer.to,
115
+ transactionFrom: from,
116
+ subjectAddress,
117
+ });
118
+ if (isNftExchange || saleProceedsTransfer) {
119
+ return {
120
+ type: 'nftSell',
121
+ ...common,
122
+ data: {
123
+ from: sentNftTransfer.from,
124
+ to: sentNftTransfer.to,
125
+ token: getToken(sentNftTransfer, 'out'),
126
+ paymentToken: getToken(saleProceedsTransfer, 'in'),
127
+ },
128
+ };
129
+ }
88
130
  return {
89
- type: 'nftBuy',
90
- ...common,
91
- data: {
92
- from: receivedNftTransfer.from,
93
- to: receivedNftTransfer.to,
94
- token: getToken(receivedNftTransfer, 'in'),
95
- paymentToken: getToken(purchasePaymentTransfer, 'out'),
96
- },
97
- };
98
- }
99
- return {
100
- type: 'receive',
101
- ...common,
102
- data: {
103
- from: receivedNftTransfer.from,
104
- to: receivedNftTransfer.to,
105
- token: getToken(receivedNftTransfer, 'in'),
106
- },
107
- };
108
- }
109
- if (sentNftTransfer) {
110
- const saleProceedsTransfer = getNftPaymentTransfer({
111
- side: 'sell',
112
- receivedTransfer,
113
- nftCounterparty: sentNftTransfer.to,
114
- transactionFrom: from,
115
- subjectAddress,
116
- });
117
- if (isNftExchange || saleProceedsTransfer) {
118
- return {
119
- type: 'nftSell',
131
+ type: 'send',
120
132
  ...common,
121
133
  data: {
122
134
  from: sentNftTransfer.from,
123
135
  to: sentNftTransfer.to,
124
136
  token: getToken(sentNftTransfer, 'out'),
125
- paymentToken: getToken(saleProceedsTransfer, 'in'),
126
137
  },
127
138
  };
128
139
  }
129
- return {
130
- type: 'send',
131
- ...common,
132
- data: {
133
- from: sentNftTransfer.from,
134
- to: sentNftTransfer.to,
135
- token: getToken(sentNftTransfer, 'out'),
136
- },
137
- };
138
140
  }
139
141
  const hasNativeTransferWithoutMethod = transactionCategory === 'CONTRACT_CALL' &&
140
142
  !methodId &&
@@ -147,14 +149,22 @@ export function mapApiTransaction({ transaction, subjectAddress, }) {
147
149
  !equalsIgnoreCase(from, subjectAddress));
148
150
  const transfer = isReceive ? receivedTransfer : sentTransfer;
149
151
  const direction = isReceive ? 'in' : 'out';
152
+ const nativeAsset = getNativeAsset(chainId);
153
+ const nativeToken = transactionCategory === 'STANDARD' && nativeAsset
154
+ ? {
155
+ ...nativeAsset,
156
+ amount: transaction.value,
157
+ direction,
158
+ }
159
+ : undefined;
150
160
  return {
151
161
  type: isReceive ? 'receive' : 'send',
152
162
  ...common,
153
163
  data: {
154
164
  from: transfer?.from ?? from,
155
165
  to: transfer?.to ?? transaction.to,
156
- token: withFallbackTokenAssetId(getToken(transfer, direction), transaction.to, transfer?.transferType, chainId),
157
- fees: getFees(transaction),
166
+ token: withFallbackTokenAssetId(getToken(transfer, direction), transaction.to, transfer?.transferType, chainId) ?? nativeToken,
167
+ fees: getFees(transaction, chainId),
158
168
  },
159
169
  };
160
170
  }
@@ -185,7 +195,7 @@ export function mapApiTransaction({ transaction, subjectAddress, }) {
185
195
  data: {
186
196
  from,
187
197
  sourceToken: getToken(sentTransfer, 'out'),
188
- fees: getFees(transaction),
198
+ fees: getFees(transaction, chainId),
189
199
  },
190
200
  };
191
201
  }
@@ -198,7 +208,7 @@ export function mapApiTransaction({ transaction, subjectAddress, }) {
198
208
  from,
199
209
  sourceToken: getToken(sentTransfer, 'out'),
200
210
  destinationToken: getToken(receivedTransfer, 'in'),
201
- fees: getFees(transaction),
211
+ fees: getFees(transaction, chainId),
202
212
  },
203
213
  };
204
214
  }
@@ -211,7 +221,7 @@ export function mapApiTransaction({ transaction, subjectAddress, }) {
211
221
  from,
212
222
  sourceToken: getToken(sentTransfer, 'out'),
213
223
  destinationToken: getToken(receivedTransfer, 'in'),
214
- fees: getFees(transaction),
224
+ fees: getFees(transaction, chainId),
215
225
  },
216
226
  };
217
227
  }
@@ -227,7 +237,7 @@ export function mapApiTransaction({ transaction, subjectAddress, }) {
227
237
  from,
228
238
  sourceToken: getToken(sentTransfer, 'out'),
229
239
  destinationToken: getToken(receivedTransfer, 'in'),
230
- fees: getFees(transaction),
240
+ fees: getFees(transaction, chainId),
231
241
  },
232
242
  };
233
243
  }
@@ -239,7 +249,7 @@ export function mapApiTransaction({ transaction, subjectAddress, }) {
239
249
  from,
240
250
  sourceToken: getToken(sentTransfer, 'out'),
241
251
  destinationToken: getToken(receivedTransfer, 'in'),
242
- fees: getFees(transaction),
252
+ fees: getFees(transaction, chainId),
243
253
  },
244
254
  };
245
255
  }
@@ -255,7 +265,7 @@ export function mapApiTransaction({ transaction, subjectAddress, }) {
255
265
  from,
256
266
  sourceToken: getToken(sentTransfer, 'out'),
257
267
  destinationToken: getToken(receivedTransfer, 'in'),
258
- fees: getFees(transaction),
268
+ fees: getFees(transaction, chainId),
259
269
  },
260
270
  };
261
271
  }