@payai/x402-evm 2.4.1 → 2.4.3

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 (143) hide show
  1. package/dist/cjs/batch-settlement/client/file-storage.d.ts +47 -0
  2. package/dist/cjs/batch-settlement/client/file-storage.js +116 -0
  3. package/dist/cjs/batch-settlement/client/file-storage.js.map +1 -0
  4. package/dist/cjs/batch-settlement/client/index.d.ts +111 -0
  5. package/dist/cjs/batch-settlement/client/index.js +1565 -0
  6. package/dist/cjs/batch-settlement/client/index.js.map +1 -0
  7. package/dist/cjs/batch-settlement/facilitator/index.d.ts +71 -0
  8. package/dist/cjs/batch-settlement/facilitator/index.js +2032 -0
  9. package/dist/cjs/batch-settlement/facilitator/index.js.map +1 -0
  10. package/dist/cjs/batch-settlement/server/file-storage.d.ts +53 -0
  11. package/dist/cjs/batch-settlement/server/file-storage.js +181 -0
  12. package/dist/cjs/batch-settlement/server/file-storage.js.map +1 -0
  13. package/dist/cjs/batch-settlement/server/index.d.ts +491 -0
  14. package/dist/cjs/batch-settlement/server/index.js +1960 -0
  15. package/dist/cjs/batch-settlement/server/index.js.map +1 -0
  16. package/dist/cjs/batch-settlement/server/redis-storage.d.ts +87 -0
  17. package/dist/cjs/batch-settlement/server/redis-storage.js +181 -0
  18. package/dist/cjs/batch-settlement/server/redis-storage.js.map +1 -0
  19. package/dist/cjs/exact/client/index.d.ts +6 -4
  20. package/dist/cjs/exact/client/index.js +7 -5
  21. package/dist/cjs/exact/client/index.js.map +1 -1
  22. package/dist/cjs/exact/facilitator/index.d.ts +16 -9
  23. package/dist/cjs/exact/facilitator/index.js +35 -7
  24. package/dist/cjs/exact/facilitator/index.js.map +1 -1
  25. package/dist/cjs/exact/server/index.js +40 -1
  26. package/dist/cjs/exact/server/index.js.map +1 -1
  27. package/dist/cjs/exact/v1/client/index.d.ts +2 -1
  28. package/dist/cjs/exact/v1/client/index.js.map +1 -1
  29. package/dist/cjs/exact/v1/facilitator/index.d.ts +11 -5
  30. package/dist/cjs/exact/v1/facilitator/index.js +16 -2
  31. package/dist/cjs/exact/v1/facilitator/index.js.map +1 -1
  32. package/dist/cjs/index.d.ts +113 -7
  33. package/dist/cjs/index.js +1353 -5
  34. package/dist/cjs/index.js.map +1 -1
  35. package/dist/{esm/permit2-CyZxwngN.d.mts → cjs/permit2-DhJRUcgY.d.ts} +1 -13
  36. package/dist/cjs/rpc-DULZzRne.d.ts +13 -0
  37. package/dist/cjs/scheme-CvkPJXBD.d.ts +307 -0
  38. package/dist/{esm/scheme-DCR7hsa3.d.mts → cjs/scheme-DTQFE9xp.d.ts} +2 -2
  39. package/dist/{esm/signer-D912R4mq.d.mts → cjs/signer-tYS6Y46X.d.ts} +3 -0
  40. package/dist/cjs/storage-6W5MO46W.d.ts +50 -0
  41. package/dist/cjs/storage-Bl6aD0Xg.d.ts +81 -0
  42. package/dist/cjs/types-CF8P2-NM.d.ts +180 -0
  43. package/dist/cjs/upto/client/index.d.ts +5 -3
  44. package/dist/cjs/upto/client/index.js +7 -5
  45. package/dist/cjs/upto/client/index.js.map +1 -1
  46. package/dist/cjs/upto/facilitator/index.d.ts +2 -1
  47. package/dist/cjs/upto/facilitator/index.js +2 -1
  48. package/dist/cjs/upto/facilitator/index.js.map +1 -1
  49. package/dist/cjs/upto/server/index.js +40 -1
  50. package/dist/cjs/upto/server/index.js.map +1 -1
  51. package/dist/cjs/v1/index.d.ts +2 -1
  52. package/dist/cjs/v1/index.js.map +1 -1
  53. package/dist/esm/batch-settlement/client/file-storage.d.mts +47 -0
  54. package/dist/esm/batch-settlement/client/file-storage.mjs +63 -0
  55. package/dist/esm/batch-settlement/client/file-storage.mjs.map +1 -0
  56. package/dist/esm/batch-settlement/client/index.d.mts +111 -0
  57. package/dist/esm/batch-settlement/client/index.mjs +59 -0
  58. package/dist/esm/batch-settlement/client/index.mjs.map +1 -0
  59. package/dist/esm/batch-settlement/facilitator/index.d.mts +71 -0
  60. package/dist/esm/batch-settlement/facilitator/index.mjs +1235 -0
  61. package/dist/esm/batch-settlement/facilitator/index.mjs.map +1 -0
  62. package/dist/esm/batch-settlement/server/file-storage.d.mts +53 -0
  63. package/dist/esm/batch-settlement/server/file-storage.mjs +128 -0
  64. package/dist/esm/batch-settlement/server/file-storage.mjs.map +1 -0
  65. package/dist/esm/batch-settlement/server/index.d.mts +491 -0
  66. package/dist/esm/batch-settlement/server/index.mjs +1645 -0
  67. package/dist/esm/batch-settlement/server/index.mjs.map +1 -0
  68. package/dist/esm/batch-settlement/server/redis-storage.d.mts +87 -0
  69. package/dist/esm/batch-settlement/server/redis-storage.mjs +156 -0
  70. package/dist/esm/batch-settlement/server/redis-storage.mjs.map +1 -0
  71. package/dist/esm/chunk-2EUQTNJO.mjs +38 -0
  72. package/dist/esm/chunk-2EUQTNJO.mjs.map +1 -0
  73. package/dist/esm/chunk-53USC5VE.mjs +47 -0
  74. package/dist/esm/chunk-53USC5VE.mjs.map +1 -0
  75. package/dist/esm/{chunk-GJ57SZGI.mjs → chunk-6WQOGWBE.mjs} +7 -5
  76. package/dist/esm/{chunk-GJ57SZGI.mjs.map → chunk-6WQOGWBE.mjs.map} +1 -1
  77. package/dist/esm/{chunk-F3OOHBAW.mjs → chunk-BTYNCDNS.mjs} +42 -2
  78. package/dist/esm/{chunk-F3OOHBAW.mjs.map → chunk-BTYNCDNS.mjs.map} +1 -1
  79. package/dist/esm/{chunk-ERK2ZPOY.mjs → chunk-CSQS7ZON.mjs} +27 -7
  80. package/dist/esm/chunk-CSQS7ZON.mjs.map +1 -0
  81. package/dist/esm/chunk-GD4MKCN7.mjs +57 -0
  82. package/dist/esm/chunk-GD4MKCN7.mjs.map +1 -0
  83. package/dist/esm/chunk-HYABYUBD.mjs +432 -0
  84. package/dist/esm/chunk-HYABYUBD.mjs.map +1 -0
  85. package/dist/esm/chunk-IN5YIT5C.mjs +159 -0
  86. package/dist/esm/chunk-IN5YIT5C.mjs.map +1 -0
  87. package/dist/esm/{chunk-JII456TS.mjs → chunk-JK7SLLF7.mjs} +1 -1
  88. package/dist/esm/chunk-JK7SLLF7.mjs.map +1 -0
  89. package/dist/esm/{chunk-C4ZQMS77.mjs → chunk-MACPBXCT.mjs} +2 -216
  90. package/dist/esm/chunk-MACPBXCT.mjs.map +1 -0
  91. package/dist/esm/chunk-NKYVYGRA.mjs +911 -0
  92. package/dist/esm/chunk-NKYVYGRA.mjs.map +1 -0
  93. package/dist/esm/{chunk-FQJR4RCF.mjs → chunk-R7I3RZFF.mjs} +10 -6
  94. package/dist/esm/{chunk-FQJR4RCF.mjs.map → chunk-R7I3RZFF.mjs.map} +1 -1
  95. package/dist/esm/{chunk-CRT6YNY5.mjs → chunk-RWLVVO3B.mjs} +21 -61
  96. package/dist/esm/chunk-RWLVVO3B.mjs.map +1 -0
  97. package/dist/esm/chunk-TGFAVNUD.mjs +111 -0
  98. package/dist/esm/chunk-TGFAVNUD.mjs.map +1 -0
  99. package/dist/esm/chunk-TW7Z65AO.mjs +34 -0
  100. package/dist/esm/chunk-TW7Z65AO.mjs.map +1 -0
  101. package/dist/esm/chunk-U4HCGTLU.mjs +35 -0
  102. package/dist/esm/chunk-U4HCGTLU.mjs.map +1 -0
  103. package/dist/esm/chunk-VS3RYAYE.mjs +80 -0
  104. package/dist/esm/chunk-VS3RYAYE.mjs.map +1 -0
  105. package/dist/esm/chunk-W6ON4LG2.mjs +39 -0
  106. package/dist/esm/chunk-W6ON4LG2.mjs.map +1 -0
  107. package/dist/esm/{chunk-WKBC5YMI.mjs → chunk-YMQCTKDU.mjs} +23 -55
  108. package/dist/esm/chunk-YMQCTKDU.mjs.map +1 -0
  109. package/dist/esm/exact/client/index.d.mts +6 -4
  110. package/dist/esm/exact/client/index.mjs +10 -5
  111. package/dist/esm/exact/facilitator/index.d.mts +16 -9
  112. package/dist/esm/exact/facilitator/index.mjs +36 -14
  113. package/dist/esm/exact/facilitator/index.mjs.map +1 -1
  114. package/dist/esm/exact/server/index.mjs +1 -1
  115. package/dist/esm/exact/v1/client/index.d.mts +2 -1
  116. package/dist/esm/exact/v1/client/index.mjs +5 -2
  117. package/dist/esm/exact/v1/facilitator/index.d.mts +11 -5
  118. package/dist/esm/exact/v1/facilitator/index.mjs +5 -2
  119. package/dist/esm/index.d.mts +113 -7
  120. package/dist/esm/index.mjs +53 -7
  121. package/dist/esm/index.mjs.map +1 -1
  122. package/dist/esm/permit2-DhJRUcgY.d.mts +729 -0
  123. package/dist/esm/rpc-DULZzRne.d.mts +13 -0
  124. package/dist/esm/scheme-DtbSS4Fk.d.mts +307 -0
  125. package/dist/esm/scheme-gtqAIYPJ.d.mts +47 -0
  126. package/dist/esm/signer-tYS6Y46X.d.mts +170 -0
  127. package/dist/esm/storage-6W5MO46W.d.mts +50 -0
  128. package/dist/esm/storage-sZ1CDS4P.d.mts +81 -0
  129. package/dist/esm/types-CF8P2-NM.d.mts +180 -0
  130. package/dist/esm/upto/client/index.d.mts +5 -3
  131. package/dist/esm/upto/client/index.mjs +9 -4
  132. package/dist/esm/upto/facilitator/index.d.mts +2 -1
  133. package/dist/esm/upto/facilitator/index.mjs +17 -9
  134. package/dist/esm/upto/facilitator/index.mjs.map +1 -1
  135. package/dist/esm/upto/server/index.mjs +1 -1
  136. package/dist/esm/v1/index.d.mts +2 -1
  137. package/dist/esm/v1/index.mjs +5 -2
  138. package/package.json +5 -5
  139. package/dist/esm/chunk-C4ZQMS77.mjs.map +0 -1
  140. package/dist/esm/chunk-CRT6YNY5.mjs.map +0 -1
  141. package/dist/esm/chunk-ERK2ZPOY.mjs.map +0 -1
  142. package/dist/esm/chunk-JII456TS.mjs.map +0 -1
  143. package/dist/esm/chunk-WKBC5YMI.mjs.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  isPermit2Payload
