@deserialize/multi-vm-wallet 1.2.21 → 1.2.23
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/dist/constant.js +18 -3
- package/dist/constant.js.map +1 -1
- package/dist/evm/transaction.utils.d.ts +362 -0
- package/dist/evm/transaction.utils.js +669 -0
- package/dist/evm/transaction.utils.js.map +1 -0
- package/dist/evm/transactionParsing.d.ts +1 -3633
- package/dist/evm/transactionParsing.js +0 -27
- package/dist/evm/transactionParsing.js.map +1 -1
- package/dist/evm/utils.d.ts +9 -0
- package/dist/evm/utils.js +21 -0
- package/dist/evm/utils.js.map +1 -1
- package/dist/svm/utils.js +6 -4
- package/dist/svm/utils.js.map +1 -1
- package/dist/test.d.ts +4 -0
- package/dist/test.js +17 -18
- package/dist/test.js.map +1 -1
- package/package.json +5 -2
- package/utils/constant.ts +18 -3
- package/utils/evm/transaction.utils.ts +824 -0
- package/utils/evm/transactionParsing.ts +0 -26
- package/utils/evm/utils.ts +19 -0
- package/utils/svm/utils.ts +14 -5
- package/utils/test.ts +18 -16
|
@@ -0,0 +1,669 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TokenStandard = exports.AssetType = exports.TransactionType = void 0;
|
|
4
|
+
exports.isEIP1559Transaction = isEIP1559Transaction;
|
|
5
|
+
exports.isLegacyTransaction = isLegacyTransaction;
|
|
6
|
+
exports.txParamsAreDappSuggested = txParamsAreDappSuggested;
|
|
7
|
+
exports.parseStandardTokenTransactionData = parseStandardTokenTransactionData;
|
|
8
|
+
exports.hasTransactionData = hasTransactionData;
|
|
9
|
+
exports.parseApprovalTransactionData = parseApprovalTransactionData;
|
|
10
|
+
exports.readAddressAsContract = readAddressAsContract;
|
|
11
|
+
exports.getTokenStandard = getTokenStandard;
|
|
12
|
+
exports.getTokenStandardAndDetails = getTokenStandardAndDetails;
|
|
13
|
+
exports.determineTransactionType = determineTransactionType;
|
|
14
|
+
exports.determineTransactionAssetType = determineTransactionAssetType;
|
|
15
|
+
exports.parseTypedDataMessage = parseTypedDataMessage;
|
|
16
|
+
exports.isEqualCaseInsensitive = isEqualCaseInsensitive;
|
|
17
|
+
const viem_1 = require("viem");
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Types & Constants
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Enum representing different transaction types
|
|
23
|
+
*/
|
|
24
|
+
var TransactionType;
|
|
25
|
+
(function (TransactionType) {
|
|
26
|
+
// Token operations
|
|
27
|
+
TransactionType["tokenMethodApprove"] = "approve";
|
|
28
|
+
TransactionType["tokenMethodSetApprovalForAll"] = "setApprovalForAll";
|
|
29
|
+
TransactionType["tokenMethodTransfer"] = "transfer";
|
|
30
|
+
TransactionType["tokenMethodTransferFrom"] = "transferFrom";
|
|
31
|
+
TransactionType["tokenMethodIncreaseAllowance"] = "increaseAllowance";
|
|
32
|
+
TransactionType["tokenMethodSafeTransferFrom"] = "safeTransferFrom";
|
|
33
|
+
// Contract operations
|
|
34
|
+
TransactionType["contractInteraction"] = "contractInteraction";
|
|
35
|
+
TransactionType["deployContract"] = "deployContract";
|
|
36
|
+
// Simple transfers
|
|
37
|
+
TransactionType["simpleSend"] = "simpleSend";
|
|
38
|
+
// Special operations
|
|
39
|
+
TransactionType["cancel"] = "cancel";
|
|
40
|
+
TransactionType["retry"] = "retry";
|
|
41
|
+
TransactionType["swap"] = "swap";
|
|
42
|
+
})(TransactionType || (exports.TransactionType = TransactionType = {}));
|
|
43
|
+
/**
|
|
44
|
+
* Enum representing asset types
|
|
45
|
+
*/
|
|
46
|
+
var AssetType;
|
|
47
|
+
(function (AssetType) {
|
|
48
|
+
AssetType["native"] = "NATIVE";
|
|
49
|
+
AssetType["token"] = "TOKEN";
|
|
50
|
+
AssetType["NFT"] = "NFT";
|
|
51
|
+
AssetType["unknown"] = "UNKNOWN";
|
|
52
|
+
})(AssetType || (exports.AssetType = AssetType = {}));
|
|
53
|
+
/**
|
|
54
|
+
* Enum representing token standards
|
|
55
|
+
*/
|
|
56
|
+
var TokenStandard;
|
|
57
|
+
(function (TokenStandard) {
|
|
58
|
+
TokenStandard["ERC20"] = "ERC20";
|
|
59
|
+
TokenStandard["ERC721"] = "ERC721";
|
|
60
|
+
TokenStandard["ERC1155"] = "ERC1155";
|
|
61
|
+
TokenStandard["none"] = "none";
|
|
62
|
+
})(TokenStandard || (exports.TokenStandard = TokenStandard = {}));
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// ABIs
|
|
65
|
+
// ============================================================================
|
|
66
|
+
/**
|
|
67
|
+
* ERC20 token ABI (essential methods only)
|
|
68
|
+
*/
|
|
69
|
+
const ERC20_ABI = (0, viem_1.parseAbi)([
|
|
70
|
+
'function approve(address spender, uint256 amount) returns (bool)',
|
|
71
|
+
'function transfer(address to, uint256 amount) returns (bool)',
|
|
72
|
+
'function transferFrom(address from, address to, uint256 amount) returns (bool)',
|
|
73
|
+
'function increaseAllowance(address spender, uint256 addedValue) returns (bool)',
|
|
74
|
+
'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)',
|
|
75
|
+
'function decimals() view returns (uint8)',
|
|
76
|
+
'function symbol() view returns (string)',
|
|
77
|
+
'function balanceOf(address account) view returns (uint256)',
|
|
78
|
+
]);
|
|
79
|
+
/**
|
|
80
|
+
* ERC721 token ABI (essential methods only)
|
|
81
|
+
*/
|
|
82
|
+
const ERC721_ABI = (0, viem_1.parseAbi)([
|
|
83
|
+
'function approve(address to, uint256 tokenId)',
|
|
84
|
+
'function setApprovalForAll(address operator, bool approved)',
|
|
85
|
+
'function transferFrom(address from, address to, uint256 tokenId)',
|
|
86
|
+
'function safeTransferFrom(address from, address to, uint256 tokenId)',
|
|
87
|
+
'function safeTransferFrom(address from, address to, uint256 tokenId, bytes data)',
|
|
88
|
+
'function supportsInterface(bytes4 interfaceId) view returns (bool)',
|
|
89
|
+
]);
|
|
90
|
+
/**
|
|
91
|
+
* ERC1155 token ABI (essential methods only)
|
|
92
|
+
*/
|
|
93
|
+
const ERC1155_ABI = (0, viem_1.parseAbi)([
|
|
94
|
+
'function setApprovalForAll(address operator, bool approved)',
|
|
95
|
+
'function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data)',
|
|
96
|
+
'function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data)',
|
|
97
|
+
'function supportsInterface(bytes4 interfaceId) view returns (bool)',
|
|
98
|
+
]);
|
|
99
|
+
/**
|
|
100
|
+
* USDC (Fiat Token V2) specific methods
|
|
101
|
+
*/
|
|
102
|
+
const FIAT_TOKEN_V2_ABI = (0, viem_1.parseAbi)([
|
|
103
|
+
'function increaseAllowance(address spender, uint256 increment) returns (bool)',
|
|
104
|
+
'function decreaseAllowance(address spender, uint256 decrement) returns (bool)',
|
|
105
|
+
]);
|
|
106
|
+
/**
|
|
107
|
+
* Permit2 contract ABI
|
|
108
|
+
*/
|
|
109
|
+
const PERMIT2_ABI = (0, viem_1.parseAbi)([
|
|
110
|
+
'function approve(address token, address spender, uint160 amount, uint48 expiration)',
|
|
111
|
+
]);
|
|
112
|
+
/**
|
|
113
|
+
* List of transaction types that can be inferred from transaction data
|
|
114
|
+
*/
|
|
115
|
+
const INFERRABLE_TRANSACTION_TYPES = [
|
|
116
|
+
TransactionType.tokenMethodApprove,
|
|
117
|
+
TransactionType.tokenMethodSetApprovalForAll,
|
|
118
|
+
TransactionType.tokenMethodTransfer,
|
|
119
|
+
TransactionType.tokenMethodTransferFrom,
|
|
120
|
+
TransactionType.tokenMethodIncreaseAllowance,
|
|
121
|
+
TransactionType.contractInteraction,
|
|
122
|
+
TransactionType.simpleSend,
|
|
123
|
+
];
|
|
124
|
+
/**
|
|
125
|
+
* List of approval method names
|
|
126
|
+
*/
|
|
127
|
+
const APPROVAL_METHOD_NAMES = [
|
|
128
|
+
'approve',
|
|
129
|
+
'setApprovalForAll',
|
|
130
|
+
'increaseAllowance',
|
|
131
|
+
'decreaseAllowance',
|
|
132
|
+
];
|
|
133
|
+
/**
|
|
134
|
+
* Interface IDs for token standards (EIP-165)
|
|
135
|
+
*/
|
|
136
|
+
const INTERFACE_IDS = {
|
|
137
|
+
ERC721: '0x80ac58cd',
|
|
138
|
+
ERC1155: '0xd9b67a26',
|
|
139
|
+
ERC165: '0x01ffc9a7',
|
|
140
|
+
};
|
|
141
|
+
// ============================================================================
|
|
142
|
+
// Gas Fee Utilities
|
|
143
|
+
// ============================================================================
|
|
144
|
+
/**
|
|
145
|
+
* Determines if a transaction uses EIP-1559 gas fields
|
|
146
|
+
*
|
|
147
|
+
* EIP-1559 transactions use maxFeePerGas and maxPriorityFeePerGas instead of gasPrice
|
|
148
|
+
*
|
|
149
|
+
* @param transactionMeta - Transaction metadata to check
|
|
150
|
+
* @returns True if transaction uses valid EIP-1559 fields
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* const isEIP1559 = isEIP1559Transaction({
|
|
155
|
+
* txParams: {
|
|
156
|
+
* maxFeePerGas: '0x59682f00',
|
|
157
|
+
* maxPriorityFeePerGas: '0x3b9aca00'
|
|
158
|
+
* }
|
|
159
|
+
* });
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
function isEIP1559Transaction(transactionMeta) {
|
|
163
|
+
const { maxFeePerGas, maxPriorityFeePerGas } = transactionMeta.txParams;
|
|
164
|
+
return ((0, viem_1.isHex)(String(maxFeePerGas ?? '')) &&
|
|
165
|
+
(0, viem_1.isHex)(String(maxPriorityFeePerGas ?? '')));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Determines if a transaction uses legacy gas fields (gasPrice)
|
|
169
|
+
*
|
|
170
|
+
* Legacy transactions use gasPrice instead of EIP-1559 fields
|
|
171
|
+
*
|
|
172
|
+
* @param transactionMeta - Transaction metadata to check
|
|
173
|
+
* @returns True if transaction uses valid legacy gas fields
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```typescript
|
|
177
|
+
* const isLegacy = isLegacyTransaction({
|
|
178
|
+
* txParams: {
|
|
179
|
+
* gasPrice: '0x3b9aca00'
|
|
180
|
+
* }
|
|
181
|
+
* });
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
function isLegacyTransaction(transactionMeta) {
|
|
185
|
+
const { maxFeePerGas, maxPriorityFeePerGas, gasPrice } = transactionMeta.txParams;
|
|
186
|
+
return (typeof maxFeePerGas === 'undefined' &&
|
|
187
|
+
typeof maxPriorityFeePerGas === 'undefined' &&
|
|
188
|
+
(typeof gasPrice === 'undefined' || (0, viem_1.isHex)(String(gasPrice))));
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Checks if transaction gas fees match dApp suggested fees
|
|
192
|
+
*
|
|
193
|
+
* Useful for determining if the user has modified the dApp's suggested gas fees
|
|
194
|
+
*
|
|
195
|
+
* @param transactionMeta - Transaction metadata to check
|
|
196
|
+
* @returns True if txParams match dappSuggestedGasFees
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* const isUnmodified = txParamsAreDappSuggested({
|
|
201
|
+
* txParams: { gasPrice: '0x3b9aca00' },
|
|
202
|
+
* dappSuggestedGasFees: { gasPrice: '0x3b9aca00' }
|
|
203
|
+
* });
|
|
204
|
+
* ```
|
|
205
|
+
*/
|
|
206
|
+
function txParamsAreDappSuggested(transactionMeta) {
|
|
207
|
+
const { gasPrice, maxPriorityFeePerGas, maxFeePerGas } = transactionMeta.txParams;
|
|
208
|
+
const suggested = transactionMeta.dappSuggestedGasFees;
|
|
209
|
+
if (!suggested)
|
|
210
|
+
return false;
|
|
211
|
+
return Boolean((gasPrice && gasPrice === suggested.gasPrice) ||
|
|
212
|
+
(maxPriorityFeePerGas &&
|
|
213
|
+
maxFeePerGas &&
|
|
214
|
+
suggested.maxPriorityFeePerGas === maxPriorityFeePerGas &&
|
|
215
|
+
suggested.maxFeePerGas === maxFeePerGas));
|
|
216
|
+
}
|
|
217
|
+
// ============================================================================
|
|
218
|
+
// Transaction Data Parsing
|
|
219
|
+
// ============================================================================
|
|
220
|
+
/**
|
|
221
|
+
* Attempts to decode transaction data using standard token ABIs
|
|
222
|
+
*
|
|
223
|
+
* Tries to decode the data against ERC20, ERC721, ERC1155, USDC, and Permit2 ABIs
|
|
224
|
+
*
|
|
225
|
+
* @param data - Encoded transaction data
|
|
226
|
+
* @returns Decoded function data or undefined if decoding fails
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```typescript
|
|
230
|
+
* const parsed = parseStandardTokenTransactionData('0xa9059cbb...');
|
|
231
|
+
* if (parsed) {
|
|
232
|
+
* console.log('Function:', parsed.functionName);
|
|
233
|
+
* console.log('Args:', parsed.args);
|
|
234
|
+
* }
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
function parseStandardTokenTransactionData(data) {
|
|
238
|
+
const abis = [
|
|
239
|
+
ERC20_ABI,
|
|
240
|
+
ERC721_ABI,
|
|
241
|
+
ERC1155_ABI,
|
|
242
|
+
FIAT_TOKEN_V2_ABI,
|
|
243
|
+
PERMIT2_ABI,
|
|
244
|
+
];
|
|
245
|
+
for (const abi of abis) {
|
|
246
|
+
try {
|
|
247
|
+
return (0, viem_1.decodeFunctionData)({ abi, data });
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// Continue to next ABI
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Checks if transaction has meaningful data
|
|
257
|
+
*
|
|
258
|
+
* @param transactionData - Transaction data field
|
|
259
|
+
* @returns True if data exists and is not empty
|
|
260
|
+
*
|
|
261
|
+
* @example
|
|
262
|
+
* ```typescript
|
|
263
|
+
* hasTransactionData('0x') // false
|
|
264
|
+
* hasTransactionData('0xa9059cbb...') // true
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
function hasTransactionData(transactionData) {
|
|
268
|
+
return Boolean(transactionData?.length && transactionData.toLowerCase() !== '0x');
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Parses approval transaction data to extract relevant information
|
|
272
|
+
*
|
|
273
|
+
* Supports:
|
|
274
|
+
* - ERC20: approve, increaseAllowance
|
|
275
|
+
* - ERC721/ERC1155: setApprovalForAll
|
|
276
|
+
* - Permit2: approve
|
|
277
|
+
* - USDC: increaseAllowance
|
|
278
|
+
*
|
|
279
|
+
* @param data - Transaction data to parse
|
|
280
|
+
* @returns Parsed approval data or undefined if not an approval transaction
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* ```typescript
|
|
284
|
+
* const approval = parseApprovalTransactionData('0x095ea7b3...');
|
|
285
|
+
* if (approval) {
|
|
286
|
+
* console.log('Spender:', approval.spender);
|
|
287
|
+
* console.log('Amount:', approval.amountOrTokenId);
|
|
288
|
+
* console.log('Is approval for all?', approval.isApproveAll);
|
|
289
|
+
* }
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
function parseApprovalTransactionData(data) {
|
|
293
|
+
const decoded = parseStandardTokenTransactionData(data);
|
|
294
|
+
if (!decoded)
|
|
295
|
+
return undefined;
|
|
296
|
+
const { functionName, args } = decoded;
|
|
297
|
+
if (!functionName || !APPROVAL_METHOD_NAMES.includes(functionName)) {
|
|
298
|
+
return undefined;
|
|
299
|
+
}
|
|
300
|
+
// Extract amount or token ID based on function
|
|
301
|
+
const rawAmountOrTokenId = args?._value ?? // ERC-20 approve
|
|
302
|
+
args?.increment ?? // Fiat Token V2 increaseAllowance
|
|
303
|
+
args?.amount ?? // Permit2 approve
|
|
304
|
+
args?.addedValue; // ERC-20 increaseAllowance
|
|
305
|
+
const amountOrTokenId = rawAmountOrTokenId
|
|
306
|
+
? BigInt(rawAmountOrTokenId.toString())
|
|
307
|
+
: undefined;
|
|
308
|
+
// Extract spender address
|
|
309
|
+
const spender = args?.spender ??
|
|
310
|
+
args?._spender ??
|
|
311
|
+
args?.[0];
|
|
312
|
+
// Check if it's an approval for all (ERC721/ERC1155)
|
|
313
|
+
const isApproveAll = functionName === 'setApprovalForAll' && args?._approved === true;
|
|
314
|
+
const isRevokeAll = functionName === 'setApprovalForAll' && args?._approved === false;
|
|
315
|
+
// Extract token address for Permit2
|
|
316
|
+
const tokenAddress = functionName === 'approve' ? args?.token : undefined;
|
|
317
|
+
return {
|
|
318
|
+
amountOrTokenId,
|
|
319
|
+
isApproveAll,
|
|
320
|
+
isRevokeAll,
|
|
321
|
+
name: functionName,
|
|
322
|
+
tokenAddress,
|
|
323
|
+
spender,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
// ============================================================================
|
|
327
|
+
// Contract Utilities
|
|
328
|
+
// ============================================================================
|
|
329
|
+
/**
|
|
330
|
+
* Reads an address to determine if it's a contract
|
|
331
|
+
*
|
|
332
|
+
* @param client - Viem public client
|
|
333
|
+
* @param address - Address to check
|
|
334
|
+
* @returns Contract code and whether it's a contract address
|
|
335
|
+
*
|
|
336
|
+
* @example
|
|
337
|
+
* ```typescript
|
|
338
|
+
* const { isContractAddress, contractCode } = await readAddressAsContract(
|
|
339
|
+
* client,
|
|
340
|
+
* '0x...'
|
|
341
|
+
* );
|
|
342
|
+
* ```
|
|
343
|
+
*/
|
|
344
|
+
async function readAddressAsContract(client, address) {
|
|
345
|
+
try {
|
|
346
|
+
const code = await client.getCode({ address });
|
|
347
|
+
const isContract = Boolean(code && code !== '0x' && code !== '0x0');
|
|
348
|
+
return {
|
|
349
|
+
isContractAddress: isContract,
|
|
350
|
+
contractCode: code || null,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
console.error('Error reading contract code:', error);
|
|
355
|
+
return {
|
|
356
|
+
isContractAddress: false,
|
|
357
|
+
contractCode: null,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Determines the token standard by checking EIP-165 interface support
|
|
363
|
+
*
|
|
364
|
+
* @param client - Viem public client
|
|
365
|
+
* @param address - Token contract address
|
|
366
|
+
* @returns Token standard (ERC721, ERC1155, ERC20, or none)
|
|
367
|
+
*
|
|
368
|
+
* @example
|
|
369
|
+
* ```typescript
|
|
370
|
+
* const standard = await getTokenStandard(client, '0x...');
|
|
371
|
+
* console.log('Token standard:', standard); // 'ERC721'
|
|
372
|
+
* ```
|
|
373
|
+
*/
|
|
374
|
+
async function getTokenStandard(client, address) {
|
|
375
|
+
// Try ERC165 supportsInterface for ERC721/ERC1155
|
|
376
|
+
try {
|
|
377
|
+
const contract = (0, viem_1.getContract)({
|
|
378
|
+
address,
|
|
379
|
+
abi: (0, viem_1.parseAbi)(['function supportsInterface(bytes4) view returns (bool)']),
|
|
380
|
+
client,
|
|
381
|
+
});
|
|
382
|
+
// Check ERC721
|
|
383
|
+
const isERC721 = await contract.read.supportsInterface([INTERFACE_IDS.ERC721]);
|
|
384
|
+
if (isERC721)
|
|
385
|
+
return TokenStandard.ERC721;
|
|
386
|
+
// Check ERC1155
|
|
387
|
+
const isERC1155 = await contract.read.supportsInterface([INTERFACE_IDS.ERC1155]);
|
|
388
|
+
if (isERC1155)
|
|
389
|
+
return TokenStandard.ERC1155;
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
// Not ERC721/ERC1155, try ERC20
|
|
393
|
+
}
|
|
394
|
+
// Try ERC20 by checking for decimals function
|
|
395
|
+
try {
|
|
396
|
+
const contract = (0, viem_1.getContract)({
|
|
397
|
+
address,
|
|
398
|
+
abi: (0, viem_1.parseAbi)(['function decimals() view returns (uint8)']),
|
|
399
|
+
client,
|
|
400
|
+
});
|
|
401
|
+
await contract.read.decimals();
|
|
402
|
+
return TokenStandard.ERC20;
|
|
403
|
+
}
|
|
404
|
+
catch {
|
|
405
|
+
// Not a recognized token standard
|
|
406
|
+
}
|
|
407
|
+
return TokenStandard.none;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Gets token details including standard, decimals, symbol, and balance
|
|
411
|
+
*
|
|
412
|
+
* @param client - Viem public client
|
|
413
|
+
* @param address - Token contract address
|
|
414
|
+
* @param holderAddress - Optional address to check balance for
|
|
415
|
+
* @returns Token details
|
|
416
|
+
*
|
|
417
|
+
* @example
|
|
418
|
+
* ```typescript
|
|
419
|
+
* const details = await getTokenStandardAndDetails(
|
|
420
|
+
* client,
|
|
421
|
+
* '0x...', // token address
|
|
422
|
+
* '0x...' // holder address
|
|
423
|
+
* );
|
|
424
|
+
* console.log(details.symbol, details.decimals, details.balance);
|
|
425
|
+
* ```
|
|
426
|
+
*/
|
|
427
|
+
async function getTokenStandardAndDetails(client, address, holderAddress) {
|
|
428
|
+
const standard = await getTokenStandard(client, address);
|
|
429
|
+
if (standard === TokenStandard.none) {
|
|
430
|
+
return { standard };
|
|
431
|
+
}
|
|
432
|
+
const details = { standard };
|
|
433
|
+
// Get ERC20 details
|
|
434
|
+
if (standard === TokenStandard.ERC20) {
|
|
435
|
+
try {
|
|
436
|
+
const contract = (0, viem_1.getContract)({
|
|
437
|
+
address,
|
|
438
|
+
abi: ERC20_ABI,
|
|
439
|
+
client,
|
|
440
|
+
});
|
|
441
|
+
const [decimals, symbol, balance] = await Promise.all([
|
|
442
|
+
contract.read.decimals().catch(() => undefined),
|
|
443
|
+
contract.read.symbol().catch(() => undefined),
|
|
444
|
+
holderAddress
|
|
445
|
+
? contract.read.balanceOf([holderAddress]).catch(() => undefined)
|
|
446
|
+
: Promise.resolve(undefined),
|
|
447
|
+
]);
|
|
448
|
+
details.decimals = decimals;
|
|
449
|
+
details.symbol = symbol;
|
|
450
|
+
details.balance = balance;
|
|
451
|
+
}
|
|
452
|
+
catch (error) {
|
|
453
|
+
console.error('Error fetching ERC20 details:', error);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return details;
|
|
457
|
+
}
|
|
458
|
+
// ============================================================================
|
|
459
|
+
// Transaction Type Determination
|
|
460
|
+
// ============================================================================
|
|
461
|
+
/**
|
|
462
|
+
* Determines the type of transaction by analyzing its parameters
|
|
463
|
+
*
|
|
464
|
+
* This function analyzes the transaction to determine if it's:
|
|
465
|
+
* - A contract deployment
|
|
466
|
+
* - A token transfer/approval
|
|
467
|
+
* - A contract interaction
|
|
468
|
+
* - A simple ETH transfer
|
|
469
|
+
*
|
|
470
|
+
* @param txParams - Transaction parameters
|
|
471
|
+
* @param client - Viem public client
|
|
472
|
+
* @returns Transaction type and contract code
|
|
473
|
+
*
|
|
474
|
+
* @example
|
|
475
|
+
* ```typescript
|
|
476
|
+
* const result = await determineTransactionType(
|
|
477
|
+
* {
|
|
478
|
+
* from: '0x...',
|
|
479
|
+
* to: '0x...',
|
|
480
|
+
* data: '0xa9059cbb...'
|
|
481
|
+
* },
|
|
482
|
+
* client
|
|
483
|
+
* );
|
|
484
|
+
* console.log('Transaction type:', result.type);
|
|
485
|
+
* ```
|
|
486
|
+
*/
|
|
487
|
+
async function determineTransactionType(txParams, client) {
|
|
488
|
+
const { data, to, value } = txParams;
|
|
489
|
+
// Contract deployment (no 'to' address)
|
|
490
|
+
if (data && !to) {
|
|
491
|
+
return {
|
|
492
|
+
type: TransactionType.deployContract,
|
|
493
|
+
contractCode: null,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
// Check if 'to' is a contract
|
|
497
|
+
if (to) {
|
|
498
|
+
const { contractCode, isContractAddress } = await readAddressAsContract(client, to);
|
|
499
|
+
if (isContractAddress) {
|
|
500
|
+
const hasValue = value && BigInt(value) !== 0n;
|
|
501
|
+
// Try to parse the transaction data
|
|
502
|
+
let functionName = '';
|
|
503
|
+
try {
|
|
504
|
+
const parsed = data ? parseStandardTokenTransactionData(data) : undefined;
|
|
505
|
+
if (parsed?.functionName) {
|
|
506
|
+
functionName = parsed.functionName;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
catch (error) {
|
|
510
|
+
console.debug('Failed to parse transaction data:', error);
|
|
511
|
+
}
|
|
512
|
+
// Check if it's a known token method
|
|
513
|
+
const tokenMethodName = [
|
|
514
|
+
TransactionType.tokenMethodApprove,
|
|
515
|
+
TransactionType.tokenMethodSetApprovalForAll,
|
|
516
|
+
TransactionType.tokenMethodTransfer,
|
|
517
|
+
TransactionType.tokenMethodTransferFrom,
|
|
518
|
+
TransactionType.tokenMethodIncreaseAllowance,
|
|
519
|
+
TransactionType.tokenMethodSafeTransferFrom,
|
|
520
|
+
].find((methodName) => methodName.toLowerCase() === functionName.toLowerCase());
|
|
521
|
+
// Return token method if found and no ETH value
|
|
522
|
+
if (data && tokenMethodName && !hasValue) {
|
|
523
|
+
return {
|
|
524
|
+
type: tokenMethodName,
|
|
525
|
+
contractCode,
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
// Otherwise it's a general contract interaction
|
|
529
|
+
return {
|
|
530
|
+
type: TransactionType.contractInteraction,
|
|
531
|
+
contractCode,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
// Simple ETH transfer
|
|
536
|
+
return {
|
|
537
|
+
type: TransactionType.simpleSend,
|
|
538
|
+
contractCode: null,
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Determines the asset type and token standard for a transaction
|
|
543
|
+
*
|
|
544
|
+
* This function analyzes the transaction to determine what type of asset
|
|
545
|
+
* is being transferred and what standard it follows (if applicable)
|
|
546
|
+
*
|
|
547
|
+
* @param txMeta - Transaction metadata
|
|
548
|
+
* @param client - Viem public client
|
|
549
|
+
* @returns Asset type and token standard
|
|
550
|
+
*
|
|
551
|
+
* @example
|
|
552
|
+
* ```typescript
|
|
553
|
+
* const { assetType, tokenStandard } = await determineTransactionAssetType(
|
|
554
|
+
* txMeta,
|
|
555
|
+
* client
|
|
556
|
+
* );
|
|
557
|
+
*
|
|
558
|
+
* if (assetType === AssetType.token) {
|
|
559
|
+
* console.log('ERC20 token transfer');
|
|
560
|
+
* }
|
|
561
|
+
* ```
|
|
562
|
+
*/
|
|
563
|
+
async function determineTransactionAssetType(txMeta, client) {
|
|
564
|
+
// Use existing type if it's already inferrable
|
|
565
|
+
let inferrableType = txMeta.type;
|
|
566
|
+
if (txMeta.type && !INFERRABLE_TRANSACTION_TYPES.includes(txMeta.type)) {
|
|
567
|
+
// Get an inferrable type for special transactions (like swaps)
|
|
568
|
+
const result = await determineTransactionType(txMeta.txParams, client);
|
|
569
|
+
inferrableType = result.type;
|
|
570
|
+
}
|
|
571
|
+
// Check if it's a token method
|
|
572
|
+
const isTokenMethod = [
|
|
573
|
+
TransactionType.tokenMethodApprove,
|
|
574
|
+
TransactionType.tokenMethodSetApprovalForAll,
|
|
575
|
+
TransactionType.tokenMethodTransfer,
|
|
576
|
+
TransactionType.tokenMethodTransferFrom,
|
|
577
|
+
TransactionType.tokenMethodIncreaseAllowance,
|
|
578
|
+
].includes(inferrableType);
|
|
579
|
+
// Try to get token standard for token methods or contract interactions
|
|
580
|
+
if (isTokenMethod || inferrableType === TransactionType.contractInteraction) {
|
|
581
|
+
if (txMeta.txParams.to) {
|
|
582
|
+
try {
|
|
583
|
+
const details = await getTokenStandardAndDetails(client, txMeta.txParams.to);
|
|
584
|
+
if (details.standard && details.standard !== TokenStandard.none) {
|
|
585
|
+
return {
|
|
586
|
+
assetType: details.standard === TokenStandard.ERC20
|
|
587
|
+
? AssetType.token
|
|
588
|
+
: AssetType.NFT,
|
|
589
|
+
tokenStandard: details.standard,
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
catch {
|
|
594
|
+
// Failed to get token details, continue
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
// Contract interaction with unknown asset type
|
|
599
|
+
if (inferrableType === TransactionType.contractInteraction) {
|
|
600
|
+
return {
|
|
601
|
+
assetType: AssetType.unknown,
|
|
602
|
+
tokenStandard: TokenStandard.none,
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
// Native ETH transfer
|
|
606
|
+
return {
|
|
607
|
+
assetType: AssetType.native,
|
|
608
|
+
tokenStandard: TokenStandard.none,
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
// ============================================================================
|
|
612
|
+
// Typed Data Parsing
|
|
613
|
+
// ============================================================================
|
|
614
|
+
/**
|
|
615
|
+
* Regex to extract large number values from typed data messages
|
|
616
|
+
* Handles cases where JSON.parse would lose precision
|
|
617
|
+
*/
|
|
618
|
+
const REGEX_MESSAGE_VALUE_LARGE = /"message"\s*:\s*\{[^}]*"value"\s*:\s*(\d{15,})/u;
|
|
619
|
+
/**
|
|
620
|
+
* Extracts large number value from a stringified message
|
|
621
|
+
*
|
|
622
|
+
* @param dataToParse - Stringified data to parse
|
|
623
|
+
* @returns Extracted large number or undefined
|
|
624
|
+
*/
|
|
625
|
+
function extractLargeMessageValue(dataToParse) {
|
|
626
|
+
if (typeof dataToParse !== 'string') {
|
|
627
|
+
return undefined;
|
|
628
|
+
}
|
|
629
|
+
return dataToParse.match(REGEX_MESSAGE_VALUE_LARGE)?.[1];
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* Parses typed data message while preserving large number precision
|
|
633
|
+
*
|
|
634
|
+
* JSON.parse can lose precision for numbers > Number.MAX_SAFE_INTEGER
|
|
635
|
+
* This function extracts large values and preserves them as strings
|
|
636
|
+
*
|
|
637
|
+
* @param dataToParse - Data to parse (object or string)
|
|
638
|
+
* @returns Parsed data with preserved precision
|
|
639
|
+
*
|
|
640
|
+
* @example
|
|
641
|
+
* ```typescript
|
|
642
|
+
* const parsed = parseTypedDataMessage(signatureRequest.data);
|
|
643
|
+
* console.log(parsed.message.value); // Preserved as string
|
|
644
|
+
* ```
|
|
645
|
+
*/
|
|
646
|
+
function parseTypedDataMessage(dataToParse) {
|
|
647
|
+
const result = typeof dataToParse === 'object'
|
|
648
|
+
? dataToParse
|
|
649
|
+
: JSON.parse(String(dataToParse));
|
|
650
|
+
const messageValue = extractLargeMessageValue(String(dataToParse));
|
|
651
|
+
if (result.message?.value) {
|
|
652
|
+
result.message.value = messageValue || String(result.message.value);
|
|
653
|
+
}
|
|
654
|
+
return result;
|
|
655
|
+
}
|
|
656
|
+
// ============================================================================
|
|
657
|
+
// Helper Utilities
|
|
658
|
+
// ============================================================================
|
|
659
|
+
/**
|
|
660
|
+
* Case-insensitive string comparison
|
|
661
|
+
*
|
|
662
|
+
* @param str1 - First string
|
|
663
|
+
* @param str2 - Second string
|
|
664
|
+
* @returns True if strings are equal (case-insensitive)
|
|
665
|
+
*/
|
|
666
|
+
function isEqualCaseInsensitive(str1, str2) {
|
|
667
|
+
return str1.toLowerCase() === str2.toLowerCase();
|
|
668
|
+
}
|
|
669
|
+
//# sourceMappingURL=transaction.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.utils.js","sourceRoot":"","sources":["../../utils/evm/transaction.utils.ts"],"names":[],"mappings":"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"}
|