@x402/evm 2.3.0 → 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.
Files changed (47) hide show
  1. package/dist/cjs/exact/client/index.d.ts +2 -2
  2. package/dist/cjs/exact/client/index.js +161 -9
  3. package/dist/cjs/exact/client/index.js.map +1 -1
  4. package/dist/cjs/exact/facilitator/index.d.ts +1 -1
  5. package/dist/cjs/exact/facilitator/index.js +118 -27
  6. package/dist/cjs/exact/facilitator/index.js.map +1 -1
  7. package/dist/cjs/exact/server/index.js +8 -1
  8. package/dist/cjs/exact/server/index.js.map +1 -1
  9. package/dist/cjs/exact/v1/client/index.d.ts +1 -1
  10. package/dist/cjs/exact/v1/client/index.js +2 -1
  11. package/dist/cjs/exact/v1/client/index.js.map +1 -1
  12. package/dist/cjs/exact/v1/facilitator/index.d.ts +1 -1
  13. package/dist/cjs/exact/v1/facilitator/index.js +2 -1
  14. package/dist/cjs/exact/v1/facilitator/index.js.map +1 -1
  15. package/dist/cjs/index.d.ts +2 -2
  16. package/dist/cjs/index.js +170 -9
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/{permit2-BYv82va2.d.ts → permit2-CzKPU5By.d.ts} +32 -5
  19. package/dist/cjs/{signer-5OVDxViv.d.ts → signer-3KGwtdNT.d.ts} +52 -7
  20. package/dist/cjs/v1/index.d.ts +2 -1
  21. package/dist/cjs/v1/index.js +2 -1
  22. package/dist/cjs/v1/index.js.map +1 -1
  23. package/dist/esm/{chunk-U4H6Q62Q.mjs → chunk-CJHYX7BQ.mjs} +141 -8
  24. package/dist/esm/chunk-CJHYX7BQ.mjs.map +1 -0
  25. package/dist/esm/{chunk-DSSJHWGT.mjs → chunk-GSU4DHTC.mjs} +23 -2
  26. package/dist/esm/chunk-GSU4DHTC.mjs.map +1 -0
  27. package/dist/esm/exact/client/index.d.mts +2 -2
  28. package/dist/esm/exact/client/index.mjs +2 -2
  29. package/dist/esm/exact/facilitator/index.d.mts +1 -1
  30. package/dist/esm/exact/facilitator/index.mjs +120 -27
  31. package/dist/esm/exact/facilitator/index.mjs.map +1 -1
  32. package/dist/esm/exact/server/index.mjs +8 -1
  33. package/dist/esm/exact/server/index.mjs.map +1 -1
  34. package/dist/esm/exact/v1/client/index.d.mts +1 -1
  35. package/dist/esm/exact/v1/client/index.mjs +1 -1
  36. package/dist/esm/exact/v1/facilitator/index.d.mts +1 -1
  37. package/dist/esm/exact/v1/facilitator/index.mjs +1 -1
  38. package/dist/esm/index.d.mts +2 -2
  39. package/dist/esm/index.mjs +14 -4
  40. package/dist/esm/index.mjs.map +1 -1
  41. package/dist/esm/{permit2-BsAoJiWD.d.mts → permit2-C2FkNEHT.d.mts} +32 -5
  42. package/dist/esm/{signer-5OVDxViv.d.mts → signer-3KGwtdNT.d.mts} +52 -7
  43. package/dist/esm/v1/index.d.mts +2 -1
  44. package/dist/esm/v1/index.mjs +1 -1
  45. package/package.json +3 -2
  46. package/dist/esm/chunk-DSSJHWGT.mjs.map +0 -1
  47. package/dist/esm/chunk-U4H6Q62Q.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
- return {
599
- isValid: false,
600
- invalidReason: "permit2_allowance_required",
601
- payer
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 tx = await signer.writeContract({
643
- address: x402ExactPermit2ProxyAddress,
644
- abi: x402ExactPermit2ProxyABI,
645
- functionName: "settle",
646
- args: [
647
- {
648
- permitted: {
649
- token: (0, import_viem2.getAddress)(permit2Payload.permit2Authorization.permitted.token),
650
- amount: BigInt(permit2Payload.permit2Authorization.permitted.amount)
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
- nonce: BigInt(permit2Payload.permit2Authorization.nonce),
653
- deadline: BigInt(permit2Payload.permit2Authorization.deadline)
654
- },
655
- (0, import_viem2.getAddress)(payer),
656
- {
657
- to: (0, import_viem2.getAddress)(permit2Payload.permit2Authorization.witness.to),
658
- validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),
659
- extra: permit2Payload.permit2Authorization.witness.extra
660
- },
661
- permit2Payload.signature
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 {
@@ -804,7 +894,8 @@ var EVM_NETWORK_CHAIN_ID_MAP = {
804
894
  peaq: 3338,
805
895
  story: 1514,
806
896
  educhain: 41923,
807
- "skale-base-sepolia": 324705682
897
+ "skale-base-sepolia": 324705682,
898
+ megaeth: 4326
808
899
  };
809
900
  var NETWORKS = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);
810
901