@t402/evm 2.5.0 → 2.6.1

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 (39) hide show
  1. package/dist/cjs/index-fzI2FyBT.d.ts +122 -0
  2. package/dist/cjs/permit2/client/index.d.ts +81 -0
  3. package/dist/cjs/permit2/client/index.js +150 -0
  4. package/dist/cjs/permit2/client/index.js.map +1 -0
  5. package/dist/cjs/permit2/facilitator/index.d.ts +82 -0
  6. package/dist/cjs/permit2/facilitator/index.js +301 -0
  7. package/dist/cjs/permit2/facilitator/index.js.map +1 -0
  8. package/dist/cjs/permit2/index.d.ts +145 -0
  9. package/dist/cjs/permit2/index.js +1075 -0
  10. package/dist/cjs/permit2/index.js.map +1 -0
  11. package/dist/cjs/permit2/server/index.d.ts +3 -0
  12. package/dist/cjs/permit2/server/index.js +686 -0
  13. package/dist/cjs/permit2/server/index.js.map +1 -0
  14. package/dist/esm/chunk-3KHB6QTD.mjs +112 -0
  15. package/dist/esm/chunk-3KHB6QTD.mjs.map +1 -0
  16. package/dist/esm/{chunk-ZDGWVHD5.mjs → chunk-EEZNFYCW.mjs} +5 -5
  17. package/dist/esm/chunk-MMQSLAA2.mjs +190 -0
  18. package/dist/esm/chunk-MMQSLAA2.mjs.map +1 -0
  19. package/dist/esm/chunk-NIGKNI66.mjs +224 -0
  20. package/dist/esm/chunk-NIGKNI66.mjs.map +1 -0
  21. package/dist/esm/chunk-URG4HEYQ.mjs +74 -0
  22. package/dist/esm/chunk-URG4HEYQ.mjs.map +1 -0
  23. package/dist/esm/index-fzI2FyBT.d.mts +122 -0
  24. package/dist/esm/index.mjs +10 -10
  25. package/dist/esm/permit2/client/index.d.mts +81 -0
  26. package/dist/esm/permit2/client/index.mjs +11 -0
  27. package/dist/esm/permit2/client/index.mjs.map +1 -0
  28. package/dist/esm/permit2/facilitator/index.d.mts +82 -0
  29. package/dist/esm/permit2/facilitator/index.mjs +11 -0
  30. package/dist/esm/permit2/facilitator/index.mjs.map +1 -0
  31. package/dist/esm/permit2/index.d.mts +145 -0
  32. package/dist/esm/permit2/index.mjs +31 -0
  33. package/dist/esm/permit2/index.mjs.map +1 -0
  34. package/dist/esm/permit2/server/index.d.mts +3 -0
  35. package/dist/esm/permit2/server/index.mjs +12 -0
  36. package/dist/esm/permit2/server/index.mjs.map +1 -0
  37. package/dist/esm/upto/index.mjs +2 -2
  38. package/package.json +58 -11
  39. /package/dist/esm/{chunk-ZDGWVHD5.mjs.map → chunk-EEZNFYCW.mjs.map} +0 -0
