@x402/evm 2.2.0 → 2.3.1

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 (52) hide show
  1. package/dist/cjs/exact/client/index.d.ts +2 -2
  2. package/dist/cjs/exact/client/index.js +265 -119
  3. package/dist/cjs/exact/client/index.js.map +1 -1
  4. package/dist/cjs/exact/facilitator/index.d.ts +3 -0
  5. package/dist/cjs/exact/facilitator/index.js +692 -281
  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.js +44 -17
  10. package/dist/cjs/exact/v1/client/index.js.map +1 -1
  11. package/dist/cjs/exact/v1/facilitator/index.js +60 -26
  12. package/dist/cjs/exact/v1/facilitator/index.js.map +1 -1
  13. package/dist/cjs/index.d.ts +458 -31
  14. package/dist/cjs/index.js +439 -63
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/permit2-BYv82va2.d.ts +103 -0
  17. package/dist/cjs/v1/index.d.ts +22 -1
  18. package/dist/cjs/v1/index.js +34 -29
  19. package/dist/cjs/v1/index.js.map +1 -1
  20. package/dist/esm/chunk-E2YMUI3X.mjs +229 -0
  21. package/dist/esm/chunk-E2YMUI3X.mjs.map +1 -0
  22. package/dist/esm/chunk-PFULIQAE.mjs +13 -0
  23. package/dist/esm/chunk-PFULIQAE.mjs.map +1 -0
  24. package/dist/esm/chunk-RPL6OFJL.mjs +659 -0
  25. package/dist/esm/chunk-RPL6OFJL.mjs.map +1 -0
  26. package/dist/esm/exact/client/index.d.mts +2 -2
  27. package/dist/esm/exact/client/index.mjs +10 -30
  28. package/dist/esm/exact/client/index.mjs.map +1 -1
  29. package/dist/esm/exact/facilitator/index.d.mts +3 -0
  30. package/dist/esm/exact/facilitator/index.mjs +491 -241
  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.mjs +1 -2
  35. package/dist/esm/exact/v1/facilitator/index.mjs +2 -3
  36. package/dist/esm/index.d.mts +458 -31
  37. package/dist/esm/index.mjs +31 -4
  38. package/dist/esm/index.mjs.map +1 -1
  39. package/dist/esm/permit2-BsAoJiWD.d.mts +103 -0
  40. package/dist/esm/v1/index.d.mts +22 -1
  41. package/dist/esm/v1/index.mjs +4 -6
  42. package/package.json +2 -2
  43. package/dist/esm/chunk-FOUXRQAV.mjs +0 -88
  44. package/dist/esm/chunk-FOUXRQAV.mjs.map +0 -1
  45. package/dist/esm/chunk-JYZWCLMP.mjs +0 -305
  46. package/dist/esm/chunk-JYZWCLMP.mjs.map +0 -1
  47. package/dist/esm/chunk-PSA4YVU2.mjs +0 -92
  48. package/dist/esm/chunk-PSA4YVU2.mjs.map +0 -1
  49. package/dist/esm/chunk-QLXM7BIB.mjs +0 -23
  50. package/dist/esm/chunk-QLXM7BIB.mjs.map +0 -1
  51. package/dist/esm/chunk-ZYXTTU74.mjs +0 -88
  52. package/dist/esm/chunk-ZYXTTU74.mjs.map +0 -1
