@circle-fin/usdckit 0.22.0 → 0.23.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.
Files changed (59) hide show
  1. package/dist/cjs/abis/EIP2612.d.ts +197 -0
  2. package/dist/cjs/abis/EIP2612.js +78 -0
  3. package/dist/cjs/actions/index.d.ts +66 -0
  4. package/dist/cjs/actions/index.js +7 -0
  5. package/dist/cjs/actions/index.test.js +4 -0
  6. package/dist/cjs/actions/permit.d.ts +19 -0
  7. package/dist/cjs/actions/permit.js +50 -0
  8. package/dist/cjs/actions/permit.test.d.ts +1 -0
  9. package/dist/cjs/actions/permit.test.js +652 -0
  10. package/dist/cjs/actions/signEIP2612Permit.d.ts +130 -0
  11. package/dist/cjs/actions/signEIP2612Permit.js +128 -0
  12. package/dist/cjs/actions/signEIP2612Permit.test.d.ts +1 -0
  13. package/dist/cjs/actions/signEIP2612Permit.test.js +434 -0
  14. package/dist/cjs/chains/ARC_TESTNET.d.ts +180 -0
  15. package/dist/cjs/chains/ARC_TESTNET.js +57 -0
  16. package/dist/cjs/chains/index.d.ts +1 -0
  17. package/dist/cjs/chains/index.js +3 -1
  18. package/dist/cjs/chains/index.test.js +1 -0
  19. package/dist/cjs/extractChain.d.ts +179 -0
  20. package/dist/cjs/extractChain.test.js +1 -0
  21. package/dist/cjs/metadata.js +1 -1
  22. package/dist/cjs/providers/circle-wallets/actions/createAccount.d.ts +179 -0
  23. package/dist/cjs/providers/circle-wallets/actions/createAccount.js +3 -0
  24. package/dist/cjs/providers/circle-wallets/actions/estimateContractExecutionFee.d.ts +6 -0
  25. package/dist/cjs/providers/circle-wallets/actions/estimateTransferFee.d.ts +6 -0
  26. package/dist/cjs/providers/circle-wallets/actions/getAccounts.d.ts +179 -0
  27. package/dist/cjs/providers/circle-wallets/index.d.ts +358 -0
  28. package/dist/cjs/providers/circle-wallets/index.js +2 -0
  29. package/dist/cjs/providers/circle-wallets/transports/index.d.ts +12 -0
  30. package/dist/esm/abis/EIP2612.d.ts +197 -0
  31. package/dist/esm/abis/EIP2612.js +76 -0
  32. package/dist/esm/actions/index.d.ts +66 -0
  33. package/dist/esm/actions/index.js +7 -0
  34. package/dist/esm/actions/index.test.js +4 -0
  35. package/dist/esm/actions/permit.d.ts +19 -0
  36. package/dist/esm/actions/permit.js +44 -0
  37. package/dist/esm/actions/permit.test.d.ts +1 -0
  38. package/dist/esm/actions/permit.test.js +650 -0
  39. package/dist/esm/actions/signEIP2612Permit.d.ts +130 -0
  40. package/dist/esm/actions/signEIP2612Permit.js +122 -0
  41. package/dist/esm/actions/signEIP2612Permit.test.d.ts +1 -0
  42. package/dist/esm/actions/signEIP2612Permit.test.js +432 -0
  43. package/dist/esm/chains/ARC_TESTNET.d.ts +180 -0
  44. package/dist/esm/chains/ARC_TESTNET.js +54 -0
  45. package/dist/esm/chains/index.d.ts +1 -0
  46. package/dist/esm/chains/index.js +1 -0
  47. package/dist/esm/chains/index.test.js +1 -0
  48. package/dist/esm/extractChain.d.ts +179 -0
  49. package/dist/esm/extractChain.test.js +2 -1
  50. package/dist/esm/metadata.js +1 -1
  51. package/dist/esm/providers/circle-wallets/actions/createAccount.d.ts +179 -0
  52. package/dist/esm/providers/circle-wallets/actions/createAccount.js +3 -0
  53. package/dist/esm/providers/circle-wallets/actions/estimateContractExecutionFee.d.ts +6 -0
  54. package/dist/esm/providers/circle-wallets/actions/estimateTransferFee.d.ts +6 -0
  55. package/dist/esm/providers/circle-wallets/actions/getAccounts.d.ts +179 -0
  56. package/dist/esm/providers/circle-wallets/index.d.ts +358 -0
  57. package/dist/esm/providers/circle-wallets/index.js +3 -1
  58. package/dist/esm/providers/circle-wallets/transports/index.d.ts +12 -0
  59. package/package.json +5 -4