3
- } from "../../chunk-JII456TS.mjs";
3
+ } from "../../chunk-JK7SLLF7.mjs";
4
+ import "../../chunk-U4HCGTLU.mjs";
4
5
  import {
5
6
  ExactEvmSchemeV1,
6
7
  NETWORKS,
@@ -8,16 +9,12 @@ import {
8
9
  executeTransferWithAuthorization,
9
10
  parseEip3009TransferError,
10
11
  simulateEip3009Transfer
11
- } from "../../chunk-ERK2ZPOY.mjs";
12
+ } from "../../chunk-CSQS7ZON.mjs";
12
13
  import {
13
- ERC20_APPROVAL_GAS_SPONSORING_KEY,
14
14
  buildExactPermit2SettleArgs,
15
15
  checkPermit2Prerequisites,
16
16
  diagnosePermit2SimulationFailure,
17
- extractEip2612GasSponsoringInfo,
18
- extractErc20ApprovalGasSponsoringInfo,
19
17
  mapSettleError,
20
- resolveErc20ApprovalExtensionSigner,
21
18
  simulatePermit2Settle,
22
19
  simulatePermit2SettleWithErc20Approval,
23
20
  simulatePermit2SettleWithPermit,
@@ -25,8 +22,15 @@ import {
25
22
  validateEip2612PermitForPayment,
26
23
  validateErc20ApprovalForPayment,
27
24
  waitAndReturnSettleResponse
28
- } from "../../chunk-CRT6YNY5.mjs";
25
+ } from "../../chunk-RWLVVO3B.mjs";
29
26
  import {
27
+ ERC20_APPROVAL_GAS_SPONSORING_KEY,
28
+ extractEip2612GasSponsoringInfo,
29
+ extractErc20ApprovalGasSponsoringInfo,
30
+ resolveErc20ApprovalExtensionSigner
31
+ } from "../../chunk-GD4MKCN7.mjs";
32
+ import {
33
+ ErrFactoryNotAllowed,
30
34
  ErrInvalidAuthorizationValue,
31
35
  ErrInvalidScheme,
32
36
  ErrInvalidSignature,
@@ -44,14 +48,19 @@ import {
44
48
  ErrUndeployedSmartWallet,
45
49
  ErrUnsupportedPayloadType,
46
50
  ErrValidAfterInFuture,
47
- ErrValidBeforeExpired,
51
+ ErrValidBeforeExpired
52
+ } from "../../chunk-TGFAVNUD.mjs";
53
+ import {
48
54
  PERMIT2_ADDRESS,
49
55
  authorizationTypes,
50
- getEvmChainId,
51
56
  permit2WitnessTypes,
52
57
  x402ExactPermit2ProxyABI,
53
58
  x402ExactPermit2ProxyAddress
54
- } from "../../chunk-C4ZQMS77.mjs";
59
+ } from "../../chunk-MACPBXCT.mjs";
60
+ import "../../chunk-VS3RYAYE.mjs";
61
+ import {
62
+ getEvmChainId
63
+ } from "../../chunk-TW7Z65AO.mjs";
55
64
 
56
65
  // src/exact/facilitator/eip3009.ts
57
66
  import { getAddress, isAddressEqual, parseErc6492Signature } from "viem";
