@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.
- 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 +25 -7
- package/dist/cjs/schemes/index.js +477 -95
- 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-G6WN2WYX.mjs → chunk-3SCH5JL2.mjs} +433 -98
- package/dist/esm/chunk-3SCH5JL2.mjs.map +1 -0
- package/dist/esm/{chunk-2AM3S66N.mjs → chunk-7MNUQUHN.mjs} +3 -3
- package/dist/esm/{chunk-34YNR4LY.mjs → chunk-KABV25HJ.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/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 +25 -7
- 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-G6WN2WYX.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-2AM3S66N.mjs.map → chunk-7MNUQUHN.mjs.map} +0 -0
- /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
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
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?.
|
|
1897
|
-
if ((0, import_viem4.getAddress)(spender) !== (0, import_viem4.getAddress)(paymentRequirements.extra?.
|
|
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?.
|
|
2257
|
+
if (paymentRequirements.extra?.relayer) {
|
|
1962
2258
|
transactionHash = await wallet.writeContract({
|
|
1963
|
-
address: paymentRequirements.extra.
|
|
2259
|
+
address: paymentRequirements.extra.relayer,
|
|
1964
2260
|
abi: permitProxyContractABI,
|
|
1965
|
-
functionName: "
|
|
2261
|
+
functionName: "settleWithPermit",
|
|
1966
2262
|
args: [
|
|
1967
2263
|
tokenAddress,
|
|
2264
|
+
// token
|
|
1968
2265
|
owner,
|
|
1969
|
-
|
|
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
|
-
|
|
1975
|
-
|
|
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
|
|
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
|
|
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?.
|
|
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
|
|
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
|
};
|