@x402/evm 2.3.1 → 2.4.0
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/exact/client/index.d.ts +2 -2
- package/dist/cjs/exact/client/index.js +159 -8
- package/dist/cjs/exact/client/index.js.map +1 -1
- package/dist/cjs/exact/facilitator/index.d.ts +1 -1
- package/dist/cjs/exact/facilitator/index.js +116 -26
- package/dist/cjs/exact/facilitator/index.js.map +1 -1
- package/dist/cjs/exact/v1/client/index.d.ts +1 -1
- package/dist/cjs/exact/v1/client/index.js.map +1 -1
- package/dist/cjs/exact/v1/facilitator/index.d.ts +1 -1
- package/dist/cjs/exact/v1/facilitator/index.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.js +168 -8
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/{permit2-BYv82va2.d.ts → permit2-CzKPU5By.d.ts} +32 -5
- package/dist/cjs/{signer-5OVDxViv.d.ts → signer-3KGwtdNT.d.ts} +52 -7
- package/dist/cjs/v1/index.d.ts +1 -1
- package/dist/cjs/v1/index.js.map +1 -1
- package/dist/esm/{chunk-E2YMUI3X.mjs → chunk-CJHYX7BQ.mjs} +141 -8
- package/dist/esm/chunk-CJHYX7BQ.mjs.map +1 -0
- package/dist/esm/{chunk-RPL6OFJL.mjs → chunk-GSU4DHTC.mjs} +21 -1
- package/dist/esm/chunk-GSU4DHTC.mjs.map +1 -0
- package/dist/esm/exact/client/index.d.mts +2 -2
- package/dist/esm/exact/client/index.mjs +2 -2
- package/dist/esm/exact/facilitator/index.d.mts +1 -1
- package/dist/esm/exact/facilitator/index.mjs +120 -27
- package/dist/esm/exact/facilitator/index.mjs.map +1 -1
- package/dist/esm/exact/v1/client/index.d.mts +1 -1
- package/dist/esm/exact/v1/client/index.mjs +1 -1
- package/dist/esm/exact/v1/facilitator/index.d.mts +1 -1
- package/dist/esm/exact/v1/facilitator/index.mjs +1 -1
- package/dist/esm/index.d.mts +2 -2
- package/dist/esm/index.mjs +14 -4
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/{permit2-BsAoJiWD.d.mts → permit2-C2FkNEHT.d.mts} +32 -5
- package/dist/esm/{signer-5OVDxViv.d.mts → signer-3KGwtdNT.d.mts} +52 -7
- package/dist/esm/v1/index.d.mts +1 -1
- package/dist/esm/v1/index.mjs +1 -1
- package/package.json +3 -2
- package/dist/esm/chunk-E2YMUI3X.mjs.map +0 -1
- package/dist/esm/chunk-RPL6OFJL.mjs.map +0 -1
|
@@ -470,6 +470,7 @@ async function settleEIP3009(signer, payload, requirements, eip3009Payload, conf
|
|
|
470
470
|
}
|
|
471
471
|
|
|
472
472
|
// src/exact/facilitator/permit2.ts
|
|
473
|
+
var import_extensions = require("@x402/extensions");
|
|
473
474
|
var import_viem2 = require("viem");
|
|
474
475
|
var erc20AllowanceABI = [
|
|
475
476
|
{
|
|
@@ -595,13 +596,36 @@ async function verifyPermit2(signer, payload, requirements, permit2Payload) {
|
|
|
595
596
|
args: [payer, PERMIT2_ADDRESS]
|
|
596
597
|
});
|
|
597
598
|
if (allowance < BigInt(requirements.amount)) {
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
599
|
+
const eip2612Info = (0, import_extensions.extractEip2612GasSponsoringInfo)(payload);
|
|
600
|
+
if (eip2612Info) {
|
|
601
|
+
const validationResult = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);
|
|
602
|
+
if (!validationResult.isValid) {
|
|
603
|
+
return {
|
|
604
|
+
isValid: false,
|
|
605
|
+
invalidReason: validationResult.invalidReason,
|
|
606
|
+
payer
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
} else {
|
|
610
|
+
return {
|
|
611
|
+
isValid: false,
|
|
612
|
+
invalidReason: "permit2_allowance_required",
|
|
613
|
+
payer
|
|
614
|
+
};
|
|
615
|
+
}
|
|
603
616
|
}
|
|
604
617
|
} catch {
|
|
618
|
+
const eip2612Info = (0, import_extensions.extractEip2612GasSponsoringInfo)(payload);
|
|
619
|
+
if (eip2612Info) {
|
|
620
|
+
const validationResult = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);
|
|
621
|
+
if (!validationResult.isValid) {
|
|
622
|
+
return {
|
|
623
|
+
isValid: false,
|
|
624
|
+
invalidReason: validationResult.invalidReason,
|
|
625
|
+
payer
|
|
626
|
+
};
|
|
627
|
+
}
|
|
628
|
+
}
|
|
605
629
|
}
|
|
606
630
|
try {
|
|
607
631
|
const balance = await signer.readContract({
|
|
@@ -639,28 +663,63 @@ async function settlePermit2(signer, payload, requirements, permit2Payload) {
|
|
|
639
663
|
};
|
|
640
664
|
}
|
|
641
665
|
try {
|
|
642
|
-
const
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
666
|
+
const eip2612Info = (0, import_extensions.extractEip2612GasSponsoringInfo)(payload);
|
|
667
|
+
let tx;
|
|
668
|
+
if (eip2612Info) {
|
|
669
|
+
const { v, r, s } = splitEip2612Signature(eip2612Info.signature);
|
|
670
|
+
tx = await signer.writeContract({
|
|
671
|
+
address: x402ExactPermit2ProxyAddress,
|
|
672
|
+
abi: x402ExactPermit2ProxyABI,
|
|
673
|
+
functionName: "settleWithPermit",
|
|
674
|
+
args: [
|
|
675
|
+
{
|
|
676
|
+
value: BigInt(eip2612Info.amount),
|
|
677
|
+
deadline: BigInt(eip2612Info.deadline),
|
|
678
|
+
r,
|
|
679
|
+
s,
|
|
680
|
+
v
|
|
651
681
|
},
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
682
|
+
{
|
|
683
|
+
permitted: {
|
|
684
|
+
token: (0, import_viem2.getAddress)(permit2Payload.permit2Authorization.permitted.token),
|
|
685
|
+
amount: BigInt(permit2Payload.permit2Authorization.permitted.amount)
|
|
686
|
+
},
|
|
687
|
+
nonce: BigInt(permit2Payload.permit2Authorization.nonce),
|
|
688
|
+
deadline: BigInt(permit2Payload.permit2Authorization.deadline)
|
|
689
|
+
},
|
|
690
|
+
(0, import_viem2.getAddress)(payer),
|
|
691
|
+
{
|
|
692
|
+
to: (0, import_viem2.getAddress)(permit2Payload.permit2Authorization.witness.to),
|
|
693
|
+
validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),
|
|
694
|
+
extra: permit2Payload.permit2Authorization.witness.extra
|
|
695
|
+
},
|
|
696
|
+
permit2Payload.signature
|
|
697
|
+
]
|
|
698
|
+
});
|
|
699
|
+
} else {
|
|
700
|
+
tx = await signer.writeContract({
|
|
701
|
+
address: x402ExactPermit2ProxyAddress,
|
|
702
|
+
abi: x402ExactPermit2ProxyABI,
|
|
703
|
+
functionName: "settle",
|
|
704
|
+
args: [
|
|
705
|
+
{
|
|
706
|
+
permitted: {
|
|
707
|
+
token: (0, import_viem2.getAddress)(permit2Payload.permit2Authorization.permitted.token),
|
|
708
|
+
amount: BigInt(permit2Payload.permit2Authorization.permitted.amount)
|
|
709
|
+
},
|
|
710
|
+
nonce: BigInt(permit2Payload.permit2Authorization.nonce),
|
|
711
|
+
deadline: BigInt(permit2Payload.permit2Authorization.deadline)
|
|
712
|
+
},
|
|
713
|
+
(0, import_viem2.getAddress)(payer),
|
|
714
|
+
{
|
|
715
|
+
to: (0, import_viem2.getAddress)(permit2Payload.permit2Authorization.witness.to),
|
|
716
|
+
validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),
|
|
717
|
+
extra: permit2Payload.permit2Authorization.witness.extra
|
|
718
|
+
},
|
|
719
|
+
permit2Payload.signature
|
|
720
|
+
]
|
|
721
|
+
});
|
|
722
|
+
}
|
|
664
723
|
const receipt = await signer.waitForTransactionReceipt({ hash: tx });
|
|
665
724
|
if (receipt.status !== "success") {
|
|
666
725
|
return {
|
|
@@ -706,6 +765,37 @@ async function settlePermit2(signer, payload, requirements, permit2Payload) {
|
|
|
706
765
|
};
|
|
707
766
|
}
|
|
708
767
|
}
|
|
768
|
+
function validateEip2612PermitForPayment(info, payer, tokenAddress) {
|
|
769
|
+
if (!(0, import_extensions.validateEip2612GasSponsoringInfo)(info)) {
|
|
770
|
+
return { isValid: false, invalidReason: "invalid_eip2612_extension_format" };
|
|
771
|
+
}
|
|
772
|
+
if ((0, import_viem2.getAddress)(info.from) !== (0, import_viem2.getAddress)(payer)) {
|
|
773
|
+
return { isValid: false, invalidReason: "eip2612_from_mismatch" };
|
|
774
|
+
}
|
|
775
|
+
if ((0, import_viem2.getAddress)(info.asset) !== tokenAddress) {
|
|
776
|
+
return { isValid: false, invalidReason: "eip2612_asset_mismatch" };
|
|
777
|
+
}
|
|
778
|
+
if ((0, import_viem2.getAddress)(info.spender) !== (0, import_viem2.getAddress)(PERMIT2_ADDRESS)) {
|
|
779
|
+
return { isValid: false, invalidReason: "eip2612_spender_not_permit2" };
|
|
780
|
+
}
|
|
781
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
782
|
+
if (BigInt(info.deadline) < BigInt(now + 6)) {
|
|
783
|
+
return { isValid: false, invalidReason: "eip2612_deadline_expired" };
|
|
784
|
+
}
|
|
785
|
+
return { isValid: true };
|
|
786
|
+
}
|
|
787
|
+
function splitEip2612Signature(signature) {
|
|
788
|
+
const sig = signature.startsWith("0x") ? signature.slice(2) : signature;
|
|
789
|
+
if (sig.length !== 130) {
|
|
790
|
+
throw new Error(
|
|
791
|
+
`invalid EIP-2612 signature length: expected 65 bytes (130 hex chars), got ${sig.length / 2} bytes`
|
|
792
|
+
);
|
|
793
|
+
}
|
|
794
|
+
const r = `0x${sig.slice(0, 64)}`;
|
|
795
|
+
const s = `0x${sig.slice(64, 128)}`;
|
|
796
|
+
const v = parseInt(sig.slice(128, 130), 16);
|
|
797
|
+
return { v, r, s };
|
|
798
|
+
}
|
|
709
799
|
|
|
710
800
|
// src/exact/facilitator/scheme.ts
|
|
711
801
|
var ExactEvmScheme = class {
|