@wtflabs/x402 0.0.1-beta.0 → 0.0.1-beta.10

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 (84) 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 +81 -9
  13. package/dist/cjs/schemes/index.js +633 -100
  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/cjs/{x402Specs-CYq5tSY1.d.ts → x402Specs-BtRXj67U.d.ts} +43 -10
  25. package/dist/esm/{chunk-34YNR4LY.mjs → chunk-KABV25HJ.mjs} +3 -3
  26. package/dist/esm/{chunk-LGXWNXCO.mjs → chunk-LXLCF4IW.mjs} +3 -3
  27. package/dist/esm/{chunk-UCBE7FDY.mjs → chunk-NPWDNT2P.mjs} +67 -2
  28. package/dist/esm/chunk-NPWDNT2P.mjs.map +1 -0
  29. package/dist/esm/{chunk-RX2JKK4O.mjs → chunk-VTLJOZXM.mjs} +3 -3
  30. package/dist/esm/chunk-VTLJOZXM.mjs.map +1 -0
  31. package/dist/esm/{chunk-57UEJN5U.mjs → chunk-XGQBEMP7.mjs} +589 -103
  32. package/dist/esm/chunk-XGQBEMP7.mjs.map +1 -0
  33. package/dist/esm/client/index.d.mts +64 -0
  34. package/dist/esm/client/index.mjs +3 -3
  35. package/dist/esm/config-CFBSAuxW.d.mts +10 -0
  36. package/dist/esm/config-Dfuvno71.d.mts +19 -0
  37. package/dist/esm/facilitator/index.d.mts +42 -0
  38. package/dist/esm/facilitator/index.mjs +4 -4
  39. package/dist/esm/index.d.mts +16 -0
  40. package/dist/esm/index.mjs +5 -5
  41. package/dist/{cjs/middleware-6_1ApcJn.d.ts → esm/middleware-DSDucaQ5.d.mts} +3 -3
  42. package/dist/{cjs/network-RtNddYQk.d.ts → esm/network-FrFmmiyj.d.mts} +3 -3
  43. package/dist/esm/paywall/index.d.mts +30 -0
  44. package/dist/{cjs/rpc-Ca8eHCWz.d.ts → esm/rpc-DyKXu0SX.d.mts} +1 -1
  45. package/dist/esm/schemes/index.d.mts +605 -0
  46. package/dist/esm/schemes/index.mjs +3 -3
  47. package/dist/esm/shared/evm/index.d.mts +71 -0
  48. package/dist/esm/shared/index.d.mts +182 -0
  49. package/dist/esm/shared/index.mjs +1 -1
  50. package/dist/esm/types/index.d.mts +1604 -0
  51. package/dist/esm/types/index.mjs +1 -1
  52. package/dist/esm/verify/index.d.mts +7 -0
  53. package/dist/esm/verify/index.mjs +1 -1
  54. package/dist/esm/wallet-BTqCm9Zp.d.mts +27 -0
  55. package/dist/esm/wallet-KorGgbAj.d.mts +88 -0
  56. package/dist/{cjs/wallet-BRWfOM5D.d.ts → esm/wallet-SJKJpUgQ.d.mts} +54 -40
  57. package/dist/{cjs/x402Specs-qUBCpcuz.d.ts → esm/x402Specs-BtRXj67U.d.mts} +73 -10
  58. package/package.json +15 -15
  59. package/dist/cjs/middleware-B_ewwsQp.d.ts +0 -93
  60. package/dist/cjs/middleware-BwfW7mAs.d.ts +0 -93
  61. package/dist/cjs/middleware-CQb61c1k.d.ts +0 -93
  62. package/dist/cjs/middleware-DB9lqy9f.d.ts +0 -93
  63. package/dist/cjs/middleware-DcHctwQV.d.ts +0 -93
  64. package/dist/cjs/middleware-De0jD3Bp.d.ts +0 -93
  65. package/dist/cjs/middleware-HoFOmpgv.d.ts +0 -93
  66. package/dist/cjs/middleware-Y8AiAfYw.d.ts +0 -93
  67. package/dist/cjs/middleware-pnres9YM.d.ts +0 -93
  68. package/dist/cjs/wallet-BYRAGtOB.d.ts +0 -153
  69. package/dist/cjs/wallet-BmEtlgEf.d.ts +0 -48
  70. package/dist/cjs/wallet-CNOAmyZ6.d.ts +0 -48
  71. package/dist/cjs/wallet-D1SoxFTw.d.ts +0 -48
  72. package/dist/cjs/wallet-SJ-hbjm9.d.ts +0 -153
  73. package/dist/cjs/wallet-ecnda4Aj.d.ts +0 -48
  74. package/dist/cjs/wallet-gP8Qoi-c.d.ts +0 -74
  75. package/dist/cjs/x402Specs-B7InXo2L.d.ts +0 -1065
  76. package/dist/cjs/x402Specs-BLH3j34O.d.ts +0 -1696
  77. package/dist/cjs/x402Specs-C7LipAZg.d.ts +0 -1715
  78. package/dist/cjs/x402Specs-CeajqonG.d.ts +0 -1696
  79. package/dist/cjs/x402Specs-qMujgEV5.d.ts +0 -1715
  80. package/dist/esm/chunk-57UEJN5U.mjs.map +0 -1
  81. package/dist/esm/chunk-RX2JKK4O.mjs.map +0 -1
  82. package/dist/esm/chunk-UCBE7FDY.mjs.map +0 -1
  83. /package/dist/esm/{chunk-34YNR4LY.mjs.map → chunk-KABV25HJ.mjs.map} +0 -0
  84. /package/dist/esm/{chunk-LGXWNXCO.mjs.map → chunk-LXLCF4IW.mjs.map} +0 -0
