@deserialize/multi-vm-wallet 1.2.21 → 1.2.22

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.
@@ -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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"}