@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,20 @@
|
|
|
1
|
+
import type { Fee, ActivityItem, TokenAmount } from "../types.cjs";
|
|
2
|
+
import type { TransactionGroup } from "./helpers/transactions.cjs";
|
|
3
|
+
/**
|
|
4
|
+
* Maps a local TransactionController group into the shared activity item shape.
|
|
5
|
+
*
|
|
6
|
+
* @param transactionGroup - The transaction group to map, optionally enriched by the client.
|
|
7
|
+
* @returns The normalized activity item.
|
|
8
|
+
*/
|
|
9
|
+
export declare function mapLocalTransaction(transactionGroup: TransactionGroup & {
|
|
10
|
+
sourceToken?: TokenAmount;
|
|
11
|
+
destinationToken?: TokenAmount;
|
|
12
|
+
nativeAssetSymbol?: string;
|
|
13
|
+
contractTokenMetadata?: {
|
|
14
|
+
symbol?: string;
|
|
15
|
+
decimals?: number;
|
|
16
|
+
};
|
|
17
|
+
activityStatus?: ActivityItem['status'];
|
|
18
|
+
fees?: Fee[];
|
|
19
|
+
}): ActivityItem;
|
|
20
|
+
//# sourceMappingURL=local-transaction-mapper.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-transaction-mapper.d.cts","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAiB;AAiB/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,mCAA+B;AAI/D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,gBAAgB,GAAG;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,cAAc,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,GACA,YAAY,CA2fd"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Fee, ActivityItem, TokenAmount } from "../types.mjs";
|
|
2
|
+
import type { TransactionGroup } from "./helpers/transactions.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* Maps a local TransactionController group into the shared activity item shape.
|
|
5
|
+
*
|
|
6
|
+
* @param transactionGroup - The transaction group to map, optionally enriched by the client.
|
|
7
|
+
* @returns The normalized activity item.
|
|
8
|
+
*/
|
|
9
|
+
export declare function mapLocalTransaction(transactionGroup: TransactionGroup & {
|
|
10
|
+
sourceToken?: TokenAmount;
|
|
11
|
+
destinationToken?: TokenAmount;
|
|
12
|
+
nativeAssetSymbol?: string;
|
|
13
|
+
contractTokenMetadata?: {
|
|
14
|
+
symbol?: string;
|
|
15
|
+
decimals?: number;
|
|
16
|
+
};
|
|
17
|
+
activityStatus?: ActivityItem['status'];
|
|
18
|
+
fees?: Fee[];
|
|
19
|
+
}): ActivityItem;
|
|
20
|
+
//# sourceMappingURL=local-transaction-mapper.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-transaction-mapper.d.mts","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAiB;AAiB/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,mCAA+B;AAI/D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,gBAAgB,GAAG;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,cAAc,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,GACA,YAAY,CA2fd"}
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
import { isEqualCaseInsensitive as equalsIgnoreCase } from "@metamask/controller-utils";
|
|
2
|
+
import { TransactionType } from "@metamask/transaction-controller";
|
|
3
|
+
import { KnownCaipNamespace, toCaipChainId } from "@metamask/utils";
|
|
4
|
+
import { permit2ApproveMethodId, swapsWrappedTokensAddresses, supplyMethodIds, tokenTransferLogTopicHash, unwrapMethodIds, withdrawMethodIds, wrapMethodIds } from "./constants.mjs";
|
|
5
|
+
import { formatAddressToAssetId, getNativeAsset } from "./helpers/caip.mjs";
|
|
6
|
+
import { getKnownTokenMetadata } from "./helpers/token-metadata.mjs";
|
|
7
|
+
import { getLocalTransactionFees, getLocalTransactionStatus, isNftStandard } from "./helpers/transactions.mjs";
|
|
8
|
+
const evmNativeDecimals = 18;
|
|
9
|
+
/**
|
|
10
|
+
* Maps a local TransactionController group into the shared activity item shape.
|
|
11
|
+
*
|
|
12
|
+
* @param transactionGroup - The transaction group to map, optionally enriched by the client.
|
|
13
|
+
* @returns The normalized activity item.
|
|
14
|
+
*/
|
|
15
|
+
export function mapLocalTransaction(transactionGroup) {
|
|
16
|
+
const fees = transactionGroup.fees ?? getLocalTransactionFees(transactionGroup);
|
|
17
|
+
const { initialTransaction, primaryTransaction } = transactionGroup;
|
|
18
|
+
const { transferInformation, type: transactionType, simulationData, txReceipt, metamaskPay, txParams: { from = '', to = '', data: txData, value: txValue } = {}, } = initialTransaction;
|
|
19
|
+
const { time: primaryTime, hash: primaryHash, id: primaryId, } = primaryTransaction;
|
|
20
|
+
const methodId = txData?.slice(0, 10);
|
|
21
|
+
// Permit2 approvals use the Permit2 contract as `to`, not the approved token.
|
|
22
|
+
// Keep this mapper thin: still classify the activity as an approve, but omit
|
|
23
|
+
// the token rather than surfacing the wrong one — the API mapper provides
|
|
24
|
+
// accurate token data.
|
|
25
|
+
const isPermit2Approve = methodId === permit2ApproveMethodId;
|
|
26
|
+
const tokenContractAddress = isPermit2Approve
|
|
27
|
+
? undefined
|
|
28
|
+
: (transferInformation?.contractAddress ?? (to || undefined));
|
|
29
|
+
const chainId = toCaipChainId(KnownCaipNamespace.Eip155, Number.parseInt(initialTransaction.chainId, 16).toString());
|
|
30
|
+
const nativeAsset = getNativeAsset(initialTransaction.chainId);
|
|
31
|
+
const nativeSymbol = transactionGroup.nativeAssetSymbol ?? nativeAsset?.symbol;
|
|
32
|
+
const getNativeToken = (transaction, direction) => {
|
|
33
|
+
if (nativeSymbol === undefined) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
direction,
|
|
38
|
+
symbol: nativeSymbol,
|
|
39
|
+
...(transaction.txParams.value
|
|
40
|
+
? { amount: transaction.txParams.value }
|
|
41
|
+
: {}),
|
|
42
|
+
...(nativeAsset?.assetId ? { assetId: nativeAsset.assetId } : {}),
|
|
43
|
+
decimals: nativeAsset?.decimals ?? evmNativeDecimals,
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
const getContractTokenFromTransaction = ({ contractAddress, direction, transaction, }) => {
|
|
47
|
+
if (!contractAddress) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const symbol = transaction.transferInformation?.symbol ??
|
|
51
|
+
transactionGroup.contractTokenMetadata?.symbol;
|
|
52
|
+
const decimals = transaction.transferInformation?.decimals ??
|
|
53
|
+
transactionGroup.contractTokenMetadata?.decimals;
|
|
54
|
+
const amount = transaction.transferInformation?.amount;
|
|
55
|
+
const assetId = formatAddressToAssetId(contractAddress, chainId);
|
|
56
|
+
return {
|
|
57
|
+
direction,
|
|
58
|
+
...(symbol ? { symbol } : {}),
|
|
59
|
+
...(assetId ? { assetId } : {}),
|
|
60
|
+
...(amount ? { amount } : {}),
|
|
61
|
+
...(decimals === undefined ? {} : { decimals }),
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
const getContractTokenWithKnownMetadata = ({ amount, contractAddress, direction, transaction, }) => {
|
|
65
|
+
if (!contractAddress) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);
|
|
69
|
+
const isWrappedNativeToken = equalsIgnoreCase(contractAddress, swapsWrappedTokensAddresses[initialTransaction.chainId] || '');
|
|
70
|
+
const wrappedNativeTokenDecimals = isWrappedNativeToken
|
|
71
|
+
? (nativeAsset?.decimals ?? evmNativeDecimals)
|
|
72
|
+
: undefined;
|
|
73
|
+
const decimals = transaction.transferInformation?.amount === undefined
|
|
74
|
+
? (tokenMetadata?.decimals ??
|
|
75
|
+
transactionGroup.contractTokenMetadata?.decimals ??
|
|
76
|
+
wrappedNativeTokenDecimals)
|
|
77
|
+
: transaction.transferInformation.decimals;
|
|
78
|
+
const tokenAmount = transaction.transferInformation?.amount ?? amount;
|
|
79
|
+
const symbol = transaction.transferInformation?.symbol ??
|
|
80
|
+
tokenMetadata?.symbol ??
|
|
81
|
+
transactionGroup.contractTokenMetadata?.symbol;
|
|
82
|
+
const assetId = formatAddressToAssetId(contractAddress, chainId);
|
|
83
|
+
return {
|
|
84
|
+
direction,
|
|
85
|
+
...(symbol ? { symbol } : {}),
|
|
86
|
+
...(assetId ? { assetId } : {}),
|
|
87
|
+
...(tokenAmount ? { amount: tokenAmount } : {}),
|
|
88
|
+
...(decimals === undefined ? {} : { decimals }),
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
const status = transactionGroup.activityStatus ??
|
|
92
|
+
getLocalTransactionStatus({
|
|
93
|
+
primaryTransaction,
|
|
94
|
+
initialTransaction,
|
|
95
|
+
});
|
|
96
|
+
const timestamp = primaryTime ?? initialTransaction.time;
|
|
97
|
+
const hash = primaryHash ?? initialTransaction.hash ?? primaryId;
|
|
98
|
+
const common = { chainId, status, timestamp, hash };
|
|
99
|
+
switch (transactionType) {
|
|
100
|
+
case TransactionType.simpleSend: {
|
|
101
|
+
return {
|
|
102
|
+
type: 'send',
|
|
103
|
+
...common,
|
|
104
|
+
data: {
|
|
105
|
+
from,
|
|
106
|
+
to,
|
|
107
|
+
token: getNativeToken(initialTransaction, 'out'),
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
case TransactionType.swap:
|
|
112
|
+
case TransactionType.swapAndSend:
|
|
113
|
+
case TransactionType.bridge: {
|
|
114
|
+
const { sourceToken, destinationToken } = transactionGroup;
|
|
115
|
+
return {
|
|
116
|
+
type: transactionType === TransactionType.bridge ? 'bridge' : 'swap',
|
|
117
|
+
...common,
|
|
118
|
+
data: {
|
|
119
|
+
from,
|
|
120
|
+
sourceToken,
|
|
121
|
+
destinationToken,
|
|
122
|
+
fees,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
case TransactionType.tokenMethodSafeTransferFrom:
|
|
127
|
+
case TransactionType.tokenMethodTransfer:
|
|
128
|
+
case TransactionType.tokenMethodTransferFrom: {
|
|
129
|
+
return {
|
|
130
|
+
type: 'send',
|
|
131
|
+
...common,
|
|
132
|
+
data: {
|
|
133
|
+
from,
|
|
134
|
+
to,
|
|
135
|
+
token: getContractTokenFromTransaction({
|
|
136
|
+
transaction: initialTransaction,
|
|
137
|
+
direction: 'out',
|
|
138
|
+
contractAddress: tokenContractAddress,
|
|
139
|
+
}),
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
case TransactionType.lendingDeposit:
|
|
144
|
+
case TransactionType.stakingDeposit:
|
|
145
|
+
return {
|
|
146
|
+
type: transactionType === TransactionType.stakingDeposit
|
|
147
|
+
? 'deposit'
|
|
148
|
+
: 'lendingDeposit',
|
|
149
|
+
...common,
|
|
150
|
+
data: {
|
|
151
|
+
from,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
case TransactionType.incoming: {
|
|
155
|
+
return {
|
|
156
|
+
type: 'receive',
|
|
157
|
+
...common,
|
|
158
|
+
data: {
|
|
159
|
+
from,
|
|
160
|
+
to,
|
|
161
|
+
token: transferInformation?.contractAddress
|
|
162
|
+
? getContractTokenFromTransaction({
|
|
163
|
+
transaction: initialTransaction,
|
|
164
|
+
direction: 'in',
|
|
165
|
+
contractAddress: transferInformation.contractAddress,
|
|
166
|
+
})
|
|
167
|
+
: getNativeToken(initialTransaction, 'in'),
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
case TransactionType.musdClaim:
|
|
172
|
+
return {
|
|
173
|
+
type: 'claimMusdBonus',
|
|
174
|
+
...common,
|
|
175
|
+
data: {
|
|
176
|
+
from,
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
case TransactionType.musdConversion: {
|
|
180
|
+
let conversionAmount;
|
|
181
|
+
if (txData && txData.length >= 138) {
|
|
182
|
+
try {
|
|
183
|
+
conversionAmount = BigInt(`0x${txData.slice(74, 138)}`).toString();
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
conversionAmount = undefined;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
type: 'convert',
|
|
191
|
+
...common,
|
|
192
|
+
data: {
|
|
193
|
+
from,
|
|
194
|
+
sourceToken: transactionGroup.sourceToken,
|
|
195
|
+
destinationToken: getContractTokenWithKnownMetadata({
|
|
196
|
+
amount: conversionAmount,
|
|
197
|
+
transaction: initialTransaction,
|
|
198
|
+
direction: 'in',
|
|
199
|
+
contractAddress: to,
|
|
200
|
+
}),
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
case TransactionType.bridgeApproval:
|
|
205
|
+
case TransactionType.shieldSubscriptionApprove:
|
|
206
|
+
case TransactionType.swapApproval:
|
|
207
|
+
case TransactionType.tokenMethodSetApprovalForAll:
|
|
208
|
+
case TransactionType.tokenMethodApprove:
|
|
209
|
+
case TransactionType.tokenMethodIncreaseAllowance: {
|
|
210
|
+
const approvalToken = getContractTokenFromTransaction({
|
|
211
|
+
transaction: initialTransaction,
|
|
212
|
+
direction: 'out',
|
|
213
|
+
contractAddress: tokenContractAddress,
|
|
214
|
+
});
|
|
215
|
+
return {
|
|
216
|
+
type: transactionType === TransactionType.tokenMethodIncreaseAllowance
|
|
217
|
+
? 'increaseSpendingCap'
|
|
218
|
+
: 'approveSpendingCap',
|
|
219
|
+
...common,
|
|
220
|
+
data: {
|
|
221
|
+
from,
|
|
222
|
+
token: approvalToken,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
case TransactionType.perpsDeposit:
|
|
227
|
+
case TransactionType.perpsDepositAndOrder:
|
|
228
|
+
case TransactionType.perpsWithdraw: {
|
|
229
|
+
const token = to
|
|
230
|
+
? {
|
|
231
|
+
direction: 'out',
|
|
232
|
+
assetId: formatAddressToAssetId(to, chainId),
|
|
233
|
+
}
|
|
234
|
+
: undefined;
|
|
235
|
+
const fiat = metamaskPay?.targetFiat
|
|
236
|
+
? { amount: metamaskPay.targetFiat }
|
|
237
|
+
: undefined;
|
|
238
|
+
const networkFee = typeof metamaskPay?.networkFeeFiat === 'string'
|
|
239
|
+
? { amount: metamaskPay.networkFeeFiat }
|
|
240
|
+
: undefined;
|
|
241
|
+
return {
|
|
242
|
+
type: transactionType === TransactionType.perpsWithdraw
|
|
243
|
+
? 'perpsWithdraw'
|
|
244
|
+
: 'perpsAddFunds',
|
|
245
|
+
...common,
|
|
246
|
+
data: {
|
|
247
|
+
from,
|
|
248
|
+
token,
|
|
249
|
+
fiat,
|
|
250
|
+
networkFee,
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
default: {
|
|
255
|
+
const isSupplyContractInteraction = transactionType === TransactionType.contractInteraction &&
|
|
256
|
+
methodId &&
|
|
257
|
+
supplyMethodIds.has(methodId.toLowerCase());
|
|
258
|
+
const isWithdrawContractInteraction = transactionType === TransactionType.contractInteraction &&
|
|
259
|
+
methodId &&
|
|
260
|
+
withdrawMethodIds.has(methodId.toLowerCase());
|
|
261
|
+
let hasNativeValue = false;
|
|
262
|
+
try {
|
|
263
|
+
hasNativeValue = BigInt(txValue ?? '0') > 0n;
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
hasNativeValue = false;
|
|
267
|
+
}
|
|
268
|
+
// Confirm an outflow before labelling a supply, mirroring the API mapper's
|
|
269
|
+
// `sentTransfer` guard: native stakes (e.g. Lido) decrease the native
|
|
270
|
+
// balance, while ERC-20 supplies (e.g. Aave) show a token decrease.
|
|
271
|
+
const isSupply = isSupplyContractInteraction &&
|
|
272
|
+
(simulationData?.nativeBalanceChange?.isDecrease === true ||
|
|
273
|
+
simulationData?.tokenBalanceChanges?.some(({ isDecrease, standard }) => isDecrease && standard === 'erc20') === true);
|
|
274
|
+
const incomingNftBalanceChange = transactionType === TransactionType.contractInteraction &&
|
|
275
|
+
simulationData?.tokenBalanceChanges?.find(({ isDecrease, standard }) => !isDecrease && isNftStandard(standard));
|
|
276
|
+
if (incomingNftBalanceChange && hasNativeValue) {
|
|
277
|
+
// Keep this mapper thin: classify the activity as an NFT buy and let the
|
|
278
|
+
// API mapper provide the token/payment details.
|
|
279
|
+
return {
|
|
280
|
+
type: 'nftBuy',
|
|
281
|
+
...common,
|
|
282
|
+
data: {
|
|
283
|
+
from,
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
if (isSupply) {
|
|
288
|
+
return {
|
|
289
|
+
type: 'lendingDeposit',
|
|
290
|
+
...common,
|
|
291
|
+
data: {
|
|
292
|
+
from,
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
// lending withdrawal - applies to Earn features only
|
|
297
|
+
if (isWithdrawContractInteraction) {
|
|
298
|
+
const fromAddress = from.toLowerCase();
|
|
299
|
+
const receivedTokenLog = (txReceipt?.logs ?? []).find(({ topics: [eventTopic, , logTo] = [] }) => {
|
|
300
|
+
const toAddress = logTo
|
|
301
|
+
? `0x${logTo.slice(-40)}`.toLowerCase()
|
|
302
|
+
: undefined;
|
|
303
|
+
return (eventTopic?.toLowerCase() === tokenTransferLogTopicHash &&
|
|
304
|
+
toAddress === fromAddress);
|
|
305
|
+
});
|
|
306
|
+
let receivedAmount;
|
|
307
|
+
if (receivedTokenLog) {
|
|
308
|
+
try {
|
|
309
|
+
receivedAmount = BigInt(String(receivedTokenLog.data)).toString();
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
receivedAmount = undefined;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const destinationToken = receivedTokenLog
|
|
316
|
+
? getContractTokenWithKnownMetadata({
|
|
317
|
+
amount: receivedAmount,
|
|
318
|
+
transaction: initialTransaction,
|
|
319
|
+
direction: 'in',
|
|
320
|
+
contractAddress: receivedTokenLog.address,
|
|
321
|
+
})
|
|
322
|
+
: undefined;
|
|
323
|
+
return {
|
|
324
|
+
type: 'lendingWithdrawal',
|
|
325
|
+
...common,
|
|
326
|
+
data: {
|
|
327
|
+
from,
|
|
328
|
+
destinationToken,
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
// wrap and unwrap
|
|
333
|
+
if (transactionType === TransactionType.contractInteraction && methodId) {
|
|
334
|
+
const wrappedTokenAddress = swapsWrappedTokensAddresses[initialTransaction.chainId];
|
|
335
|
+
if (wrappedTokenAddress && equalsIgnoreCase(to, wrappedTokenAddress)) {
|
|
336
|
+
const normalizedMethodId = methodId.toLowerCase();
|
|
337
|
+
if (wrapMethodIds.has(normalizedMethodId)) {
|
|
338
|
+
try {
|
|
339
|
+
if (txValue && BigInt(txValue) > 0n) {
|
|
340
|
+
return {
|
|
341
|
+
type: 'wrap',
|
|
342
|
+
...common,
|
|
343
|
+
data: {
|
|
344
|
+
from,
|
|
345
|
+
sourceToken: getNativeToken(initialTransaction, 'out'),
|
|
346
|
+
destinationToken: getContractTokenWithKnownMetadata({
|
|
347
|
+
amount: txValue,
|
|
348
|
+
transaction: initialTransaction,
|
|
349
|
+
direction: 'in',
|
|
350
|
+
contractAddress: wrappedTokenAddress,
|
|
351
|
+
}),
|
|
352
|
+
},
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
// Invalid native value — fall through.
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
if (unwrapMethodIds.has(normalizedMethodId)) {
|
|
361
|
+
let unwrapAmount;
|
|
362
|
+
if (txData && txData.length >= 74) {
|
|
363
|
+
try {
|
|
364
|
+
unwrapAmount = BigInt(`0x${txData.slice(10, 74)}`).toString();
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
unwrapAmount = undefined;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
const nativeToken = getNativeToken(initialTransaction, 'in');
|
|
371
|
+
return {
|
|
372
|
+
type: 'unwrap',
|
|
373
|
+
...common,
|
|
374
|
+
data: {
|
|
375
|
+
from,
|
|
376
|
+
sourceToken: getContractTokenWithKnownMetadata({
|
|
377
|
+
amount: unwrapAmount,
|
|
378
|
+
transaction: initialTransaction,
|
|
379
|
+
direction: 'out',
|
|
380
|
+
contractAddress: wrappedTokenAddress,
|
|
381
|
+
}),
|
|
382
|
+
destinationToken: nativeToken && unwrapAmount
|
|
383
|
+
? { ...nativeToken, amount: unwrapAmount }
|
|
384
|
+
: nativeToken,
|
|
385
|
+
},
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
const token = (() => {
|
|
391
|
+
if (txValue === undefined || txValue === '') {
|
|
392
|
+
return undefined;
|
|
393
|
+
}
|
|
394
|
+
try {
|
|
395
|
+
return BigInt(txValue) > 0n
|
|
396
|
+
? getNativeToken(initialTransaction, 'out')
|
|
397
|
+
: undefined;
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
return undefined;
|
|
401
|
+
}
|
|
402
|
+
})();
|
|
403
|
+
return {
|
|
404
|
+
type: 'contractInteraction',
|
|
405
|
+
...common,
|
|
406
|
+
data: {
|
|
407
|
+
from,
|
|
408
|
+
to,
|
|
409
|
+
...(token ? { token } : {}),
|
|
410
|
+
methodId,
|
|
411
|
+
},
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=local-transaction-mapper.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-transaction-mapper.mjs","sourceRoot":"","sources":["../../src/mappers/local-transaction-mapper.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEqualCaseInsensitive as equalsIgnoreCase } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport { KnownCaipNamespace, toCaipChainId } from '@metamask/utils';\n\nimport type { Fee, ActivityItem, TokenAmount } from '../types';\nimport {\n permit2ApproveMethodId,\n swapsWrappedTokensAddresses,\n supplyMethodIds,\n tokenTransferLogTopicHash,\n unwrapMethodIds,\n withdrawMethodIds,\n wrapMethodIds,\n} from './constants';\nimport { formatAddressToAssetId, getNativeAsset } from './helpers/caip';\nimport { getKnownTokenMetadata } from './helpers/token-metadata';\nimport {\n getLocalTransactionFees,\n getLocalTransactionStatus,\n isNftStandard,\n} from './helpers/transactions';\nimport type { TransactionGroup } from './helpers/transactions';\n\nconst evmNativeDecimals = 18;\n\n/**\n * Maps a local TransactionController group into the shared activity item shape.\n *\n * @param transactionGroup - The transaction group to map, optionally enriched by the client.\n * @returns The normalized activity item.\n */\nexport function mapLocalTransaction(\n transactionGroup: TransactionGroup & {\n sourceToken?: TokenAmount;\n destinationToken?: TokenAmount;\n nativeAssetSymbol?: string;\n contractTokenMetadata?: { symbol?: string; decimals?: number };\n activityStatus?: ActivityItem['status'];\n fees?: Fee[];\n },\n): ActivityItem {\n const fees =\n transactionGroup.fees ?? getLocalTransactionFees(transactionGroup);\n const { initialTransaction, primaryTransaction } = transactionGroup;\n const {\n transferInformation,\n type: transactionType,\n simulationData,\n txReceipt,\n metamaskPay,\n txParams: { from = '', to = '', data: txData, value: txValue } = {},\n } = initialTransaction;\n const {\n time: primaryTime,\n hash: primaryHash,\n id: primaryId,\n } = primaryTransaction;\n const methodId = txData?.slice(0, 10);\n // Permit2 approvals use the Permit2 contract as `to`, not the approved token.\n // Keep this mapper thin: still classify the activity as an approve, but omit\n // the token rather than surfacing the wrong one — the API mapper provides\n // accurate token data.\n const isPermit2Approve = methodId === permit2ApproveMethodId;\n const tokenContractAddress = isPermit2Approve\n ? undefined\n : (transferInformation?.contractAddress ?? (to || undefined));\n const chainId = toCaipChainId(\n KnownCaipNamespace.Eip155,\n Number.parseInt(initialTransaction.chainId, 16).toString(),\n );\n const nativeAsset = getNativeAsset(initialTransaction.chainId);\n const nativeSymbol =\n transactionGroup.nativeAssetSymbol ?? nativeAsset?.symbol;\n\n const getNativeToken = (\n transaction: TransactionGroup['initialTransaction'],\n direction: TokenAmount['direction'],\n ): TokenAmount | undefined => {\n if (nativeSymbol === undefined) {\n return undefined;\n }\n\n return {\n direction,\n symbol: nativeSymbol,\n ...(transaction.txParams.value\n ? { amount: transaction.txParams.value }\n : {}),\n ...(nativeAsset?.assetId ? { assetId: nativeAsset.assetId } : {}),\n decimals: nativeAsset?.decimals ?? evmNativeDecimals,\n };\n };\n\n const getContractTokenFromTransaction = ({\n contractAddress,\n direction,\n transaction,\n }: {\n contractAddress?: string;\n direction: TokenAmount['direction'];\n transaction: TransactionGroup['initialTransaction'];\n }): TokenAmount | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n const symbol =\n transaction.transferInformation?.symbol ??\n transactionGroup.contractTokenMetadata?.symbol;\n const decimals =\n transaction.transferInformation?.decimals ??\n transactionGroup.contractTokenMetadata?.decimals;\n const amount = transaction.transferInformation?.amount;\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n return {\n direction,\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(amount ? { amount } : {}),\n ...(decimals === undefined ? {} : { decimals }),\n };\n };\n\n const getContractTokenWithKnownMetadata = ({\n amount,\n contractAddress,\n direction,\n transaction,\n }: {\n amount?: string;\n contractAddress?: string;\n direction: TokenAmount['direction'];\n transaction: TransactionGroup['initialTransaction'];\n }): TokenAmount | undefined => {\n if (!contractAddress) {\n return undefined;\n }\n\n const tokenMetadata = getKnownTokenMetadata(chainId, contractAddress);\n\n const isWrappedNativeToken = equalsIgnoreCase(\n contractAddress,\n swapsWrappedTokensAddresses[\n initialTransaction.chainId as keyof typeof swapsWrappedTokensAddresses\n ] || '',\n );\n const wrappedNativeTokenDecimals = isWrappedNativeToken\n ? (nativeAsset?.decimals ?? evmNativeDecimals)\n : undefined;\n\n const decimals =\n transaction.transferInformation?.amount === undefined\n ? (tokenMetadata?.decimals ??\n transactionGroup.contractTokenMetadata?.decimals ??\n wrappedNativeTokenDecimals)\n : transaction.transferInformation.decimals;\n const tokenAmount = transaction.transferInformation?.amount ?? amount;\n const symbol =\n transaction.transferInformation?.symbol ??\n tokenMetadata?.symbol ??\n transactionGroup.contractTokenMetadata?.symbol;\n const assetId = formatAddressToAssetId(contractAddress, chainId);\n\n return {\n direction,\n ...(symbol ? { symbol } : {}),\n ...(assetId ? { assetId } : {}),\n ...(tokenAmount ? { amount: tokenAmount } : {}),\n ...(decimals === undefined ? {} : { decimals }),\n };\n };\n\n const status =\n transactionGroup.activityStatus ??\n getLocalTransactionStatus({\n primaryTransaction,\n initialTransaction,\n });\n const timestamp = primaryTime ?? initialTransaction.time;\n const hash = primaryHash ?? initialTransaction.hash ?? primaryId;\n const common = { chainId, status, timestamp, hash };\n\n switch (transactionType) {\n case TransactionType.simpleSend: {\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token: getNativeToken(initialTransaction, 'out'),\n },\n };\n }\n\n case TransactionType.swap:\n case TransactionType.swapAndSend:\n case TransactionType.bridge: {\n const { sourceToken, destinationToken } = transactionGroup;\n\n return {\n type: transactionType === TransactionType.bridge ? 'bridge' : 'swap',\n ...common,\n data: {\n from,\n sourceToken,\n destinationToken,\n fees,\n },\n };\n }\n\n case TransactionType.tokenMethodSafeTransferFrom:\n case TransactionType.tokenMethodTransfer:\n case TransactionType.tokenMethodTransferFrom: {\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token: getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: tokenContractAddress,\n }),\n },\n };\n }\n\n case TransactionType.lendingDeposit:\n case TransactionType.stakingDeposit:\n return {\n type:\n transactionType === TransactionType.stakingDeposit\n ? 'deposit'\n : 'lendingDeposit',\n ...common,\n data: {\n from,\n },\n };\n\n case TransactionType.incoming: {\n return {\n type: 'receive',\n ...common,\n data: {\n from,\n to,\n token: transferInformation?.contractAddress\n ? getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: transferInformation.contractAddress,\n })\n : getNativeToken(initialTransaction, 'in'),\n },\n };\n }\n case TransactionType.musdClaim:\n return {\n type: 'claimMusdBonus',\n ...common,\n data: {\n from,\n },\n };\n\n case TransactionType.musdConversion: {\n let conversionAmount: string | undefined;\n\n if (txData && txData.length >= 138) {\n try {\n conversionAmount = BigInt(`0x${txData.slice(74, 138)}`).toString();\n } catch {\n conversionAmount = undefined;\n }\n }\n\n return {\n type: 'convert',\n ...common,\n data: {\n from,\n sourceToken: transactionGroup.sourceToken,\n destinationToken: getContractTokenWithKnownMetadata({\n amount: conversionAmount,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: to,\n }),\n },\n };\n }\n\n case TransactionType.bridgeApproval:\n case TransactionType.shieldSubscriptionApprove:\n case TransactionType.swapApproval:\n case TransactionType.tokenMethodSetApprovalForAll:\n case TransactionType.tokenMethodApprove:\n case TransactionType.tokenMethodIncreaseAllowance: {\n const approvalToken = getContractTokenFromTransaction({\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: tokenContractAddress,\n });\n\n return {\n type:\n transactionType === TransactionType.tokenMethodIncreaseAllowance\n ? 'increaseSpendingCap'\n : 'approveSpendingCap',\n ...common,\n data: {\n from,\n token: approvalToken,\n },\n };\n }\n\n case TransactionType.perpsDeposit:\n case TransactionType.perpsDepositAndOrder:\n case TransactionType.perpsWithdraw: {\n const token = to\n ? {\n direction: 'out' as const,\n assetId: formatAddressToAssetId(to, chainId),\n }\n : undefined;\n\n const fiat = metamaskPay?.targetFiat\n ? { amount: metamaskPay.targetFiat }\n : undefined;\n const networkFee =\n typeof metamaskPay?.networkFeeFiat === 'string'\n ? { amount: metamaskPay.networkFeeFiat }\n : undefined;\n\n return {\n type:\n transactionType === TransactionType.perpsWithdraw\n ? 'perpsWithdraw'\n : 'perpsAddFunds',\n ...common,\n data: {\n from,\n token,\n fiat,\n networkFee,\n },\n };\n }\n\n default: {\n const isSupplyContractInteraction =\n transactionType === TransactionType.contractInteraction &&\n methodId &&\n supplyMethodIds.has(methodId.toLowerCase());\n const isWithdrawContractInteraction =\n transactionType === TransactionType.contractInteraction &&\n methodId &&\n withdrawMethodIds.has(methodId.toLowerCase());\n\n let hasNativeValue = false;\n\n try {\n hasNativeValue = BigInt(txValue ?? '0') > 0n;\n } catch {\n hasNativeValue = false;\n }\n\n // Confirm an outflow before labelling a supply, mirroring the API mapper's\n // `sentTransfer` guard: native stakes (e.g. Lido) decrease the native\n // balance, while ERC-20 supplies (e.g. Aave) show a token decrease.\n const isSupply =\n isSupplyContractInteraction &&\n (simulationData?.nativeBalanceChange?.isDecrease === true ||\n simulationData?.tokenBalanceChanges?.some(\n ({ isDecrease, standard }) => isDecrease && standard === 'erc20',\n ) === true);\n const incomingNftBalanceChange =\n transactionType === TransactionType.contractInteraction &&\n simulationData?.tokenBalanceChanges?.find(\n ({ isDecrease, standard }) => !isDecrease && isNftStandard(standard),\n );\n\n if (incomingNftBalanceChange && hasNativeValue) {\n // Keep this mapper thin: classify the activity as an NFT buy and let the\n // API mapper provide the token/payment details.\n return {\n type: 'nftBuy',\n ...common,\n data: {\n from,\n },\n };\n }\n\n if (isSupply) {\n return {\n type: 'lendingDeposit',\n ...common,\n data: {\n from,\n },\n };\n }\n\n // lending withdrawal - applies to Earn features only\n if (isWithdrawContractInteraction) {\n const fromAddress = from.toLowerCase();\n const receivedTokenLog = (txReceipt?.logs ?? []).find(\n ({ topics: [eventTopic, , logTo] = [] }) => {\n const toAddress = logTo\n ? `0x${logTo.slice(-40)}`.toLowerCase()\n : undefined;\n\n return (\n eventTopic?.toLowerCase() === tokenTransferLogTopicHash &&\n toAddress === fromAddress\n );\n },\n );\n let receivedAmount: string | undefined;\n\n if (receivedTokenLog) {\n try {\n receivedAmount = BigInt(String(receivedTokenLog.data)).toString();\n } catch {\n receivedAmount = undefined;\n }\n }\n\n const destinationToken = receivedTokenLog\n ? getContractTokenWithKnownMetadata({\n amount: receivedAmount,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: receivedTokenLog.address,\n })\n : undefined;\n\n return {\n type: 'lendingWithdrawal',\n ...common,\n data: {\n from,\n destinationToken,\n },\n };\n }\n\n // wrap and unwrap\n if (transactionType === TransactionType.contractInteraction && methodId) {\n const wrappedTokenAddress =\n swapsWrappedTokensAddresses[\n initialTransaction.chainId as keyof typeof swapsWrappedTokensAddresses\n ];\n\n if (wrappedTokenAddress && equalsIgnoreCase(to, wrappedTokenAddress)) {\n const normalizedMethodId = methodId.toLowerCase();\n\n if (wrapMethodIds.has(normalizedMethodId)) {\n try {\n if (txValue && BigInt(txValue) > 0n) {\n return {\n type: 'wrap',\n ...common,\n data: {\n from,\n sourceToken: getNativeToken(initialTransaction, 'out'),\n destinationToken: getContractTokenWithKnownMetadata({\n amount: txValue,\n transaction: initialTransaction,\n direction: 'in',\n contractAddress: wrappedTokenAddress,\n }),\n },\n };\n }\n } catch {\n // Invalid native value — fall through.\n }\n }\n\n if (unwrapMethodIds.has(normalizedMethodId)) {\n let unwrapAmount: string | undefined;\n\n if (txData && txData.length >= 74) {\n try {\n unwrapAmount = BigInt(`0x${txData.slice(10, 74)}`).toString();\n } catch {\n unwrapAmount = undefined;\n }\n }\n\n const nativeToken = getNativeToken(initialTransaction, 'in');\n\n return {\n type: 'unwrap',\n ...common,\n data: {\n from,\n sourceToken: getContractTokenWithKnownMetadata({\n amount: unwrapAmount,\n transaction: initialTransaction,\n direction: 'out',\n contractAddress: wrappedTokenAddress,\n }),\n destinationToken:\n nativeToken && unwrapAmount\n ? { ...nativeToken, amount: unwrapAmount }\n : nativeToken,\n },\n };\n }\n }\n }\n\n const token = ((): TokenAmount | undefined => {\n if (txValue === undefined || txValue === '') {\n return undefined;\n }\n\n try {\n return BigInt(txValue) > 0n\n ? getNativeToken(initialTransaction, 'out')\n : undefined;\n } catch {\n return undefined;\n }\n })();\n\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n ...(token ? { token } : {}),\n methodId,\n },\n };\n }\n }\n}\n"]}
|
package/dist/types.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ValueTransfer as _ValueTransfer } from '@metamask/core-backend';\nimport type { CaipChainId } from '@metamask/utils';\n\nexport type ActivityKind =\n | 'receive'\n | 'sell'\n | 'buy'\n | 'deposit'\n | 'swap'\n | 'claim'\n | 'claimMusdBonus'\n | 'send'\n | 'wrap'\n | 'unwrap'\n | 'approveSpendingCap'\n | 'revokeSpendingCap'\n | 'increaseSpendingCap'\n | 'contractInteraction'\n | 'contractDeployment'\n | 'bridge'\n | 'convert'\n | 'nftBuy'\n | 'nftMint'\n | 'nftSell'\n | 'smartAccountUpgrade'\n | 'lendingDeposit'\n | 'lendingWithdrawal'\n | 'predictionsAddFunds'\n | 'predictionsWithdrawFunds'\n | 'predictionClaimWinnings'\n | 'predictionCashedOut'\n | 'predictionPlaced'\n | 'perpsAddFunds'\n | 'perpsWithdraw'\n | 'perpsOpenLong'\n | 'perpsCloseLong'\n | 'perpsCloseLongLiquidated'\n | 'perpsCloseLongStopLoss'\n | 'perpsOpenShort'\n | 'perpsCloseShort'\n | 'perpsCloseShortLiquidated'\n | 'perpsCloseShortStopLoss'\n | 'perpsPaidFundingFees'\n | 'perpsReceivedFundingFees'\n | 'perpsCloseShortTakeProfit'\n | 'perpsCloseLongTakeProfit'\n | 'marketShort'\n | 'stopMarketCloseShort'\n | 'marketCloseShort';\n\nexport type Status = 'pending' | 'success' | 'failed' | 'cancelled';\n\nexport type TokenAmount = {\n amount?: string;\n decimals?: number;\n symbol?: string;\n assetId?: string;\n direction: 'in' | 'out';\n};\n\nexport type FiatAmount = {\n amount: string;\n currency?: string;\n};\n\nexport type Fee = {\n type: string;\n amount?: string;\n decimals?: number;\n symbol?: string;\n assetId?: string;\n};\n\ntype ActivityData<Type extends ActivityKind, Data> = {\n type: Type;\n chainId: CaipChainId;\n status: Status;\n timestamp: number;\n hash?: string;\n data: Data;\n};\n\nexport type ActivityItem =\n | ActivityData<\n 'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap',\n {\n from?: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'send' | 'receive',\n {\n from: string;\n to: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'nftBuy' | 'nftMint' | 'nftSell',\n {\n from?: string;\n to?: string;\n token?: TokenAmount;\n paymentToken?: TokenAmount;\n }\n >\n | ActivityData<\n | 'swap'\n | 'bridge'\n | 'convert'\n | 'lendingDeposit'\n | 'lendingWithdrawal'\n | 'wrap'\n | 'unwrap',\n {\n from?: string;\n sourceToken?: TokenAmount;\n destinationToken?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'buy' | 'claim' | 'deposit' | 'claimMusdBonus',\n {\n from?: string;\n token?: TokenAmount;\n }\n >\n | ActivityData<\n 'perpsAddFunds' | 'perpsWithdraw',\n {\n from?: string;\n fiat?: FiatAmount;\n networkFee?: FiatAmount;\n token?: TokenAmount;\n }\n >\n | ActivityData<\n 'contractInteraction',\n {\n from: string;\n to: string;\n token?: TokenAmount;\n fees?: Fee[];\n methodId?: string;\n transactionCategory?: string;\n transactionProtocol?: string;\n }\n >;\n\n// Note: Update core-backend\nexport type ValueTransfer = _ValueTransfer & {\n contractAddress: string;\n symbol: string;\n name: string;\n};\n"]}
|
package/dist/types.d.cts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { ValueTransfer as _ValueTransfer } from "@metamask/core-backend";
|
|
2
|
+
import type { CaipChainId } from "@metamask/utils";
|
|
3
|
+
export type ActivityKind = 'receive' | 'sell' | 'buy' | 'deposit' | 'swap' | 'claim' | 'claimMusdBonus' | 'send' | 'wrap' | 'unwrap' | 'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap' | 'contractInteraction' | 'contractDeployment' | 'bridge' | 'convert' | 'nftBuy' | 'nftMint' | 'nftSell' | 'smartAccountUpgrade' | 'lendingDeposit' | 'lendingWithdrawal' | 'predictionsAddFunds' | 'predictionsWithdrawFunds' | 'predictionClaimWinnings' | 'predictionCashedOut' | 'predictionPlaced' | 'perpsAddFunds' | 'perpsWithdraw' | 'perpsOpenLong' | 'perpsCloseLong' | 'perpsCloseLongLiquidated' | 'perpsCloseLongStopLoss' | 'perpsOpenShort' | 'perpsCloseShort' | 'perpsCloseShortLiquidated' | 'perpsCloseShortStopLoss' | 'perpsPaidFundingFees' | 'perpsReceivedFundingFees' | 'perpsCloseShortTakeProfit' | 'perpsCloseLongTakeProfit' | 'marketShort' | 'stopMarketCloseShort' | 'marketCloseShort';
|
|
4
|
+
export type Status = 'pending' | 'success' | 'failed' | 'cancelled';
|
|
5
|
+
export type TokenAmount = {
|
|
6
|
+
amount?: string;
|
|
7
|
+
decimals?: number;
|
|
8
|
+
symbol?: string;
|
|
9
|
+
assetId?: string;
|
|
10
|
+
direction: 'in' | 'out';
|
|
11
|
+
};
|
|
12
|
+
export type FiatAmount = {
|
|
13
|
+
amount: string;
|
|
14
|
+
currency?: string;
|
|
15
|
+
};
|
|
16
|
+
export type Fee = {
|
|
17
|
+
type: string;
|
|
18
|
+
amount?: string;
|
|
19
|
+
decimals?: number;
|
|
20
|
+
symbol?: string;
|
|
21
|
+
assetId?: string;
|
|
22
|
+
};
|
|
23
|
+
type ActivityData<Type extends ActivityKind, Data> = {
|
|
24
|
+
type: Type;
|
|
25
|
+
chainId: CaipChainId;
|
|
26
|
+
status: Status;
|
|
27
|
+
timestamp: number;
|
|
28
|
+
hash?: string;
|
|
29
|
+
data: Data;
|
|
30
|
+
};
|
|
31
|
+
export type ActivityItem = ActivityData<'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap', {
|
|
32
|
+
from?: string;
|
|
33
|
+
token?: TokenAmount;
|
|
34
|
+
fees?: Fee[];
|
|
35
|
+
}> | ActivityData<'send' | 'receive', {
|
|
36
|
+
from: string;
|
|
37
|
+
to: string;
|
|
38
|
+
token?: TokenAmount;
|
|
39
|
+
fees?: Fee[];
|
|
40
|
+
}> | ActivityData<'nftBuy' | 'nftMint' | 'nftSell', {
|
|
41
|
+
from?: string;
|
|
42
|
+
to?: string;
|
|
43
|
+
token?: TokenAmount;
|
|
44
|
+
paymentToken?: TokenAmount;
|
|
45
|
+
}> | ActivityData<'swap' | 'bridge' | 'convert' | 'lendingDeposit' | 'lendingWithdrawal' | 'wrap' | 'unwrap', {
|
|
46
|
+
from?: string;
|
|
47
|
+
sourceToken?: TokenAmount;
|
|
48
|
+
destinationToken?: TokenAmount;
|
|
49
|
+
fees?: Fee[];
|
|
50
|
+
}> | ActivityData<'buy' | 'claim' | 'deposit' | 'claimMusdBonus', {
|
|
51
|
+
from?: string;
|
|
52
|
+
token?: TokenAmount;
|
|
53
|
+
}> | ActivityData<'perpsAddFunds' | 'perpsWithdraw', {
|
|
54
|
+
from?: string;
|
|
55
|
+
fiat?: FiatAmount;
|
|
56
|
+
networkFee?: FiatAmount;
|
|
57
|
+
token?: TokenAmount;
|
|
58
|
+
}> | ActivityData<'contractInteraction', {
|
|
59
|
+
from: string;
|
|
60
|
+
to: string;
|
|
61
|
+
token?: TokenAmount;
|
|
62
|
+
fees?: Fee[];
|
|
63
|
+
methodId?: string;
|
|
64
|
+
transactionCategory?: string;
|
|
65
|
+
transactionProtocol?: string;
|
|
66
|
+
}>;
|
|
67
|
+
export type ValueTransfer = _ValueTransfer & {
|
|
68
|
+
contractAddress: string;
|
|
69
|
+
symbol: string;
|
|
70
|
+
name: string;
|
|
71
|
+
};
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,+BAA+B;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAwB;AAEnD,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,MAAM,GACN,KAAK,GACL,SAAS,GACT,MAAM,GACN,OAAO,GACP,gBAAgB,GAChB,MAAM,GACN,MAAM,GACN,QAAQ,GACR,oBAAoB,GACpB,mBAAmB,GACnB,qBAAqB,GACrB,qBAAqB,GACrB,oBAAoB,GACpB,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,SAAS,GACT,SAAS,GACT,qBAAqB,GACrB,gBAAgB,GAChB,mBAAmB,GACnB,qBAAqB,GACrB,0BAA0B,GAC1B,yBAAyB,GACzB,qBAAqB,GACrB,kBAAkB,GAClB,eAAe,GACf,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,0BAA0B,GAC1B,wBAAwB,GACxB,gBAAgB,GAChB,iBAAiB,GACjB,2BAA2B,GAC3B,yBAAyB,GACzB,sBAAsB,GACtB,0BAA0B,GAC1B,2BAA2B,GAC3B,0BAA0B,GAC1B,aAAa,GACb,sBAAsB,GACtB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,GAAG,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,YAAY,CAAC,IAAI,SAAS,YAAY,EAAE,IAAI,IAAI;IACnD,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB,YAAY,CACV,oBAAoB,GAAG,mBAAmB,GAAG,qBAAqB,EAClE;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,CACF,GACD,YAAY,CACV,MAAM,GAAG,SAAS,EAClB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,CACF,GACD,YAAY,CACV,QAAQ,GAAG,SAAS,GAAG,SAAS,EAChC;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B,CACF,GACD,YAAY,CACR,MAAM,GACN,QAAQ,GACR,SAAS,GACT,gBAAgB,GAChB,mBAAmB,GACnB,MAAM,GACN,QAAQ,EACV;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,CACF,GACD,YAAY,CACV,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,gBAAgB,EAC9C;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CACF,GACD,YAAY,CACV,eAAe,GAAG,eAAe,EACjC;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CACF,GACD,YAAY,CACV,qBAAqB,EACrB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CACF,CAAC;AAGN,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
|