@wtflabs/x402 0.0.1-beta.4 → 0.0.1-beta.6

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 (81) hide show
  1. package/dist/cjs/client/index.d.ts +1 -1
  2. package/dist/cjs/client/index.js +7 -2
  3. package/dist/cjs/client/index.js.map +1 -1
  4. package/dist/cjs/facilitator/index.d.ts +1 -1
  5. package/dist/cjs/facilitator/index.js +444 -87
  6. package/dist/cjs/facilitator/index.js.map +1 -1
  7. package/dist/cjs/index.d.ts +1 -1
  8. package/dist/cjs/index.js +445 -88
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/{middleware-Brgsx32F.d.ts → middleware-nzDe-TDJ.d.ts} +1 -1
  11. package/dist/cjs/paywall/index.d.ts +1 -1
  12. package/dist/cjs/schemes/index.d.ts +25 -7
  13. package/dist/cjs/schemes/index.js +477 -95
  14. package/dist/cjs/schemes/index.js.map +1 -1
  15. package/dist/cjs/shared/index.d.ts +2 -2
  16. package/dist/cjs/shared/index.js +6 -1
  17. package/dist/cjs/shared/index.js.map +1 -1
  18. package/dist/cjs/types/index.d.ts +93 -4
  19. package/dist/cjs/types/index.js +64 -1
  20. package/dist/cjs/types/index.js.map +1 -1
  21. package/dist/cjs/verify/index.d.ts +2 -2
  22. package/dist/cjs/verify/index.js +6 -1
  23. package/dist/cjs/verify/index.js.map +1 -1
  24. package/dist/{esm/x402Specs-CYq5tSY1.d.mts → cjs/x402Specs-BtRXj67U.d.ts} +43 -10
  25. package/dist/esm/{chunk-G6WN2WYX.mjs → chunk-3SCH5JL2.mjs} +433 -98
  26. package/dist/esm/chunk-3SCH5JL2.mjs.map +1 -0
  27. package/dist/esm/{chunk-2AM3S66N.mjs → chunk-7MNUQUHN.mjs} +3 -3
  28. package/dist/esm/{chunk-34YNR4LY.mjs → chunk-KABV25HJ.mjs} +3 -3
  29. package/dist/esm/{chunk-UCBE7FDY.mjs → chunk-NPWDNT2P.mjs} +67 -2
  30. package/dist/esm/chunk-NPWDNT2P.mjs.map +1 -0
  31. package/dist/esm/{chunk-RX2JKK4O.mjs → chunk-VTLJOZXM.mjs} +3 -3
  32. package/dist/esm/chunk-VTLJOZXM.mjs.map +1 -0
  33. package/dist/esm/client/index.d.mts +1 -1
  34. package/dist/esm/client/index.mjs +3 -3
  35. package/dist/esm/facilitator/index.d.mts +1 -1
  36. package/dist/esm/facilitator/index.mjs +4 -4
  37. package/dist/esm/index.d.mts +1 -1
  38. package/dist/esm/index.mjs +5 -5
  39. package/dist/esm/{middleware-BSjsPDKM.d.mts → middleware-DSDucaQ5.d.mts} +1 -1
  40. package/dist/esm/paywall/index.d.mts +1 -1
  41. package/dist/esm/schemes/index.d.mts +25 -7
  42. package/dist/esm/schemes/index.mjs +3 -3
  43. package/dist/esm/shared/index.d.mts +2 -2
  44. package/dist/esm/shared/index.mjs +1 -1
  45. package/dist/esm/types/index.d.mts +93 -4
  46. package/dist/esm/types/index.mjs +1 -1
  47. package/dist/esm/verify/index.d.mts +2 -2
  48. package/dist/esm/verify/index.mjs +1 -1
  49. package/dist/{cjs/x402Specs-CYq5tSY1.d.ts → esm/x402Specs-BtRXj67U.d.mts} +43 -10
  50. package/package.json +15 -15
  51. package/dist/cjs/middleware-6_1ApcJn.d.ts +0 -93
  52. package/dist/cjs/middleware-B_ewwsQp.d.ts +0 -93
  53. package/dist/cjs/middleware-BwfW7mAs.d.ts +0 -93
  54. package/dist/cjs/middleware-CQb61c1k.d.ts +0 -93
  55. package/dist/cjs/middleware-DB9lqy9f.d.ts +0 -93
  56. package/dist/cjs/middleware-DcHctwQV.d.ts +0 -93
  57. package/dist/cjs/middleware-De0jD3Bp.d.ts +0 -93
  58. package/dist/cjs/middleware-HoFOmpgv.d.ts +0 -93
  59. package/dist/cjs/middleware-Y8AiAfYw.d.ts +0 -93
  60. package/dist/cjs/middleware-pnres9YM.d.ts +0 -93
  61. package/dist/cjs/network-RtNddYQk.d.ts +0 -11
  62. package/dist/cjs/rpc-Ca8eHCWz.d.ts +0 -35
  63. package/dist/cjs/wallet-BRWfOM5D.d.ts +0 -153
  64. package/dist/cjs/wallet-BYRAGtOB.d.ts +0 -153
  65. package/dist/cjs/wallet-BmEtlgEf.d.ts +0 -48
  66. package/dist/cjs/wallet-CNOAmyZ6.d.ts +0 -48
  67. package/dist/cjs/wallet-D1SoxFTw.d.ts +0 -48
  68. package/dist/cjs/wallet-SJ-hbjm9.d.ts +0 -153
  69. package/dist/cjs/wallet-ecnda4Aj.d.ts +0 -48
  70. package/dist/cjs/wallet-gP8Qoi-c.d.ts +0 -74
  71. package/dist/cjs/x402Specs-B7InXo2L.d.ts +0 -1065
  72. package/dist/cjs/x402Specs-BLH3j34O.d.ts +0 -1696
  73. package/dist/cjs/x402Specs-C7LipAZg.d.ts +0 -1715
  74. package/dist/cjs/x402Specs-CeajqonG.d.ts +0 -1696
  75. package/dist/cjs/x402Specs-qMujgEV5.d.ts +0 -1715
  76. package/dist/cjs/x402Specs-qUBCpcuz.d.ts +0 -1715
  77. package/dist/esm/chunk-G6WN2WYX.mjs.map +0 -1
  78. package/dist/esm/chunk-RX2JKK4O.mjs.map +0 -1
  79. package/dist/esm/chunk-UCBE7FDY.mjs.map +0 -1
  80. /package/dist/esm/{chunk-2AM3S66N.mjs.map → chunk-7MNUQUHN.mjs.map} +0 -0
  81. /package/dist/esm/{chunk-34YNR4LY.mjs.map → chunk-KABV25HJ.mjs.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  export { PaymentRequirementsSelector, createPaymentHeader, preparePaymentHeader, selectPaymentRequirements, signPaymentHeader } from './client/index.js';
2
2
  export { Supported, settle, verify } from './facilitator/index.js';
3
3
  import './config-Dfuvno71.js';
4
- import './x402Specs-CYq5tSY1.js';
4
+ import './x402Specs-BtRXj67U.js';
5
5
  import 'zod';
6
6
  import './wallet-CQ0Fe_M5.js';
7
7
  import './wallet-SJKJpUgQ.js';
package/dist/cjs/index.js CHANGED
@@ -202,6 +202,21 @@ var permit2Types = {
202
202
  { name: "amount", type: "uint256" }
203
203
  ]
204
204
  };