@@ -38,8 +38,11 @@ __export(exact_exports, {
38
38
  var evm_exports2 = {};
39
39
  __export(evm_exports2, {
40
40
  decodePayment: () => decodePayment,
41
+ detectTokenPaymentMethods: () => detectTokenPaymentMethods,
41
42
  eip3009: () => eip3009_exports,
42
43
  encodePayment: () => encodePayment,
44
+ getRecommendedPaymentMethod: () => getRecommendedPaymentMethod,
45
+ getTokenInfo: () => getTokenInfo,
43
46
  permit: () => permit_exports,
44
47
  permit2: () => permit2_exports,
45
48
  settle: () => settle4,
@@ -357,6 +360,21 @@ var permit2Types = {
357
360
  { name: "amount", type: "uint256" }
358
361
  ]
359
362
  };
363
+ var permit2WitnessTypes = {
364
+ PermitWitnessTransferFrom: [
365
+ { name: "permitted", type: "TokenPermissions" },
366
+ { name: "spender", type: "address" },
367
+ { name: "nonce", type: "uint256" },
368
+ { name: "deadline", type: "uint256" },
369
+ { name: "witness", type: "Witness" }
370
+ ],
371
+ TokenPermissions: [
372
+ { name: "token", type: "address" },
373
+ { name: "amount", type: "uint256" }
374
+ ],
375
+ Witness: [{ name: "to", type: "address" }]
376
+ };
377
+ var WITNESS_TYPE_STRING = "Witness(address to)";
360
378
  var permit2ABI = [
361
379
  {
362
380
  inputs: [
@@ -426,6 +444,45 @@ var permit2ABI = [
426
444
  outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
427
445
  stateMutability: "view",
428
446
  type: "function"
447
+ },
448
+ {
449
+ inputs: [
450
+ {
451
+ components: [
452
+ {
453
+ components: [
454
+ { internalType: "address", name: "token", type: "address" },
455
+ { internalType: "uint256", name: "amount", type: "uint256" }
456
+ ],
457
+ internalType: "struct ISignatureTransfer.TokenPermissions",
458
+ name: "permitted",
459
+ type: "tuple"
460
+ },
461
+ { internalType: "uint256", name: "nonce", type: "uint256" },
462
+ { internalType: "uint256", name: "deadline", type: "uint256" }
463
+ ],
464
+ internalType: "struct ISignatureTransfer.PermitTransferFrom",
465
+ name: "permit",
466
+ type: "tuple"
467
+ },
468
+ {
469
+ components: [
470
+ { internalType: "address", name: "to", type: "address" },
471
+ { internalType: "uint256", name: "requestedAmount", type: "uint256" }
472
+ ],
473
+ internalType: "struct ISignatureTransfer.SignatureTransferDetails",
474
+ name: "transferDetails",
475
+ type: "tuple"
476
+ },
477
+ { internalType: "address", name: "owner", type: "address" },
478
+ { internalType: "bytes32", name: "witness", type: "bytes32" },
479
+ { internalType: "string", name: "witnessTypeString", type: "string" },
480
+ { internalType: "bytes", name: "signature", type: "bytes" }
481
+ ],
482
+ name: "permitWitnessTransferFrom",
483
+ outputs: [],
484
+ stateMutability: "nonpayable",
485
+ type: "function"
429
486
  }
430
487
  ];
431
488
 
@@ -1243,6 +1300,8 @@ var ErrorReasons = [
1243
1300
  "invalid_authorization_type",
1244
1301
  "invalid_permit_signature",
1245
1302
  "invalid_permit2_signature",
1303
+ "invalid_permit2_witness_signature",
1304
+ "witness_recipient_mismatch",
1246
1305
  "permit_expired",
1247
1306
  "permit2_expired",
1248
1307
  "permit2_not_approved",
@@ -1250,6 +1309,7 @@ var ErrorReasons = [
1250
1309
  "invalid_spender_address",
1251
1310
  "token_mismatch",
1252
1311
  "insufficient_payment_amount",
1312
+ "insufficient_token_balance",
1253
1313
  "transaction_failed",
1254
1314
  "settlement_failed"
1255
1315
  ];
@@ -1292,7 +1352,9 @@ var Permit2EvmPayloadAuthorizationSchema = import_zod3.z.object({
1292
1352
  token: import_zod3.z.string().regex(EvmAddressRegex),
1293
1353
  amount: import_zod3.z.string().refine(isInteger).refine(hasMaxLength(EvmMaxAtomicUnits)),
1294
1354
  deadline: import_zod3.z.string().refine(isInteger),
1295
- nonce: import_zod3.z.string().refine(isInteger)
1355
+ nonce: import_zod3.z.string().refine(isInteger),
1356
+ to: import_zod3.z.string().regex(EvmAddressRegex).optional()
1357
+ // Witness: binds recipient address to signature
1296
1358
  });
1297
1359
  var ExactEvmPayloadSchema = import_zod3.z.discriminatedUnion("authorizationType", [
1298
1360
  import_zod3.z.object({
@@ -1524,6 +1586,264 @@ async function signAndSimulateTransaction(signer, transaction, rpc) {
1524
1586
  return simulateResult;
1525
1587
  }
1526
1588
 
1589
+ // src/types/shared/evm/permitProxyABI.ts
1590
+ var permitProxyContractABI = [
1591
+ // settleWithPermit - 使用 EIP-2612 Permit 进行结算
1592
+ {
1593
+ inputs: [
1594
+ {
1595
+ internalType: "address",
1596
+ name: "token",
1597
+ type: "address"
1598
+ },
1599
+ {
1600
+ internalType: "address",
1601
+ name: "payer",
1602
+ type: "address"
1603
+ },
1604
+ {
1605
+ internalType: "address",
1606
+ name: "seller",
1607
+ type: "address"
1608
+ },
1609
+ {
1610
+ internalType: "uint256",
1611
+ name: "amount",
1612
+ type: "uint256"
1613
+ },
1614
+ {
1615
+ internalType: "uint256",
1616
+ name: "deadline",
1617
+ type: "uint256"
1618
+ },
1619
+ {
1620
+ internalType: "uint8",
1621
+ name: "v",
1622
+ type: "uint8"
1623
+ },
1624
+ {
1625
+ internalType: "bytes32",
1626
+ name: "r",
1627
+ type: "bytes32"
1628
+ },
1629
+ {
1630
+ internalType: "bytes32",
1631
+ name: "s",
1632
+ type: "bytes32"
1633
+ }
1634
+ ],
1635
+ name: "settleWithPermit",
1636
+ outputs: [],
1637
+ stateMutability: "nonpayable",
1638
+ type: "function"
1639
+ },
1640
+ // settleWithERC3009 - 使用 EIP-3009 TransferWithAuthorization 进行结算
1641
+ {
1642
+ inputs: [
1643
+ {
1644
+ internalType: "address",
1645
+ name: "token",
1646
+ type: "address"
1647
+ },
1648
+ {
1649
+ internalType: "address",
1650
+ name: "payer",
1651
+ type: "address"
1652
+ },
1653
+ {
1654
+ internalType: "address",
1655
+ name: "seller",
1656
+ type: "address"
1657
+ },
1658
+ {
1659
+ internalType: "uint256",
1660
+ name: "amount",
1661
+ type: "uint256"
1662
+ },
1663
+ {
1664
+ internalType: "uint256",
1665
+ name: "validAfter",
1666
+ type: "uint256"
1667
+ },
1668
+ {
1669
+ internalType: "uint256",
1670
+ name: "validBefore",
1671
+ type: "uint256"
1672
+ },
1673
+ {
1674
+ internalType: "bytes32",
1675
+ name: "nonce",
1676
+ type: "bytes32"
1677
+ },
1678
+ {
1679
+ internalType: "uint8",
1680
+ name: "v",
1681
+ type: "uint8"
1682
+ },
1683
+ {
1684
+ internalType: "bytes32",
1685
+ name: "r",
1686
+ type: "bytes32"
1687
+ },
1688
+ {
1689
+ internalType: "bytes32",
1690
+ name: "s",
1691
+ type: "bytes32"
1692
+ }
1693
+ ],
1694
+ name: "settleWithERC3009",
1695
+ outputs: [],
1696
+ stateMutability: "nonpayable",
1697
+ type: "function"
1698
+ },
1699
+ // settleWithERC3009Direct - 直接结算(无手续费)
1700
+ {
1701
+ inputs: [
1702
+ {
1703
+ internalType: "address",
1704
+ name: "token",
1705
+ type: "address"
1706
+ },
1707
+ {
1708
+ internalType: "address",
1709
+ name: "payer",
1710
+ type: "address"
1711
+ },
1712
+ {
1713
+ internalType: "address",
1714
+ name: "seller",
1715
+ type: "address"
1716
+ },
1717
+ {
1718
+ internalType: "uint256",
1719
+ name: "amount",
1720
+ type: "uint256"
1721
+ },
1722
+ {
1723
+ internalType: "uint256",
1724
+ name: "validAfter",
1725
+ type: "uint256"
1726
+ },
1727
+ {
1728
+ internalType: "uint256",
1729
+ name: "validBefore",
1730
+ type: "uint256"
1731
+ },
1732
+ {
1733
+ internalType: "bytes32",
1734
+ name: "nonce",
1735
+ type: "bytes32"
1736
+ },
1737
+ {
1738
+ internalType: "uint8",
1739
+ name: "v",
1740
+ type: "uint8"
1741
+ },
1742
+ {
1743
+ internalType: "bytes32",
1744
+ name: "r",
1745
+ type: "bytes32"
1746
+ },
1747
+ {
1748
+ internalType: "bytes32",
1749
+ name: "s",
1750
+ type: "bytes32"
1751
+ }
1752
+ ],
1753
+ name: "settleWithERC3009Direct",
1754
+ outputs: [],
1755
+ stateMutability: "nonpayable",
1756
+ type: "function"
1757
+ },
1758
+ // Events
1759
+ {
1760
+ anonymous: false,
1761
+ inputs: [
1762
+ {
1763
+ indexed: true,
1764
+ internalType: "address",
1765
+ name: "token",
1766
+ type: "address"
1767
+ },
1768
+ {
1769
+ indexed: true,
1770
+ internalType: "address",
1771
+ name: "payer",
1772
+ type: "address"
1773
+ },
1774
+ {
1775
+ indexed: true,
1776
+ internalType: "address",
1777
+ name: "seller",
1778
+ type: "address"
1779
+ },
1780
+ {
1781
+ indexed: false,
1782
+ internalType: "uint256",
1783
+ name: "amount",
1784
+ type: "uint256"
1785
+ },
1786
+ {
1787
+ indexed: false,
1788
+ internalType: "uint256",
1789
+ name: "sellerAmount",
1790
+ type: "uint256"
1791
+ },
1792
+ {
1793
+ indexed: false,
1794
+ internalType: "uint256",
1795
+ name: "feeAmount",
1796
+ type: "uint256"
1797
+ },
1798
+ {
1799
+ indexed: false,
1800
+ internalType: "string",
1801
+ name: "path",
1802
+ type: "string"
1803
+ }
1804
+ ],
1805
+ name: "SettledSplit",
1806
+ type: "event"
1807
+ },
1808
+ {
1809
+ anonymous: false,
1810
+ inputs: [
1811
+ {
1812
+ indexed: true,
1813
+ internalType: "address",
1814
+ name: "token",
1815
+ type: "address"
1816
+ },
1817
+ {
1818
+ indexed: true,
1819
+ internalType: "address",
1820
+ name: "payer",
1821
+ type: "address"
1822
+ },
1823
+ {
1824
+ indexed: true,
1825
+ internalType: "address",
1826
+ name: "seller",
1827
+ type: "address"
1828
+ },
1829
+ {
1830
+ indexed: false,
1831
+ internalType: "uint256",
1832
+ name: "amount",
1833
+ type: "uint256"
1834
+ },
1835
+ {
1836
+ indexed: false,
1837
+ internalType: "string",
1838
+ name: "path",
1839
+ type: "string"
1840
+ }
1841
+ ],
1842
+ name: "SettledDirect",
1843
+ type: "event"
1844
+ }
1845
+ ];
1846
+
1527
1847
  // src/schemes/exact/evm/eip3009/facilitator.ts
1528
1848
  async function verify(client, payload, paymentRequirements) {
1529
1849
  const exactEvmPayload = payload.payload;
@@ -1588,7 +1908,7 @@ async function verify(client, payload, paymentRequirements) {
1588
1908
  payer: exactEvmPayload.authorization.from
1589
1909
  };
1590
1910
  }
1591
- if ((0, import_viem2.getAddress)(exactEvmPayload.authorization.to) !== (0, import_viem2.getAddress)(paymentRequirements.payTo)) {
1911
+ 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
1912
  return {
1593
1913
  isValid: false,
1594
1914
  invalidReason: "invalid_exact_evm_payload_recipient_mismatch",
@@ -1661,21 +1981,57 @@ async function settle(wallet, paymentPayload, paymentRequirements) {
1661
1981
  };
1662
1982
  }
1663
1983
  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
- });
1984
+ let tx;
1985
+ if (paymentRequirements.extra?.relayer) {
1986
+ const sig = (0, import_viem2.hexToSignature)(signature);
1987
+ const v = Number(sig.v);
1988
+ const r = sig.r;
1989
+ const s = sig.s;
1990
+ tx = await wallet.writeContract({
1991
+ address: paymentRequirements.extra.relayer,
1992
+ abi: permitProxyContractABI,
1993
+ functionName: "settleWithERC3009",
1994
+ args: [
1995
+ paymentRequirements.asset,
1996
+ // token
1997
+ payload.authorization.from,
1998
+ // payer
1999
+ payload.authorization.to,
2000
+ // seller
2001
+ BigInt(payload.authorization.value),
2002
+ // amount
2003
+ BigInt(payload.authorization.validAfter),
2004
+ // validAfter
2005
+ BigInt(payload.authorization.validBefore),
2006
+ // validBefore
2007
+ payload.authorization.nonce,
2008
+ // nonce
2009
+ v,
2010
+ // v (uint8)
2011
+ r,
2012
+ // r (bytes32)
2013
+ s
2014
+ // s (bytes32)
2015
+ ],
2016
+ chain: wallet.chain
2017
+ });
2018
+ } else {
2019
+ tx = await wallet.writeContract({
2020
+ address: paymentRequirements.asset,
2021
+ abi: usdcABI,
2022
+ functionName: "transferWithAuthorization",
2023
+ args: [
2024
+ payload.authorization.from,
2025
+ payload.authorization.to,
2026
+ BigInt(payload.authorization.value),
2027
+ BigInt(payload.authorization.validAfter),
2028
+ BigInt(payload.authorization.validBefore),
2029
+ payload.authorization.nonce,
2030
+ signature
2031
+ ],
2032
+ chain: wallet.chain
2033
+ });
2034
+ }
1679
2035
  const receipt = await wallet.waitForTransactionReceipt({ hash: tx });
1680
2036
  if (receipt.status !== "success") {
1681
2037
  return {
@@ -1719,11 +2075,7 @@ async function signPermit(walletClient, { owner, spender, value, deadline }, { a
1719
2075
  abi: erc20PermitABI,
1720
2076
  functionName: "name"
1721
2077
  }),
1722
- walletClient.readContract({
1723
- address: tokenAddress,
1724
- abi: erc20PermitABI,
1725
- functionName: "version"
1726
- })
2078
+ getVersion(walletClient, tokenAddress)
1727
2079
  ]);
1728
2080
  } else {
1729
2081
  throw new Error("Local account signing for permit requires a connected client");
@@ -1773,63 +2125,6 @@ function splitSignature(signature) {
1773
2125
  return { v, r, s };
1774
2126
  }
1775
2127
 
1776
- // src/types/shared/evm/permitProxyABI.ts
1777
- var permitProxyContractABI = [
1778
- {
1779
- inputs: [
1780
- {
1781
- internalType: "address",
1782
- name: "token",
1783
- type: "address"
1784
- },
1785
- {
1786
- internalType: "address",
1787
- name: "owner",
1788
- type: "address"
1789
- },
1790
- {
1791
- internalType: "address",
1792
- name: "spender",
1793
- type: "address"
1794
- },
1795
- {
1796
- internalType: "uint256",
1797
- name: "value",
1798
- type: "uint256"
1799
- },
1800
- {
1801
- internalType: "uint256",
1802
- name: "deadline",
1803
- type: "uint256"
1804
- },
1805
- {
1806
- internalType: "uint8",
1807
- name: "v",
1808
- type: "uint8"
1809
- },
1810
- {
1811
- internalType: "bytes32",
1812
- name: "r",
1813
- type: "bytes32"
1814
- },
1815
- {
1816
- internalType: "bytes32",
1817
- name: "s",
1818
- type: "bytes32"
1819
- },
1820
- {
1821
- internalType: "address",
1822
- name: "to",
1823
- type: "address"
1824
- }
1825
- ],
1826
- name: "permitAndTransfer",
1827
- outputs: [],
1828
- stateMutability: "nonpayable",
1829
- type: "function"
1830
- }
1831
- ];
1832
-
1833
2128
  // src/schemes/exact/evm/permit/facilitator.ts
1834
2129
  async function verify2(client, payload, paymentRequirements) {
1835
2130
  if (payload.payload.authorizationType !== "permit" || payload.scheme !== SCHEME || paymentRequirements.scheme !== SCHEME) {
@@ -1897,8 +2192,8 @@ async function verify2(client, payload, paymentRequirements) {
1897
2192
  payer: owner
1898
2193
  };
1899
2194
  }
1900
- if (paymentRequirements.extra?.proxyAddress) {
1901
- if ((0, import_viem4.getAddress)(spender) !== (0, import_viem4.getAddress)(paymentRequirements.extra?.proxyAddress)) {
2195
+ if (paymentRequirements.extra?.relayer) {
2196
+ if ((0, import_viem4.getAddress)(spender) !== (0, import_viem4.getAddress)(paymentRequirements.extra?.relayer)) {
1902
2197
  return {
1903
2198
  isValid: false,
1904
2199
  invalidReason: "invalid_spender_address",
@@ -1962,21 +2257,28 @@ async function settle2(wallet, paymentPayload, paymentRequirements) {
1962
2257
  address: wallet.account.address
1963
2258
  });
1964
2259
  let transactionHash;
1965
- if (paymentRequirements.extra?.proxyAddress) {
2260
+ if (paymentRequirements.extra?.relayer) {
1966
2261
  transactionHash = await wallet.writeContract({
1967
- address: paymentRequirements.extra.proxyAddress,
2262
+ address: paymentRequirements.extra.relayer,
1968
2263
  abi: permitProxyContractABI,
1969
- functionName: "permitAndTransfer",
2264
+ functionName: "settleWithPermit",
1970
2265
  args: [
1971
2266
  tokenAddress,
2267
+ // token
1972
2268
  owner,
1973
- spender,
2269
+ // payer
2270
+ paymentRequirements.payTo,
2271
+ // seller
1974
2272
  BigInt(value),
2273
+ // amount
1975
2274
  BigInt(deadline),
2275
+ // deadline
1976
2276
  v,
2277
+ // v
1977
2278
  r,
1978
- s,
1979
- paymentRequirements.payTo
2279
+ // r
2280
+ s
2281
+ // s
1980
2282
  ],
1981
2283
  chain: wallet.chain,
1982
2284
  nonce: txNonce
@@ -2045,11 +2347,41 @@ async function verify3(client, payload, paymentRequirements) {
2045
2347
  };
2046
2348
  }
2047
2349
  const permit2Payload = payload.payload;
2048
- const { owner, spender, token, amount, deadline, nonce } = permit2Payload.authorization;
2350
+ const { owner, spender, token, amount, deadline, nonce, to } = permit2Payload.authorization;
2049
2351
  const chainId = getNetworkId(payload.network);
2050
2352
  const tokenAddress = (0, import_viem5.getAddress)(token);
2051
2353
  const ownerAddress = (0, import_viem5.getAddress)(owner);
2052
- const permit2TypedData = {
2354
+ const hasWitness = !!to;
2355
+ if (hasWitness) {
2356
+ if ((0, import_viem5.getAddress)(to) !== (0, import_viem5.getAddress)(paymentRequirements.payTo)) {
2357
+ return {
2358
+ isValid: false,
2359
+ invalidReason: "witness_recipient_mismatch",
2360
+ payer: owner
2361
+ };
2362
+ }
2363
+ }
2364
+ const permit2TypedData = hasWitness ? {
2365
+ types: permit2WitnessTypes,
2366
+ domain: {
2367
+ name: "Permit2",
2368
+ chainId,
2369
+ verifyingContract: PERMIT2_ADDRESS
2370
+ },
2371
+ primaryType: "PermitWitnessTransferFrom",
2372
+ message: {
2373
+ permitted: {
2374
+ token: tokenAddress,
2375
+ amount
2376
+ },
2377
+ spender: (0, import_viem5.getAddress)(spender),
2378
+ nonce,
2379
+ deadline,
2380
+ witness: {
2381
+ to: (0, import_viem5.getAddress)(to)
2382
+ }
2383
+ }
2384
+ } : {
2053
2385
  types: permit2Types,
2054
2386
  domain: {
2055
2387
  name: "Permit2",
@@ -2075,7 +2407,7 @@ async function verify3(client, payload, paymentRequirements) {
2075
2407
  if (!recoveredAddress) {
2076
2408
  return {
2077
2409
  isValid: false,
2078
- invalidReason: "invalid_permit2_signature",
2410
+ invalidReason: hasWitness ? "invalid_permit2_witness_signature" : "invalid_permit2_signature",
2079
2411
  payer: owner
2080
2412
  };
2081
2413
  }
@@ -2150,10 +2482,34 @@ async function settle3(wallet, paymentPayload, paymentRequirements) {
2150
2482
  payer: permit2Payload.authorization.owner
2151
2483
  };
2152
2484
  }
2153
- const { owner, token, amount, deadline, nonce } = permit2Payload.authorization;
2485
+ const { owner, token, amount, deadline, nonce, to } = permit2Payload.authorization;
2154
2486
  const tokenAddress = (0, import_viem5.getAddress)(token);
2155
2487
  const ownerAddress = (0, import_viem5.getAddress)(owner);
2156
- const tx = await wallet.writeContract({
2488
+ const hasWitness = !!to;
2489
+ const tx = hasWitness ? await wallet.writeContract({
2490
+ address: PERMIT2_ADDRESS,
2491
+ abi: permit2ABI,
2492
+ functionName: "permitWitnessTransferFrom",
2493
+ args: [
2494
+ {
2495
+ permitted: {
2496
+ token: tokenAddress,
2497
+ amount: BigInt(amount)
2498
+ },
2499
+ nonce: BigInt(nonce),
2500
+ deadline: BigInt(deadline)
2501
+ },
2502
+ {
2503
+ to: paymentRequirements.payTo,
2504
+ requestedAmount: BigInt(amount)
2505
+ },
2506
+ ownerAddress,
2507
+ (0, import_viem5.keccak256)((0, import_viem5.encodeAbiParameters)([{ type: "address", name: "to" }], [(0, import_viem5.getAddress)(to)])),
2508
+ WITNESS_TYPE_STRING,
2509
+ permit2Payload.signature
2510
+ ],
2511
+ chain: wallet.chain
2512
+ }) : await wallet.writeContract({
2157
2513
  address: PERMIT2_ADDRESS,
2158
2514
  abi: permit2ABI,
2159
2515
  functionName: "permitTransferFrom",
@@ -2339,7 +2695,7 @@ function preparePaymentHeader(from, x402Version, paymentRequirements) {
2339
2695
  signature: void 0,
2340
2696
  authorization: {
2341
2697
  from,
2342
- to: paymentRequirements.payTo,
2698
+ to: paymentRequirements.extra?.relayer || paymentRequirements.payTo,
2343
2699
  value: paymentRequirements.maxAmountRequired,
2344
2700
  validAfter: validAfter.toString(),
2345
2701
  validBefore: validBefore.toString(),
@@ -2397,7 +2753,7 @@ function preparePaymentHeader2(from, x402Version, paymentRequirements) {
2397
2753
  signature: void 0,
2398
2754
  authorization: {
2399
2755
  owner: from,
2400
- spender: paymentRequirements.payTo,
2756
+ spender: paymentRequirements.extra?.relayer || paymentRequirements.payTo,
2401
2757
  value: paymentRequirements.maxAmountRequired,
2402
2758
  deadline
2403
2759
  }
@@ -2451,13 +2807,34 @@ __export(permit2_exports, {
2451
2807
 
2452
2808
  // src/schemes/exact/evm/permit2/sign.ts
2453
2809
  var import_viem7 = require("viem");
2454
- async function signPermit2(walletClient, { owner, spender, token, amount, deadline }, { network }) {
2810
+ async function signPermit2(walletClient, { owner, spender, token, amount, deadline, to }, { network }) {
2455
2811
  const chainId = getNetworkId(network);
2456
2812
  const tokenAddress = (0, import_viem7.getAddress)(token);
2457
2813
  const ownerAddress = (0, import_viem7.getAddress)(owner);
2458
2814
  const spenderAddress = (0, import_viem7.getAddress)(spender);
2459
2815
  const nonce = await createPermit2Nonce(walletClient, ownerAddress);
2460
- const data = {
2816
+ const hasWitness = !!to;
2817
+ const data = hasWitness ? {
2818
+ types: permit2WitnessTypes,
2819
+ domain: {
2820
+ name: "Permit2",
2821
+ chainId,
2822
+ verifyingContract: PERMIT2_ADDRESS
2823
+ },
2824
+ primaryType: "PermitWitnessTransferFrom",
2825
+ message: {
2826
+ permitted: {
2827
+ token: tokenAddress,
2828
+ amount: BigInt(amount)
2829
+ },
2830
+ spender: spenderAddress,
2831
+ nonce,
2832
+ deadline: BigInt(deadline),
2833
+ witness: {
2834
+ to: (0, import_viem7.getAddress)(to)
2835
+ }
2836
+ }
2837
+ } : {
2461
2838
  types: permit2Types,
2462
2839
  domain: {
2463
2840
  name: "Permit2",
@@ -2535,16 +2912,18 @@ function preparePaymentHeader3(from, x402Version, paymentRequirements) {
2535
2912
  spender: paymentRequirements.payTo,
2536
2913
  token: paymentRequirements.asset,
2537
2914
  amount: paymentRequirements.maxAmountRequired,
2538
- deadline
2915
+ deadline,
2916
+ to: paymentRequirements.payTo
2917
+ // Witness: bind recipient to signature
2539
2918
  }
2540
2919
  }
2541
2920
  };
2542
2921
  }
2543
2922
  async function signPaymentHeader3(client, paymentRequirements, unsignedPaymentHeader) {
2544
- const { owner, spender, token, amount, deadline } = unsignedPaymentHeader.payload.authorization;
2923
+ const { owner, spender, token, amount, deadline, to } = unsignedPaymentHeader.payload.authorization;
2545
2924
  const { signature, nonce } = await signPermit2(
2546
2925
  client,
2547
- { owner, spender, token, amount, deadline },
2926
+ { owner, spender, token, amount, deadline, to },
2548
2927
  paymentRequirements
2549
2928
  );
2550
2929
  return {
@@ -2558,7 +2937,9 @@ async function signPaymentHeader3(client, paymentRequirements, unsignedPaymentHe
2558
2937
  token,
2559
2938
  amount,
2560
2939
  deadline,
2561
- nonce
2940
+ nonce,
2941
+ ...to ? { to } : {}
2942
+ // Include `to` field if present (witness mode)
2562
2943
  }
2563
2944
  }
2564
2945
  };
@@ -2573,6 +2954,158 @@ async function createPaymentHeader3(client, x402Version, paymentRequirements) {
2573
2954
  return encodePayment(payment);
2574
2955
  }
2575
2956
 
2957
+ // src/schemes/exact/evm/utils/tokenDetection.ts
2958
+ var EIP3009_SIGNATURES = ["0xe3ee160e", "0xcf092995"];
2959
+ var EIP2612_PERMIT = "0xd505accf";
2960
+ var PERMIT2_ADDRESS2 = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
2961
+ async function hasMethod(client, tokenAddress, methodSelector) {
2962
+ try {
2963
+ const code = await client.getBytecode({ address: tokenAddress });
2964
+ if (!code) return false;
2965
+ return code.toLowerCase().includes(methodSelector.slice(2).toLowerCase());
2966
+ } catch (error) {
2967
+ console.error(`Error checking method ${methodSelector}:`, error);
2968
+ return false;
2969
+ }
2970
+ }
2971
+ async function hasAnyMethod(client, tokenAddress, methodSelectors) {
2972
+ try {
2973
+ const code = await client.getBytecode({ address: tokenAddress });
2974
+ if (!code) return false;
2975
+ const codeLower = code.toLowerCase();
2976
+ return methodSelectors.some((selector) => codeLower.includes(selector.slice(2).toLowerCase()));
2977
+ } catch (error) {
2978
+ console.error(`Error checking methods ${methodSelectors.join(", ")}:`, error);
2979
+ return false;
2980
+ }
2981
+ }
2982
+ async function checkPermit2Support(client) {
2983
+ try {
2984
+ const permit2Code = await client.getBytecode({ address: PERMIT2_ADDRESS2 });
2985
+ if (!permit2Code) return false;
2986
+ return true;
2987
+ } catch (error) {
2988
+ console.error("Error checking Permit2 support:", error);
2989
+ return false;
2990
+ }
2991
+ }
2992
+ async function detectTokenPaymentMethods(tokenAddress, client) {
2993
+ const address = tokenAddress.toLowerCase();
2994
+ console.log(`\u{1F50D} Detecting payment methods for token ${address}...`);
2995
+ const [hasEIP3009, hasPermit, hasPermit2Approval] = await Promise.all([
2996
+ hasAnyMethod(client, address, EIP3009_SIGNATURES),
2997
+ hasMethod(client, address, EIP2612_PERMIT),
2998
+ checkPermit2Support(client)
2999
+ ]);
3000
+ const supportedMethods = [];
3001
+ if (hasEIP3009) {
3002
+ supportedMethods.push("eip3009");
3003
+ console.log(" \u2705 EIP-3009 (transferWithAuthorization) detected");
3004
+ }
3005
+ if (hasPermit) {
3006
+ supportedMethods.push("permit");
3007
+ console.log(" \u2705 EIP-2612 (permit) detected");
3008
+ }
3009
+ if (hasPermit2Approval) {
3010
+ supportedMethods.push("permit2");
3011
+ supportedMethods.push("permit2-witness");
3012
+ console.log(" \u2705 Permit2 support available (universal)");
3013
+ }
3014
+ if (supportedMethods.length === 0) {
3015
+ console.log(" \u26A0\uFE0F No advanced payment methods detected (standard ERC-20 only)");
3016
+ }
3017
+ return {
3018
+ address,
3019
+ supportedMethods,
3020
+ details: {
3021
+ hasEIP3009,
3022
+ hasPermit,
3023
+ hasPermit2Approval
3024
+ }
3025
+ };
3026
+ }
3027
+ async function getRecommendedPaymentMethod(tokenAddress, client) {
3028
+ const capabilities = await detectTokenPaymentMethods(tokenAddress, client);
3029
+ const { supportedMethods } = capabilities;
3030
+ if (supportedMethods.includes("eip3009")) return "eip3009";
3031
+ if (supportedMethods.includes("permit")) return "permit";
3032
+ if (supportedMethods.includes("permit2") || supportedMethods.includes("permit2-witness")) {
3033
+ return "permit2";
3034
+ }
3035
+ return null;
3036
+ }
3037
+ async function getTokenInfo(tokenAddress, client) {
3038
+ const address = tokenAddress.toLowerCase();
3039
+ const erc20ABI = [
3040
+ {
3041
+ inputs: [],
3042
+ name: "name",
3043
+ outputs: [{ name: "", type: "string" }],
3044
+ stateMutability: "view",
3045
+ type: "function"
3046
+ }
3047
+ ];
3048
+ const eip712DomainABI = [
3049
+ {
3050
+ inputs: [],
3051
+ name: "eip712Domain",
3052
+ outputs: [
3053
+ { name: "fields", type: "bytes1" },
3054
+ { name: "name", type: "string" },
3055
+ { name: "version", type: "string" },
3056
+ { name: "chainId", type: "uint256" },
3057
+ { name: "verifyingContract", type: "address" },
3058
+ { name: "salt", type: "bytes32" },
3059
+ { name: "extensions", type: "uint256[]" }
3060
+ ],
3061
+ stateMutability: "view",
3062
+ type: "function"
3063
+ }
3064
+ ];
3065
+ const versionABI = [
3066
+ {
3067
+ inputs: [],
3068
+ name: "version",
3069
+ outputs: [{ name: "", type: "string" }],
3070
+ stateMutability: "view",
3071
+ type: "function"
3072
+ }
3073
+ ];
3074
+ try {
3075
+ const name = await client.readContract({
3076
+ address,
3077
+ abi: erc20ABI,
3078
+ functionName: "name"
3079
+ });
3080
+ let version = "1";
3081
+ try {
3082
+ const result = await client.readContract({
3083
+ address,
3084
+ abi: eip712DomainABI,
3085
+ functionName: "eip712Domain"
3086
+ });
3087
+ version = result[2];
3088
+ } catch {
3089
+ try {
3090
+ version = await client.readContract({
3091
+ address,
3092
+ abi: versionABI,
3093
+ functionName: "version"
3094
+ });
3095
+ } catch {
3096
+ console.log(` \u2139\uFE0F Using default version "1" for token ${address}`);
3097
+ }
3098
+ }
3099
+ return {
3100
+ name,
3101
+ version
3102
+ };
3103
+ } catch (error) {
3104
+ console.error(`Error getting token info for ${address}:`, error);
3105
+ throw new Error(`Failed to get token info: ${error}`);
3106
+ }
3107
+ }
3108
+
2576
3109
  // src/schemes/exact/evm/index.ts
2577
3110
  async function verify4(client, payload, paymentRequirements) {
2578
3111
  const exactEvmPayload = payload.payload;