@@ -0,0 +1,1075 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
21
+
22
+ // src/permit2/index.ts
23
+ var permit2_exports = {};
24
+ __export(permit2_exports, {
25
+ PERMIT2_ADDRESS: () => PERMIT2_ADDRESS,
26
+ Permit2EvmClientScheme: () => Permit2EvmScheme,
27
+ Permit2EvmFacilitatorScheme: () => Permit2EvmScheme3,
28
+ Permit2EvmServerScheme: () => Permit2EvmScheme2,
29
+ permit2ABI: () => permit2ABI,
30
+ permit2Types: () => permit2Types,
31
+ registerPermit2EvmClientScheme: () => registerPermit2EvmScheme,
32
+ registerPermit2EvmFacilitatorScheme: () => registerPermit2EvmScheme3,
33
+ registerPermit2EvmServerScheme: () => registerPermit2EvmScheme2
34
+ });
35
+ module.exports = __toCommonJS(permit2_exports);
36
+
37
+ // src/permit2/client/scheme.ts
38
+ var import_viem = require("viem");
39
+
40
+ // src/permit2/constants.ts
41
+ var PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
42
+ var permit2Types = {
43
+ PermitTransferFrom: [
44
+ { name: "permitted", type: "TokenPermissions" },
45
+ { name: "spender", type: "address" },
46
+ { name: "nonce", type: "uint256" },
47
+ { name: "deadline", type: "uint256" }
48
+ ],
49
+ TokenPermissions: [
50
+ { name: "token", type: "address" },
51
+ { name: "amount", type: "uint256" }
52
+ ]
53
+ };
54
+ var permit2ABI = [
55
+ {
56
+ inputs: [
57
+ {
58
+ components: [
59
+ {
60
+ components: [
61
+ { name: "token", type: "address" },
62
+ { name: "amount", type: "uint256" }
63
+ ],
64
+ name: "permitted",
65
+ type: "tuple"
66
+ },
67
+ { name: "nonce", type: "uint256" },
68
+ { name: "deadline", type: "uint256" }
69
+ ],
70
+ name: "permit",
71
+ type: "tuple"
72
+ },
73
+ {
74
+ components: [
75
+ { name: "to", type: "address" },
76
+ { name: "requestedAmount", type: "uint256" }
77
+ ],
78
+ name: "transferDetails",
79
+ type: "tuple"
80
+ },
81
+ { name: "owner", type: "address" },
82
+ { name: "signature", type: "bytes" }
83
+ ],
84
+ name: "permitTransferFrom",
85
+ outputs: [],
86
+ stateMutability: "nonpayable",
87
+ type: "function"
88
+ },
89
+ {
90
+ inputs: [{ name: "account", type: "address" }],
91
+ name: "balanceOf",
92
+ outputs: [{ name: "", type: "uint256" }],
93
+ stateMutability: "view",
94
+ type: "function"
95
+ }
96
+ ];
97
+ var erc20BalanceABI = [
98
+ {
99
+ inputs: [{ name: "account", type: "address" }],
100
+ name: "balanceOf",
101
+ outputs: [{ name: "", type: "uint256" }],
102
+ stateMutability: "view",
103
+ type: "function"
104
+ }
105
+ ];
106
+
107
+ // src/permit2/client/scheme.ts
108
+ var Permit2EvmScheme = class {
109
+ /**
110
+ * Creates a new Permit2EvmScheme instance.
111
+ *
112
+ * @param signer - The EVM signer for client operations
113
+ */
114
+ constructor(signer) {
115
+ this.signer = signer;
116
+ __publicField(this, "scheme", "permit2");
117
+ }
118
+ /**
119
+ * Creates a payment payload for the Permit2 scheme.
120
+ *
121
+ * @param t402Version - The t402 protocol version
122
+ * @param paymentRequirements - The payment requirements
123
+ * @returns Promise resolving to a payment payload
124
+ */
125
+ async createPaymentPayload(t402Version, paymentRequirements) {
126
+ const now = Math.floor(Date.now() / 1e3);
127
+ const deadline = now + paymentRequirements.maxTimeoutSeconds;
128
+ const nonce = BigInt(
129
+ "0x" + Array.from(globalThis.crypto.getRandomValues(new Uint8Array(32))).map((b) => b.toString(16).padStart(2, "0")).join("")
130
+ ).toString();
131
+ const permit = {
132
+ permitted: {
133
+ token: (0, import_viem.getAddress)(paymentRequirements.asset),
134
+ amount: paymentRequirements.amount
135
+ },
136
+ nonce,
137
+ deadline: deadline.toString()
138
+ };
139
+ const transferDetails = {
140
+ to: (0, import_viem.getAddress)(paymentRequirements.payTo),
141
+ requestedAmount: paymentRequirements.amount
142
+ };
143
+ const signature = await this.signPermit2(permit, transferDetails.to, paymentRequirements);
144
+ const payload = {
145
+ permit,
146
+ transferDetails,
147
+ signature,
148
+ owner: this.signer.address
149
+ };
150
+ return {
151
+ t402Version,
152
+ payload
153
+ };
154
+ }
155
+ /**
156
+ * Sign the Permit2 SignatureTransfer using EIP-712
157
+ *
158
+ * @param permit - The permit transfer data
159
+ * @param spender - The spender address
160
+ * @param requirements - The payment requirements
161
+ * @returns Signed typed data hex string
162
+ */
163
+ async signPermit2(permit, spender, requirements) {
164
+ const chainId = parseInt(requirements.network.split(":")[1]);
165
+ const domain = {
166
+ name: "Permit2",
167
+ chainId,
168
+ verifyingContract: PERMIT2_ADDRESS
169
+ };
170
+ const message = {
171
+ permitted: {
172
+ token: permit.permitted.token,
173
+ amount: BigInt(permit.permitted.amount)
174
+ },
175
+ spender,
176
+ nonce: BigInt(permit.nonce),
177
+ deadline: BigInt(permit.deadline)
178
+ };
179
+ return await this.signer.signTypedData({
180
+ domain,
181
+ types: permit2Types,
182
+ primaryType: "PermitTransferFrom",
183
+ message
184
+ });
185
+ }
186
+ };
187
+
188
+ // src/permit2/client/register.ts
189
+ function registerPermit2EvmScheme(client, config) {
190
+ if (config.networks && config.networks.length > 0) {
191
+ config.networks.forEach((network) => {
192
+ client.register(network, new Permit2EvmScheme(config.signer));
193
+ });
194
+ } else {
195
+ client.register("eip155:*", new Permit2EvmScheme(config.signer));
196
+ }
197
+ if (config.policies) {
198
+ config.policies.forEach((policy) => {
199
+ client.registerPolicy(policy);
200
+ });
201
+ }
202
+ return client;
203
+ }
204
+
205
+ // src/tokens.ts
206
+ var USDT0_ADDRESSES = {
207
+ // === Existing Networks ===
208
+ // Ethereum Mainnet - OFT Adapter (bridge endpoint)
209
+ "eip155:1": "0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee",
210
+ // Arbitrum One - Native USDT0
211
+ "eip155:42161": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",
212
+ // Ink Mainnet
213
+ "eip155:57073": "0x0200C29006150606B650577BBE7B6248F58470c1",
214
+ // Berachain Mainnet
215
+ "eip155:80094": "0x779Ded0c9e1022225f8E0630b35a9b54bE713736",
216
+ // Unichain Mainnet (updated address)
217
+ "eip155:130": "0x9151434b16b9763660705744891fA906F660EcC5",
218
+ // === Phase 1: High Priority Networks ===
219
+ // Polygon PoS
220
+ "eip155:137": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
221
+ // Mantle
222
+ "eip155:5000": "0x779Ded0c9e1022225f8E0630b35a9b54bE713736",
223
+ // Optimism
224
+ "eip155:10": "0x01bFF41798a0BcF287b996046Ca68b395DbC1071",
225
+ // Plasma
226
+ "eip155:9745": "0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb",
227
+ // Sei
228
+ "eip155:1329": "0x9151434b16b9763660705744891fA906F660EcC5",
229
+ // Conflux eSpace
230
+ "eip155:1030": "0xaf37E8B6C9ED7f6318979f56Fc287d76c30847ff",
231
+ // Monad
232
+ "eip155:143": "0xe7cd86e13AC4309349F30B3435a9d337750fC82D",
233
+ // === Phase 2: Medium Priority Networks ===
234
+ // Rootstock (Bitcoin sidechain)
235
+ "eip155:30": "0x779dED0C9e1022225F8e0630b35A9B54Be713736",
236
+ // XLayer (OKX L2)
237
+ "eip155:196": "0x779Ded0c9e1022225f8E0630b35a9b54bE713736",
238
+ // Flare
239
+ "eip155:14": "0xe7cd86e13AC4309349F30B3435a9d337750fC82D",
240
+ // Corn
241
+ "eip155:21000000": "0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb",
242
+ // HyperEVM
243
+ "eip155:999": "0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb",
244
+ // MegaETH
245
+ "eip155:4326": "0xb8ce59fc3717ada4c02eadf9682a9e934f625ebb",
246
+ // Stable
247
+ "eip155:988": "0x779Ded0c9e1022225f8E0630b35a9b54bE713736"
248
+ };
249
+ var USDC_ADDRESSES = {
250
+ // Ethereum Mainnet
251
+ "eip155:1": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
252
+ // Base Mainnet
253
+ "eip155:8453": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
254
+ // Base Sepolia (testnet)
255
+ "eip155:84532": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
256
+ // Sepolia (testnet)
257
+ "eip155:11155111": "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
258
+ // Arbitrum One
259
+ "eip155:42161": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
260
+ // Polygon Mainnet
261
+ "eip155:137": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"
262
+ };
263
+ var USAT_ADDRESSES = {
264
+ // Ethereum Mainnet
265
+ "eip155:1": "0x07041776f5007aca2a54844f50503a18a72a8b68"
266
+ };
267
+ var USDT_LEGACY_ADDRESSES = {
268
+ // Ethereum Mainnet
269
+ "eip155:1": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
270
+ // Polygon Mainnet (native USDT, not USDT0)
271
+ "eip155:137": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
272
+ // BNB Chain (BSC) - BEP-20 USDT
273
+ "eip155:56": "0x55d398326f99059fF775485246999027B3197955",
274
+ // Avalanche C-Chain
275
+ "eip155:43114": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7",
276
+ // Fantom
277
+ "eip155:250": "0x049d68029688eabf473097a2fc38ef61633a3c7a",
278
+ // Celo
279
+ "eip155:42220": "0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e",
280
+ // Kaia (formerly Klaytn)
281
+ "eip155:8217": "0xcee8faf64bb97a73bb51e115aa89c17ffa8dd167"
282
+ };
283
+ var TOKEN_REGISTRY = {
284
+ // Ethereum Mainnet
285
+ "eip155:1": {
286
+ USDT0: {
287
+ address: USDT0_ADDRESSES["eip155:1"],
288
+ symbol: "USDT0",
289
+ name: "TetherToken",
290
+ version: "1",
291
+ decimals: 6,
292
+ tokenType: "eip3009",
293
+ priority: 1
294
+ },
295
+ USDC: {
296
+ address: USDC_ADDRESSES["eip155:1"],
297
+ symbol: "USDC",
298
+ name: "USD Coin",
299
+ version: "2",
300
+ decimals: 6,
301
+ tokenType: "eip3009",
302
+ priority: 2
303
+ },
304
+ USAT: {
305
+ address: USAT_ADDRESSES["eip155:1"],
306
+ symbol: "USAT",
307
+ name: "Tether America USD",
308
+ version: "1",
309
+ decimals: 6,
310
+ tokenType: "legacy",
311
+ priority: 3
312
+ },
313
+ USDT: {
314
+ address: USDT_LEGACY_ADDRESSES["eip155:1"],
315
+ symbol: "USDT",
316
+ name: "TetherUSD",
317
+ version: "1",
318
+ decimals: 6,
319
+ tokenType: "legacy",
320
+ priority: 10
321
+ // Lower priority due to legacy flow
322
+ }
323
+ },
324
+ // Arbitrum One
325
+ "eip155:42161": {
326
+ USDT0: {
327
+ address: USDT0_ADDRESSES["eip155:42161"],
328
+ symbol: "USDT0",
329
+ name: "TetherToken",
330
+ version: "1",
331
+ decimals: 6,
332
+ tokenType: "eip3009",
333
+ priority: 1
334
+ },
335
+ USDC: {
336
+ address: USDC_ADDRESSES["eip155:42161"],
337
+ symbol: "USDC",
338
+ name: "USD Coin",
339
+ version: "2",
340
+ decimals: 6,
341
+ tokenType: "eip3009",
342
+ priority: 2
343
+ }
344
+ },
345
+ // Ink Mainnet
346
+ "eip155:57073": {
347
+ USDT0: {
348
+ address: USDT0_ADDRESSES["eip155:57073"],
349
+ symbol: "USDT0",
350
+ name: "TetherToken",
351
+ version: "1",
352
+ decimals: 6,
353
+ tokenType: "eip3009",
354
+ priority: 1
355
+ }
356
+ },
357
+ // Berachain Mainnet
358
+ "eip155:80094": {
359
+ USDT0: {
360
+ address: USDT0_ADDRESSES["eip155:80094"],
361
+ symbol: "USDT0",
362
+ name: "TetherToken",
363
+ version: "1",
364
+ decimals: 6,
365
+ tokenType: "eip3009",
366
+ priority: 1
367
+ }
368
+ },
369
+ // Unichain Mainnet
370
+ "eip155:130": {
371
+ USDT0: {
372
+ address: USDT0_ADDRESSES["eip155:130"],
373
+ symbol: "USDT0",
374
+ name: "TetherToken",
375
+ version: "1",
376
+ decimals: 6,
377
+ tokenType: "eip3009",
378
+ priority: 1
379
+ }
380
+ },
381
+ // Base Mainnet
382
+ "eip155:8453": {
383
+ USDC: {
384
+ address: USDC_ADDRESSES["eip155:8453"],
385
+ symbol: "USDC",
386
+ name: "USD Coin",
387
+ version: "2",
388
+ decimals: 6,
389
+ tokenType: "eip3009",
390
+ priority: 2
391
+ }
392
+ },
393
+ // Base Sepolia (testnet)
394
+ "eip155:84532": {
395
+ USDC: {
396
+ address: USDC_ADDRESSES["eip155:84532"],
397
+ symbol: "USDC",
398
+ name: "USDC",
399
+ version: "2",
400
+ decimals: 6,
401
+ tokenType: "eip3009",
402
+ priority: 2
403
+ }
404
+ },
405
+ // Sepolia (testnet)
406
+ "eip155:11155111": {
407
+ USDC: {
408
+ address: USDC_ADDRESSES["eip155:11155111"],
409
+ symbol: "USDC",
410
+ name: "USDC",
411
+ version: "2",
412
+ decimals: 6,
413
+ tokenType: "eip3009",
414
+ priority: 2
415
+ }
416
+ },
417
+ // Polygon Mainnet
418
+ "eip155:137": {
419
+ USDT0: {
420
+ address: USDT0_ADDRESSES["eip155:137"],
421
+ symbol: "USDT0",
422
+ name: "TetherToken",
423
+ version: "1",
424
+ decimals: 6,
425
+ tokenType: "eip3009",
426
+ priority: 1
427
+ },
428
+ USDC: {
429
+ address: USDC_ADDRESSES["eip155:137"],
430
+ symbol: "USDC",
431
+ name: "USD Coin",
432
+ version: "2",
433
+ decimals: 6,
434
+ tokenType: "eip3009",
435
+ priority: 2
436
+ },
437
+ USDT: {
438
+ address: USDT_LEGACY_ADDRESSES["eip155:137"],
439
+ symbol: "USDT",
440
+ name: "TetherUSD",
441
+ version: "1",
442
+ decimals: 6,
443
+ tokenType: "legacy",
444
+ priority: 10
445
+ }
446
+ },
447
+ // === Phase 1: High Priority USDT0 Networks ===
448
+ // Optimism Mainnet
449
+ "eip155:10": {
450
+ USDT0: {
451
+ address: USDT0_ADDRESSES["eip155:10"],
452
+ symbol: "USDT0",
453
+ name: "TetherToken",
454
+ version: "1",
455
+ decimals: 6,
456
+ tokenType: "eip3009",
457
+ priority: 1
458
+ }
459
+ },
460
+ // Mantle Mainnet
461
+ "eip155:5000": {
462
+ USDT0: {
463
+ address: USDT0_ADDRESSES["eip155:5000"],
464
+ symbol: "USDT0",
465
+ name: "TetherToken",
466
+ version: "1",
467
+ decimals: 6,
468
+ tokenType: "eip3009",
469
+ priority: 1
470
+ }
471
+ },
472
+ // Plasma Mainnet
473
+ "eip155:9745": {
474
+ USDT0: {
475
+ address: USDT0_ADDRESSES["eip155:9745"],
476
+ symbol: "USDT0",
477
+ name: "TetherToken",
478
+ version: "1",
479
+ decimals: 6,
480
+ tokenType: "eip3009",
481
+ priority: 1
482
+ }
483
+ },
484
+ // Sei Mainnet
485
+ "eip155:1329": {
486
+ USDT0: {
487
+ address: USDT0_ADDRESSES["eip155:1329"],
488
+ symbol: "USDT0",
489
+ name: "TetherToken",
490
+ version: "1",
491
+ decimals: 6,
492
+ tokenType: "eip3009",
493
+ priority: 1
494
+ }
495
+ },
496
+ // Conflux eSpace Mainnet
497
+ "eip155:1030": {
498
+ USDT0: {
499
+ address: USDT0_ADDRESSES["eip155:1030"],
500
+ symbol: "USDT0",
501
+ name: "TetherToken",
502
+ version: "1",
503
+ decimals: 6,
504
+ tokenType: "eip3009",
505
+ priority: 1
506
+ }
507
+ },
508
+ // Monad Mainnet
509
+ "eip155:143": {
510
+ USDT0: {
511
+ address: USDT0_ADDRESSES["eip155:143"],
512
+ symbol: "USDT0",
513
+ name: "TetherToken",
514
+ version: "1",
515
+ decimals: 6,
516
+ tokenType: "eip3009",
517
+ priority: 1
518
+ }
519
+ },
520
+ // === Phase 2: Medium Priority USDT0 Networks ===
521
+ // Flare Mainnet
522
+ "eip155:14": {
523
+ USDT0: {
524
+ address: USDT0_ADDRESSES["eip155:14"],
525
+ symbol: "USDT0",
526
+ name: "TetherToken",
527
+ version: "1",
528
+ decimals: 6,
529
+ tokenType: "eip3009",
530
+ priority: 1
531
+ }
532
+ },
533
+ // Rootstock Mainnet (Bitcoin sidechain)
534
+ "eip155:30": {
535
+ USDT0: {
536
+ address: USDT0_ADDRESSES["eip155:30"],
537
+ symbol: "USDT0",
538
+ name: "TetherToken",
539
+ version: "1",
540
+ decimals: 6,
541
+ tokenType: "eip3009",
542
+ priority: 1
543
+ }
544
+ },
545
+ // XLayer Mainnet (OKX L2)
546
+ "eip155:196": {
547
+ USDT0: {
548
+ address: USDT0_ADDRESSES["eip155:196"],
549
+ symbol: "USDT0",
550
+ name: "TetherToken",
551
+ version: "1",
552
+ decimals: 6,
553
+ tokenType: "eip3009",
554
+ priority: 1
555
+ }
556
+ },
557
+ // Stable Mainnet
558
+ "eip155:988": {
559
+ USDT0: {
560
+ address: USDT0_ADDRESSES["eip155:988"],
561
+ symbol: "USDT0",
562
+ name: "TetherToken",
563
+ version: "1",
564
+ decimals: 6,
565
+ tokenType: "eip3009",
566
+ priority: 1
567
+ }
568
+ },
569
+ // HyperEVM Mainnet
570
+ "eip155:999": {
571
+ USDT0: {
572
+ address: USDT0_ADDRESSES["eip155:999"],
573
+ symbol: "USDT0",
574
+ name: "TetherToken",
575
+ version: "1",
576
+ decimals: 6,
577
+ tokenType: "eip3009",
578
+ priority: 1
579
+ }
580
+ },
581
+ // MegaETH Mainnet
582
+ "eip155:4326": {
583
+ USDT0: {
584
+ address: USDT0_ADDRESSES["eip155:4326"],
585
+ symbol: "USDT0",
586
+ name: "TetherToken",
587
+ version: "1",
588
+ decimals: 6,
589
+ tokenType: "eip3009",
590
+ priority: 1
591
+ }
592
+ },
593
+ // Corn Mainnet
594
+ "eip155:21000000": {
595
+ USDT0: {
596
+ address: USDT0_ADDRESSES["eip155:21000000"],
597
+ symbol: "USDT0",
598
+ name: "TetherToken",
599
+ version: "1",
600
+ decimals: 6,
601
+ tokenType: "eip3009",
602
+ priority: 1
603
+ }
604
+ },
605
+ // === Legacy USDT Networks (no EIP-3009 support) ===
606
+ // BNB Chain (BSC) - BEP-20 USDT
607
+ "eip155:56": {
608
+ USDT: {
609
+ address: USDT_LEGACY_ADDRESSES["eip155:56"],
610
+ symbol: "USDT",
611
+ name: "Tether USD",
612
+ version: "1",
613
+ decimals: 18,
614
+ // BSC USDT uses 18 decimals
615
+ tokenType: "legacy",
616
+ priority: 10
617
+ }
618
+ },
619
+ // Avalanche C-Chain
620
+ "eip155:43114": {
621
+ USDT: {
622
+ address: USDT_LEGACY_ADDRESSES["eip155:43114"],
623
+ symbol: "USDT",
624
+ name: "TetherToken",
625
+ version: "1",
626
+ decimals: 6,
627
+ tokenType: "legacy",
628
+ priority: 10
629
+ }
630
+ },
631
+ // Fantom
632
+ "eip155:250": {
633
+ USDT: {
634
+ address: USDT_LEGACY_ADDRESSES["eip155:250"],
635
+ symbol: "USDT",
636
+ name: "Frapped USDT",
637
+ version: "1",
638
+ decimals: 6,
639
+ tokenType: "legacy",
640
+ priority: 10
641
+ }
642
+ },
643
+ // Celo
644
+ "eip155:42220": {
645
+ USDT: {
646
+ address: USDT_LEGACY_ADDRESSES["eip155:42220"],
647
+ symbol: "USDT",
648
+ name: "Tether USD",
649
+ version: "1",
650
+ decimals: 18,
651
+ tokenType: "legacy",
652
+ priority: 10
653
+ }
654
+ },
655
+ // Kaia (formerly Klaytn)
656
+ "eip155:8217": {
657
+ USDT: {
658
+ address: USDT_LEGACY_ADDRESSES["eip155:8217"],
659
+ symbol: "USDT",
660
+ name: "Tether USD",
661
+ version: "1",
662
+ decimals: 6,
663
+ tokenType: "legacy",
664
+ priority: 10
665
+ }
666
+ }
667
+ };
668
+ function getTokenConfig(network, symbol) {
669
+ return TOKEN_REGISTRY[network]?.[symbol.toUpperCase()];
670
+ }
671
+ function getNetworkTokens(network) {
672
+ const tokens = TOKEN_REGISTRY[network];
673
+ if (!tokens) return [];
674
+ return Object.values(tokens).sort((a, b) => a.priority - b.priority);
675
+ }
676
+ function getDefaultToken(network) {
677
+ const tokens = getNetworkTokens(network);
678
+ return tokens[0];
679
+ }
680
+
681
+ // src/permit2/server/scheme.ts
682
+ var Permit2EvmScheme2 = class {
683
+ /**
684
+ * Creates a new Permit2EvmScheme server instance.
685
+ *
686
+ * @param config - Server configuration options
687
+ */
688
+ constructor(config = {}) {
689
+ __publicField(this, "scheme", "permit2");
690
+ __publicField(this, "moneyParsers", []);
691
+ __publicField(this, "config");
692
+ this.config = config;
693
+ }
694
+ /**
695
+ * Get the list of supported EVM networks.
696
+ *
697
+ * @returns Array of supported network identifiers
698
+ */
699
+ static getSupportedNetworks() {
700
+ return Object.keys(TOKEN_REGISTRY);
701
+ }
702
+ /**
703
+ * Check if a network is supported.
704
+ *
705
+ * @param network - Network identifier to check
706
+ * @returns Whether the network is supported
707
+ */
708
+ static isNetworkSupported(network) {
709
+ return network in TOKEN_REGISTRY;
710
+ }
711
+ /**
712
+ * Register a custom money parser for price conversion.
713
+ *
714
+ * @param parser - The money parser to register
715
+ * @returns This instance for chaining
716
+ */
717
+ registerMoneyParser(parser) {
718
+ this.moneyParsers.push(parser);
719
+ return this;
720
+ }
721
+ /**
722
+ * Parse a price into an AssetAmount for the given network.
723
+ *
724
+ * @param price - The price to parse
725
+ * @param network - The target network
726
+ * @returns The parsed asset amount
727
+ */
728
+ async parsePrice(price, network) {
729
+ if (typeof price === "object" && price !== null && "amount" in price) {
730
+ if (!price.asset) {
731
+ throw new Error(`Asset address must be specified for AssetAmount on network ${network}`);
732
+ }
733
+ return {
734
+ amount: price.amount,
735
+ asset: price.asset,
736
+ extra: price.extra || {}
737
+ };
738
+ }
739
+ const amount = this.parseMoneyToDecimal(price);
740
+ for (const parser of this.moneyParsers) {
741
+ const result = await parser(amount, network);
742
+ if (result !== null) {
743
+ return result;
744
+ }
745
+ }
746
+ return this.defaultMoneyConversion(amount, network);
747
+ }
748
+ /**
749
+ * Enhance payment requirements with Permit2-specific data.
750
+ *
751
+ * @param paymentRequirements - The base payment requirements
752
+ * @param supportedKind - The supported kind metadata
753
+ * @param supportedKind.t402Version - Protocol version
754
+ * @param supportedKind.scheme - Payment scheme
755
+ * @param supportedKind.network - Target network
756
+ * @param supportedKind.extra - Extra metadata
757
+ * @param extensionKeys - Active extension keys
758
+ * @returns Enhanced payment requirements
759
+ */
760
+ enhancePaymentRequirements(paymentRequirements, supportedKind, extensionKeys) {
761
+ void supportedKind;
762
+ void extensionKeys;
763
+ if (!paymentRequirements.extra) {
764
+ paymentRequirements.extra = {};
765
+ }
766
+ paymentRequirements.extra.permit2Address = PERMIT2_ADDRESS;
767
+ return Promise.resolve(paymentRequirements);
768
+ }
769
+ /**
770
+ * Parse a money value into a decimal number.
771
+ *
772
+ * @param money - The money value to parse
773
+ * @returns The decimal amount
774
+ */
775
+ parseMoneyToDecimal(money) {
776
+ if (typeof money === "number") {
777
+ if (!Number.isFinite(money)) {
778
+ throw new Error(`Invalid money value: ${money} (must be a finite number)`);
779
+ }
780
+ return money;
781
+ }
782
+ const cleanMoney = money.replace(/^\$/, "").trim();
783
+ const amount = parseFloat(cleanMoney);
784
+ if (!Number.isFinite(amount)) {
785
+ throw new Error(`Invalid money format: ${money}`);
786
+ }
787
+ return amount;
788
+ }
789
+ /**
790
+ * Convert a decimal amount to a token amount using default network token.
791
+ *
792
+ * @param amount - The decimal amount
793
+ * @param network - The target network
794
+ * @returns The asset amount with token details
795
+ */
796
+ defaultMoneyConversion(amount, network) {
797
+ const token = this.getDefaultAsset(network);
798
+ const tokenAmount = this.convertToTokenAmount(amount.toString(), token.decimals);
799
+ return {
800
+ amount: tokenAmount,
801
+ asset: token.address,
802
+ extra: {
803
+ symbol: token.symbol,
804
+ permit2Address: PERMIT2_ADDRESS
805
+ }
806
+ };
807
+ }
808
+ /**
809
+ * Convert a decimal amount string to token smallest units.
810
+ *
811
+ * @param decimalAmount - The decimal amount as a string
812
+ * @param decimals - The token's decimal places
813
+ * @returns The amount in smallest units
814
+ */
815
+ convertToTokenAmount(decimalAmount, decimals) {
816
+ if (!/^-?\d+(\.\d+)?$/.test(decimalAmount)) {
817
+ throw new Error(`Invalid amount format: ${decimalAmount}`);
818
+ }
819
+ const [wholePart, fracPart = ""] = decimalAmount.split(".");
820
+ const paddedFrac = fracPart.padEnd(decimals, "0").slice(0, decimals);
821
+ const combined = wholePart + paddedFrac;
822
+ const result = combined.replace(/^0+/, "") || "0";
823
+ return result;
824
+ }
825
+ /**
826
+ * Get the default token asset for a network.
827
+ *
828
+ * @param network - The target network
829
+ * @returns The token configuration
830
+ */
831
+ getDefaultAsset(network) {
832
+ if (this.config.preferredToken) {
833
+ const preferred = getTokenConfig(network, this.config.preferredToken);
834
+ if (preferred) return preferred;
835
+ }
836
+ const defaultToken = getDefaultToken(network);
837
+ if (defaultToken) return defaultToken;
838
+ throw new Error(`No tokens configured for network ${network}`);
839
+ }
840
+ };
841
+
842
+ // src/permit2/server/register.ts
843
+ function registerPermit2EvmScheme2(server, config = {}) {
844
+ if (config.networks && config.networks.length > 0) {
845
+ config.networks.forEach((network) => {
846
+ server.register(network, new Permit2EvmScheme2());
847
+ });
848
+ } else {
849
+ server.register("eip155:*", new Permit2EvmScheme2());
850
+ }
851
+ return server;
852
+ }
853
+
854
+ // src/permit2/facilitator/scheme.ts
855
+ var import_viem2 = require("viem");
856
+ var Permit2EvmScheme3 = class {
857
+ /**
858
+ * Creates a new Permit2 facilitator instance.
859
+ *
860
+ * @param signer - The facilitator EVM signer
861
+ */
862
+ constructor(signer) {
863
+ this.signer = signer;
864
+ __publicField(this, "scheme", "permit2");
865
+ __publicField(this, "caipFamily", "eip155:*");
866
+ }
867
+ /**
868
+ * Get mechanism-specific extra data for supported kinds.
869
+ *
870
+ * @param _ - The network identifier
871
+ * @returns Extra data including permit2 contract address
872
+ */
873
+ getExtra(_) {
874
+ return { permit2Address: PERMIT2_ADDRESS };
875
+ }
876
+ /**
877
+ * Get signer addresses for this facilitator.
878
+ *
879
+ * @param _ - The network identifier
880
+ * @returns Array of signer addresses
881
+ */
882
+ getSigners(_) {
883
+ return [...this.signer.getAddresses()];
884
+ }
885
+ /**
886
+ * Verify a Permit2 payment payload.
887
+ *
888
+ * @param payload - The payment payload to verify
889
+ * @param requirements - The payment requirements
890
+ * @returns Verification result
891
+ */
892
+ async verify(payload, requirements) {
893
+ const permit2Payload = payload.payload;
894
+ if (!permit2Payload?.permit?.permitted?.token || !permit2Payload?.owner) {
895
+ return {
896
+ isValid: false,
897
+ invalidReason: "invalid_payload_structure",
898
+ payer: void 0
899
+ };
900
+ }
901
+ if (payload.accepted.scheme !== "permit2" || requirements.scheme !== "permit2") {
902
+ return {
903
+ isValid: false,
904
+ invalidReason: "unsupported_scheme",
905
+ payer: permit2Payload.owner
906
+ };
907
+ }
908
+ if (payload.accepted.network !== requirements.network) {
909
+ return {
910
+ isValid: false,
911
+ invalidReason: "network_mismatch",
912
+ payer: permit2Payload.owner
913
+ };
914
+ }
915
+ if ((0, import_viem2.getAddress)(permit2Payload.permit.permitted.token) !== (0, import_viem2.getAddress)(requirements.asset)) {
916
+ return {
917
+ isValid: false,
918
+ invalidReason: "token_mismatch",
919
+ payer: permit2Payload.owner
920
+ };
921
+ }
922
+ if ((0, import_viem2.getAddress)(permit2Payload.transferDetails.to) !== (0, import_viem2.getAddress)(requirements.payTo)) {
923
+ return {
924
+ isValid: false,
925
+ invalidReason: "recipient_mismatch",
926
+ payer: permit2Payload.owner
927
+ };
928
+ }
929
+ const now = Math.floor(Date.now() / 1e3);
930
+ if (BigInt(permit2Payload.permit.deadline) < BigInt(now + 6)) {
931
+ return {
932
+ isValid: false,
933
+ invalidReason: "permit_expired",
934
+ payer: permit2Payload.owner
935
+ };
936
+ }
937
+ if (BigInt(permit2Payload.permit.permitted.amount) < BigInt(requirements.amount)) {
938
+ return {
939
+ isValid: false,
940
+ invalidReason: "insufficient_permitted_amount",
941
+ payer: permit2Payload.owner
942
+ };
943
+ }
944
+ if (BigInt(permit2Payload.transferDetails.requestedAmount) < BigInt(requirements.amount)) {
945
+ return {
946
+ isValid: false,
947
+ invalidReason: "insufficient_requested_amount",
948
+ payer: permit2Payload.owner
949
+ };
950
+ }
951
+ try {
952
+ const balance = await this.signer.readContract({
953
+ address: (0, import_viem2.getAddress)(requirements.asset),
954
+ abi: erc20BalanceABI,
955
+ functionName: "balanceOf",
956
+ args: [(0, import_viem2.getAddress)(permit2Payload.owner)]
957
+ });
958
+ if (BigInt(balance) < BigInt(requirements.amount)) {
959
+ return {
960
+ isValid: false,
961
+ invalidReason: "insufficient_funds",
962
+ payer: permit2Payload.owner
963
+ };
964
+ }
965
+ } catch (error) {
966
+ const errorMessage = error instanceof Error ? error.message : String(error);
967
+ return {
968
+ isValid: false,
969
+ invalidReason: `balance_check_failed: ${errorMessage}`,
970
+ payer: permit2Payload.owner
971
+ };
972
+ }
973
+ return {
974
+ isValid: true,
975
+ invalidReason: void 0,
976
+ payer: permit2Payload.owner
977
+ };
978
+ }
979
+ /**
980
+ * Settle a Permit2 payment by executing permitTransferFrom.
981
+ *
982
+ * @param payload - The payment payload
983
+ * @param requirements - The payment requirements
984
+ * @returns Settlement result
985
+ */
986
+ async settle(payload, requirements) {
987
+ const permit2Payload = payload.payload;
988
+ if (!permit2Payload?.permit?.permitted?.token || !permit2Payload?.owner) {
989
+ return {
990
+ success: false,
991
+ network: payload.accepted.network,
992
+ transaction: "",
993
+ errorReason: "invalid_payload_structure",
994
+ payer: void 0
995
+ };
996
+ }
997
+ const valid = await this.verify(payload, requirements);
998
+ if (!valid.isValid) {
999
+ return {
1000
+ success: false,
1001
+ network: payload.accepted.network,
1002
+ transaction: "",
1003
+ errorReason: valid.invalidReason ?? "invalid_scheme",
1004
+ payer: permit2Payload.owner
1005
+ };
1006
+ }
1007
+ try {
1008
+ const tx = await this.signer.writeContract({
1009
+ address: PERMIT2_ADDRESS,
1010
+ abi: permit2ABI,
1011
+ functionName: "permitTransferFrom",
1012
+ args: [
1013
+ {
1014
+ permitted: {
1015
+ token: (0, import_viem2.getAddress)(permit2Payload.permit.permitted.token),
1016
+ amount: BigInt(permit2Payload.permit.permitted.amount)
1017
+ },
1018
+ nonce: BigInt(permit2Payload.permit.nonce),
1019
+ deadline: BigInt(permit2Payload.permit.deadline)
1020
+ },
1021
+ {
1022
+ to: (0, import_viem2.getAddress)(permit2Payload.transferDetails.to),
1023
+ requestedAmount: BigInt(permit2Payload.transferDetails.requestedAmount)
1024
+ },
1025
+ (0, import_viem2.getAddress)(permit2Payload.owner),
1026
+ permit2Payload.signature
1027
+ ]
1028
+ });
1029
+ const receipt = await this.signer.waitForTransactionReceipt({ hash: tx });
1030
+ if (receipt.status !== "success") {
1031
+ return {
1032
+ success: false,
1033
+ errorReason: "invalid_transaction_state",
1034
+ transaction: tx,
1035
+ network: payload.accepted.network,
1036
+ payer: permit2Payload.owner
1037
+ };
1038
+ }
1039
+ return {
1040
+ success: true,
1041
+ transaction: tx,
1042
+ network: payload.accepted.network,
1043
+ payer: permit2Payload.owner
1044
+ };
1045
+ } catch (error) {
1046
+ console.error("Failed to settle Permit2 transaction:", error);
1047
+ return {
1048
+ success: false,
1049
+ errorReason: "transaction_failed",
1050
+ transaction: "",
1051
+ network: payload.accepted.network,
1052
+ payer: permit2Payload.owner
1053
+ };
1054
+ }
1055
+ }
1056
+ };
1057
+
1058
+ // src/permit2/facilitator/register.ts
1059
+ function registerPermit2EvmScheme3(facilitator, config) {
1060
+ facilitator.register(config.networks, new Permit2EvmScheme3(config.signer));
1061
+ return facilitator;
1062
+ }
1063
+ // Annotate the CommonJS export names for ESM import in node:
1064
+ 0 && (module.exports = {
1065
+ PERMIT2_ADDRESS,
1066
+ Permit2EvmClientScheme,
1067
+ Permit2EvmFacilitatorScheme,
1068
+ Permit2EvmServerScheme,
1069
+ permit2ABI,
1070
+ permit2Types,
1071
+ registerPermit2EvmClientScheme,
1072
+ registerPermit2EvmFacilitatorScheme,
1073
+ registerPermit2EvmServerScheme
1074
+ });
1075
+ //# sourceMappingURL=index.js.map