205
+ var permit2WitnessTypes = {
206
+ PermitWitnessTransferFrom: [
207
+ { name: "permitted", type: "TokenPermissions" },
208
+ { name: "spender", type: "address" },
209
+ { name: "nonce", type: "uint256" },
210
+ { name: "deadline", type: "uint256" },
211
+ { name: "witness", type: "Witness" }
212
+ ],
213
+ TokenPermissions: [
214
+ { name: "token", type: "address" },
215
+ { name: "amount", type: "uint256" }
216
+ ],
217
+ Witness: [{ name: "to", type: "address" }]
218
+ };
219
+ var WITNESS_TYPE_STRING = "Witness(address to)";
205
220
  var permit2ABI = [
206
221
  {
207
222
  inputs: [
@@ -271,6 +286,45 @@ var permit2ABI = [
271
286
  outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
272
287
  stateMutability: "view",
273
288
  type: "function"
289
+ },
290
+ {
291
+ inputs: [
292
+ {
293
+ components: [
294
+ {
295
+ components: [
296
+ { internalType: "address", name: "token", type: "address" },
297
+ { internalType: "uint256", name: "amount", type: "uint256" }
298
+ ],
299
+ internalType: "struct ISignatureTransfer.TokenPermissions",
300
+ name: "permitted",
301
+ type: "tuple"
302
+ },
303
+ { internalType: "uint256", name: "nonce", type: "uint256" },
304
+ { internalType: "uint256", name: "deadline", type: "uint256" }
305
+ ],
306
+ internalType: "struct ISignatureTransfer.PermitTransferFrom",
307
+ name: "permit",
308
+ type: "tuple"
309
+ },
310
+ {
311
+ components: [
312
+ { internalType: "address", name: "to", type: "address" },
313
+ { internalType: "uint256", name: "requestedAmount", type: "uint256" }
314
+ ],
315
+ internalType: "struct ISignatureTransfer.SignatureTransferDetails",
316
+ name: "transferDetails",
317
+ type: "tuple"
318
+ },
319
+ { internalType: "address", name: "owner", type: "address" },
320
+ { internalType: "bytes32", name: "witness", type: "bytes32" },
321
+ { internalType: "string", name: "witnessTypeString", type: "string" },
322
+ { internalType: "bytes", name: "signature", type: "bytes" }
323
+ ],
324
+ name: "permitWitnessTransferFrom",
325
+ outputs: [],
326
+ stateMutability: "nonpayable",
327
+ type: "function"
274
328
  }
275
329
  ];
276
330
 
@@ -1237,6 +1291,8 @@ var ErrorReasons = [
1237
1291
  "invalid_authorization_type",
1238
1292
  "invalid_permit_signature",
1239
1293
  "invalid_permit2_signature",
1294
+ "invalid_permit2_witness_signature",
1295
+ "witness_recipient_mismatch",
1240
1296
  "permit_expired",
1241
1297
  "permit2_expired",
1242
1298
  "permit2_not_approved",
@@ -1244,6 +1300,7 @@ var ErrorReasons = [
1244
1300
  "invalid_spender_address",
1245
1301
  "token_mismatch",
1246
1302
  "insufficient_payment_amount",
1303
+ "insufficient_token_balance",
1247
1304
  "transaction_failed",
1248
1305
  "settlement_failed"
1249
1306
  ];
@@ -1286,7 +1343,9 @@ var Permit2EvmPayloadAuthorizationSchema = import_zod3.z.object({
1286
1343
  token: import_zod3.z.string().regex(EvmAddressRegex),
1287
1344
  amount: import_zod3.z.string().refine(isInteger).refine(hasMaxLength(EvmMaxAtomicUnits)),
1288
1345
  deadline: import_zod3.z.string().refine(isInteger),
1289
- nonce: import_zod3.z.string().refine(isInteger)
1346
+ nonce: import_zod3.z.string().refine(isInteger),
1347
+ to: import_zod3.z.string().regex(EvmAddressRegex).optional()
1348
+ // Witness: binds recipient address to signature
1290
1349
  });
1291
1350
  var ExactEvmPayloadSchema = import_zod3.z.discriminatedUnion("authorizationType", [
1292
1351
  import_zod3.z.object({
@@ -1633,7 +1692,7 @@ function preparePaymentHeader(from, x402Version2, paymentRequirements) {
1633
1692
  signature: void 0,
1634
1693
  authorization: {
1635
1694
  from,
1636
- to: paymentRequirements.payTo,
1695
+ to: paymentRequirements.extra?.relayer || paymentRequirements.payTo,
1637
1696
  value: paymentRequirements.maxAmountRequired,
1638
1697
  validAfter: validAfter.toString(),
1639
1698
  validBefore: validBefore.toString(),
@@ -2231,6 +2290,264 @@ async function sendAndConfirmSignedTransaction(signedTransaction, rpc, rpcSubscr
2231
2290
  // src/schemes/exact/index.ts
2232
2291
  var SCHEME = "exact";
2233
2292
 
2293
+ // src/types/shared/evm/permitProxyABI.ts
2294
+ var permitProxyContractABI = [
2295
+ // settleWithPermit - 使用 EIP-2612 Permit 进行结算
2296
+ {
2297
+ inputs: [
2298
+ {
2299
+ internalType: "address",
2300
+ name: "token",
2301
+ type: "address"
2302
+ },
2303
+ {
2304
+ internalType: "address",
2305
+ name: "payer",
2306
+ type: "address"
2307
+ },
2308
+ {
2309
+ internalType: "address",
2310
+ name: "seller",
2311
+ type: "address"
2312
+ },
2313
+ {
2314
+ internalType: "uint256",
2315
+ name: "amount",
2316
+ type: "uint256"
2317
+ },
2318
+ {
2319
+ internalType: "uint256",
2320
+ name: "deadline",
2321
+ type: "uint256"
2322
+ },
2323
+ {
2324
+ internalType: "uint8",
2325
+ name: "v",
2326
+ type: "uint8"
2327
+ },
2328
+ {
2329
+ internalType: "bytes32",
2330
+ name: "r",
2331
+ type: "bytes32"
2332
+ },
2333
+ {
2334
+ internalType: "bytes32",
2335
+ name: "s",
2336
+ type: "bytes32"
2337
+ }
2338
+ ],
2339
+ name: "settleWithPermit",
2340
+ outputs: [],
2341
+ stateMutability: "nonpayable",
2342
+ type: "function"
2343
+ },
2344
+ // settleWithERC3009 - 使用 EIP-3009 TransferWithAuthorization 进行结算
2345
+ {
2346
+ inputs: [
2347
+ {
2348
+ internalType: "address",
2349
+ name: "token",
2350
+ type: "address"
2351
+ },
2352
+ {
2353
+ internalType: "address",
2354
+ name: "payer",
2355
+ type: "address"
2356
+ },
2357
+ {
2358
+ internalType: "address",
2359
+ name: "seller",
2360
+ type: "address"
2361
+ },
2362
+ {
2363
+ internalType: "uint256",
2364
+ name: "amount",
2365
+ type: "uint256"
2366
+ },
2367
+ {
2368
+ internalType: "uint256",
2369
+ name: "validAfter",
2370
+ type: "uint256"
2371
+ },
2372
+ {
2373
+ internalType: "uint256",
2374
+ name: "validBefore",
2375
+ type: "uint256"
2376
+ },
2377
+ {
2378
+ internalType: "bytes32",
2379
+ name: "nonce",
2380
+ type: "bytes32"
2381
+ },
2382
+ {
2383
+ internalType: "uint8",
2384
+ name: "v",
2385
+ type: "uint8"
2386
+ },
2387
+ {
2388
+ internalType: "bytes32",
2389
+ name: "r",
2390
+ type: "bytes32"
2391
+ },
2392
+ {
2393
+ internalType: "bytes32",
2394
+ name: "s",
2395
+ type: "bytes32"
2396
+ }
2397
+ ],
2398
+ name: "settleWithERC3009",
2399
+ outputs: [],
2400
+ stateMutability: "nonpayable",
2401
+ type: "function"
2402
+ },
2403
+ // settleWithERC3009Direct - 直接结算(无手续费)
2404
+ {
2405
+ inputs: [
2406
+ {
2407
+ internalType: "address",
2408
+ name: "token",
2409
+ type: "address"
2410
+ },
2411
+ {
2412
+ internalType: "address",
2413
+ name: "payer",
2414
+ type: "address"
2415
+ },
2416
+ {
2417
+ internalType: "address",
2418
+ name: "seller",
2419
+ type: "address"
2420
+ },
2421
+ {
2422
+ internalType: "uint256",
2423
+ name: "amount",
2424
+ type: "uint256"
2425
+ },
2426
+ {
2427
+ internalType: "uint256",
2428
+ name: "validAfter",
2429
+ type: "uint256"
2430
+ },
2431
+ {
2432
+ internalType: "uint256",
2433
+ name: "validBefore",
2434
+ type: "uint256"
2435
+ },
2436
+ {
2437
+ internalType: "bytes32",
2438
+ name: "nonce",
2439
+ type: "bytes32"
2440
+ },
2441
+ {
2442
+ internalType: "uint8",
2443
+ name: "v",
2444
+ type: "uint8"
2445
+ },
2446
+ {
2447
+ internalType: "bytes32",
2448
+ name: "r",
2449
+ type: "bytes32"
2450
+ },
2451
+ {
2452
+ internalType: "bytes32",
2453
+ name: "s",
2454
+ type: "bytes32"
2455
+ }
2456
+ ],
2457
+ name: "settleWithERC3009Direct",
2458
+ outputs: [],
2459
+ stateMutability: "nonpayable",
2460
+ type: "function"
2461
+ },
2462
+ // Events
2463
+ {
2464
+ anonymous: false,
2465
+ inputs: [
2466
+ {
2467
+ indexed: true,
2468
+ internalType: "address",
2469
+ name: "token",
2470
+ type: "address"
2471
+ },
2472
+ {
2473
+ indexed: true,
2474
+ internalType: "address",
2475
+ name: "payer",
2476
+ type: "address"
2477
+ },
2478
+ {
2479
+ indexed: true,
2480
+ internalType: "address",
2481
+ name: "seller",
2482
+ type: "address"
2483
+ },
2484
+ {
2485
+ indexed: false,
2486
+ internalType: "uint256",
2487
+ name: "amount",
2488
+ type: "uint256"
2489
+ },
2490
+ {
2491
+ indexed: false,
2492
+ internalType: "uint256",
2493
+ name: "sellerAmount",
2494
+ type: "uint256"
2495
+ },
2496
+ {
2497
+ indexed: false,
2498
+ internalType: "uint256",
2499
+ name: "feeAmount",
2500
+ type: "uint256"
2501
+ },
2502
+ {
2503
+ indexed: false,
2504
+ internalType: "string",
2505
+ name: "path",
2506
+ type: "string"
2507
+ }
2508
+ ],
2509
+ name: "SettledSplit",
2510
+ type: "event"
2511
+ },
2512
+ {
2513
+ anonymous: false,
2514
+ inputs: [
2515
+ {
2516
+ indexed: true,
2517
+ internalType: "address",
2518
+ name: "token",
2519
+ type: "address"
2520
+ },
2521
+ {
2522
+ indexed: true,
2523
+ internalType: "address",
2524
+ name: "payer",
2525
+ type: "address"
2526
+ },
2527
+ {
2528
+ indexed: true,
2529
+ internalType: "address",
2530
+ name: "seller",
2531
+ type: "address"
2532
+ },
2533
+ {
2534
+ indexed: false,
2535
+ internalType: "uint256",
2536
+ name: "amount",
2537
+ type: "uint256"
2538
+ },
2539
+ {
2540
+ indexed: false,
2541
+ internalType: "string",
2542
+ name: "path",
2543
+ type: "string"
2544
+ }
2545
+ ],
2546
+ name: "SettledDirect",
2547
+ type: "event"
2548
+ }
2549
+ ];
2550
+
2234
2551
  // src/schemes/exact/evm/eip3009/facilitator.ts
2235
2552
  async function verify2(client, payload, paymentRequirements) {
2236
2553
  const exactEvmPayload = payload.payload;
@@ -2295,7 +2612,7 @@ async function verify2(client, payload, paymentRequirements) {
2295
2612
  payer: exactEvmPayload.authorization.from
2296
2613
  };
2297
2614
  }
2298
- if ((0, import_viem3.getAddress)(exactEvmPayload.authorization.to) !== (0, import_viem3.getAddress)(paymentRequirements.payTo)) {
2615
+ if ((0, import_viem3.getAddress)(exactEvmPayload.authorization.to) !== (0, import_viem3.getAddress)(paymentRequirements.payTo) && (0, import_viem3.getAddress)(exactEvmPayload.authorization.to) !== (0, import_viem3.getAddress)(paymentRequirements.extra?.relayer)) {
2299
2616
  return {
2300
2617
  isValid: false,
2301
2618
  invalidReason: "invalid_exact_evm_payload_recipient_mismatch",
@@ -2368,21 +2685,57 @@ async function settle2(wallet, paymentPayload, paymentRequirements) {
2368
2685
  };
2369
2686
  }
2370
2687
  const { signature } = (0, import_viem3.parseErc6492Signature)(payload.signature);
2371
- const tx = await wallet.writeContract({
2372
- address: paymentRequirements.asset,
2373
- abi: usdcABI,
2374
- functionName: "transferWithAuthorization",
2375
- args: [
2376
- payload.authorization.from,
2377
- payload.authorization.to,
2378
- BigInt(payload.authorization.value),
2379
- BigInt(payload.authorization.validAfter),
2380
- BigInt(payload.authorization.validBefore),
2381
- payload.authorization.nonce,
2382
- signature
2383
- ],
2384
- chain: wallet.chain
2385
- });
2688
+ let tx;
2689
+ if (paymentRequirements.extra?.relayer) {
2690
+ const sig = (0, import_viem3.hexToSignature)(signature);
2691
+ const v = Number(sig.v);
2692
+ const r = sig.r;
2693
+ const s = sig.s;
2694
+ tx = await wallet.writeContract({
2695
+ address: paymentRequirements.extra.relayer,
2696
+ abi: permitProxyContractABI,
2697
+ functionName: "settleWithERC3009",
2698
+ args: [
2699
+ paymentRequirements.asset,
2700
+ // token
2701
+ payload.authorization.from,
2702
+ // payer
2703
+ payload.authorization.to,
2704
+ // seller
2705
+ BigInt(payload.authorization.value),
2706
+ // amount
2707
+ BigInt(payload.authorization.validAfter),
2708
+ // validAfter
2709
+ BigInt(payload.authorization.validBefore),
2710
+ // validBefore
2711
+ payload.authorization.nonce,
2712
+ // nonce
2713
+ v,
2714
+ // v (uint8)
2715
+ r,
2716
+ // r (bytes32)
2717
+ s
2718
+ // s (bytes32)
2719
+ ],
2720
+ chain: wallet.chain
2721
+ });
2722
+ } else {
2723
+ tx = await wallet.writeContract({
2724
+ address: paymentRequirements.asset,
2725
+ abi: usdcABI,
2726
+ functionName: "transferWithAuthorization",
2727
+ args: [
2728
+ payload.authorization.from,
2729
+ payload.authorization.to,
2730
+ BigInt(payload.authorization.value),
2731
+ BigInt(payload.authorization.validAfter),
2732
+ BigInt(payload.authorization.validBefore),
2733
+ payload.authorization.nonce,
2734
+ signature
2735
+ ],
2736
+ chain: wallet.chain
2737
+ });
2738
+ }
2386
2739
  const receipt = await wallet.waitForTransactionReceipt({ hash: tx });
2387
2740
  if (receipt.status !== "success") {
2388
2741
  return {
@@ -2418,63 +2771,6 @@ function splitSignature(signature) {
2418
2771
  return { v, r, s };
2419
2772
  }
2420
2773
 
2421
- // src/types/shared/evm/permitProxyABI.ts
2422
- var permitProxyContractABI = [
2423
- {
2424
- inputs: [
2425
- {
2426
- internalType: "address",
2427
- name: "token",
2428
- type: "address"
2429
- },
2430
- {
2431
- internalType: "address",
2432
- name: "owner",
2433
- type: "address"
2434
- },
2435
- {
2436
- internalType: "address",
2437
- name: "spender",
2438
- type: "address"
2439
- },
2440
- {
2441
- internalType: "uint256",
2442
- name: "value",
2443
- type: "uint256"
2444
- },
2445
- {
2446
- internalType: "uint256",
2447
- name: "deadline",
2448
- type: "uint256"
2449
- },
2450
- {
2451
- internalType: "uint8",
2452
- name: "v",
2453
- type: "uint8"
2454
- },
2455
- {
2456
- internalType: "bytes32",
2457
- name: "r",
2458
- type: "bytes32"
2459
- },
2460
- {
2461
- internalType: "bytes32",
2462
- name: "s",
2463
- type: "bytes32"
2464
- },
2465
- {
2466
- internalType: "address",
2467
- name: "to",
2468
- type: "address"
2469
- }
2470
- ],
2471
- name: "permitAndTransfer",
2472
- outputs: [],
2473
- stateMutability: "nonpayable",
2474
- type: "function"
2475
- }
2476
- ];
2477
-
2478
2774
  // src/schemes/exact/evm/permit/facilitator.ts
2479
2775
  async function verify3(client, payload, paymentRequirements) {
2480
2776
  if (payload.payload.authorizationType !== "permit" || payload.scheme !== SCHEME || paymentRequirements.scheme !== SCHEME) {
@@ -2542,8 +2838,8 @@ async function verify3(client, payload, paymentRequirements) {
2542
2838
  payer: owner
2543
2839
  };
2544
2840
  }
2545
- if (paymentRequirements.extra?.proxyAddress) {
2546
- if ((0, import_viem5.getAddress)(spender) !== (0, import_viem5.getAddress)(paymentRequirements.extra?.proxyAddress)) {
2841
+ if (paymentRequirements.extra?.relayer) {
2842
+ if ((0, import_viem5.getAddress)(spender) !== (0, import_viem5.getAddress)(paymentRequirements.extra?.relayer)) {
2547
2843
  return {
2548
2844
  isValid: false,
2549
2845
  invalidReason: "invalid_spender_address",
@@ -2607,21 +2903,28 @@ async function settle3(wallet, paymentPayload, paymentRequirements) {
2607
2903
  address: wallet.account.address
2608
2904
  });
2609
2905
  let transactionHash;
2610
- if (paymentRequirements.extra?.proxyAddress) {
2906
+ if (paymentRequirements.extra?.relayer) {
2611
2907
  transactionHash = await wallet.writeContract({
2612
- address: paymentRequirements.extra.proxyAddress,
2908
+ address: paymentRequirements.extra.relayer,
2613
2909
  abi: permitProxyContractABI,
2614
- functionName: "permitAndTransfer",
2910
+ functionName: "settleWithPermit",
2615
2911
  args: [
2616
2912
  tokenAddress,
2913
+ // token
2617
2914
  owner,
2618
- spender,
2915
+ // payer
2916
+ paymentRequirements.payTo,
2917
+ // seller
2619
2918
  BigInt(value),
2919
+ // amount
2620
2920
  BigInt(deadline),
2921
+ // deadline
2621
2922
  v,
2923
+ // v
2622
2924
  r,
2623
- s,
2624
- paymentRequirements.payTo
2925
+ // r
2926
+ s
2927
+ // s
2625
2928
  ],
2626
2929
  chain: wallet.chain,
2627
2930
  nonce: txNonce
@@ -2690,11 +2993,41 @@ async function verify4(client, payload, paymentRequirements) {
2690
2993
  };
2691
2994
  }
2692
2995
  const permit2Payload = payload.payload;
2693
- const { owner, spender, token, amount, deadline, nonce } = permit2Payload.authorization;
2996
+ const { owner, spender, token, amount, deadline, nonce, to } = permit2Payload.authorization;
2694
2997
  const chainId = getNetworkId(payload.network);
2695
2998
  const tokenAddress = (0, import_viem6.getAddress)(token);
2696
2999
  const ownerAddress = (0, import_viem6.getAddress)(owner);
2697
- const permit2TypedData = {
3000
+ const hasWitness = !!to;
3001
+ if (hasWitness) {
3002
+ if ((0, import_viem6.getAddress)(to) !== (0, import_viem6.getAddress)(paymentRequirements.payTo)) {
3003
+ return {
3004
+ isValid: false,
3005
+ invalidReason: "witness_recipient_mismatch",
3006
+ payer: owner
3007
+ };
3008
+ }
3009
+ }
3010
+ const permit2TypedData = hasWitness ? {
3011
+ types: permit2WitnessTypes,
3012
+ domain: {
3013
+ name: "Permit2",
3014
+ chainId,
3015
+ verifyingContract: PERMIT2_ADDRESS
3016
+ },
3017
+ primaryType: "PermitWitnessTransferFrom",
3018
+ message: {
3019
+ permitted: {
3020
+ token: tokenAddress,
3021
+ amount
3022
+ },
3023
+ spender: (0, import_viem6.getAddress)(spender),
3024
+ nonce,
3025
+ deadline,
3026
+ witness: {
3027
+ to: (0, import_viem6.getAddress)(to)
3028
+ }
3029
+ }
3030
+ } : {
2698
3031
  types: permit2Types,
2699
3032
  domain: {
2700
3033
  name: "Permit2",
@@ -2720,7 +3053,7 @@ async function verify4(client, payload, paymentRequirements) {
2720
3053
  if (!recoveredAddress) {
2721
3054
  return {
2722
3055
  isValid: false,
2723
- invalidReason: "invalid_permit2_signature",
3056
+ invalidReason: hasWitness ? "invalid_permit2_witness_signature" : "invalid_permit2_signature",
2724
3057
  payer: owner
2725
3058
  };
2726
3059
  }
@@ -2795,10 +3128,34 @@ async function settle4(wallet, paymentPayload, paymentRequirements) {
2795
3128
  payer: permit2Payload.authorization.owner
2796
3129
  };
2797
3130
  }
2798
- const { owner, token, amount, deadline, nonce } = permit2Payload.authorization;
3131
+ const { owner, token, amount, deadline, nonce, to } = permit2Payload.authorization;
2799
3132
  const tokenAddress = (0, import_viem6.getAddress)(token);
2800
3133
  const ownerAddress = (0, import_viem6.getAddress)(owner);
2801
- const tx = await wallet.writeContract({
3134
+ const hasWitness = !!to;
3135
+ const tx = hasWitness ? await wallet.writeContract({
3136
+ address: PERMIT2_ADDRESS,
3137
+ abi: permit2ABI,
3138
+ functionName: "permitWitnessTransferFrom",
3139
+ args: [
3140
+ {
3141
+ permitted: {
3142
+ token: tokenAddress,
3143
+ amount: BigInt(amount)
3144
+ },
3145
+ nonce: BigInt(nonce),
3146
+ deadline: BigInt(deadline)
3147
+ },
3148
+ {
3149
+ to: paymentRequirements.payTo,
3150
+ requestedAmount: BigInt(amount)
3151
+ },
3152
+ ownerAddress,
3153
+ (0, import_viem6.keccak256)((0, import_viem6.encodeAbiParameters)([{ type: "address", name: "to" }], [(0, import_viem6.getAddress)(to)])),
3154
+ WITNESS_TYPE_STRING,
3155
+ permit2Payload.signature
3156
+ ],
3157
+ chain: wallet.chain
3158
+ }) : await wallet.writeContract({
2802
3159
  address: PERMIT2_ADDRESS,
2803
3160
  abi: permit2ABI,
2804
3161
  functionName: "permitTransferFrom",