@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
@@ -357,6 +357,21 @@ var permit2Types = {
357
357
  { name: "amount", type: "uint256" }
358
358
  ]
359
359
  };
360
+ var permit2WitnessTypes = {
361
+ PermitWitnessTransferFrom: [
362
+ { name: "permitted", type: "TokenPermissions" },
363
+ { name: "spender", type: "address" },
364
+ { name: "nonce", type: "uint256" },
365
+ { name: "deadline", type: "uint256" },
366
+ { name: "witness", type: "Witness" }
367
+ ],
368
+ TokenPermissions: [
369
+ { name: "token", type: "address" },
370
+ { name: "amount", type: "uint256" }
371
+ ],
372
+ Witness: [{ name: "to", type: "address" }]
373
+ };
374
+ var WITNESS_TYPE_STRING = "Witness(address to)";
360
375
  var permit2ABI = [
361
376
  {
362
377
  inputs: [
@@ -426,6 +441,45 @@ var permit2ABI = [
426
441
  outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
427
442
  stateMutability: "view",
428
443
  type: "function"
444
+ },
445
+ {
446
+ inputs: [
447
+ {
448
+ components: [
449
+ {
450
+ components: [
451
+ { internalType: "address", name: "token", type: "address" },
452
+ { internalType: "uint256", name: "amount", type: "uint256" }
453
+ ],
454
+ internalType: "struct ISignatureTransfer.TokenPermissions",
455
+ name: "permitted",
456
+ type: "tuple"
457
+ },
458
+ { internalType: "uint256", name: "nonce", type: "uint256" },
459
+ { internalType: "uint256", name: "deadline", type: "uint256" }
460
+ ],
461
+ internalType: "struct ISignatureTransfer.PermitTransferFrom",
462
+ name: "permit",
463
+ type: "tuple"
464
+ },
465
+ {
466
+ components: [
467
+ { internalType: "address", name: "to", type: "address" },
468
+ { internalType: "uint256", name: "requestedAmount", type: "uint256" }
469
+ ],
470
+ internalType: "struct ISignatureTransfer.SignatureTransferDetails",
471
+ name: "transferDetails",
472
+ type: "tuple"
473
+ },
474
+ { internalType: "address", name: "owner", type: "address" },
475
+ { internalType: "bytes32", name: "witness", type: "bytes32" },
476
+ { internalType: "string", name: "witnessTypeString", type: "string" },
477
+ { internalType: "bytes", name: "signature", type: "bytes" }
478
+ ],
479
+ name: "permitWitnessTransferFrom",
480
+ outputs: [],
481
+ stateMutability: "nonpayable",
482
+ type: "function"
429
483
  }
430
484
  ];
431
485
 
@@ -1243,6 +1297,8 @@ var ErrorReasons = [
1243
1297
  "invalid_authorization_type",
1244
1298
  "invalid_permit_signature",
1245
1299
  "invalid_permit2_signature",
1300
+ "invalid_permit2_witness_signature",
1301
+ "witness_recipient_mismatch",
1246
1302
  "permit_expired",
1247
1303
  "permit2_expired",
1248
1304
  "permit2_not_approved",
@@ -1250,6 +1306,7 @@ var ErrorReasons = [
1250
1306
  "invalid_spender_address",
1251
1307
  "token_mismatch",
1252
1308
  "insufficient_payment_amount",
1309
+ "insufficient_token_balance",
1253
1310
  "transaction_failed",
1254
1311
  "settlement_failed"
1255
1312
  ];
@@ -1292,7 +1349,9 @@ var Permit2EvmPayloadAuthorizationSchema = import_zod3.z.object({
1292
1349
  token: import_zod3.z.string().regex(EvmAddressRegex),
1293
1350
  amount: import_zod3.z.string().refine(isInteger).refine(hasMaxLength(EvmMaxAtomicUnits)),
1294
1351
  deadline: import_zod3.z.string().refine(isInteger),
1295
- nonce: import_zod3.z.string().refine(isInteger)
1352
+ nonce: import_zod3.z.string().refine(isInteger),
1353
+ to: import_zod3.z.string().regex(EvmAddressRegex).optional()
1354
+ // Witness: binds recipient address to signature
1296
1355
  });
1297
1356
  var ExactEvmPayloadSchema = import_zod3.z.discriminatedUnion("authorizationType", [
1298
1357
  import_zod3.z.object({
@@ -1524,6 +1583,264 @@ async function signAndSimulateTransaction(signer, transaction, rpc) {
1524
1583
  return simulateResult;
1525
1584
  }
1526
1585
 
1586
+ // src/types/shared/evm/permitProxyABI.ts
1587
+ var permitProxyContractABI = [
1588
+ // settleWithPermit - 使用 EIP-2612 Permit 进行结算
1589
+ {
1590
+ inputs: [
1591
+ {
1592
+ internalType: "address",
1593
+ name: "token",
1594
+ type: "address"
1595
+ },
1596
+ {
1597
+ internalType: "address",
1598
+ name: "payer",
1599
+ type: "address"
1600
+ },
1601
+ {
1602
+ internalType: "address",
1603
+ name: "seller",
1604
+ type: "address"
1605
+ },
1606
+ {
1607
+ internalType: "uint256",
1608
+ name: "amount",
1609
+ type: "uint256"
1610
+ },
1611
+ {
1612
+ internalType: "uint256",
1613
+ name: "deadline",
1614
+ type: "uint256"
1615
+ },
1616
+ {
1617
+ internalType: "uint8",
1618
+ name: "v",
1619
+ type: "uint8"
1620
+ },
1621
+ {
1622
+ internalType: "bytes32",
1623
+ name: "r",
1624
+ type: "bytes32"
1625
+ },
1626
+ {
1627
+ internalType: "bytes32",
1628
+ name: "s",
1629
+ type: "bytes32"
1630
+ }
1631
+ ],
1632
+ name: "settleWithPermit",
1633
+ outputs: [],
1634
+ stateMutability: "nonpayable",
1635
+ type: "function"
1636
+ },
1637
+ // settleWithERC3009 - 使用 EIP-3009 TransferWithAuthorization 进行结算
1638
+ {
1639
+ inputs: [
1640
+ {
1641
+ internalType: "address",
1642
+ name: "token",
1643
+ type: "address"
1644
+ },
1645
+ {
1646
+ internalType: "address",
1647
+ name: "payer",
1648
+ type: "address"
1649
+ },
1650
+ {
1651
+ internalType: "address",
1652
+ name: "seller",
1653
+ type: "address"
1654
+ },
1655
+ {
1656
+ internalType: "uint256",
1657
+ name: "amount",
1658
+ type: "uint256"
1659
+ },
1660
+ {
1661
+ internalType: "uint256",
1662
+ name: "validAfter",
1663
+ type: "uint256"
1664
+ },
1665
+ {
1666
+ internalType: "uint256",
1667
+ name: "validBefore",
1668
+ type: "uint256"
1669
+ },
1670
+ {
1671
+ internalType: "bytes32",
1672
+ name: "nonce",
1673
+ type: "bytes32"
1674
+ },
1675
+ {
1676
+ internalType: "uint8",
1677
+ name: "v",
1678
+ type: "uint8"
1679
+ },
1680
+ {
1681
+ internalType: "bytes32",
1682
+ name: "r",
1683
+ type: "bytes32"
1684
+ },
1685
+ {
1686
+ internalType: "bytes32",
1687
+ name: "s",
1688
+ type: "bytes32"
1689
+ }
1690
+ ],
1691
+ name: "settleWithERC3009",
1692
+ outputs: [],
1693
+ stateMutability: "nonpayable",
1694
+ type: "function"
1695
+ },
1696
+ // settleWithERC3009Direct - 直接结算(无手续费)
1697
+ {
1698
+ inputs: [
1699
+ {
1700
+ internalType: "address",
1701
+ name: "token",
1702
+ type: "address"
1703
+ },
1704
+ {
1705
+ internalType: "address",
1706
+ name: "payer",
1707
+ type: "address"
1708
+ },
1709
+ {
1710
+ internalType: "address",
1711
+ name: "seller",
1712
+ type: "address"
1713
+ },
1714
+ {
1715
+ internalType: "uint256",
1716
+ name: "amount",
1717
+ type: "uint256"
1718
+ },
1719
+ {
1720
+ internalType: "uint256",
1721
+ name: "validAfter",
1722
+ type: "uint256"
1723
+ },
1724
+ {
1725
+ internalType: "uint256",
1726
+ name: "validBefore",
1727
+ type: "uint256"
1728
+ },
1729
+ {
1730
+ internalType: "bytes32",
1731
+ name: "nonce",
1732
+ type: "bytes32"
1733
+ },
1734
+ {
1735
+ internalType: "uint8",
1736
+ name: "v",
1737
+ type: "uint8"
1738
+ },
1739
+ {
1740
+ internalType: "bytes32",
1741
+ name: "r",
1742
+ type: "bytes32"
1743
+ },
1744
+ {
1745
+ internalType: "bytes32",
1746
+ name: "s",
1747
+ type: "bytes32"
1748
+ }
1749
+ ],
1750
+ name: "settleWithERC3009Direct",
1751
+ outputs: [],
1752
+ stateMutability: "nonpayable",
1753
+ type: "function"
1754
+ },
1755
+ // Events
1756
+ {
1757
+ anonymous: false,
1758
+ inputs: [
1759
+ {
1760
+ indexed: true,
1761
+ internalType: "address",
1762
+ name: "token",
1763
+ type: "address"
1764
+ },
1765
+ {
1766
+ indexed: true,
1767
+ internalType: "address",
1768
+ name: "payer",
1769
+ type: "address"
1770
+ },
1771
+ {
1772
+ indexed: true,
1773
+ internalType: "address",
1774
+ name: "seller",
1775
+ type: "address"
1776
+ },
1777
+ {
1778
+ indexed: false,
1779
+ internalType: "uint256",
1780
+ name: "amount",
1781
+ type: "uint256"
1782
+ },
1783
+ {
1784
+ indexed: false,
1785
+ internalType: "uint256",
1786
+ name: "sellerAmount",
1787
+ type: "uint256"
1788
+ },
1789
+ {
1790
+ indexed: false,
1791
+ internalType: "uint256",
1792
+ name: "feeAmount",
1793
+ type: "uint256"
1794
+ },
1795
+ {
1796
+ indexed: false,
1797
+ internalType: "string",
1798
+ name: "path",
1799
+ type: "string"
1800
+ }
1801
+ ],
1802
+ name: "SettledSplit",
1803
+ type: "event"
1804
+ },
1805
+ {
1806
+ anonymous: false,
1807
+ inputs: [
1808
+ {
1809
+ indexed: true,
1810
+ internalType: "address",
1811
+ name: "token",
1812
+ type: "address"
1813
+ },
1814
+ {
1815
+ indexed: true,
1816
+ internalType: "address",
1817
+ name: "payer",
1818
+ type: "address"
1819
+ },
1820
+ {
1821
+ indexed: true,
1822
+ internalType: "address",
1823
+ name: "seller",
1824
+ type: "address"
1825
+ },
1826
+ {
1827
+ indexed: false,
1828
+ internalType: "uint256",
1829
+ name: "amount",
1830
+ type: "uint256"
1831
+ },
1832
+ {
1833
+ indexed: false,
1834
+ internalType: "string",
1835
+ name: "path",
1836
+ type: "string"
1837
+ }
1838
+ ],
1839
+ name: "SettledDirect",
1840
+ type: "event"
1841
+ }
1842
+ ];
1843
+
1527
1844
  // src/schemes/exact/evm/eip3009/facilitator.ts
1528
1845
  async function verify(client, payload, paymentRequirements) {
1529
1846
  const exactEvmPayload = payload.payload;
@@ -1588,7 +1905,7 @@ async function verify(client, payload, paymentRequirements) {
1588
1905
  payer: exactEvmPayload.authorization.from
1589
1906
  };
1590
1907
  }
1591
- if ((0, import_viem2.getAddress)(exactEvmPayload.authorization.to) !== (0, import_viem2.getAddress)(paymentRequirements.payTo)) {
1908
+ if ((0, import_viem2.getAddress)(exactEvmPayload.authorization.to) !== (0, import_viem2.getAddress)(paymentRequirements.payTo) && (0, import_viem2.getAddress)(exactEvmPayload.authorization.to) !== (0, import_viem2.getAddress)(paymentRequirements.extra?.relayer)) {
1592
1909
  return {
1593
1910
  isValid: false,
1594
1911
  invalidReason: "invalid_exact_evm_payload_recipient_mismatch",
@@ -1661,21 +1978,57 @@ async function settle(wallet, paymentPayload, paymentRequirements) {
1661
1978
  };
1662
1979
  }
1663
1980
  const { signature } = (0, import_viem2.parseErc6492Signature)(payload.signature);
1664
- const tx = await wallet.writeContract({
1665
- address: paymentRequirements.asset,
1666
- abi: usdcABI,
1667
- functionName: "transferWithAuthorization",
1668
- args: [
1669
- payload.authorization.from,
1670
- payload.authorization.to,
1671
- BigInt(payload.authorization.value),
1672
- BigInt(payload.authorization.validAfter),
1673
- BigInt(payload.authorization.validBefore),
1674
- payload.authorization.nonce,
1675
- signature
1676
- ],
1677
- chain: wallet.chain
1678
- });
1981
+ let tx;
1982
+ if (paymentRequirements.extra?.relayer) {
1983
+ const sig = (0, import_viem2.hexToSignature)(signature);
1984
+ const v = Number(sig.v);
1985
+ const r = sig.r;
1986
+ const s = sig.s;
1987
+ tx = await wallet.writeContract({
1988
+ address: paymentRequirements.extra.relayer,
1989
+ abi: permitProxyContractABI,
1990
+ functionName: "settleWithERC3009",
1991
+ args: [
1992
+ paymentRequirements.asset,
1993
+ // token
1994
+ payload.authorization.from,
1995
+ // payer
1996
+ payload.authorization.to,
1997
+ // seller
1998
+ BigInt(payload.authorization.value),
1999
+ // amount
2000
+ BigInt(payload.authorization.validAfter),
2001
+ // validAfter
2002
+ BigInt(payload.authorization.validBefore),
2003
+ // validBefore
2004
+ payload.authorization.nonce,
2005
+ // nonce
2006
+ v,
2007
+ // v (uint8)
2008
+ r,
2009
+ // r (bytes32)
2010
+ s
2011
+ // s (bytes32)
2012
+ ],
2013
+ chain: wallet.chain
2014
+ });
2015
+ } else {
2016
+ tx = await wallet.writeContract({
2017
+ address: paymentRequirements.asset,
2018
+ abi: usdcABI,
2019
+ functionName: "transferWithAuthorization",
2020
+ args: [
2021
+ payload.authorization.from,
2022
+ payload.authorization.to,
2023
+ BigInt(payload.authorization.value),
2024
+ BigInt(payload.authorization.validAfter),
2025
+ BigInt(payload.authorization.validBefore),
2026
+ payload.authorization.nonce,
2027
+ signature
2028
+ ],
2029
+ chain: wallet.chain
2030
+ });
2031
+ }
1679
2032
  const receipt = await wallet.waitForTransactionReceipt({ hash: tx });
1680
2033
  if (receipt.status !== "success") {
1681
2034
  return {
@@ -1769,63 +2122,6 @@ function splitSignature(signature) {
1769
2122
  return { v, r, s };
1770
2123
  }
1771
2124
 
1772
- // src/types/shared/evm/permitProxyABI.ts
1773
- var permitProxyContractABI = [
1774
- {
1775
- inputs: [
1776
- {
1777
- internalType: "address",
1778
- name: "token",
1779
- type: "address"
1780
- },
1781
- {
1782
- internalType: "address",
1783
- name: "owner",
1784
- type: "address"
1785
- },
1786
- {
1787
- internalType: "address",
1788
- name: "spender",
1789
- type: "address"
1790
- },
1791
- {
1792
- internalType: "uint256",
1793
- name: "value",
1794
- type: "uint256"
1795
- },
1796
- {
1797
- internalType: "uint256",
1798
- name: "deadline",
1799
- type: "uint256"
1800
- },
1801
- {
1802
- internalType: "uint8",
1803
- name: "v",
1804
- type: "uint8"
1805
- },
1806
- {
1807
- internalType: "bytes32",
1808
- name: "r",
1809
- type: "bytes32"
1810
- },
1811
- {
1812
- internalType: "bytes32",
1813
- name: "s",
1814
- type: "bytes32"
1815
- },
1816
- {
1817
- internalType: "address",
1818
- name: "to",
1819
- type: "address"
1820
- }
1821
- ],
1822
- name: "permitAndTransfer",
1823
- outputs: [],
1824
- stateMutability: "nonpayable",
1825
- type: "function"
1826
- }
1827
- ];
1828
-
1829
2125
  // src/schemes/exact/evm/permit/facilitator.ts
1830
2126
  async function verify2(client, payload, paymentRequirements) {
1831
2127
  if (payload.payload.authorizationType !== "permit" || payload.scheme !== SCHEME || paymentRequirements.scheme !== SCHEME) {
@@ -1893,8 +2189,8 @@ async function verify2(client, payload, paymentRequirements) {
1893
2189
  payer: owner
1894
2190
  };
1895
2191
  }
1896
- if (paymentRequirements.extra?.proxyAddress) {
1897
- if ((0, import_viem4.getAddress)(spender) !== (0, import_viem4.getAddress)(paymentRequirements.extra?.proxyAddress)) {
2192
+ if (paymentRequirements.extra?.relayer) {
2193
+ if ((0, import_viem4.getAddress)(spender) !== (0, import_viem4.getAddress)(paymentRequirements.extra?.relayer)) {
1898
2194
  return {
1899
2195
  isValid: false,
1900
2196
  invalidReason: "invalid_spender_address",
@@ -1958,21 +2254,28 @@ async function settle2(wallet, paymentPayload, paymentRequirements) {
1958
2254
  address: wallet.account.address
1959
2255
  });
1960
2256
  let transactionHash;
1961
- if (paymentRequirements.extra?.proxyAddress) {
2257
+ if (paymentRequirements.extra?.relayer) {
1962
2258
  transactionHash = await wallet.writeContract({
1963
- address: paymentRequirements.extra.proxyAddress,
2259
+ address: paymentRequirements.extra.relayer,
1964
2260
  abi: permitProxyContractABI,
1965
- functionName: "permitAndTransfer",
2261
+ functionName: "settleWithPermit",
1966
2262
  args: [
1967
2263
  tokenAddress,
2264
+ // token
1968
2265
  owner,
1969
- spender,
2266
+ // payer
2267
+ paymentRequirements.payTo,
2268
+ // seller
1970
2269
  BigInt(value),
2270
+ // amount
1971
2271
  BigInt(deadline),
2272
+ // deadline
1972
2273
  v,
2274
+ // v
1973
2275
  r,
1974
- s,
1975
- paymentRequirements.payTo
2276
+ // r
2277
+ s
2278
+ // s
1976
2279
  ],
1977
2280
  chain: wallet.chain,
1978
2281
  nonce: txNonce
@@ -2041,11 +2344,41 @@ async function verify3(client, payload, paymentRequirements) {
2041
2344
  };
2042
2345
  }
2043
2346
  const permit2Payload = payload.payload;
2044
- const { owner, spender, token, amount, deadline, nonce } = permit2Payload.authorization;
2347
+ const { owner, spender, token, amount, deadline, nonce, to } = permit2Payload.authorization;
2045
2348
  const chainId = getNetworkId(payload.network);
2046
2349
  const tokenAddress = (0, import_viem5.getAddress)(token);
2047
2350
  const ownerAddress = (0, import_viem5.getAddress)(owner);
2048
- const permit2TypedData = {
2351
+ const hasWitness = !!to;
2352
+ if (hasWitness) {
2353
+ if ((0, import_viem5.getAddress)(to) !== (0, import_viem5.getAddress)(paymentRequirements.payTo)) {
2354
+ return {
2355
+ isValid: false,
2356
+ invalidReason: "witness_recipient_mismatch",
2357
+ payer: owner
2358
+ };
2359
+ }
2360
+ }
2361
+ const permit2TypedData = hasWitness ? {
2362
+ types: permit2WitnessTypes,
2363
+ domain: {
2364
+ name: "Permit2",
2365
+ chainId,
2366
+ verifyingContract: PERMIT2_ADDRESS
2367
+ },
2368
+ primaryType: "PermitWitnessTransferFrom",
2369
+ message: {
2370
+ permitted: {
2371
+ token: tokenAddress,
2372
+ amount
2373
+ },
2374
+ spender: (0, import_viem5.getAddress)(spender),
2375
+ nonce,
2376
+ deadline,
2377
+ witness: {
2378
+ to: (0, import_viem5.getAddress)(to)
2379
+ }
2380
+ }
2381
+ } : {
2049
2382
  types: permit2Types,
2050
2383
  domain: {
2051
2384
  name: "Permit2",
@@ -2071,7 +2404,7 @@ async function verify3(client, payload, paymentRequirements) {
2071
2404
  if (!recoveredAddress) {
2072
2405
  return {
2073
2406
  isValid: false,
2074
- invalidReason: "invalid_permit2_signature",
2407
+ invalidReason: hasWitness ? "invalid_permit2_witness_signature" : "invalid_permit2_signature",
2075
2408
  payer: owner
2076
2409
  };
2077
2410
  }
@@ -2146,10 +2479,34 @@ async function settle3(wallet, paymentPayload, paymentRequirements) {
2146
2479
  payer: permit2Payload.authorization.owner
2147
2480
  };
2148
2481
  }
2149
- const { owner, token, amount, deadline, nonce } = permit2Payload.authorization;
2482
+ const { owner, token, amount, deadline, nonce, to } = permit2Payload.authorization;
2150
2483
  const tokenAddress = (0, import_viem5.getAddress)(token);
2151
2484
  const ownerAddress = (0, import_viem5.getAddress)(owner);
2152
- const tx = await wallet.writeContract({
2485
+ const hasWitness = !!to;
2486
+ const tx = hasWitness ? await wallet.writeContract({
2487
+ address: PERMIT2_ADDRESS,
2488
+ abi: permit2ABI,
2489
+ functionName: "permitWitnessTransferFrom",
2490
+ args: [
2491
+ {
2492
+ permitted: {
2493
+ token: tokenAddress,
2494
+ amount: BigInt(amount)
2495
+ },
2496
+ nonce: BigInt(nonce),
2497
+ deadline: BigInt(deadline)
2498
+ },
2499
+ {
2500
+ to: paymentRequirements.payTo,
2501
+ requestedAmount: BigInt(amount)
2502
+ },
2503
+ ownerAddress,
2504
+ (0, import_viem5.keccak256)((0, import_viem5.encodeAbiParameters)([{ type: "address", name: "to" }], [(0, import_viem5.getAddress)(to)])),
2505
+ WITNESS_TYPE_STRING,
2506
+ permit2Payload.signature
2507
+ ],
2508
+ chain: wallet.chain
2509
+ }) : await wallet.writeContract({
2153
2510
  address: PERMIT2_ADDRESS,
2154
2511
  abi: permit2ABI,
2155
2512
  functionName: "permitTransferFrom",
@@ -2335,7 +2692,7 @@ function preparePaymentHeader(from, x402Version, paymentRequirements) {
2335
2692
  signature: void 0,
2336
2693
  authorization: {
2337
2694
  from,
2338
- to: paymentRequirements.payTo,
2695
+ to: paymentRequirements.extra?.relayer || paymentRequirements.payTo,
2339
2696
  value: paymentRequirements.maxAmountRequired,
2340
2697
  validAfter: validAfter.toString(),
2341
2698
  validBefore: validBefore.toString(),
@@ -2393,7 +2750,7 @@ function preparePaymentHeader2(from, x402Version, paymentRequirements) {
2393
2750
  signature: void 0,
2394
2751
  authorization: {
2395
2752
  owner: from,
2396
- spender: paymentRequirements.extra?.feePayer,
2753
+ spender: paymentRequirements.extra?.relayer || paymentRequirements.payTo,
2397
2754
  value: paymentRequirements.maxAmountRequired,
2398
2755
  deadline
2399
2756
  }
@@ -2447,13 +2804,34 @@ __export(permit2_exports, {
2447
2804
 
2448
2805
  // src/schemes/exact/evm/permit2/sign.ts
2449
2806
  var import_viem7 = require("viem");
2450
- async function signPermit2(walletClient, { owner, spender, token, amount, deadline }, { network }) {
2807
+ async function signPermit2(walletClient, { owner, spender, token, amount, deadline, to }, { network }) {
2451
2808
  const chainId = getNetworkId(network);
2452
2809
  const tokenAddress = (0, import_viem7.getAddress)(token);
2453
2810
  const ownerAddress = (0, import_viem7.getAddress)(owner);
2454
2811
  const spenderAddress = (0, import_viem7.getAddress)(spender);
2455
2812
  const nonce = await createPermit2Nonce(walletClient, ownerAddress);
2456
- const data = {
2813
+ const hasWitness = !!to;
2814
+ const data = hasWitness ? {
2815
+ types: permit2WitnessTypes,
2816
+ domain: {
2817
+ name: "Permit2",
2818
+ chainId,
2819
+ verifyingContract: PERMIT2_ADDRESS
2820
+ },
2821
+ primaryType: "PermitWitnessTransferFrom",
2822
+ message: {
2823
+ permitted: {
2824
+ token: tokenAddress,
2825
+ amount: BigInt(amount)
2826
+ },
2827
+ spender: spenderAddress,
2828
+ nonce,
2829
+ deadline: BigInt(deadline),
2830
+ witness: {
2831
+ to: (0, import_viem7.getAddress)(to)
2832
+ }
2833
+ }
2834
+ } : {
2457
2835
  types: permit2Types,
2458
2836
  domain: {
2459
2837
  name: "Permit2",
@@ -2531,16 +2909,18 @@ function preparePaymentHeader3(from, x402Version, paymentRequirements) {
2531
2909
  spender: paymentRequirements.payTo,
2532
2910
  token: paymentRequirements.asset,
2533
2911
  amount: paymentRequirements.maxAmountRequired,
2534
- deadline
2912
+ deadline,
2913
+ to: paymentRequirements.payTo
2914
+ // Witness: bind recipient to signature
2535
2915
  }
2536
2916
  }
2537
2917
  };
2538
2918
  }
2539
2919
  async function signPaymentHeader3(client, paymentRequirements, unsignedPaymentHeader) {
2540
- const { owner, spender, token, amount, deadline } = unsignedPaymentHeader.payload.authorization;
2920
+ const { owner, spender, token, amount, deadline, to } = unsignedPaymentHeader.payload.authorization;
2541
2921
  const { signature, nonce } = await signPermit2(
2542
2922
  client,
2543
- { owner, spender, token, amount, deadline },
2923
+ { owner, spender, token, amount, deadline, to },
2544
2924
  paymentRequirements
2545
2925
  );
2546
2926
  return {
@@ -2554,7 +2934,9 @@ async function signPaymentHeader3(client, paymentRequirements, unsignedPaymentHe
2554
2934
  token,
2555
2935
  amount,
2556
2936
  deadline,
2557
- nonce
2937
+ nonce,
2938
+ ...to ? { to } : {}
2939
+ // Include `to` field if present (witness mode)
2558
2940
  }
2559
2941
  }
2560
2942
  };