@@ -208,9 +217,22 @@ async function settleEIP3009(signer, payload, requirements, eip3009Payload, conf
208
217
  const { address: factoryAddress, data: factoryCalldata } = parseErc6492Signature(
209
218
  eip3009Payload.signature
210
219
  );
211
- if (config.deployERC4337WithEIP6492 && factoryAddress && factoryCalldata && !isAddressEqual(factoryAddress, "0x0000000000000000000000000000000000000000")) {
220
+ if (factoryAddress && factoryCalldata && !isAddressEqual(factoryAddress, "0x0000000000000000000000000000000000000000")) {
212
221
  const bytecode = await signer.getCode({ address: payer });
213
222
  if (!bytecode || bytecode === "0x") {
223
+ const normalizedFactory = factoryAddress.toLowerCase();
224
+ const isAllowed = (config.eip6492AllowedFactories ?? []).some(
225
+ (allowed) => allowed.toLowerCase() === normalizedFactory
226
+ );
227
+ if (!isAllowed) {
228
+ return {
229
+ success: false,
230
+ errorReason: ErrFactoryNotAllowed,
231
+ transaction: "",
232
+ network: payload.accepted.network,
233
+ payer
234
+ };
235
+ }
214
236
  const deployTx = await signer.sendTransaction({
215
237
  to: factoryAddress,
216
238
  data: factoryCalldata
@@ -553,7 +575,7 @@ var ExactEvmScheme = class {
553
575
  this.scheme = "exact";
554
576
  this.caipFamily = "eip155:*";
555
577
  this.config = {
556
- deployERC4337WithEIP6492: config?.deployERC4337WithEIP6492 ?? false,
578
+ eip6492AllowedFactories: config?.eip6492AllowedFactories ?? [],
557
579
  simulateInSettle: config?.simulateInSettle ?? false
558
580
  };
559
581
  }
@@ -618,14 +640,14 @@ function registerExactEvmScheme(facilitator, config) {
618
640
  facilitator.register(
619
641
  config.networks,
620
642
  new ExactEvmScheme(config.signer, {
621
- deployERC4337WithEIP6492: config.deployERC4337WithEIP6492,
643
+ eip6492AllowedFactories: config.eip6492AllowedFactories,
622
644
  simulateInSettle: config.simulateInSettle
623
645
  })
624
646
  );
625
647
  facilitator.registerV1(
626
648
  NETWORKS,
627
649
  new ExactEvmSchemeV1(config.signer, {
628
- deployERC4337WithEIP6492: config.deployERC4337WithEIP6492,
650
+ eip6492AllowedFactories: config.eip6492AllowedFactories,
629
651
  simulateInSettle: config.simulateInSettle
630
652
  })
631
653
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/exact/facilitator/eip3009.ts","../../../../src/exact/facilitator/permit2.ts","../../../../src/exact/facilitator/scheme.ts","../../../../src/exact/facilitator/register.ts"],"sourcesContent":["import {\n PaymentPayload,\n PaymentRequirements,\n SettleResponse,\n VerifyResponse,\n} from \"@payai/x402/types\";\nimport { getAddress, Hex, isAddressEqual, parseErc6492Signature } from \"viem\";\nimport { authorizationTypes } from \"../../constants\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { getEvmChainId } from \"../../utils\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport * as Errors from \"./errors\";\nimport {\n diagnoseEip3009SimulationFailure,\n executeTransferWithAuthorization,\n parseEip3009TransferError,\n simulateEip3009Transfer,\n} from \"./eip3009-utils\";\n\nexport interface VerifyEIP3009Options {\n /** Run onchain simulation. Defaults to true. */\n simulate?: boolean;\n}\n\nexport interface EIP3009FacilitatorConfig {\n /**\n * If enabled, the facilitator will deploy ERC-4337 smart wallets\n * via EIP-6492 when encountering undeployed contract signatures.\n *\n * @default false\n */\n deployERC4337WithEIP6492: boolean;\n /**\n * If enabled, simulates transaction before settling. Defaults to false, ie only simulate during verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * Verifies an EIP-3009 payment payload.\n *\n * @param signer - The facilitator signer for contract reads\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param eip3009Payload - The EIP-3009 specific payload\n * @param options - Optional verification options\n * @returns Promise resolving to verification response\n */\nexport async function verifyEIP3009(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n eip3009Payload: ExactEIP3009Payload,\n options?: VerifyEIP3009Options,\n): Promise<VerifyResponse> {\n const payer = eip3009Payload.authorization.from;\n let eip6492Deployment:\n | { factoryAddress: `0x${string}`; factoryCalldata: `0x${string}` }\n | undefined;\n\n // Verify scheme matches\n if (payload.accepted.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidScheme,\n payer,\n };\n }\n\n // Get chain configuration\n if (!requirements.extra?.name || !requirements.extra?.version) {\n return {\n isValid: false,\n invalidReason: Errors.ErrMissingEip712Domain,\n payer,\n };\n }\n\n const { name, version } = requirements.extra;\n const erc20Address = getAddress(requirements.asset);\n\n // Verify network matches\n if (payload.accepted.network !== requirements.network) {\n return {\n isValid: false,\n invalidReason: Errors.ErrNetworkMismatch,\n payer,\n };\n }\n\n // Build typed data for signature verification\n const permitTypedData = {\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\" as const,\n domain: {\n name,\n version,\n chainId: getEvmChainId(requirements.network),\n verifyingContract: erc20Address,\n },\n message: {\n from: eip3009Payload.authorization.from,\n to: eip3009Payload.authorization.to,\n value: BigInt(eip3009Payload.authorization.value),\n validAfter: BigInt(eip3009Payload.authorization.validAfter),\n validBefore: BigInt(eip3009Payload.authorization.validBefore),\n nonce: eip3009Payload.authorization.nonce,\n },\n };\n\n // Verify signature\n // Note: verifyTypedData is implementation-dependent and pluggable on FacilitatorEvmSigner\n // Some implementations only do EOA-style ECDSA recovery (e.g. viem/utils verifyTypedData, ethers.verifyTypedData)\n // Viem's publicClient.verifyTypedData supports EOA and Smart Contract Account (ERC-1271 / ERC-6492) signature verification\n let isValid = false;\n try {\n isValid = await signer.verifyTypedData({\n address: eip3009Payload.authorization.from,\n ...permitTypedData,\n signature: eip3009Payload.signature!,\n });\n } catch {\n isValid = false;\n }\n const signature = eip3009Payload.signature!;\n const sigLen = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n\n // Extract EIP-6492 deployment info (factory address + calldata) if present\n const erc6492Data = parseErc6492Signature(signature);\n const hasDeploymentInfo =\n erc6492Data.address &&\n erc6492Data.data &&\n !isAddressEqual(erc6492Data.address, \"0x0000000000000000000000000000000000000000\");\n\n if (hasDeploymentInfo) {\n eip6492Deployment = {\n factoryAddress: erc6492Data.address!,\n factoryCalldata: erc6492Data.data!,\n };\n }\n\n if (!isValid) {\n // Check if signature is from a smart wallet\n const isSmartWallet = sigLen > 130; // 65 bytes = 130 hex chars for EOA\n\n // EOA signature that failed verification — definitely invalid\n if (!isSmartWallet) {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidSignature,\n payer,\n };\n }\n\n // Smart wallet signature: check if deployed or has ERC-6492 deployment info\n const bytecode = await signer.getCode({ address: payer });\n const isDeployed = bytecode && bytecode !== \"0x\";\n\n if (!isDeployed && !hasDeploymentInfo) {\n // Undeployed smart wallet with no factory info\n return {\n isValid: false,\n invalidReason: Errors.ErrUndeployedSmartWallet,\n payer,\n };\n }\n // Deployed smart wallet or undeployed with ERC-6492 factory info\n // fall through to remaining field checks and onchain simulation\n }\n\n // Verify payment recipient matches\n if (getAddress(eip3009Payload.authorization.to) !== getAddress(requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrRecipientMismatch,\n payer,\n };\n }\n\n // Verify validBefore is in the future (with 6 second buffer for block time)\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(eip3009Payload.authorization.validBefore) < BigInt(now + 6)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrValidBeforeExpired,\n payer,\n };\n }\n\n // Verify validAfter is not in the future\n if (BigInt(eip3009Payload.authorization.validAfter) > BigInt(now)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrValidAfterInFuture,\n payer,\n };\n }\n\n // Verify amount exactly matches requirements\n if (BigInt(eip3009Payload.authorization.value) !== BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidAuthorizationValue,\n payer,\n };\n }\n\n // Transaction simulation\n if (options?.simulate !== false) {\n const simulationSucceeded = await simulateEip3009Transfer(\n signer,\n erc20Address,\n eip3009Payload,\n eip6492Deployment,\n );\n if (!simulationSucceeded) {\n return diagnoseEip3009SimulationFailure(\n signer,\n erc20Address,\n eip3009Payload,\n requirements,\n requirements.amount,\n );\n }\n }\n\n return {\n isValid: true,\n invalidReason: undefined,\n payer,\n };\n}\n\n/**\n * Settles an EIP-3009 payment by executing transferWithAuthorization.\n *\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param eip3009Payload - The EIP-3009 specific payload\n * @param config - Facilitator configuration\n * @returns Promise resolving to settlement response\n */\nexport async function settleEIP3009(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n eip3009Payload: ExactEIP3009Payload,\n config: EIP3009FacilitatorConfig,\n): Promise<SettleResponse> {\n const payer = eip3009Payload.authorization.from;\n\n // Re-verify before settling\n const valid = await verifyEIP3009(signer, payload, requirements, eip3009Payload, {\n simulate: config.simulateInSettle ?? false,\n });\n if (!valid.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: valid.invalidReason ?? Errors.ErrInvalidScheme,\n payer,\n };\n }\n\n try {\n // Parse ERC-6492 signature if applicable (for optional deployment)\n const { address: factoryAddress, data: factoryCalldata } = parseErc6492Signature(\n eip3009Payload.signature!,\n );\n\n // Deploy ERC-4337 smart wallet via EIP-6492 if configured and needed\n if (\n config.deployERC4337WithEIP6492 &&\n factoryAddress &&\n factoryCalldata &&\n !isAddressEqual(factoryAddress, \"0x0000000000000000000000000000000000000000\")\n ) {\n // Check if smart wallet is already deployed\n const bytecode = await signer.getCode({ address: payer });\n\n if (!bytecode || bytecode === \"0x\") {\n // Wallet not deployed - attempt deployment\n const deployTx = await signer.sendTransaction({\n to: factoryAddress as Hex,\n data: factoryCalldata as Hex,\n });\n\n // Wait for deployment transaction\n await signer.waitForTransactionReceipt({ hash: deployTx });\n }\n }\n\n const tx = await executeTransferWithAuthorization(\n signer,\n getAddress(requirements.asset),\n eip3009Payload,\n );\n\n // Wait for transaction confirmation\n const receipt = await signer.waitForTransactionReceipt({ hash: tx });\n\n if (receipt.status !== \"success\") {\n return {\n success: false,\n errorReason: Errors.ErrTransactionFailed,\n transaction: tx,\n network: payload.accepted.network,\n payer,\n };\n }\n\n return {\n success: true,\n transaction: tx,\n network: payload.accepted.network,\n payer,\n };\n } catch (error) {\n return {\n success: false,\n errorReason: parseEip3009TransferError(error),\n transaction: \"\",\n network: payload.accepted.network,\n payer,\n };\n }\n}\n","import {\n PaymentPayload,\n PaymentRequirements,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@payai/x402/types\";\nimport {\n extractEip2612GasSponsoringInfo,\n extractErc20ApprovalGasSponsoringInfo,\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n resolveErc20ApprovalExtensionSigner,\n type Eip2612GasSponsoringInfo,\n type Erc20ApprovalGasSponsoringFacilitatorExtension,\n type Erc20ApprovalGasSponsoringSigner,\n} from \"../extensions\";\nimport { getAddress, encodeFunctionData } from \"viem\";\nimport {\n PERMIT2_ADDRESS,\n permit2WitnessTypes,\n x402ExactPermit2ProxyABI,\n x402ExactPermit2ProxyAddress,\n} from \"../../constants\";\nimport * as Errors from \"./errors\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactPermit2Payload } from \"../../types\";\nimport { getEvmChainId } from \"../../utils\";\nimport { validateErc20ApprovalForPayment } from \"./erc20approval\";\nimport {\n simulatePermit2Settle,\n simulatePermit2SettleWithPermit,\n simulatePermit2SettleWithErc20Approval,\n diagnosePermit2SimulationFailure,\n checkPermit2Prerequisites,\n validateEip2612PermitForPayment,\n buildExactPermit2SettleArgs,\n splitEip2612Signature,\n waitAndReturnSettleResponse,\n mapSettleError,\n type Permit2ProxyConfig,\n} from \"../../shared/permit2\";\n\nconst exactProxyConfig: Permit2ProxyConfig = {\n proxyAddress: x402ExactPermit2ProxyAddress,\n proxyABI: x402ExactPermit2ProxyABI,\n};\n\nexport interface VerifyPermit2Options {\n /** Run onchain simulation. Defaults to true. */\n simulate?: boolean;\n}\n\nexport interface Permit2FacilitatorConfig {\n /**\n * If enabled, simulates transaction before settling. Defaults to false,\n * i.e. only simulate during verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * Verifies a Permit2 payment payload.\n *\n * Handles all Permit2 verification paths:\n * - Standard: checks on-chain Permit2 allowance\n * - EIP-2612: validates the EIP-2612 permit extension when allowance is insufficient\n * - ERC-20 approval: validates the pre-signed approve tx extension when allowance is insufficient\n *\n * @param signer - The facilitator signer for contract reads\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param permit2Payload - The Permit2 specific payload\n * @param context - Optional facilitator context for extension-provided capabilities\n * @param options - Optional verification options (e.g. simulate)\n * @returns Promise resolving to verification response\n */\nexport async function verifyPermit2(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n permit2Payload: ExactPermit2Payload,\n context?: FacilitatorContext,\n options?: VerifyPermit2Options,\n): Promise<VerifyResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n if (payload.accepted.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n return {\n isValid: false,\n invalidReason: Errors.ErrUnsupportedPayloadType,\n payer,\n };\n }\n\n if (payload.accepted.network !== requirements.network) {\n return {\n isValid: false,\n invalidReason: Errors.ErrNetworkMismatch,\n payer,\n };\n }\n\n const chainId = getEvmChainId(requirements.network);\n const tokenAddress = getAddress(requirements.asset);\n\n if (\n getAddress(permit2Payload.permit2Authorization.spender) !==\n getAddress(x402ExactPermit2ProxyAddress)\n ) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2InvalidSpender,\n payer,\n };\n }\n\n if (\n getAddress(permit2Payload.permit2Authorization.witness.to) !== getAddress(requirements.payTo)\n ) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2RecipientMismatch,\n payer,\n };\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(permit2Payload.permit2Authorization.deadline) < BigInt(now + 6)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2DeadlineExpired,\n payer,\n };\n }\n\n if (BigInt(permit2Payload.permit2Authorization.witness.validAfter) > BigInt(now)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2NotYetValid,\n payer,\n };\n }\n\n // Verify amount exactly matches requirements\n if (\n BigInt(permit2Payload.permit2Authorization.permitted.amount) !== BigInt(requirements.amount)\n ) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2AmountMismatch,\n payer,\n };\n }\n\n if (getAddress(permit2Payload.permit2Authorization.permitted.token) !== tokenAddress) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2TokenMismatch,\n payer,\n };\n }\n\n const permit2TypedData = {\n types: permit2WitnessTypes,\n primaryType: \"PermitWitnessTransferFrom\" as const,\n domain: {\n name: \"Permit2\",\n chainId,\n verifyingContract: PERMIT2_ADDRESS,\n },\n message: {\n permitted: {\n token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n },\n spender: getAddress(permit2Payload.permit2Authorization.spender),\n nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n witness: {\n to: getAddress(permit2Payload.permit2Authorization.witness.to),\n validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n },\n },\n };\n\n // Verify signature\n // Note: verifyTypedData is implementation-dependent and pluggable on FacilitatorEvmSigner\n // Some implementations only do EOA-style ECDSA recovery (e.g. viem/utils verifyTypedData, ethers.verifyTypedData)\n // Viem's publicClient.verifyTypedData supports EOA and Smart Contract Account (ERC-1271 / ERC-6492) signature verification\n let signatureValid = false;\n try {\n signatureValid = await signer.verifyTypedData({\n address: payer,\n ...permit2TypedData,\n signature: permit2Payload.signature,\n });\n } catch {\n signatureValid = false;\n }\n\n if (!signatureValid) {\n // Check if the payer is a deployed smart contract\n const bytecode = await signer.getCode({ address: payer });\n const isDeployedContract = bytecode && bytecode !== \"0x\";\n\n if (!isDeployedContract) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2InvalidSignature,\n payer,\n };\n }\n // Deployed smart contract: fall through to simulation\n }\n\n // If simulation is disabled, return early\n if (options?.simulate === false) {\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n // Branch: EIP-2612 gas sponsoring (atomic settleWithPermit via contract)\n const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n if (eip2612Info) {\n const fieldResult = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);\n if (!fieldResult.isValid) {\n return { isValid: false, invalidReason: fieldResult.invalidReason!, payer };\n }\n\n const exactSettleArgs = buildExactPermit2SettleArgs(permit2Payload);\n const simOk = await simulatePermit2SettleWithPermit(\n exactProxyConfig,\n signer,\n exactSettleArgs,\n eip2612Info,\n );\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n exactProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n // Branch: ERC-20 approval gas sponsoring (broadcast approval + settle via extension signer)\n const erc20GasSponsorshipExtension =\n context?.getExtension<Erc20ApprovalGasSponsoringFacilitatorExtension>(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n if (erc20GasSponsorshipExtension) {\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const fieldResult = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n if (!fieldResult.isValid) {\n return { isValid: false, invalidReason: fieldResult.invalidReason!, payer };\n }\n\n const extensionSigner = resolveErc20ApprovalExtensionSigner(\n erc20GasSponsorshipExtension,\n requirements.network,\n );\n\n if (extensionSigner?.simulateTransactions) {\n const simOk = await simulatePermit2SettleWithErc20Approval(\n exactProxyConfig,\n extensionSigner,\n buildExactPermit2SettleArgs(permit2Payload),\n erc20Info,\n );\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n exactProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n // Fallback to prerequisite-only check if simulateTransactions is not available\n return checkPermit2Prerequisites(\n exactProxyConfig,\n signer,\n tokenAddress,\n payer,\n requirements.amount,\n );\n }\n }\n\n // Branch: standard settle (allowance already on-chain)\n const simOk = await simulatePermit2Settle(\n exactProxyConfig,\n signer,\n buildExactPermit2SettleArgs(permit2Payload),\n );\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n exactProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n\n return { isValid: true, invalidReason: undefined, payer };\n}\n\n/**\n * Settles a Permit2 payment. Single entry point for all Permit2 settlement paths:\n *\n * 1. EIP-2612 extension present -> settleWithPermit (atomic single tx via contract)\n * 2. ERC-20 approval extension present + extension signer -> broadcast approval + settle (via extension signer)\n * 3. Standard -> settle directly (allowance already on-chain)\n *\n * @param signer - The base facilitator signer for contract writes\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param permit2Payload - The Permit2 specific payload\n * @param context - Optional facilitator context for extension-provided capabilities\n * @param config - Optional facilitator config (simulateInSettle)\n * @returns Promise resolving to settlement response\n */\nexport async function settlePermit2(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n permit2Payload: ExactPermit2Payload,\n context?: FacilitatorContext,\n config?: Permit2FacilitatorConfig,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n const valid = await verifyPermit2(signer, payload, requirements, permit2Payload, context, {\n simulate: config?.simulateInSettle ?? false,\n });\n if (!valid.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: valid.invalidReason ?? Errors.ErrInvalidScheme,\n payer,\n };\n }\n\n // Branch: EIP-2612 gas sponsoring (atomic settleWithPermit via contract)\n const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n if (eip2612Info) {\n return settlePermit2WithEIP2612(exactProxyConfig, signer, payload, permit2Payload, eip2612Info);\n }\n\n // Branch: ERC-20 approval gas sponsoring (broadcast approval + settle via extension signer)\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const erc20GasSponsorshipExtension =\n context?.getExtension<Erc20ApprovalGasSponsoringFacilitatorExtension>(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n const extensionSigner = resolveErc20ApprovalExtensionSigner(\n erc20GasSponsorshipExtension,\n payload.accepted.network,\n );\n if (extensionSigner) {\n return settlePermit2WithERC20Approval(\n exactProxyConfig,\n extensionSigner,\n payload,\n permit2Payload,\n erc20Info,\n );\n }\n }\n\n // Branch: standard settle (allowance already on-chain)\n return settlePermit2Direct(exactProxyConfig, signer, payload, permit2Payload);\n}\n\n// ---------------------------------------------------------------------------\n// Exact-only settle helpers (not shared — upto has its own implementations)\n// ---------------------------------------------------------------------------\n\n/**\n * Settles a Permit2 payment via settleWithPermit, including the EIP-2612 permit atomically.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload for network info\n * @param permit2Payload - The Permit2 payload with authorization and signature\n * @param eip2612Info - The EIP-2612 gas sponsoring info from the payload extension\n * @returns Promise resolving to a settlement response\n */\nasync function settlePermit2WithEIP2612(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n permit2Payload: ExactPermit2Payload,\n eip2612Info: Eip2612GasSponsoringInfo,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n try {\n const { v, r, s } = splitEip2612Signature(eip2612Info.signature);\n\n const tx = await signer.writeContract({\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"settleWithPermit\",\n args: [\n {\n value: BigInt(eip2612Info.amount),\n deadline: BigInt(eip2612Info.deadline),\n r,\n s,\n v,\n },\n ...buildExactPermit2SettleArgs(permit2Payload),\n ],\n });\n\n return waitAndReturnSettleResponse(signer, tx, payload, payer);\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n\n/**\n * Settles a Permit2 payment using an ERC-20 approval gas sponsoring extension.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param extensionSigner - The extension signer with sendTransactions capability\n * @param payload - The payment payload for network info\n * @param permit2Payload - The Permit2 payload with authorization and signature\n * @param erc20Info - Object containing the signed approval transaction\n * @param erc20Info.signedTransaction - The RLP-encoded signed ERC-20 approve transaction\n * @returns Promise resolving to a settlement response\n */\nasync function settlePermit2WithERC20Approval(\n config: Permit2ProxyConfig,\n extensionSigner: Erc20ApprovalGasSponsoringSigner,\n payload: PaymentPayload,\n permit2Payload: ExactPermit2Payload,\n erc20Info: { signedTransaction: string },\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n try {\n const settleData = encodeFunctionData({\n abi: config.proxyABI,\n functionName: \"settle\",\n args: buildExactPermit2SettleArgs(permit2Payload),\n });\n\n const txHashes = await extensionSigner.sendTransactions([\n erc20Info.signedTransaction as `0x${string}`,\n { to: config.proxyAddress, data: settleData, gas: BigInt(300_000) },\n ]);\n\n const settleTxHash = txHashes[txHashes.length - 1];\n return waitAndReturnSettleResponse(extensionSigner, settleTxHash, payload, payer);\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n\n/**\n * Settles a Permit2 payment directly when Permit2 allowance is already on-chain.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload for network info\n * @param permit2Payload - The Permit2 payload with authorization and signature\n * @returns Promise resolving to a settlement response\n */\nasync function settlePermit2Direct(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n permit2Payload: ExactPermit2Payload,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n try {\n const tx = await signer.writeContract({\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"settle\",\n args: buildExactPermit2SettleArgs(permit2Payload),\n });\n\n return waitAndReturnSettleResponse(signer, tx, payload, payer);\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n","import {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@payai/x402/types\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactEvmPayloadV2, ExactEIP3009Payload, isPermit2Payload } from \"../../types\";\nimport { verifyEIP3009, settleEIP3009 } from \"./eip3009\";\nimport { verifyPermit2, settlePermit2 } from \"./permit2\";\n\nexport interface ExactEvmSchemeConfig {\n /**\n * If enabled, the facilitator will deploy ERC-4337 smart wallets\n * via EIP-6492 when encountering undeployed contract signatures.\n *\n * @default false\n */\n deployERC4337WithEIP6492?: boolean;\n /**\n * If enabled, run on-chain simulation during settle's re-verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * EVM facilitator implementation for the Exact payment scheme.\n * Thin router that delegates to EIP-3009 or Permit2 based on payload type.\n * All extension handling (EIP-2612, ERC-20 approval gas sponsoring) is owned\n * by the Permit2 functions via FacilitatorContext.\n */\nexport class ExactEvmScheme implements SchemeNetworkFacilitator {\n readonly scheme = \"exact\";\n readonly caipFamily = \"eip155:*\";\n private readonly config: Required<ExactEvmSchemeConfig>;\n\n /**\n * Creates a new ExactEvmScheme facilitator instance.\n *\n * @param signer - The EVM signer for facilitator operations\n * @param config - Optional configuration\n */\n constructor(\n private readonly signer: FacilitatorEvmSigner,\n config?: ExactEvmSchemeConfig,\n ) {\n this.config = {\n deployERC4337WithEIP6492: config?.deployERC4337WithEIP6492 ?? false,\n simulateInSettle: config?.simulateInSettle ?? false,\n };\n }\n\n /**\n * Returns undefined — EVM has no mechanism-specific extra data.\n *\n * @param _ - The network identifier (unused)\n * @returns undefined\n */\n getExtra(_: string): Record<string, unknown> | undefined {\n return undefined;\n }\n\n /**\n * Returns facilitator wallet addresses for the supported response.\n *\n * @param _ - The network identifier (unused, addresses are network-agnostic)\n * @returns Array of facilitator wallet addresses\n */\n getSigners(_: string): string[] {\n return [...this.signer.getAddresses()];\n }\n\n /**\n * Verifies a payment payload. Routes to Permit2 or EIP-3009 based on payload type.\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param context - Optional facilitator context for extension capabilities\n * @returns Promise resolving to verification response\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\n ): Promise<VerifyResponse> {\n const rawPayload = payload.payload as ExactEvmPayloadV2;\n const isPermit2 = isPermit2Payload(rawPayload);\n\n if (isPermit2) {\n return verifyPermit2(this.signer, payload, requirements, rawPayload, context);\n }\n\n const eip3009Payload: ExactEIP3009Payload = rawPayload;\n return verifyEIP3009(this.signer, payload, requirements, eip3009Payload);\n }\n\n /**\n * Settles a payment. Routes to Permit2 or EIP-3009 based on payload type.\n *\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param context - Optional facilitator context for extension capabilities\n * @returns Promise resolving to settlement response\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\n ): Promise<SettleResponse> {\n const rawPayload = payload.payload as ExactEvmPayloadV2;\n const isPermit2 = isPermit2Payload(rawPayload);\n\n if (isPermit2) {\n return settlePermit2(this.signer, payload, requirements, rawPayload, context, {\n simulateInSettle: this.config.simulateInSettle,\n });\n }\n\n const eip3009Payload: ExactEIP3009Payload = rawPayload;\n return settleEIP3009(this.signer, payload, requirements, eip3009Payload, this.config);\n }\n}\n","import { x402Facilitator } from \"@payai/x402/facilitator\";\nimport { Network } from \"@payai/x402/types\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactEvmScheme } from \"./scheme\";\nimport { ExactEvmSchemeV1 } from \"../v1/facilitator/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering EVM schemes to an x402Facilitator\n */\nexport interface EvmFacilitatorConfig {\n /**\n * The EVM signer for facilitator operations (verify and settle)\n */\n signer: FacilitatorEvmSigner;\n\n /**\n * Networks to register (single network or array of networks)\n * Examples: \"eip155:84532\", [\"eip155:84532\", \"eip155:1\"]\n */\n networks: Network | Network[];\n\n /**\n * If enabled, the facilitator will deploy ERC-4337 smart wallets\n * via EIP-6492 when encountering undeployed contract signatures.\n *\n * @default false\n */\n deployERC4337WithEIP6492?: boolean;\n\n /**\n * If enabled, reruns on-chain simulation during settle's re-verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * Registers EVM exact payment schemes to an x402Facilitator instance.\n *\n * This function registers:\n * - V2: Specified networks with ExactEvmScheme\n * - V1: All supported EVM networks with ExactEvmSchemeV1\n *\n * @param facilitator - The x402Facilitator instance to register schemes to\n * @param config - Configuration for EVM facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactEvmScheme } from \"@payai/x402-evm/exact/facilitator/register\";\n * import { x402Facilitator } from \"@payai/x402/facilitator\";\n * import { createPublicClient, createWalletClient } from \"viem\";\n *\n * const facilitator = new x402Facilitator();\n *\n * // Single network\n * registerExactEvmScheme(facilitator, {\n * signer: combinedClient,\n * networks: \"eip155:84532\" // Base Sepolia\n * });\n *\n * // Multiple networks (will auto-derive eip155:* pattern)\n * registerExactEvmScheme(facilitator, {\n * signer: combinedClient,\n * networks: [\"eip155:84532\", \"eip155:1\"] // Base Sepolia and Mainnet\n * });\n * ```\n */\nexport function registerExactEvmScheme(\n facilitator: x402Facilitator,\n config: EvmFacilitatorConfig,\n): x402Facilitator {\n // Register V2 scheme with specified networks\n facilitator.register(\n config.networks,\n new ExactEvmScheme(config.signer, {\n deployERC4337WithEIP6492: config.deployERC4337WithEIP6492,\n simulateInSettle: config.simulateInSettle,\n }),\n );\n\n // Register all V1 networks\n facilitator.registerV1(\n NETWORKS as Network[],\n new ExactEvmSchemeV1(config.signer, {\n deployERC4337WithEIP6492: config.deployERC4337WithEIP6492,\n simulateInSettle: config.simulateInSettle,\n }),\n );\n\n return facilitator;\n}\n"],"mappings":"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","names":["getAddress","getAddress","simOk"]}
1
+ {"version":3,"sources":["../../../../src/exact/facilitator/eip3009.ts","../../../../src/exact/facilitator/permit2.ts","../../../../src/exact/facilitator/scheme.ts","../../../../src/exact/facilitator/register.ts"],"sourcesContent":["import {\n PaymentPayload,\n PaymentRequirements,\n SettleResponse,\n VerifyResponse,\n} from \"@payai/x402/types\";\nimport { getAddress, Hex, isAddressEqual, parseErc6492Signature } from \"viem\";\nimport { authorizationTypes } from \"../../constants\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { getEvmChainId } from \"../../utils\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport * as Errors from \"./errors\";\nimport {\n diagnoseEip3009SimulationFailure,\n executeTransferWithAuthorization,\n parseEip3009TransferError,\n simulateEip3009Transfer,\n} from \"./eip3009-utils\";\n\nexport interface VerifyEIP3009Options {\n /** Run onchain simulation. Defaults to true. */\n simulate?: boolean;\n}\n\nexport interface EIP3009FacilitatorConfig {\n /**\n * Allowlist of factory contract addresses (hex strings, case-insensitive) that the facilitator\n * will call when deploying an undeployed smart wallet via ERC-6492.\n *\n * A non-empty list enables ERC-4337 smart wallet deployment via EIP-6492. Facilitators must\n * explicitly list every factory they trust to prevent arbitrary transaction injection via\n * attacker-controlled ERC-6492 signature wrappers. An empty or omitted list denies all factory\n * deployment calls.\n *\n * @default []\n */\n eip6492AllowedFactories?: string[];\n /**\n * If enabled, simulates transaction before settling. Defaults to false, ie only simulate during verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * Verifies an EIP-3009 payment payload.\n *\n * @param signer - The facilitator signer for contract reads\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param eip3009Payload - The EIP-3009 specific payload\n * @param options - Optional verification options\n * @returns Promise resolving to verification response\n */\nexport async function verifyEIP3009(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n eip3009Payload: ExactEIP3009Payload,\n options?: VerifyEIP3009Options,\n): Promise<VerifyResponse> {\n const payer = eip3009Payload.authorization.from;\n let eip6492Deployment:\n | { factoryAddress: `0x${string}`; factoryCalldata: `0x${string}` }\n | undefined;\n\n // Verify scheme matches\n if (payload.accepted.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidScheme,\n payer,\n };\n }\n\n // Get chain configuration\n if (!requirements.extra?.name || !requirements.extra?.version) {\n return {\n isValid: false,\n invalidReason: Errors.ErrMissingEip712Domain,\n payer,\n };\n }\n\n const { name, version } = requirements.extra;\n const erc20Address = getAddress(requirements.asset);\n\n // Verify network matches\n if (payload.accepted.network !== requirements.network) {\n return {\n isValid: false,\n invalidReason: Errors.ErrNetworkMismatch,\n payer,\n };\n }\n\n // Build typed data for signature verification\n const permitTypedData = {\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\" as const,\n domain: {\n name,\n version,\n chainId: getEvmChainId(requirements.network),\n verifyingContract: erc20Address,\n },\n message: {\n from: eip3009Payload.authorization.from,\n to: eip3009Payload.authorization.to,\n value: BigInt(eip3009Payload.authorization.value),\n validAfter: BigInt(eip3009Payload.authorization.validAfter),\n validBefore: BigInt(eip3009Payload.authorization.validBefore),\n nonce: eip3009Payload.authorization.nonce,\n },\n };\n\n // Verify signature\n // Note: verifyTypedData is implementation-dependent and pluggable on FacilitatorEvmSigner\n // Some implementations only do EOA-style ECDSA recovery (e.g. viem/utils verifyTypedData, ethers.verifyTypedData)\n // Viem's publicClient.verifyTypedData supports EOA and Smart Contract Account (ERC-1271 / ERC-6492) signature verification\n let isValid = false;\n try {\n isValid = await signer.verifyTypedData({\n address: eip3009Payload.authorization.from,\n ...permitTypedData,\n signature: eip3009Payload.signature!,\n });\n } catch {\n isValid = false;\n }\n const signature = eip3009Payload.signature!;\n const sigLen = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n\n // Extract EIP-6492 deployment info (factory address + calldata) if present\n const erc6492Data = parseErc6492Signature(signature);\n const hasDeploymentInfo =\n erc6492Data.address &&\n erc6492Data.data &&\n !isAddressEqual(erc6492Data.address, \"0x0000000000000000000000000000000000000000\");\n\n if (hasDeploymentInfo) {\n eip6492Deployment = {\n factoryAddress: erc6492Data.address!,\n factoryCalldata: erc6492Data.data!,\n };\n }\n\n if (!isValid) {\n // Check if signature is from a smart wallet\n const isSmartWallet = sigLen > 130; // 65 bytes = 130 hex chars for EOA\n\n // EOA signature that failed verification — definitely invalid\n if (!isSmartWallet) {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidSignature,\n payer,\n };\n }\n\n // Smart wallet signature: check if deployed or has ERC-6492 deployment info\n const bytecode = await signer.getCode({ address: payer });\n const isDeployed = bytecode && bytecode !== \"0x\";\n\n if (!isDeployed && !hasDeploymentInfo) {\n // Undeployed smart wallet with no factory info\n return {\n isValid: false,\n invalidReason: Errors.ErrUndeployedSmartWallet,\n payer,\n };\n }\n // Deployed smart wallet or undeployed with ERC-6492 factory info\n // fall through to remaining field checks and onchain simulation\n }\n\n // Verify payment recipient matches\n if (getAddress(eip3009Payload.authorization.to) !== getAddress(requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrRecipientMismatch,\n payer,\n };\n }\n\n // Verify validBefore is in the future (with 6 second buffer for block time)\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(eip3009Payload.authorization.validBefore) < BigInt(now + 6)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrValidBeforeExpired,\n payer,\n };\n }\n\n // Verify validAfter is not in the future\n if (BigInt(eip3009Payload.authorization.validAfter) > BigInt(now)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrValidAfterInFuture,\n payer,\n };\n }\n\n // Verify amount exactly matches requirements\n if (BigInt(eip3009Payload.authorization.value) !== BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidAuthorizationValue,\n payer,\n };\n }\n\n // Transaction simulation\n if (options?.simulate !== false) {\n const simulationSucceeded = await simulateEip3009Transfer(\n signer,\n erc20Address,\n eip3009Payload,\n eip6492Deployment,\n );\n if (!simulationSucceeded) {\n return diagnoseEip3009SimulationFailure(\n signer,\n erc20Address,\n eip3009Payload,\n requirements,\n requirements.amount,\n );\n }\n }\n\n return {\n isValid: true,\n invalidReason: undefined,\n payer,\n };\n}\n\n/**\n * Settles an EIP-3009 payment by executing transferWithAuthorization.\n *\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param eip3009Payload - The EIP-3009 specific payload\n * @param config - Facilitator configuration\n * @returns Promise resolving to settlement response\n */\nexport async function settleEIP3009(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n eip3009Payload: ExactEIP3009Payload,\n config: EIP3009FacilitatorConfig,\n): Promise<SettleResponse> {\n const payer = eip3009Payload.authorization.from;\n\n // Re-verify before settling\n const valid = await verifyEIP3009(signer, payload, requirements, eip3009Payload, {\n simulate: config.simulateInSettle ?? false,\n });\n if (!valid.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: valid.invalidReason ?? Errors.ErrInvalidScheme,\n payer,\n };\n }\n\n try {\n // Parse ERC-6492 signature if applicable (for optional deployment)\n const { address: factoryAddress, data: factoryCalldata } = parseErc6492Signature(\n eip3009Payload.signature!,\n );\n\n // Deploy ERC-4337 smart wallet via EIP-6492 if factory is in the allowlist\n if (\n factoryAddress &&\n factoryCalldata &&\n !isAddressEqual(factoryAddress, \"0x0000000000000000000000000000000000000000\")\n ) {\n // Check if smart wallet is already deployed\n const bytecode = await signer.getCode({ address: payer });\n\n if (!bytecode || bytecode === \"0x\") {\n const normalizedFactory = factoryAddress.toLowerCase();\n const isAllowed = (config.eip6492AllowedFactories ?? []).some(\n allowed => allowed.toLowerCase() === normalizedFactory,\n );\n if (!isAllowed) {\n return {\n success: false,\n errorReason: Errors.ErrFactoryNotAllowed,\n transaction: \"\",\n network: payload.accepted.network,\n payer,\n };\n }\n\n // Wallet not deployed - attempt deployment\n const deployTx = await signer.sendTransaction({\n to: factoryAddress as Hex,\n data: factoryCalldata as Hex,\n });\n\n // Wait for deployment transaction\n await signer.waitForTransactionReceipt({ hash: deployTx });\n }\n }\n\n const tx = await executeTransferWithAuthorization(\n signer,\n getAddress(requirements.asset),\n eip3009Payload,\n );\n\n // Wait for transaction confirmation\n const receipt = await signer.waitForTransactionReceipt({ hash: tx });\n\n if (receipt.status !== \"success\") {\n return {\n success: false,\n errorReason: Errors.ErrTransactionFailed,\n transaction: tx,\n network: payload.accepted.network,\n payer,\n };\n }\n\n return {\n success: true,\n transaction: tx,\n network: payload.accepted.network,\n payer,\n };\n } catch (error) {\n return {\n success: false,\n errorReason: parseEip3009TransferError(error),\n transaction: \"\",\n network: payload.accepted.network,\n payer,\n };\n }\n}\n","import {\n PaymentPayload,\n PaymentRequirements,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@payai/x402/types\";\nimport {\n extractEip2612GasSponsoringInfo,\n extractErc20ApprovalGasSponsoringInfo,\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n resolveErc20ApprovalExtensionSigner,\n type Eip2612GasSponsoringInfo,\n type Erc20ApprovalGasSponsoringFacilitatorExtension,\n type Erc20ApprovalGasSponsoringSigner,\n} from \"../extensions\";\nimport { getAddress, encodeFunctionData } from \"viem\";\nimport {\n PERMIT2_ADDRESS,\n permit2WitnessTypes,\n x402ExactPermit2ProxyABI,\n x402ExactPermit2ProxyAddress,\n} from \"../../constants\";\nimport * as Errors from \"./errors\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactPermit2Payload } from \"../../types\";\nimport { getEvmChainId } from \"../../utils\";\nimport { validateErc20ApprovalForPayment } from \"./erc20approval\";\nimport {\n simulatePermit2Settle,\n simulatePermit2SettleWithPermit,\n simulatePermit2SettleWithErc20Approval,\n diagnosePermit2SimulationFailure,\n checkPermit2Prerequisites,\n validateEip2612PermitForPayment,\n buildExactPermit2SettleArgs,\n splitEip2612Signature,\n waitAndReturnSettleResponse,\n mapSettleError,\n type Permit2ProxyConfig,\n} from \"../../shared/permit2\";\n\nconst exactProxyConfig: Permit2ProxyConfig = {\n proxyAddress: x402ExactPermit2ProxyAddress,\n proxyABI: x402ExactPermit2ProxyABI,\n};\n\nexport interface VerifyPermit2Options {\n /** Run onchain simulation. Defaults to true. */\n simulate?: boolean;\n}\n\nexport interface Permit2FacilitatorConfig {\n /**\n * If enabled, simulates transaction before settling. Defaults to false,\n * i.e. only simulate during verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * Verifies a Permit2 payment payload.\n *\n * Handles all Permit2 verification paths:\n * - Standard: checks on-chain Permit2 allowance\n * - EIP-2612: validates the EIP-2612 permit extension when allowance is insufficient\n * - ERC-20 approval: validates the pre-signed approve tx extension when allowance is insufficient\n *\n * @param signer - The facilitator signer for contract reads\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param permit2Payload - The Permit2 specific payload\n * @param context - Optional facilitator context for extension-provided capabilities\n * @param options - Optional verification options (e.g. simulate)\n * @returns Promise resolving to verification response\n */\nexport async function verifyPermit2(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n permit2Payload: ExactPermit2Payload,\n context?: FacilitatorContext,\n options?: VerifyPermit2Options,\n): Promise<VerifyResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n if (payload.accepted.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n return {\n isValid: false,\n invalidReason: Errors.ErrUnsupportedPayloadType,\n payer,\n };\n }\n\n if (payload.accepted.network !== requirements.network) {\n return {\n isValid: false,\n invalidReason: Errors.ErrNetworkMismatch,\n payer,\n };\n }\n\n const chainId = getEvmChainId(requirements.network);\n const tokenAddress = getAddress(requirements.asset);\n\n if (\n getAddress(permit2Payload.permit2Authorization.spender) !==\n getAddress(x402ExactPermit2ProxyAddress)\n ) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2InvalidSpender,\n payer,\n };\n }\n\n if (\n getAddress(permit2Payload.permit2Authorization.witness.to) !== getAddress(requirements.payTo)\n ) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2RecipientMismatch,\n payer,\n };\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(permit2Payload.permit2Authorization.deadline) < BigInt(now + 6)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2DeadlineExpired,\n payer,\n };\n }\n\n if (BigInt(permit2Payload.permit2Authorization.witness.validAfter) > BigInt(now)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2NotYetValid,\n payer,\n };\n }\n\n // Verify amount exactly matches requirements\n if (\n BigInt(permit2Payload.permit2Authorization.permitted.amount) !== BigInt(requirements.amount)\n ) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2AmountMismatch,\n payer,\n };\n }\n\n if (getAddress(permit2Payload.permit2Authorization.permitted.token) !== tokenAddress) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2TokenMismatch,\n payer,\n };\n }\n\n const permit2TypedData = {\n types: permit2WitnessTypes,\n primaryType: \"PermitWitnessTransferFrom\" as const,\n domain: {\n name: \"Permit2\",\n chainId,\n verifyingContract: PERMIT2_ADDRESS,\n },\n message: {\n permitted: {\n token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n },\n spender: getAddress(permit2Payload.permit2Authorization.spender),\n nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n witness: {\n to: getAddress(permit2Payload.permit2Authorization.witness.to),\n validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n },\n },\n };\n\n // Verify signature\n // Note: verifyTypedData is implementation-dependent and pluggable on FacilitatorEvmSigner\n // Some implementations only do EOA-style ECDSA recovery (e.g. viem/utils verifyTypedData, ethers.verifyTypedData)\n // Viem's publicClient.verifyTypedData supports EOA and Smart Contract Account (ERC-1271 / ERC-6492) signature verification\n let signatureValid = false;\n try {\n signatureValid = await signer.verifyTypedData({\n address: payer,\n ...permit2TypedData,\n signature: permit2Payload.signature,\n });\n } catch {\n signatureValid = false;\n }\n\n if (!signatureValid) {\n // Check if the payer is a deployed smart contract\n const bytecode = await signer.getCode({ address: payer });\n const isDeployedContract = bytecode && bytecode !== \"0x\";\n\n if (!isDeployedContract) {\n return {\n isValid: false,\n invalidReason: Errors.ErrPermit2InvalidSignature,\n payer,\n };\n }\n // Deployed smart contract: fall through to simulation\n }\n\n // If simulation is disabled, return early\n if (options?.simulate === false) {\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n // Branch: EIP-2612 gas sponsoring (atomic settleWithPermit via contract)\n const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n if (eip2612Info) {\n const fieldResult = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);\n if (!fieldResult.isValid) {\n return { isValid: false, invalidReason: fieldResult.invalidReason!, payer };\n }\n\n const exactSettleArgs = buildExactPermit2SettleArgs(permit2Payload);\n const simOk = await simulatePermit2SettleWithPermit(\n exactProxyConfig,\n signer,\n exactSettleArgs,\n eip2612Info,\n );\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n exactProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n // Branch: ERC-20 approval gas sponsoring (broadcast approval + settle via extension signer)\n const erc20GasSponsorshipExtension =\n context?.getExtension<Erc20ApprovalGasSponsoringFacilitatorExtension>(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n if (erc20GasSponsorshipExtension) {\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const fieldResult = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n if (!fieldResult.isValid) {\n return { isValid: false, invalidReason: fieldResult.invalidReason!, payer };\n }\n\n const extensionSigner = resolveErc20ApprovalExtensionSigner(\n erc20GasSponsorshipExtension,\n requirements.network,\n );\n\n if (extensionSigner?.simulateTransactions) {\n const simOk = await simulatePermit2SettleWithErc20Approval(\n exactProxyConfig,\n extensionSigner,\n buildExactPermit2SettleArgs(permit2Payload),\n erc20Info,\n );\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n exactProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n // Fallback to prerequisite-only check if simulateTransactions is not available\n return checkPermit2Prerequisites(\n exactProxyConfig,\n signer,\n tokenAddress,\n payer,\n requirements.amount,\n );\n }\n }\n\n // Branch: standard settle (allowance already on-chain)\n const simOk = await simulatePermit2Settle(\n exactProxyConfig,\n signer,\n buildExactPermit2SettleArgs(permit2Payload),\n );\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n exactProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n\n return { isValid: true, invalidReason: undefined, payer };\n}\n\n/**\n * Settles a Permit2 payment. Single entry point for all Permit2 settlement paths:\n *\n * 1. EIP-2612 extension present -> settleWithPermit (atomic single tx via contract)\n * 2. ERC-20 approval extension present + extension signer -> broadcast approval + settle (via extension signer)\n * 3. Standard -> settle directly (allowance already on-chain)\n *\n * @param signer - The base facilitator signer for contract writes\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param permit2Payload - The Permit2 specific payload\n * @param context - Optional facilitator context for extension-provided capabilities\n * @param config - Optional facilitator config (simulateInSettle)\n * @returns Promise resolving to settlement response\n */\nexport async function settlePermit2(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n permit2Payload: ExactPermit2Payload,\n context?: FacilitatorContext,\n config?: Permit2FacilitatorConfig,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n const valid = await verifyPermit2(signer, payload, requirements, permit2Payload, context, {\n simulate: config?.simulateInSettle ?? false,\n });\n if (!valid.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: valid.invalidReason ?? Errors.ErrInvalidScheme,\n payer,\n };\n }\n\n // Branch: EIP-2612 gas sponsoring (atomic settleWithPermit via contract)\n const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n if (eip2612Info) {\n return settlePermit2WithEIP2612(exactProxyConfig, signer, payload, permit2Payload, eip2612Info);\n }\n\n // Branch: ERC-20 approval gas sponsoring (broadcast approval + settle via extension signer)\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const erc20GasSponsorshipExtension =\n context?.getExtension<Erc20ApprovalGasSponsoringFacilitatorExtension>(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n const extensionSigner = resolveErc20ApprovalExtensionSigner(\n erc20GasSponsorshipExtension,\n payload.accepted.network,\n );\n if (extensionSigner) {\n return settlePermit2WithERC20Approval(\n exactProxyConfig,\n extensionSigner,\n payload,\n permit2Payload,\n erc20Info,\n );\n }\n }\n\n // Branch: standard settle (allowance already on-chain)\n return settlePermit2Direct(exactProxyConfig, signer, payload, permit2Payload);\n}\n\n// ---------------------------------------------------------------------------\n// Exact-only settle helpers (not shared — upto has its own implementations)\n// ---------------------------------------------------------------------------\n\n/**\n * Settles a Permit2 payment via settleWithPermit, including the EIP-2612 permit atomically.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload for network info\n * @param permit2Payload - The Permit2 payload with authorization and signature\n * @param eip2612Info - The EIP-2612 gas sponsoring info from the payload extension\n * @returns Promise resolving to a settlement response\n */\nasync function settlePermit2WithEIP2612(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n permit2Payload: ExactPermit2Payload,\n eip2612Info: Eip2612GasSponsoringInfo,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n try {\n const { v, r, s } = splitEip2612Signature(eip2612Info.signature);\n\n const tx = await signer.writeContract({\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"settleWithPermit\",\n args: [\n {\n value: BigInt(eip2612Info.amount),\n deadline: BigInt(eip2612Info.deadline),\n r,\n s,\n v,\n },\n ...buildExactPermit2SettleArgs(permit2Payload),\n ],\n });\n\n return waitAndReturnSettleResponse(signer, tx, payload, payer);\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n\n/**\n * Settles a Permit2 payment using an ERC-20 approval gas sponsoring extension.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param extensionSigner - The extension signer with sendTransactions capability\n * @param payload - The payment payload for network info\n * @param permit2Payload - The Permit2 payload with authorization and signature\n * @param erc20Info - Object containing the signed approval transaction\n * @param erc20Info.signedTransaction - The RLP-encoded signed ERC-20 approve transaction\n * @returns Promise resolving to a settlement response\n */\nasync function settlePermit2WithERC20Approval(\n config: Permit2ProxyConfig,\n extensionSigner: Erc20ApprovalGasSponsoringSigner,\n payload: PaymentPayload,\n permit2Payload: ExactPermit2Payload,\n erc20Info: { signedTransaction: string },\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n try {\n const settleData = encodeFunctionData({\n abi: config.proxyABI,\n functionName: \"settle\",\n args: buildExactPermit2SettleArgs(permit2Payload),\n });\n\n const txHashes = await extensionSigner.sendTransactions([\n erc20Info.signedTransaction as `0x${string}`,\n { to: config.proxyAddress, data: settleData, gas: BigInt(300_000) },\n ]);\n\n const settleTxHash = txHashes[txHashes.length - 1];\n return waitAndReturnSettleResponse(extensionSigner, settleTxHash, payload, payer);\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n\n/**\n * Settles a Permit2 payment directly when Permit2 allowance is already on-chain.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload for network info\n * @param permit2Payload - The Permit2 payload with authorization and signature\n * @returns Promise resolving to a settlement response\n */\nasync function settlePermit2Direct(\n config: Permit2ProxyConfig,\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n permit2Payload: ExactPermit2Payload,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n try {\n const tx = await signer.writeContract({\n address: config.proxyAddress,\n abi: config.proxyABI,\n functionName: \"settle\",\n args: buildExactPermit2SettleArgs(permit2Payload),\n });\n\n return waitAndReturnSettleResponse(signer, tx, payload, payer);\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n","import {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@payai/x402/types\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactEvmPayloadV2, ExactEIP3009Payload, isPermit2Payload } from \"../../types\";\nimport { verifyEIP3009, settleEIP3009 } from \"./eip3009\";\nimport { verifyPermit2, settlePermit2 } from \"./permit2\";\n\nexport interface ExactEvmSchemeConfig {\n /**\n * Allowlist of factory contract addresses (hex strings, case-insensitive) that the facilitator\n * will call when deploying an undeployed smart wallet via ERC-6492.\n *\n * A non-empty list enables ERC-4337 smart wallet deployment via EIP-6492. An empty or omitted\n * list denies all factory deployment calls (feature disabled by default).\n *\n * @default []\n */\n eip6492AllowedFactories?: string[];\n /**\n * If enabled, run on-chain simulation during settle's re-verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * EVM facilitator implementation for the Exact payment scheme.\n * Thin router that delegates to EIP-3009 or Permit2 based on payload type.\n * All extension handling (EIP-2612, ERC-20 approval gas sponsoring) is owned\n * by the Permit2 functions via FacilitatorContext.\n */\nexport class ExactEvmScheme implements SchemeNetworkFacilitator {\n readonly scheme = \"exact\";\n readonly caipFamily = \"eip155:*\";\n private readonly config: Required<ExactEvmSchemeConfig>;\n\n /**\n * Creates a new ExactEvmScheme facilitator instance.\n *\n * @param signer - The EVM signer for facilitator operations\n * @param config - Optional configuration\n */\n constructor(\n private readonly signer: FacilitatorEvmSigner,\n config?: ExactEvmSchemeConfig,\n ) {\n this.config = {\n eip6492AllowedFactories: config?.eip6492AllowedFactories ?? [],\n simulateInSettle: config?.simulateInSettle ?? false,\n };\n }\n\n /**\n * Returns undefined — EVM has no mechanism-specific extra data.\n *\n * @param _ - The network identifier (unused)\n * @returns undefined\n */\n getExtra(_: string): Record<string, unknown> | undefined {\n return undefined;\n }\n\n /**\n * Returns facilitator wallet addresses for the supported response.\n *\n * @param _ - The network identifier (unused, addresses are network-agnostic)\n * @returns Array of facilitator wallet addresses\n */\n getSigners(_: string): string[] {\n return [...this.signer.getAddresses()];\n }\n\n /**\n * Verifies a payment payload. Routes to Permit2 or EIP-3009 based on payload type.\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param context - Optional facilitator context for extension capabilities\n * @returns Promise resolving to verification response\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\n ): Promise<VerifyResponse> {\n const rawPayload = payload.payload as ExactEvmPayloadV2;\n const isPermit2 = isPermit2Payload(rawPayload);\n\n if (isPermit2) {\n return verifyPermit2(this.signer, payload, requirements, rawPayload, context);\n }\n\n const eip3009Payload: ExactEIP3009Payload = rawPayload;\n return verifyEIP3009(this.signer, payload, requirements, eip3009Payload);\n }\n\n /**\n * Settles a payment. Routes to Permit2 or EIP-3009 based on payload type.\n *\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param context - Optional facilitator context for extension capabilities\n * @returns Promise resolving to settlement response\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\n ): Promise<SettleResponse> {\n const rawPayload = payload.payload as ExactEvmPayloadV2;\n const isPermit2 = isPermit2Payload(rawPayload);\n\n if (isPermit2) {\n return settlePermit2(this.signer, payload, requirements, rawPayload, context, {\n simulateInSettle: this.config.simulateInSettle,\n });\n }\n\n const eip3009Payload: ExactEIP3009Payload = rawPayload;\n return settleEIP3009(this.signer, payload, requirements, eip3009Payload, this.config);\n }\n}\n","import { x402Facilitator } from \"@payai/x402/facilitator\";\nimport { Network } from \"@payai/x402/types\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactEvmScheme } from \"./scheme\";\nimport { ExactEvmSchemeV1 } from \"../v1/facilitator/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering EVM schemes to an x402Facilitator\n */\nexport interface EvmFacilitatorConfig {\n /**\n * The EVM signer for facilitator operations (verify and settle)\n */\n signer: FacilitatorEvmSigner;\n\n /**\n * Networks to register (single network or array of networks)\n * Examples: \"eip155:84532\", [\"eip155:84532\", \"eip155:1\"]\n */\n networks: Network | Network[];\n\n /**\n * Allowlist of factory contract addresses (hex strings, case-insensitive) that the facilitator\n * will call when deploying an undeployed smart wallet via ERC-6492.\n *\n * A non-empty list enables ERC-4337 smart wallet deployment via EIP-6492. An empty or omitted\n * list denies all factory deployment calls (feature disabled by default).\n *\n * @default []\n */\n eip6492AllowedFactories?: string[];\n\n /**\n * If enabled, reruns on-chain simulation during settle's re-verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * Registers EVM exact payment schemes to an x402Facilitator instance.\n *\n * This function registers:\n * - V2: Specified networks with ExactEvmScheme\n * - V1: All supported EVM networks with ExactEvmSchemeV1\n *\n * @param facilitator - The x402Facilitator instance to register schemes to\n * @param config - Configuration for EVM facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactEvmScheme } from \"@payai/x402-evm/exact/facilitator/register\";\n * import { x402Facilitator } from \"@payai/x402/facilitator\";\n * import { createPublicClient, createWalletClient } from \"viem\";\n *\n * const facilitator = new x402Facilitator();\n *\n * // Single network\n * registerExactEvmScheme(facilitator, {\n * signer: combinedClient,\n * networks: \"eip155:84532\" // Base Sepolia\n * });\n *\n * // Multiple networks (will auto-derive eip155:* pattern)\n * registerExactEvmScheme(facilitator, {\n * signer: combinedClient,\n * networks: [\"eip155:84532\", \"eip155:1\"] // Base Sepolia and Mainnet\n * });\n * ```\n */\nexport function registerExactEvmScheme(\n facilitator: x402Facilitator,\n config: EvmFacilitatorConfig,\n): x402Facilitator {\n // Register V2 scheme with specified networks\n facilitator.register(\n config.networks,\n new ExactEvmScheme(config.signer, {\n eip6492AllowedFactories: config.eip6492AllowedFactories,\n simulateInSettle: config.simulateInSettle,\n }),\n );\n\n // Register all V1 networks\n facilitator.registerV1(\n NETWORKS as Network[],\n new ExactEvmSchemeV1(config.signer, {\n eip6492AllowedFactories: config.eip6492AllowedFactories,\n simulateInSettle: config.simulateInSettle,\n }),\n );\n\n return facilitator;\n}\n"],"mappings":"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","names":["getAddress","getAddress","simOk"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getDefaultAsset
3
- } from "../../chunk-F3OOHBAW.mjs";
3
+ } from "../../chunk-BTYNCDNS.mjs";
4
4
 
5
5
  // src/exact/server/scheme.ts
6
6
  import { convertToTokenAmount, numberToDecimalString } from "@payai/x402/utils";
@@ -1,5 +1,6 @@
1
1
  import { SchemeNetworkClient, PaymentRequirements, PaymentPayload, Network } from '@payai/x402/types';
2
- import { C as ClientEvmSigner } from '../../../signer-D912R4mq.mjs';
2
+ import { C as ClientEvmSigner } from '../../../signer-tYS6Y46X.mjs';
3
+ import 'viem';
3
4
 
4
5
  /**
5
6
  * EVM client implementation for the Exact payment scheme (V1).
@@ -1,7 +1,10 @@
1
1
  import {
2
2
  ExactEvmSchemeV12 as ExactEvmSchemeV1
3
- } from "../../../chunk-ERK2ZPOY.mjs";
4
- import "../../../chunk-C4ZQMS77.mjs";
3
+ } from "../../../chunk-CSQS7ZON.mjs";
4
+ import "../../../chunk-TGFAVNUD.mjs";
5
+ import "../../../chunk-MACPBXCT.mjs";
6
+ import "../../../chunk-VS3RYAYE.mjs";
7
+ import "../../../chunk-TW7Z65AO.mjs";
5
8
  export {
6
9
  ExactEvmSchemeV1
7
10
  };
@@ -1,14 +1,20 @@
1
1
  import { SchemeNetworkFacilitator, PaymentPayload, PaymentRequirements, VerifyResponse, SettleResponse } from '@payai/x402/types';
2
- import { F as FacilitatorEvmSigner } from '../../../signer-D912R4mq.mjs';
2
+ import { F as FacilitatorEvmSigner } from '../../../signer-tYS6Y46X.mjs';
3
+ import 'viem';
3
4
 
4
5
  interface ExactEvmSchemeV1Config {
5
6
  /**
6
- * If enabled, the facilitator will deploy ERC-4337 smart wallets
7
- * via EIP-6492 when encountering undeployed contract signatures.
7
+ * Allowlist of factory contract addresses (hex strings, case-insensitive) that the facilitator
8
+ * will call when deploying an undeployed smart wallet via ERC-6492.
8
9
  *
9
- * @default false
10
+ * A non-empty list enables ERC-4337 smart wallet deployment via EIP-6492. Facilitators must
11
+ * explicitly list every factory they trust to prevent arbitrary transaction injection via
12
+ * attacker-controlled ERC-6492 signature wrappers. An empty or omitted list denies all factory
13
+ * deployment calls.
14
+ *
15
+ * @default []
10
16
  */
11
- deployERC4337WithEIP6492?: boolean;
17
+ eip6492AllowedFactories?: string[];
12
18
  /**
13
19
  * If enabled, simulates transaction before settling. Defaults to false, ie only simulate during verify.
14
20
  *
@@ -1,7 +1,10 @@
1
1
  import {
2
2
  ExactEvmSchemeV1
3
- } from "../../../chunk-ERK2ZPOY.mjs";
4
- import "../../../chunk-C4ZQMS77.mjs";
3
+ } from "../../../chunk-CSQS7ZON.mjs";
4
+ import "../../../chunk-TGFAVNUD.mjs";
5
+ import "../../../chunk-MACPBXCT.mjs";
6
+ import "../../../chunk-VS3RYAYE.mjs";
7
+ import "../../../chunk-TW7Z65AO.mjs";
5
8
  export {
6
9
  ExactEvmSchemeV1
7
10
  };
@@ -1,8 +1,13 @@
1
- export { E as ExactEvmScheme } from './scheme-DCR7hsa3.mjs';
2
- export { C as ClientEvmSigner, F as FacilitatorEvmSigner, t as toClientEvmSigner, a as toFacilitatorEvmSigner } from './signer-D912R4mq.mjs';
3
- export { a as PERMIT2_ADDRESS, P as Permit2AllowanceParams, d as authorizationTypes, c as createPermit2ApprovalTx, f as eip3009ABI, e as erc20AllowanceAbi, g as getPermit2AllowanceReadParams, p as permit2WitnessTypes, u as uptoPermit2WitnessTypes, h as x402ExactPermit2ProxyABI, x as x402ExactPermit2ProxyAddress, i as x402UptoPermit2ProxyABI, b as x402UptoPermit2ProxyAddress } from './permit2-CyZxwngN.mjs';
1
+ export { E as ExactEvmScheme } from './scheme-gtqAIYPJ.mjs';
2
+ export { C as ClientEvmSigner, F as FacilitatorEvmSigner, t as toClientEvmSigner, a as toFacilitatorEvmSigner } from './signer-tYS6Y46X.mjs';
3
+ export { a as PERMIT2_ADDRESS, P as Permit2AllowanceParams, d as authorizationTypes, c as createPermit2ApprovalTx, f as eip3009ABI, e as erc20AllowanceAbi, g as getPermit2AllowanceReadParams, p as permit2WitnessTypes, u as uptoPermit2WitnessTypes, h as x402ExactPermit2ProxyABI, x as x402ExactPermit2ProxyAddress, i as x402UptoPermit2ProxyABI, b as x402UptoPermit2ProxyAddress } from './permit2-DhJRUcgY.mjs';
4
4
  export { UptoEvmScheme } from './upto/client/index.mjs';
5
- import '@payai/x402/types';
5
+ export { B as BatchSettlementEvmScheme } from './scheme-DtbSS4Fk.mjs';
6
+ export { A as AuthorizerSigner, f as BatchSettlementClaimPayload, B as BatchSettlementDepositPayload, g as BatchSettlementEnrichedRefundPayload, e as BatchSettlementErc3009Authorization, k as BatchSettlementFacilitatorSettlePayload, i as BatchSettlementPayload, l as BatchSettlementPaymentRequirementsExtra, m as BatchSettlementPaymentResponseExtra, c as BatchSettlementRefundPayload, j as BatchSettlementSettlePayload, h as BatchSettlementVoucherClaim, d as BatchSettlementVoucherFields, b as BatchSettlementVoucherPayload, C as ChannelConfig, a as ChannelState, q as isBatchSettlementClaimPayload, n as isBatchSettlementDepositPayload, s as isBatchSettlementEnrichedRefundPayload, p as isBatchSettlementRefundPayload, r as isBatchSettlementSettlePayload, o as isBatchSettlementVoucherPayload } from './types-CF8P2-NM.mjs';
7
+ import { Network } from '@payai/x402/types';
8
+ import './rpc-DULZzRne.mjs';
9
+ import 'viem';
10
+ import './storage-6W5MO46W.mjs';
6
11
 
7
12
  /**
8
13
  * Asset transfer methods for the exact EVM scheme.
@@ -99,14 +104,115 @@ type UptoPermit2Payload = {
99
104
  from: `0x${string}`;
100
105
  };
101
106
  };
107
+
102
108
  /**
103
109
  * Type guard to check if a payload is an upto Permit2 payload.
104
110
  * Validates structural presence of all required fields: signature, permit2Authorization
105
111
  * (with from, permitted, spender, nonce, deadline), and a witness containing facilitator.
106
112
  *
107
- * @param payload - The payload to check
108
- * @returns True if the payload is an upto Permit2 payload, false otherwise
113
+ * @param payload - The payload to check.
114
+ * @returns True if the payload is an upto Permit2 payload, false otherwise.
109
115
  */
110
116
  declare function isUptoPermit2Payload(payload: Record<string, unknown>): payload is UptoPermit2Payload;
111
117
 
112
- export { type AssetTransferMethod, type ExactEIP3009Payload, type ExactEvmPayloadV1, type ExactEvmPayloadV2, type ExactPermit2Payload, type Permit2Authorization, type Permit2Witness, type UptoPermit2Authorization, type UptoPermit2Payload, type UptoPermit2Witness, isEIP3009Payload, isPermit2Payload, isUptoPermit2Payload };
118
+ /** Scheme identifier for the batch-settlement payment scheme. */
119
+ declare const BATCH_SETTLEMENT_SCHEME: "batch-settlement";
120
+ /** Deployed address of the x402BatchSettlement contract. */
121
+ declare const BATCH_SETTLEMENT_ADDRESS: "0x4020074e9dF2ce1deE5A9C1b5c3f541D02a10003";
122
+ /** Deployed address of the ERC3009DepositCollector contract. */
123
+ declare const ERC3009_DEPOSIT_COLLECTOR_ADDRESS: "0x4020806089470a89826cB9fB1f4059150b550004";
124
+ /** EIP-712 domain fields shared across all batch-settlement typed-data signatures. */
125
+ declare const BATCH_SETTLEMENT_DOMAIN: {
126
+ readonly name: "x402 Batch Settlement";
127
+ readonly version: "1";
128
+ };
129
+ /** EIP-712 type definition for a cumulative voucher: `Voucher(bytes32 channelId, uint128 maxClaimableAmount)`. */
130
+ declare const voucherTypes: {
131
+ readonly Voucher: readonly [{
132
+ readonly name: "channelId";
133
+ readonly type: "bytes32";
134
+ }, {
135
+ readonly name: "maxClaimableAmount";
136
+ readonly type: "uint128";
137
+ }];
138
+ };
139
+ /** EIP-712 type definition for cooperative refund: `Refund(bytes32 channelId, uint256 nonce, uint128 amount)`. */
140
+ declare const refundTypes: {
141
+ readonly Refund: readonly [{
142
+ readonly name: "channelId";
143
+ readonly type: "bytes32";
144
+ }, {
145
+ readonly name: "nonce";
146
+ readonly type: "uint256";
147
+ }, {
148
+ readonly name: "amount";
149
+ readonly type: "uint128";
150
+ }];
151
+ };
152
+ /** EIP-712 type definitions for a receiver-authorizer claim batch (nested ClaimEntry). */
153
+ declare const claimBatchTypes: {
154
+ readonly ClaimBatch: readonly [{
155
+ readonly name: "claims";
156
+ readonly type: "ClaimEntry[]";
157
+ }];
158
+ readonly ClaimEntry: readonly [{
159
+ readonly name: "channelId";
160
+ readonly type: "bytes32";
161
+ }, {
162
+ readonly name: "maxClaimableAmount";
163
+ readonly type: "uint128";
164
+ }, {
165
+ readonly name: "totalClaimed";
166
+ readonly type: "uint128";
167
+ }];
168
+ };
169
+
170
+ /**
171
+ * Base stablecoin asset configuration shared across all EVM payment schemes.
172
+ * Contains the core fields needed to identify and convert tokens.
173
+ */
174
+ type DefaultAssetInfo = {
175
+ /** Token contract address */
176
+ address: string;
177
+ /** EIP-712 domain name (must match the token's domain separator) */
178
+ name: string;
179
+ /** EIP-712 domain version (must match the token's domain separator) */
180
+ version: string;
181
+ /** Token decimal places (typically 6 for USDC) */
182
+ decimals: number;
183
+ };
184
+ /**
185
+ * Extended asset configuration for the exact scheme.
186
+ * Includes transfer method hints that control client-side behaviour.
187
+ */
188
+ type ExactDefaultAssetInfo = DefaultAssetInfo & {
189
+ /**
190
+ * Transfer method override: `"permit2"` for tokens that don't support EIP-3009.
191
+ * Omit for EIP-3009 tokens (default behaviour).
192
+ */
193
+ assetTransferMethod?: string;
194
+ /**
195
+ * Set to `true` for permit2 tokens that implement EIP-2612 `permit()`.
196
+ * Controls whether name/version are included in `extra` so the client can
197
+ * sign a gasless EIP-2612 permit for Permit2 approval.
198
+ */
199
+ supportsEip2612?: boolean;
200
+ };
201
+ /**
202
+ * Default stablecoins indexed by CAIP-2 network identifier.
203
+ *
204
+ * Each network has the right to determine its own default stablecoin that can
205
+ * be expressed as a USD string by calling servers. See DEFAULT_ASSET.md in
206
+ * exact/server/ for how to add new chains.
207
+ */
208
+ declare const DEFAULT_STABLECOINS: Record<string, ExactDefaultAssetInfo>;
209
+ /**
210
+ * Look up the default stablecoin for a network.
211
+ *
212
+ * @param network - CAIP-2 network identifier (e.g. "eip155:8453")
213
+ * @returns The default asset info
214
+ * @throws If no default asset is configured for the network
215
+ */
216
+ declare function getDefaultAsset(network: Network): ExactDefaultAssetInfo;
217
+
218
+ export { type AssetTransferMethod, BATCH_SETTLEMENT_ADDRESS, BATCH_SETTLEMENT_DOMAIN, BATCH_SETTLEMENT_SCHEME, DEFAULT_STABLECOINS, type DefaultAssetInfo, ERC3009_DEPOSIT_COLLECTOR_ADDRESS, type ExactDefaultAssetInfo, type ExactEIP3009Payload, type ExactEvmPayloadV1, type ExactEvmPayloadV2, type ExactPermit2Payload, type Permit2Authorization, type Permit2Witness, type UptoPermit2Authorization, type UptoPermit2Payload, type UptoPermit2Witness, claimBatchTypes, getDefaultAsset, isEIP3009Payload, isPermit2Payload, isUptoPermit2Payload, refundTypes, voucherTypes };