@@ -0,0 +1,229 @@
1
+ import {
2
+ ExactEvmSchemeV1,
3
+ NETWORKS,
4
+ PERMIT2_ADDRESS,
5
+ authorizationTypes,
6
+ createNonce,
7
+ createPermit2Nonce,
8
+ permit2WitnessTypes,
9
+ x402ExactPermit2ProxyAddress
10
+ } from "./chunk-RPL6OFJL.mjs";
11
+
12
+ // src/exact/client/eip3009.ts
13
+ import { getAddress } from "viem";
14
+ async function createEIP3009Payload(signer, x402Version, paymentRequirements) {
15
+ const nonce = createNonce();
16
+ const now = Math.floor(Date.now() / 1e3);
17
+ const authorization = {
18
+ from: signer.address,
19
+ to: getAddress(paymentRequirements.payTo),
20
+ value: paymentRequirements.amount,
21
+ validAfter: (now - 600).toString(),
22
+ validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),
23
+ nonce
24
+ };
25
+ const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);
26
+ const payload = {
27
+ authorization,
28
+ signature
29
+ };
30
+ return {
31
+ x402Version,
32
+ payload
33
+ };
34
+ }
35
+ async function signEIP3009Authorization(signer, authorization, requirements) {
36
+ const chainId = parseInt(requirements.network.split(":")[1]);
37
+ if (!requirements.extra?.name || !requirements.extra?.version) {
38
+ throw new Error(
39
+ `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
40
+ );
41
+ }
42
+ const { name, version } = requirements.extra;
43
+ const domain = {
44
+ name,
45
+ version,
46
+ chainId,
47
+ verifyingContract: getAddress(requirements.asset)
48
+ };
49
+ const message = {
50
+ from: getAddress(authorization.from),
51
+ to: getAddress(authorization.to),
52
+ value: BigInt(authorization.value),
53
+ validAfter: BigInt(authorization.validAfter),
54
+ validBefore: BigInt(authorization.validBefore),
55
+ nonce: authorization.nonce
56
+ };
57
+ return await signer.signTypedData({
58
+ domain,
59
+ types: authorizationTypes,
60
+ primaryType: "TransferWithAuthorization",
61
+ message
62
+ });
63
+ }
64
+
65
+ // src/exact/client/permit2.ts
66
+ import { encodeFunctionData, getAddress as getAddress2 } from "viem";
67
+ var MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
68
+ async function createPermit2Payload(signer, x402Version, paymentRequirements) {
69
+ const now = Math.floor(Date.now() / 1e3);
70
+ const nonce = createPermit2Nonce();
71
+ const validAfter = (now - 600).toString();
72
+ const deadline = (now + paymentRequirements.maxTimeoutSeconds).toString();
73
+ const permit2Authorization = {
74
+ from: signer.address,
75
+ permitted: {
76
+ token: getAddress2(paymentRequirements.asset),
77
+ amount: paymentRequirements.amount
78
+ },
79
+ spender: x402ExactPermit2ProxyAddress,
80
+ nonce,
81
+ deadline,
82
+ witness: {
83
+ to: getAddress2(paymentRequirements.payTo),
84
+ validAfter,
85
+ extra: "0x"
86
+ }
87
+ };
88
+ const signature = await signPermit2Authorization(
89
+ signer,
90
+ permit2Authorization,
91
+ paymentRequirements
92
+ );
93
+ const payload = {
94
+ signature,
95
+ permit2Authorization
96
+ };
97
+ return {
98
+ x402Version,
99
+ payload
100
+ };
101
+ }
102
+ async function signPermit2Authorization(signer, permit2Authorization, requirements) {
103
+ const chainId = parseInt(requirements.network.split(":")[1]);
104
+ const domain = {
105
+ name: "Permit2",
106
+ chainId,
107
+ verifyingContract: PERMIT2_ADDRESS
108
+ };
109
+ const message = {
110
+ permitted: {
111
+ token: getAddress2(permit2Authorization.permitted.token),
112
+ amount: BigInt(permit2Authorization.permitted.amount)
113
+ },
114
+ spender: getAddress2(permit2Authorization.spender),
115
+ nonce: BigInt(permit2Authorization.nonce),
116
+ deadline: BigInt(permit2Authorization.deadline),
117
+ witness: {
118
+ to: getAddress2(permit2Authorization.witness.to),
119
+ validAfter: BigInt(permit2Authorization.witness.validAfter),
120
+ extra: permit2Authorization.witness.extra
121
+ }
122
+ };
123
+ return await signer.signTypedData({
124
+ domain,
125
+ types: permit2WitnessTypes,
126
+ primaryType: "PermitWitnessTransferFrom",
127
+ message
128
+ });
129
+ }
130
+ var erc20ApproveAbi = [
131
+ {
132
+ type: "function",
133
+ name: "approve",
134
+ inputs: [
135
+ { name: "spender", type: "address" },
136
+ { name: "amount", type: "uint256" }
137
+ ],
138
+ outputs: [{ type: "bool" }],
139
+ stateMutability: "nonpayable"
140
+ }
141
+ ];
142
+ var erc20AllowanceAbi = [
143
+ {
144
+ type: "function",
145
+ name: "allowance",
146
+ inputs: [
147
+ { name: "owner", type: "address" },
148
+ { name: "spender", type: "address" }
149
+ ],
150
+ outputs: [{ type: "uint256" }],
151
+ stateMutability: "view"
152
+ }
153
+ ];
154
+ function createPermit2ApprovalTx(tokenAddress) {
155
+ const data = encodeFunctionData({
156
+ abi: erc20ApproveAbi,
157
+ functionName: "approve",
158
+ args: [PERMIT2_ADDRESS, MAX_UINT256]
159
+ });
160
+ return {
161
+ to: getAddress2(tokenAddress),
162
+ data
163
+ };
164
+ }
165
+ function getPermit2AllowanceReadParams(params) {
166
+ return {
167
+ address: getAddress2(params.tokenAddress),
168
+ abi: erc20AllowanceAbi,
169
+ functionName: "allowance",
170
+ args: [getAddress2(params.ownerAddress), PERMIT2_ADDRESS]
171
+ };
172
+ }
173
+
174
+ // src/exact/client/scheme.ts
175
+ var ExactEvmScheme = class {
176
+ /**
177
+ * Creates a new ExactEvmClient instance.
178
+ *
179
+ * @param signer - The EVM signer for client operations
180
+ */
181
+ constructor(signer) {
182
+ this.signer = signer;
183
+ this.scheme = "exact";
184
+ }
185
+ /**
186
+ * Creates a payment payload for the Exact scheme.
187
+ * Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.
188
+ *
189
+ * @param x402Version - The x402 protocol version
190
+ * @param paymentRequirements - The payment requirements
191
+ * @returns Promise resolving to a payment payload result
192
+ */
193
+ async createPaymentPayload(x402Version, paymentRequirements) {
194
+ const assetTransferMethod = paymentRequirements.extra?.assetTransferMethod ?? "eip3009";
195
+ if (assetTransferMethod === "permit2") {
196
+ return createPermit2Payload(this.signer, x402Version, paymentRequirements);
197
+ }
198
+ return createEIP3009Payload(this.signer, x402Version, paymentRequirements);
199
+ }
200
+ };
201
+
202
+ // src/exact/client/register.ts
203
+ function registerExactEvmScheme(client, config) {
204
+ if (config.networks && config.networks.length > 0) {
205
+ config.networks.forEach((network) => {
206
+ client.register(network, new ExactEvmScheme(config.signer));
207
+ });
208
+ } else {
209
+ client.register("eip155:*", new ExactEvmScheme(config.signer));
210
+ }
211
+ NETWORKS.forEach((network) => {
212
+ client.registerV1(network, new ExactEvmSchemeV1(config.signer));
213
+ });
214
+ if (config.policies) {
215
+ config.policies.forEach((policy) => {
216
+ client.registerPolicy(policy);
217
+ });
218
+ }
219
+ return client;
220
+ }
221
+
222
+ export {
223
+ erc20AllowanceAbi,
224
+ createPermit2ApprovalTx,
225
+ getPermit2AllowanceReadParams,
226
+ ExactEvmScheme,
227
+ registerExactEvmScheme
228
+ };
229
+ //# sourceMappingURL=chunk-E2YMUI3X.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exact/client/eip3009.ts","../../src/exact/client/permit2.ts","../../src/exact/client/scheme.ts","../../src/exact/client/register.ts"],"sourcesContent":["import { PaymentRequirements, PaymentPayloadResult } from \"@x402/core/types\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport { createNonce } from \"../../utils\";\n\n/**\n * Creates an EIP-3009 (transferWithAuthorization) payload.\n *\n * @param signer - The EVM signer for client operations\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createEIP3009Payload(\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise<PaymentPayloadResult> {\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization: ExactEIP3009Payload[\"authorization\"] = {\n from: signer.address,\n to: getAddress(paymentRequirements.payTo),\n value: paymentRequirements.amount,\n validAfter: (now - 600).toString(),\n validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);\n\n const payload: ExactEIP3009Payload = {\n authorization,\n signature,\n };\n\n return {\n x402Version,\n payload,\n };\n}\n\n/**\n * Sign the EIP-3009 authorization using EIP-712.\n *\n * @param signer - The EVM signer\n * @param authorization - The authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\nasync function signEIP3009Authorization(\n signer: ClientEvmSigner,\n authorization: ExactEIP3009Payload[\"authorization\"],\n requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n const chainId = parseInt(requirements.network.split(\":\")[1]);\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`,\n );\n }\n\n const { name, version } = requirements.extra;\n\n const domain = {\n name,\n version,\n chainId,\n verifyingContract: getAddress(requirements.asset),\n };\n\n const message = {\n from: getAddress(authorization.from),\n to: getAddress(authorization.to),\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n };\n\n return await signer.signTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n}\n","import { PaymentRequirements, PaymentPayloadResult } from \"@x402/core/types\";\nimport { encodeFunctionData, getAddress } from \"viem\";\nimport {\n permit2WitnessTypes,\n PERMIT2_ADDRESS,\n x402ExactPermit2ProxyAddress,\n} from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactPermit2Payload } from \"../../types\";\nimport { createPermit2Nonce } from \"../../utils\";\n\n/** Maximum uint256 value for unlimited approval. */\nconst MAX_UINT256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n\n/**\n * Creates a Permit2 payload using the x402Permit2Proxy witness pattern.\n * The spender is set to x402Permit2Proxy, which enforces that funds\n * can only be sent to the witness.to address.\n *\n * @param signer - The EVM signer for client operations\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createPermit2Payload(\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise<PaymentPayloadResult> {\n const now = Math.floor(Date.now() / 1000);\n const nonce = createPermit2Nonce();\n\n // Lower time bound - allow some clock skew\n const validAfter = (now - 600).toString();\n // Upper time bound is enforced by Permit2's deadline field\n const deadline = (now + paymentRequirements.maxTimeoutSeconds).toString();\n\n const permit2Authorization: ExactPermit2Payload[\"permit2Authorization\"] = {\n from: signer.address,\n permitted: {\n token: getAddress(paymentRequirements.asset),\n amount: paymentRequirements.amount,\n },\n spender: x402ExactPermit2ProxyAddress,\n nonce,\n deadline,\n witness: {\n to: getAddress(paymentRequirements.payTo),\n validAfter,\n extra: \"0x\",\n },\n };\n\n const signature = await signPermit2Authorization(\n signer,\n permit2Authorization,\n paymentRequirements,\n );\n\n const payload: ExactPermit2Payload = {\n signature,\n permit2Authorization,\n };\n\n return {\n x402Version,\n payload,\n };\n}\n\n/**\n * Sign the Permit2 authorization using EIP-712 with witness data.\n * The signature authorizes the x402Permit2Proxy to transfer tokens on behalf of the signer.\n *\n * @param signer - The EVM signer\n * @param permit2Authorization - The Permit2 authorization parameters\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\nasync function signPermit2Authorization(\n signer: ClientEvmSigner,\n permit2Authorization: ExactPermit2Payload[\"permit2Authorization\"],\n requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n const chainId = parseInt(requirements.network.split(\":\")[1]);\n\n const domain = {\n name: \"Permit2\",\n chainId,\n verifyingContract: PERMIT2_ADDRESS,\n };\n\n const message = {\n permitted: {\n token: getAddress(permit2Authorization.permitted.token),\n amount: BigInt(permit2Authorization.permitted.amount),\n },\n spender: getAddress(permit2Authorization.spender),\n nonce: BigInt(permit2Authorization.nonce),\n deadline: BigInt(permit2Authorization.deadline),\n witness: {\n to: getAddress(permit2Authorization.witness.to),\n validAfter: BigInt(permit2Authorization.witness.validAfter),\n extra: permit2Authorization.witness.extra,\n },\n };\n\n return await signer.signTypedData({\n domain,\n types: permit2WitnessTypes,\n primaryType: \"PermitWitnessTransferFrom\",\n message,\n });\n}\n\n/**\n * ERC20 approve ABI for encoding approval transactions.\n */\nconst erc20ApproveAbi = [\n {\n type: \"function\",\n name: \"approve\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n] as const;\n\n/**\n * ERC20 allowance ABI for checking approval status.\n */\nexport const erc20AllowanceAbi = [\n {\n type: \"function\",\n name: \"allowance\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\n/**\n * Creates transaction data to approve Permit2 to spend tokens.\n * The user sends this transaction (paying gas) before using Permit2 flow.\n *\n * @param tokenAddress - The ERC20 token contract address\n * @returns Transaction data to send for approval\n *\n * @example\n * ```typescript\n * const tx = createPermit2ApprovalTx(\"0x...\");\n * await walletClient.sendTransaction({\n * to: tx.to,\n * data: tx.data,\n * });\n * ```\n */\nexport function createPermit2ApprovalTx(tokenAddress: `0x${string}`): {\n to: `0x${string}`;\n data: `0x${string}`;\n} {\n const data = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: \"approve\",\n args: [PERMIT2_ADDRESS, MAX_UINT256],\n });\n\n return {\n to: getAddress(tokenAddress),\n data,\n };\n}\n\n/**\n * Parameters for checking Permit2 allowance.\n * Application provides these to check if approval is needed.\n */\nexport interface Permit2AllowanceParams {\n tokenAddress: `0x${string}`;\n ownerAddress: `0x${string}`;\n}\n\n/**\n * Returns contract read parameters for checking Permit2 allowance.\n * Use with a public client to check if the user has approved Permit2.\n *\n * @param params - The allowance check parameters\n * @returns Contract read parameters for checking allowance\n *\n * @example\n * ```typescript\n * const readParams = getPermit2AllowanceReadParams({\n * tokenAddress: \"0x...\",\n * ownerAddress: \"0x...\",\n * });\n *\n * const allowance = await publicClient.readContract(readParams);\n * const needsApproval = allowance < requiredAmount;\n * ```\n */\nexport function getPermit2AllowanceReadParams(params: Permit2AllowanceParams): {\n address: `0x${string}`;\n abi: typeof erc20AllowanceAbi;\n functionName: \"allowance\";\n args: [`0x${string}`, `0x${string}`];\n} {\n return {\n address: getAddress(params.tokenAddress),\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [getAddress(params.ownerAddress), PERMIT2_ADDRESS],\n };\n}\n","import { PaymentRequirements, SchemeNetworkClient, PaymentPayloadResult } from \"@x402/core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { AssetTransferMethod } from \"../../types\";\nimport { createEIP3009Payload } from \"./eip3009\";\nimport { createPermit2Payload } from \"./permit2\";\n\n/**\n * EVM client implementation for the Exact payment scheme.\n * Supports both EIP-3009 (transferWithAuthorization) and Permit2 flows.\n *\n * Routes to the appropriate authorization method based on\n * `requirements.extra.assetTransferMethod`. Defaults to EIP-3009\n * for backward compatibility with older facilitators.\n */\nexport class ExactEvmScheme implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactEvmClient instance.\n *\n * @param signer - The EVM signer for client operations\n */\n constructor(private readonly signer: ClientEvmSigner) {}\n\n /**\n * Creates a payment payload for the Exact scheme.\n * Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<PaymentPayloadResult> {\n const assetTransferMethod =\n (paymentRequirements.extra?.assetTransferMethod as AssetTransferMethod) ?? \"eip3009\";\n\n if (assetTransferMethod === \"permit2\") {\n return createPermit2Payload(this.signer, x402Version, paymentRequirements);\n }\n\n return createEIP3009Payload(this.signer, x402Version, paymentRequirements);\n }\n}\n","import { x402Client, SelectPaymentRequirements, PaymentPolicy } from \"@x402/core/client\";\nimport { Network } from \"@x402/core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEvmScheme } from \"./scheme\";\nimport { ExactEvmSchemeV1 } from \"../v1/client/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering EVM schemes to an x402Client\n */\nexport interface EvmClientConfig {\n /**\n * The EVM signer to use for creating payment payloads\n */\n signer: ClientEvmSigner;\n\n /**\n * Optional payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (eip155:*)\n */\n networks?: Network[];\n}\n\n/**\n * Registers EVM exact payment schemes to an x402Client instance.\n *\n * This function registers:\n * - V2: eip155:* wildcard scheme with ExactEvmScheme (or specific networks if provided)\n * - V1: All supported EVM networks with ExactEvmSchemeV1\n *\n * @param client - The x402Client instance to register schemes to\n * @param config - Configuration for EVM client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactEvmScheme } from \"@x402/evm/exact/client/register\";\n * import { x402Client } from \"@x402/core/client\";\n * import { privateKeyToAccount } from \"viem/accounts\";\n *\n * const account = privateKeyToAccount(\"0x...\");\n * const client = new x402Client();\n * registerExactEvmScheme(client, { signer: account });\n * ```\n */\nexport function registerExactEvmScheme(client: x402Client, config: EvmClientConfig): x402Client {\n // Register V2 scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach(network => {\n client.register(network, new ExactEvmScheme(config.signer));\n });\n } else {\n // Register wildcard for all EVM chains\n client.register(\"eip155:*\", new ExactEvmScheme(config.signer));\n }\n\n // Register all V1 networks\n NETWORKS.forEach(network => {\n client.registerV1(network as Network, new ExactEvmSchemeV1(config.signer));\n });\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach(policy => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n"],"mappings":"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","names":["getAddress","getAddress"]}
@@ -0,0 +1,13 @@
1
+ // src/types.ts
2
+ function isPermit2Payload(payload) {
3
+ return "permit2Authorization" in payload;
4
+ }
5
+ function isEIP3009Payload(payload) {
6
+ return "authorization" in payload;
7
+ }
8
+
9
+ export {
10
+ isPermit2Payload,
11
+ isEIP3009Payload
12
+ };
13
+ //# sourceMappingURL=chunk-PFULIQAE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types.ts"],"sourcesContent":["/**\n * Asset transfer methods for the exact EVM scheme.\n * - eip3009: Uses transferWithAuthorization (USDC, etc.) - recommended for compatible tokens\n * - permit2: Uses Permit2 + x402Permit2Proxy - universal fallback for any ERC-20\n */\nexport type AssetTransferMethod = \"eip3009\" | \"permit2\";\n\n/**\n * EIP-3009 payload for tokens with native transferWithAuthorization support.\n */\nexport type ExactEIP3009Payload = {\n signature?: `0x${string}`;\n authorization: {\n from: `0x${string}`;\n to: `0x${string}`;\n value: string;\n validAfter: string;\n validBefore: string;\n nonce: `0x${string}`;\n };\n};\n\n/**\n * Permit2 witness data structure.\n * Matches the Witness struct in x402Permit2Proxy contract.\n * Note: Upper time bound is enforced by Permit2's `deadline` field, not a witness field.\n */\nexport type Permit2Witness = {\n to: `0x${string}`;\n validAfter: string;\n extra: `0x${string}`;\n};\n\n/**\n * Permit2 authorization parameters.\n * Used to reconstruct the signed message for verification.\n */\nexport type Permit2Authorization = {\n permitted: {\n token: `0x${string}`;\n amount: string;\n };\n spender: `0x${string}`;\n nonce: string;\n deadline: string;\n witness: Permit2Witness;\n};\n\n/**\n * Permit2 payload for tokens using the Permit2 + x402Permit2Proxy flow.\n */\nexport type ExactPermit2Payload = {\n signature: `0x${string}`;\n permit2Authorization: Permit2Authorization & {\n from: `0x${string}`;\n };\n};\n\nexport type ExactEvmPayloadV1 = ExactEIP3009Payload;\n\nexport type ExactEvmPayloadV2 = ExactEIP3009Payload | ExactPermit2Payload;\n\n/**\n * Type guard to check if a payload is a Permit2 payload.\n * Permit2 payloads have a `permit2Authorization` field.\n *\n * @param payload - The payload to check.\n * @returns True if the payload is a Permit2 payload, false otherwise.\n */\nexport function isPermit2Payload(payload: ExactEvmPayloadV2): payload is ExactPermit2Payload {\n return \"permit2Authorization\" in payload;\n}\n\n/**\n * Type guard to check if a payload is an EIP-3009 payload.\n * EIP-3009 payloads have an `authorization` field.\n *\n * @param payload - The payload to check.\n * @returns True if the payload is an EIP-3009 payload, false otherwise.\n */\nexport function isEIP3009Payload(payload: ExactEvmPayloadV2): payload is ExactEIP3009Payload {\n return \"authorization\" in payload;\n}\n"],"mappings":";AAqEO,SAAS,iBAAiB,SAA4D;AAC3F,SAAO,0BAA0B;AACnC;AASO,SAAS,iBAAiB,SAA4D;AAC3F,SAAO,mBAAmB;AAC5B;","names":[]}