@wtflabs/x402 0.0.1-beta.1 → 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.
- package/dist/cjs/client/index.d.ts +1 -1
- package/dist/cjs/client/index.js +7 -2
- package/dist/cjs/client/index.js.map +1 -1
- package/dist/cjs/facilitator/index.d.ts +1 -1
- package/dist/cjs/facilitator/index.js +444 -87
- package/dist/cjs/facilitator/index.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +445 -88
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/{middleware-Brgsx32F.d.ts → middleware-nzDe-TDJ.d.ts} +1 -1
- package/dist/cjs/paywall/index.d.ts +1 -1
- package/dist/cjs/schemes/index.d.ts +81 -9
- package/dist/cjs/schemes/index.js +633 -100
- package/dist/cjs/schemes/index.js.map +1 -1
- package/dist/cjs/shared/index.d.ts +2 -2
- package/dist/cjs/shared/index.js +6 -1
- package/dist/cjs/shared/index.js.map +1 -1
- package/dist/cjs/types/index.d.ts +93 -4
- package/dist/cjs/types/index.js +64 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/verify/index.d.ts +2 -2
- package/dist/cjs/verify/index.js +6 -1
- package/dist/cjs/verify/index.js.map +1 -1
- package/dist/{esm/x402Specs-CYq5tSY1.d.mts → cjs/x402Specs-BtRXj67U.d.ts} +43 -10
- package/dist/esm/{chunk-34YNR4LY.mjs → chunk-KABV25HJ.mjs} +3 -3
- package/dist/esm/{chunk-LGXWNXCO.mjs → chunk-LXLCF4IW.mjs} +3 -3
- package/dist/esm/{chunk-UCBE7FDY.mjs → chunk-NPWDNT2P.mjs} +67 -2
- package/dist/esm/chunk-NPWDNT2P.mjs.map +1 -0
- package/dist/esm/{chunk-RX2JKK4O.mjs → chunk-VTLJOZXM.mjs} +3 -3
- package/dist/esm/chunk-VTLJOZXM.mjs.map +1 -0
- package/dist/esm/{chunk-57UEJN5U.mjs → chunk-XGQBEMP7.mjs} +589 -103
- package/dist/esm/chunk-XGQBEMP7.mjs.map +1 -0
- package/dist/esm/client/index.d.mts +1 -1
- package/dist/esm/client/index.mjs +3 -3
- package/dist/esm/facilitator/index.d.mts +1 -1
- package/dist/esm/facilitator/index.mjs +4 -4
- package/dist/esm/index.d.mts +1 -1
- package/dist/esm/index.mjs +5 -5
- package/dist/esm/{middleware-BSjsPDKM.d.mts → middleware-DSDucaQ5.d.mts} +1 -1
- package/dist/esm/paywall/index.d.mts +1 -1
- package/dist/esm/schemes/index.d.mts +81 -9
- package/dist/esm/schemes/index.mjs +3 -3
- package/dist/esm/shared/index.d.mts +2 -2
- package/dist/esm/shared/index.mjs +1 -1
- package/dist/esm/types/index.d.mts +93 -4
- package/dist/esm/types/index.mjs +1 -1
- package/dist/esm/verify/index.d.mts +2 -2
- package/dist/esm/verify/index.mjs +1 -1
- package/dist/{cjs/x402Specs-CYq5tSY1.d.ts → esm/x402Specs-BtRXj67U.d.mts} +43 -10
- package/package.json +15 -15
- package/dist/cjs/middleware-6_1ApcJn.d.ts +0 -93
- package/dist/cjs/middleware-B_ewwsQp.d.ts +0 -93
- package/dist/cjs/middleware-BwfW7mAs.d.ts +0 -93
- package/dist/cjs/middleware-CQb61c1k.d.ts +0 -93
- package/dist/cjs/middleware-DB9lqy9f.d.ts +0 -93
- package/dist/cjs/middleware-DcHctwQV.d.ts +0 -93
- package/dist/cjs/middleware-De0jD3Bp.d.ts +0 -93
- package/dist/cjs/middleware-HoFOmpgv.d.ts +0 -93
- package/dist/cjs/middleware-Y8AiAfYw.d.ts +0 -93
- package/dist/cjs/middleware-pnres9YM.d.ts +0 -93
- package/dist/cjs/network-RtNddYQk.d.ts +0 -11
- package/dist/cjs/rpc-Ca8eHCWz.d.ts +0 -35
- package/dist/cjs/wallet-BRWfOM5D.d.ts +0 -153
- package/dist/cjs/wallet-BYRAGtOB.d.ts +0 -153
- package/dist/cjs/wallet-BmEtlgEf.d.ts +0 -48
- package/dist/cjs/wallet-CNOAmyZ6.d.ts +0 -48
- package/dist/cjs/wallet-D1SoxFTw.d.ts +0 -48
- package/dist/cjs/wallet-SJ-hbjm9.d.ts +0 -153
- package/dist/cjs/wallet-ecnda4Aj.d.ts +0 -48
- package/dist/cjs/wallet-gP8Qoi-c.d.ts +0 -74
- package/dist/cjs/x402Specs-B7InXo2L.d.ts +0 -1065
- package/dist/cjs/x402Specs-BLH3j34O.d.ts +0 -1696
- package/dist/cjs/x402Specs-C7LipAZg.d.ts +0 -1715
- package/dist/cjs/x402Specs-CeajqonG.d.ts +0 -1696
- package/dist/cjs/x402Specs-qMujgEV5.d.ts +0 -1715
- package/dist/cjs/x402Specs-qUBCpcuz.d.ts +0 -1715
- package/dist/esm/chunk-57UEJN5U.mjs.map +0 -1
- package/dist/esm/chunk-RX2JKK4O.mjs.map +0 -1
- package/dist/esm/chunk-UCBE7FDY.mjs.map +0 -1
- /package/dist/esm/{chunk-34YNR4LY.mjs.map → chunk-KABV25HJ.mjs.map} +0 -0
- /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
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
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
|
|
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?.
|
|
1901
|
-
if ((0, import_viem4.getAddress)(spender) !== (0, import_viem4.getAddress)(paymentRequirements.extra?.
|
|
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?.
|
|
2260
|
+
if (paymentRequirements.extra?.relayer) {
|
|
1966
2261
|
transactionHash = await wallet.writeContract({
|
|
1967
|
-
address: paymentRequirements.extra.
|
|
2262
|
+
address: paymentRequirements.extra.relayer,
|
|
1968
2263
|
abi: permitProxyContractABI,
|
|
1969
|
-
functionName: "
|
|
2264
|
+
functionName: "settleWithPermit",
|
|
1970
2265
|
args: [
|
|
1971
2266
|
tokenAddress,
|
|
2267
|
+
// token
|
|
1972
2268
|
owner,
|
|
1973
|
-
|
|
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
|
-
|
|
1979
|
-
|
|
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
|
|
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
|
|
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
|
|
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;
|