@@ -0,0 +1,650 @@
1
+ // Copyright (c) 2025, Circle Internet Group, Inc.
2
+ // All rights reserved.
3
+ //
4
+ // Circle Internet Group, Inc. CONFIDENTIAL
5
+ //
6
+ // This file includes unpublished proprietary source code of Circle Internet
7
+ // Group, Inc. The copyright notice above does not
8
+ // evidence any actual or intended publication of such source code. Disclosure
9
+ // of this source code or any related proprietary information is strictly
10
+ // prohibited without the express written permission of Circle Internet Group, Inc.
11
+ import { maxUint256 } from 'viem';
12
+ import { getAction } from 'viem/utils';
13
+ import { describe, expect, vi, beforeEach, test } from 'vitest';
14
+ import { ETH_SEPOLIA } from '../chains/index.js';
15
+ import { permit as action } from './permit.js';
16
+ import { signEIP2612Permit } from './signEIP2612Permit.js';
17
+ const client = {
18
+ chain: ETH_SEPOLIA,
19
+ };
20
+ const account = '0x1234567890abcdef1234567890abcdef12345678';
21
+ const spender = '0x8765432109876543210987654321098765432109';
22
+ const tokenAddress = ETH_SEPOLIA.contracts.USDC.address;
23
+ vi.mock('viem', async (importOriginal) => ({
24
+ ...(await importOriginal()),
25
+ createPublicClient: vi.fn(() => ({
26
+ simulateContract: vi.fn().mockResolvedValue({
27
+ request: {
28
+ address: tokenAddress,
29
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
30
+ abi: expect.any(Array),
31
+ functionName: 'permit',
32
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
33
+ args: expect.any(Array),
34
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
35
+ account: expect.objectContaining({ address: account }),
36
+ },
37
+ }),
38
+ })),
39
+ http: vi.fn(() => ({})),
40
+ }));
41
+ vi.mock('viem/utils', () => ({
42
+ getAction: vi.fn(),
43
+ }));
44
+ vi.mock('./signEIP2612Permit.js', () => ({
45
+ signEIP2612Permit: vi.fn(),
46
+ }));
47
+ describe(`${action.name}`, () => {
48
+ beforeEach(() => {
49
+ vi.restoreAllMocks();
50
+ });
51
+ test.each([
52
+ [
53
+ // Basic permit with NativeUnits
54
+ {
55
+ token: tokenAddress,
56
+ owner: account,
57
+ spender,
58
+ value: '1.0',
59
+ },
60
+ '0xpermitTransactionHash',
61
+ // signEIP2612Permit call
62
+ [
63
+ {
64
+ token: tokenAddress,
65
+ owner: account,
66
+ spender,
67
+ value: '1.0',
68
+ },
69
+ {
70
+ typedData: {
71
+ types: {
72
+ EIP712Domain: [
73
+ { name: 'name', type: 'string' },
74
+ { name: 'version', type: 'string' },
75
+ { name: 'chainId', type: 'uint256' },
76
+ { name: 'verifyingContract', type: 'address' },
77
+ ],
78
+ Permit: [
79
+ { name: 'owner', type: 'address' },
80
+ { name: 'spender', type: 'address' },
81
+ { name: 'value', type: 'uint256' },
82
+ { name: 'nonce', type: 'uint256' },
83
+ { name: 'deadline', type: 'uint256' },
84
+ ],
85
+ },
86
+ primaryType: 'Permit',
87
+ domain: {
88
+ name: 'USD Coin',
89
+ version: '2',
90
+ chainId: BigInt(ETH_SEPOLIA.id),
91
+ verifyingContract: tokenAddress,
92
+ },
93
+ message: {
94
+ owner: account,
95
+ spender,
96
+ value: 1000000n,
97
+ nonce: 321n,
98
+ deadline: maxUint256,
99
+ },
100
+ },
101
+ signature: '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890',
102
+ v: 27,
103
+ r: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
104
+ s: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
105
+ yParity: 0,
106
+ },
107
+ ],
108
+ // simulateContract call
109
+ [
110
+ {
111
+ address: tokenAddress,
112
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
113
+ abi: expect.any(Array),
114
+ functionName: 'permit',
115
+ args: [
116
+ account,
117
+ spender,
118
+ 1000000n,
119
+ maxUint256,
120
+ 27,
121
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
122
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
123
+ ],
124
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
125
+ account: expect.objectContaining({ address: account }),
126
+ gas: undefined,
127
+ },
128
+ {
129
+ request: {
130
+ address: tokenAddress,
131
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
132
+ abi: expect.any(Array),
133
+ functionName: 'permit',
134
+ args: [
135
+ account,
136
+ spender,
137
+ 1000000n,
138
+ maxUint256,
139
+ 27,
140
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
141
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
142
+ ],
143
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
144
+ account: expect.objectContaining({ address: account }),
145
+ },
146
+ },
147
+ ],
148
+ // writeContract call
149
+ [
150
+ {
151
+ address: tokenAddress,
152
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
153
+ abi: expect.any(Array),
154
+ functionName: 'permit',
155
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
156
+ args: expect.any(Array),
157
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
158
+ account: expect.objectContaining({ address: account }),
159
+ chain: ETH_SEPOLIA,
160
+ },
161
+ '0xpermitTransactionHash',
162
+ ],
163
+ ],
164
+ [
165
+ // Permit with BaseUnits
166
+ {
167
+ token: tokenAddress,
168
+ owner: account,
169
+ spender,
170
+ value: 1000000n,
171
+ },
172
+ '0xpermitTransactionHash',
173
+ // signEIP2612Permit call
174
+ [
175
+ {
176
+ token: tokenAddress,
177
+ owner: account,
178
+ spender,
179
+ value: 1000000n,
180
+ },
181
+ {
182
+ typedData: {
183
+ types: {
184
+ EIP712Domain: [
185
+ { name: 'name', type: 'string' },
186
+ { name: 'version', type: 'string' },
187
+ { name: 'chainId', type: 'uint256' },
188
+ { name: 'verifyingContract', type: 'address' },
189
+ ],
190
+ Permit: [
191
+ { name: 'owner', type: 'address' },
192
+ { name: 'spender', type: 'address' },
193
+ { name: 'value', type: 'uint256' },
194
+ { name: 'nonce', type: 'uint256' },
195
+ { name: 'deadline', type: 'uint256' },
196
+ ],
197
+ },
198
+ primaryType: 'Permit',
199
+ domain: {
200
+ name: 'USD Coin',
201
+ version: '2',
202
+ chainId: BigInt(ETH_SEPOLIA.id),
203
+ verifyingContract: tokenAddress,
204
+ },
205
+ message: {
206
+ owner: account,
207
+ spender,
208
+ value: 1000000n,
209
+ nonce: 321n,
210
+ deadline: maxUint256,
211
+ },
212
+ },
213
+ signature: '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890',
214
+ v: 27,
215
+ r: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
216
+ s: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
217
+ yParity: 0,
218
+ },
219
+ ],
220
+ // simulateContract call
221
+ [
222
+ {
223
+ address: tokenAddress,
224
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
225
+ abi: expect.any(Array),
226
+ functionName: 'permit',
227
+ args: [
228
+ account,
229
+ spender,
230
+ 1000000n,
231
+ maxUint256,
232
+ 27,
233
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
234
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
235
+ ],
236
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
237
+ account: expect.objectContaining({ address: account }),
238
+ gas: undefined,
239
+ },
240
+ {
241
+ request: {
242
+ address: tokenAddress,
243
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
244
+ abi: expect.any(Array),
245
+ functionName: 'permit',
246
+ args: [
247
+ account,
248
+ spender,
249
+ 1000000n,
250
+ maxUint256,
251
+ 27,
252
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
253
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
254
+ ],
255
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
256
+ account: expect.objectContaining({ address: account }),
257
+ },
258
+ },
259
+ ],
260
+ // writeContract call
261
+ [
262
+ {
263
+ address: tokenAddress,
264
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
265
+ abi: expect.any(Array),
266
+ functionName: 'permit',
267
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
268
+ args: expect.any(Array),
269
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
270
+ account: expect.objectContaining({ address: account }),
271
+ chain: ETH_SEPOLIA,
272
+ },
273
+ '0xpermitTransactionHash',
274
+ ],
275
+ ],
276
+ [
277
+ // Permit with gas and fees
278
+ {
279
+ token: tokenAddress,
280
+ owner: account,
281
+ spender,
282
+ value: '1.0',
283
+ gas: 50000n,
284
+ fees: {
285
+ maxFeePerGas: 20000000000n,
286
+ maxPriorityFeePerGas: 1000000000n,
287
+ },
288
+ },
289
+ '0xpermitTransactionHash',
290
+ // signEIP2612Permit call
291
+ [
292
+ {
293
+ token: tokenAddress,
294
+ owner: account,
295
+ spender,
296
+ value: '1.0',
297
+ gas: 50000n,
298
+ fees: {
299
+ maxFeePerGas: 20000000000n,
300
+ maxPriorityFeePerGas: 1000000000n,
301
+ },
302
+ },
303
+ {
304
+ typedData: {
305
+ types: {
306
+ EIP712Domain: [
307
+ { name: 'name', type: 'string' },
308
+ { name: 'version', type: 'string' },
309
+ { name: 'chainId', type: 'uint256' },
310
+ { name: 'verifyingContract', type: 'address' },
311
+ ],
312
+ Permit: [
313
+ { name: 'owner', type: 'address' },
314
+ { name: 'spender', type: 'address' },
315
+ { name: 'value', type: 'uint256' },
316
+ { name: 'nonce', type: 'uint256' },
317
+ { name: 'deadline', type: 'uint256' },
318
+ ],
319
+ },
320
+ primaryType: 'Permit',
321
+ domain: {
322
+ name: 'USD Coin',
323
+ version: '2',
324
+ chainId: BigInt(ETH_SEPOLIA.id),
325
+ verifyingContract: tokenAddress,
326
+ },
327
+ message: {
328
+ owner: account,
329
+ spender,
330
+ value: 1000000n,
331
+ nonce: 321n,
332
+ deadline: maxUint256,
333
+ },
334
+ },
335
+ signature: '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890',
336
+ v: 27,
337
+ r: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
338
+ s: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
339
+ yParity: 0,
340
+ },
341
+ ],
342
+ // simulateContract call
343
+ [
344
+ {
345
+ address: tokenAddress,
346
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
347
+ abi: expect.any(Array),
348
+ functionName: 'permit',
349
+ args: [
350
+ account,
351
+ spender,
352
+ 1000000n,
353
+ maxUint256,
354
+ 27,
355
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
356
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
357
+ ],
358
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
359
+ account: expect.objectContaining({ address: account }),
360
+ gas: 50000n,
361
+ maxFeePerGas: 20000000000n,
362
+ maxPriorityFeePerGas: 1000000000n,
363
+ },
364
+ {
365
+ request: {
366
+ address: tokenAddress,
367
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
368
+ abi: expect.any(Array),
369
+ functionName: 'permit',
370
+ args: [
371
+ account,
372
+ spender,
373
+ 1000000n,
374
+ maxUint256,
375
+ 27,
376
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
377
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
378
+ ],
379
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
380
+ account: expect.objectContaining({ address: account }),
381
+ gas: 50000n,
382
+ maxFeePerGas: 20000000000n,
383
+ maxPriorityFeePerGas: 1000000000n,
384
+ },
385
+ },
386
+ ],
387
+ // writeContract call
388
+ [
389
+ {
390
+ address: tokenAddress,
391
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
392
+ abi: expect.any(Array),
393
+ functionName: 'permit',
394
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
395
+ args: expect.any(Array),
396
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
397
+ account: expect.objectContaining({ address: account }),
398
+ chain: ETH_SEPOLIA,
399
+ gas: 50000n,
400
+ maxFeePerGas: 20000000000n,
401
+ maxPriorityFeePerGas: 1000000000n,
402
+ },
403
+ '0xpermitTransactionHash',
404
+ ],
405
+ ],
406
+ [
407
+ // Permit with contract object token
408
+ {
409
+ token: { address: tokenAddress },
410
+ owner: account,
411
+ spender,
412
+ value: '1.0',
413
+ },
414
+ '0xpermitTransactionHash',
415
+ // signEIP2612Permit call
416
+ [
417
+ {
418
+ token: { address: tokenAddress },
419
+ owner: account,
420
+ spender,
421
+ value: '1.0',
422
+ },
423
+ {
424
+ typedData: {
425
+ types: {
426
+ EIP712Domain: [
427
+ { name: 'name', type: 'string' },
428
+ { name: 'version', type: 'string' },
429
+ { name: 'chainId', type: 'uint256' },
430
+ { name: 'verifyingContract', type: 'address' },
431
+ ],
432
+ Permit: [
433
+ { name: 'owner', type: 'address' },
434
+ { name: 'spender', type: 'address' },
435
+ { name: 'value', type: 'uint256' },
436
+ { name: 'nonce', type: 'uint256' },
437
+ { name: 'deadline', type: 'uint256' },
438
+ ],
439
+ },
440
+ primaryType: 'Permit',
441
+ domain: {
442
+ name: 'USD Coin',
443
+ version: '2',
444
+ chainId: BigInt(ETH_SEPOLIA.id),
445
+ verifyingContract: tokenAddress,
446
+ },
447
+ message: {
448
+ owner: account,
449
+ spender,
450
+ value: 1000000n,
451
+ nonce: 321n,
452
+ deadline: maxUint256,
453
+ },
454
+ },
455
+ signature: '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890',
456
+ v: 27,
457
+ r: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
458
+ s: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
459
+ yParity: 0,
460
+ },
461
+ ],
462
+ // simulateContract call
463
+ [
464
+ {
465
+ address: tokenAddress,
466
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
467
+ abi: expect.any(Array),
468
+ functionName: 'permit',
469
+ args: [
470
+ account,
471
+ spender,
472
+ 1000000n,
473
+ maxUint256,
474
+ 27,
475
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
476
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
477
+ ],
478
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
479
+ account: expect.objectContaining({ address: account }),
480
+ gas: undefined,
481
+ },
482
+ {
483
+ request: {
484
+ address: tokenAddress,
485
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
486
+ abi: expect.any(Array),
487
+ functionName: 'permit',
488
+ args: [
489
+ account,
490
+ spender,
491
+ 1000000n,
492
+ maxUint256,
493
+ 27,
494
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
495
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
496
+ ],
497
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
498
+ account: expect.objectContaining({ address: account }),
499
+ },
500
+ },
501
+ ],
502
+ // writeContract call
503
+ [
504
+ {
505
+ address: tokenAddress,
506
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
507
+ abi: expect.any(Array),
508
+ functionName: 'permit',
509
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
510
+ args: expect.any(Array),
511
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
512
+ account: expect.objectContaining({ address: account }),
513
+ chain: ETH_SEPOLIA,
514
+ },
515
+ '0xpermitTransactionHash',
516
+ ],
517
+ ],
518
+ [
519
+ // Permit with custom deadline
520
+ {
521
+ token: tokenAddress,
522
+ owner: account,
523
+ spender,
524
+ value: '1.0',
525
+ deadline: 1234567890n,
526
+ },
527
+ '0xpermitTransactionHash',
528
+ // signEIP2612Permit
529
+ [
530
+ {
531
+ token: tokenAddress,
532
+ owner: account,
533
+ spender,
534
+ value: '1.0',
535
+ deadline: 1234567890n,
536
+ },
537
+ {
538
+ typedData: {
539
+ types: {
540
+ EIP712Domain: [
541
+ { name: 'name', type: 'string' },
542
+ { name: 'version', type: 'string' },
543
+ { name: 'chainId', type: 'uint256' },
544
+ { name: 'verifyingContract', type: 'address' },
545
+ ],
546
+ Permit: [
547
+ { name: 'owner', type: 'address' },
548
+ { name: 'spender', type: 'address' },
549
+ { name: 'value', type: 'uint256' },
550
+ { name: 'nonce', type: 'uint256' },
551
+ { name: 'deadline', type: 'uint256' },
552
+ ],
553
+ },
554
+ primaryType: 'Permit',
555
+ domain: {
556
+ name: 'USD Coin',
557
+ version: '2',
558
+ chainId: BigInt(ETH_SEPOLIA.id),
559
+ verifyingContract: tokenAddress,
560
+ },
561
+ message: {
562
+ owner: account,
563
+ spender,
564
+ value: 1000000n,
565
+ nonce: 321n,
566
+ deadline: 1234567890n,
567
+ },
568
+ },
569
+ signature: '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890',
570
+ v: 27,
571
+ r: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
572
+ s: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
573
+ yParity: 0,
574
+ },
575
+ ],
576
+ // simulateContract
577
+ [
578
+ {
579
+ address: tokenAddress,
580
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
581
+ abi: expect.any(Array),
582
+ functionName: 'permit',
583
+ args: [
584
+ account,
585
+ spender,
586
+ 1000000n,
587
+ 1234567890n,
588
+ 27,
589
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
590
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
591
+ ],
592
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
593
+ account: expect.objectContaining({ address: account }),
594
+ gas: undefined,
595
+ },
596
+ {
597
+ request: {
598
+ address: tokenAddress,
599
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
600
+ abi: expect.any(Array),
601
+ functionName: 'permit',
602
+ args: [
603
+ account,
604
+ spender,
605
+ 1000000n,
606
+ 1234567890n,
607
+ 27,
608
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
609
+ '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
610
+ ],
611
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
612
+ account: expect.objectContaining({ address: account }),
613
+ gas: undefined,
614
+ },
615
+ },
616
+ ],
617
+ // writeContract call
618
+ [
619
+ {
620
+ address: tokenAddress,
621
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
622
+ abi: expect.any(Array),
623
+ functionName: 'permit',
624
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
625
+ args: expect.any(Array),
626
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
627
+ account: expect.objectContaining({ address: account }),
628
+ chain: ETH_SEPOLIA,
629
+ },
630
+ '0xpermitTransactionHash',
631
+ ],
632
+ ],
633
+ ])('should return successfully', async (params, expectedResult, [signEIP2612PermitMockInput, signEIP2612PermitMockOutput], [simulateContractMockInput, simulateContractMockOutput], [writeContractMockInput, writeContractMockOutput]) => {
634
+ vi.mocked(signEIP2612Permit).mockResolvedValueOnce(signEIP2612PermitMockOutput);
635
+ // Mock getAction for simulateContract and writeContract
636
+ const mockSimulateContract = vi.fn().mockResolvedValue(simulateContractMockOutput);
637
+ const mockWriteContract = vi.fn().mockResolvedValue(writeContractMockOutput);
638
+ vi.mocked(getAction)
639
+ .mockReturnValueOnce(mockSimulateContract) // simulateContract
640
+ .mockReturnValueOnce(mockWriteContract); // writeContract
641
+ // Execute the function
642
+ await expect(action(client, params)).resolves.toEqual(expectedResult);
643
+ // Verify signEIP2612Permit was called correctly
644
+ expect(signEIP2612Permit).toHaveBeenCalledWith(client, signEIP2612PermitMockInput);
645
+ // Verify simulateContract was called correctly
646
+ expect(mockSimulateContract).toHaveBeenCalledWith(simulateContractMockInput);
647
+ // Verify writeContract was called correctly
648
+ expect(mockWriteContract).toHaveBeenCalledWith(writeContractMockInput);
649
+ });
650
+ });