@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
@@ -1,5 +1,5 @@
1
- export { ExactEvmScheme } from '../../index.js';
2
- import { x402Client, SelectPaymentRequirements, PaymentPolicy } from '@x402/core/client';
1
+ export { E as ExactEvmScheme, P as Permit2AllowanceParams, c as createPermit2ApprovalTx, e as erc20AllowanceAbi, g as getPermit2AllowanceReadParams } from '../../permit2-BYv82va2.js';
2
+ import { SelectPaymentRequirements, PaymentPolicy, x402Client } from '@x402/core/client';
3
3
  import { Network } from '@x402/core/types';
4
4
  import { C as ClientEvmSigner } from '../../signer-5OVDxViv.js';
5
5
 
@@ -21,12 +21,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var client_exports = {};
22
22
  __export(client_exports, {
23
23
  ExactEvmScheme: () => ExactEvmScheme,
24
+ createPermit2ApprovalTx: () => createPermit2ApprovalTx,
25
+ erc20AllowanceAbi: () => erc20AllowanceAbi,
26
+ getPermit2AllowanceReadParams: () => getPermit2AllowanceReadParams,
24
27
  registerExactEvmScheme: () => registerExactEvmScheme
25
28
  });
26
29
  module.exports = __toCommonJS(client_exports);
27
30
 
28
- // src/exact/client/scheme.ts
29
- var import_viem2 = require("viem");
31
+ // src/exact/client/eip3009.ts
32
+ var import_viem4 = require("viem");
30
33
 
31
34
  // src/constants.ts
32
35
  var authorizationTypes = {
@@ -39,32 +42,35 @@ var authorizationTypes = {
39
42
  { name: "nonce", type: "bytes32" }
40
43
  ]
41
44
  };
45
+ var permit2WitnessTypes = {
46
+ PermitWitnessTransferFrom: [
47
+ { name: "permitted", type: "TokenPermissions" },
48
+ { name: "spender", type: "address" },
49
+ { name: "nonce", type: "uint256" },
50
+ { name: "deadline", type: "uint256" },
51
+ { name: "witness", type: "Witness" }
52
+ ],
53
+ TokenPermissions: [
54
+ { name: "token", type: "address" },
55
+ { name: "amount", type: "uint256" }
56
+ ],
57
+ Witness: [
58
+ { name: "to", type: "address" },
59
+ { name: "validAfter", type: "uint256" },
60
+ { name: "extra", type: "bytes" }
61
+ ]
62
+ };
63
+ var PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
64
+ var x402ExactPermit2ProxyAddress = "0x4020615294c913F045dc10f0a5cdEbd86c280001";
42
65
 
43
66
  // src/utils.ts
44
- var import_viem = require("viem");
45
- function getEvmChainId(network) {
46
- const networkMap = {
47
- base: 8453,
48
- "base-sepolia": 84532,
49
- ethereum: 1,
50
- sepolia: 11155111,
51
- polygon: 137,
52
- "polygon-amoy": 80002
53
- };
54
- return networkMap[network] || 1;
55
- }
56
- function createNonce() {
57
- const cryptoObj = typeof globalThis.crypto !== "undefined" ? globalThis.crypto : globalThis.crypto;
58
- if (!cryptoObj) {
59
- throw new Error("Crypto API not available");
60
- }
61
- return (0, import_viem.toHex)(cryptoObj.getRandomValues(new Uint8Array(32)));
62
- }
67
+ var import_viem3 = require("viem");
63
68
 
64
- // src/exact/client/scheme.ts
65
- var ExactEvmScheme = class {
69
+ // src/exact/v1/client/scheme.ts
70
+ var import_viem = require("viem");
71
+ var ExactEvmSchemeV1 = class {
66
72
  /**
67
- * Creates a new ExactEvmClient instance.
73
+ * Creates a new ExactEvmClientV1 instance.
68
74
  *
69
75
  * @param signer - The EVM signer for client operations
70
76
  */
@@ -73,31 +79,34 @@ var ExactEvmScheme = class {
73
79
  this.scheme = "exact";
74
80
  }
75
81
  /**
76
- * Creates a payment payload for the Exact scheme.
82
+ * Creates a payment payload for the Exact scheme (V1).
77
83
  *
78
84
  * @param x402Version - The x402 protocol version
79
85
  * @param paymentRequirements - The payment requirements
80
86
  * @returns Promise resolving to a payment payload
81
87
  */
82
88
  async createPaymentPayload(x402Version, paymentRequirements) {
89
+ const selectedV1 = paymentRequirements;
83
90
  const nonce = createNonce();
84
91
  const now = Math.floor(Date.now() / 1e3);
85
92
  const authorization = {
86
93
  from: this.signer.address,
87
- to: (0, import_viem2.getAddress)(paymentRequirements.payTo),
88
- value: paymentRequirements.amount,
94
+ to: (0, import_viem.getAddress)(selectedV1.payTo),
95
+ value: selectedV1.maxAmountRequired,
89
96
  validAfter: (now - 600).toString(),
90
97
  // 10 minutes before
91
- validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),
98
+ validBefore: (now + selectedV1.maxTimeoutSeconds).toString(),
92
99
  nonce
93
100
  };
94
- const signature = await this.signAuthorization(authorization, paymentRequirements);
101
+ const signature = await this.signAuthorization(authorization, selectedV1);
95
102
  const payload = {
96
103
  authorization,
97
104
  signature
98
105
  };
99
106
  return {
100
107
  x402Version,
108
+ scheme: selectedV1.scheme,
109
+ network: selectedV1.network,
101
110
  payload
102
111
  };
103
112
  }
@@ -109,7 +118,7 @@ var ExactEvmScheme = class {
109
118
  * @returns Promise resolving to the signature
110
119
  */
111
120
  async signAuthorization(authorization, requirements) {
112
- const chainId = parseInt(requirements.network.split(":")[1]);
121
+ const chainId = getEvmChainId(requirements.network);
113
122
  if (!requirements.extra?.name || !requirements.extra?.version) {
114
123
  throw new Error(
115
124
  `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
@@ -120,11 +129,11 @@ var ExactEvmScheme = class {
120
129
  name,
121
130
  version,
122
131
  chainId,
123
- verifyingContract: (0, import_viem2.getAddress)(requirements.asset)
132
+ verifyingContract: (0, import_viem.getAddress)(requirements.asset)
124
133
  };
125
134
  const message = {
126
- from: (0, import_viem2.getAddress)(authorization.from),
127
- to: (0, import_viem2.getAddress)(authorization.to),
135
+ from: (0, import_viem.getAddress)(authorization.from),
136
+ to: (0, import_viem.getAddress)(authorization.to),
128
137
  value: BigInt(authorization.value),
129
138
  validAfter: BigInt(authorization.validAfter),
130
139
  validBefore: BigInt(authorization.validBefore),
@@ -139,11 +148,220 @@ var ExactEvmScheme = class {
139
148
  }
140
149
  };
141
150
 
142
- // src/exact/v1/client/scheme.ts
143
- var import_viem3 = require("viem");
144
- var ExactEvmSchemeV1 = class {
151
+ // src/exact/v1/facilitator/scheme.ts
152
+ var import_viem2 = require("viem");
153
+
154
+ // src/v1/index.ts
155
+ var EVM_NETWORK_CHAIN_ID_MAP = {
156
+ ethereum: 1,
157
+ sepolia: 11155111,
158
+ abstract: 2741,
159
+ "abstract-testnet": 11124,
160
+ "base-sepolia": 84532,
161
+ base: 8453,
162
+ "avalanche-fuji": 43113,
163
+ avalanche: 43114,
164
+ iotex: 4689,
165
+ sei: 1329,
166
+ "sei-testnet": 1328,
167
+ polygon: 137,
168
+ "polygon-amoy": 80002,
169
+ peaq: 3338,
170
+ story: 1514,
171
+ educhain: 41923,
172
+ "skale-base-sepolia": 324705682,
173
+ megaeth: 4326
174
+ };
175
+ var NETWORKS = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);
176
+
177
+ // src/utils.ts
178
+ function getEvmChainId(network) {
179
+ const chainId = EVM_NETWORK_CHAIN_ID_MAP[network];
180
+ if (!chainId) {
181
+ throw new Error(`Unsupported network: ${network}`);
182
+ }
183
+ return chainId;
184
+ }
185
+ function getCrypto() {
186
+ const cryptoObj = globalThis.crypto;
187
+ if (!cryptoObj) {
188
+ throw new Error("Crypto API not available");
189
+ }
190
+ return cryptoObj;
191
+ }
192
+ function createNonce() {
193
+ return (0, import_viem3.toHex)(getCrypto().getRandomValues(new Uint8Array(32)));
194
+ }
195
+ function createPermit2Nonce() {
196
+ const randomBytes = getCrypto().getRandomValues(new Uint8Array(32));
197
+ return BigInt((0, import_viem3.toHex)(randomBytes)).toString();
198
+ }
199
+
200
+ // src/exact/client/eip3009.ts
201
+ async function createEIP3009Payload(signer, x402Version, paymentRequirements) {
202
+ const nonce = createNonce();
203
+ const now = Math.floor(Date.now() / 1e3);
204
+ const authorization = {
205
+ from: signer.address,
206
+ to: (0, import_viem4.getAddress)(paymentRequirements.payTo),
207
+ value: paymentRequirements.amount,
208
+ validAfter: (now - 600).toString(),
209
+ validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),
210
+ nonce
211
+ };
212
+ const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);
213
+ const payload = {
214
+ authorization,
215
+ signature
216
+ };
217
+ return {
218
+ x402Version,
219
+ payload
220
+ };
221
+ }
222
+ async function signEIP3009Authorization(signer, authorization, requirements) {
223
+ const chainId = parseInt(requirements.network.split(":")[1]);
224
+ if (!requirements.extra?.name || !requirements.extra?.version) {
225
+ throw new Error(
226
+ `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
227
+ );
228
+ }
229
+ const { name, version } = requirements.extra;
230
+ const domain = {
231
+ name,
232
+ version,
233
+ chainId,
234
+ verifyingContract: (0, import_viem4.getAddress)(requirements.asset)
235
+ };
236
+ const message = {
237
+ from: (0, import_viem4.getAddress)(authorization.from),
238
+ to: (0, import_viem4.getAddress)(authorization.to),
239
+ value: BigInt(authorization.value),
240
+ validAfter: BigInt(authorization.validAfter),
241
+ validBefore: BigInt(authorization.validBefore),
242
+ nonce: authorization.nonce
243
+ };
244
+ return await signer.signTypedData({
245
+ domain,
246
+ types: authorizationTypes,
247
+ primaryType: "TransferWithAuthorization",
248
+ message
249
+ });
250
+ }
251
+
252
+ // src/exact/client/permit2.ts
253
+ var import_viem5 = require("viem");
254
+ var MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
255
+ async function createPermit2Payload(signer, x402Version, paymentRequirements) {
256
+ const now = Math.floor(Date.now() / 1e3);
257
+ const nonce = createPermit2Nonce();
258
+ const validAfter = (now - 600).toString();
259
+ const deadline = (now + paymentRequirements.maxTimeoutSeconds).toString();
260
+ const permit2Authorization = {
261
+ from: signer.address,
262
+ permitted: {
263
+ token: (0, import_viem5.getAddress)(paymentRequirements.asset),
264
+ amount: paymentRequirements.amount
265
+ },
266
+ spender: x402ExactPermit2ProxyAddress,
267
+ nonce,
268
+ deadline,
269
+ witness: {
270
+ to: (0, import_viem5.getAddress)(paymentRequirements.payTo),
271
+ validAfter,
272
+ extra: "0x"
273
+ }
274
+ };
275
+ const signature = await signPermit2Authorization(
276
+ signer,
277
+ permit2Authorization,
278
+ paymentRequirements
279
+ );
280
+ const payload = {
281
+ signature,
282
+ permit2Authorization
283
+ };
284
+ return {
285
+ x402Version,
286
+ payload
287
+ };
288
+ }
289
+ async function signPermit2Authorization(signer, permit2Authorization, requirements) {
290
+ const chainId = parseInt(requirements.network.split(":")[1]);
291
+ const domain = {
292
+ name: "Permit2",
293
+ chainId,
294
+ verifyingContract: PERMIT2_ADDRESS
295
+ };
296
+ const message = {
297
+ permitted: {
298
+ token: (0, import_viem5.getAddress)(permit2Authorization.permitted.token),
299
+ amount: BigInt(permit2Authorization.permitted.amount)
300
+ },
301
+ spender: (0, import_viem5.getAddress)(permit2Authorization.spender),
302
+ nonce: BigInt(permit2Authorization.nonce),
303
+ deadline: BigInt(permit2Authorization.deadline),
304
+ witness: {
305
+ to: (0, import_viem5.getAddress)(permit2Authorization.witness.to),
306
+ validAfter: BigInt(permit2Authorization.witness.validAfter),
307
+ extra: permit2Authorization.witness.extra
308
+ }
309
+ };
310
+ return await signer.signTypedData({
311
+ domain,
312
+ types: permit2WitnessTypes,
313
+ primaryType: "PermitWitnessTransferFrom",
314
+ message
315
+ });
316
+ }
317
+ var erc20ApproveAbi = [
318
+ {
319
+ type: "function",
320
+ name: "approve",
321
+ inputs: [
322
+ { name: "spender", type: "address" },
323
+ { name: "amount", type: "uint256" }
324
+ ],
325
+ outputs: [{ type: "bool" }],
326
+ stateMutability: "nonpayable"
327
+ }
328
+ ];
329
+ var erc20AllowanceAbi = [
330
+ {
331
+ type: "function",
332
+ name: "allowance",
333
+ inputs: [
334
+ { name: "owner", type: "address" },
335
+ { name: "spender", type: "address" }
336
+ ],
337
+ outputs: [{ type: "uint256" }],
338
+ stateMutability: "view"
339
+ }
340
+ ];
341
+ function createPermit2ApprovalTx(tokenAddress) {
342
+ const data = (0, import_viem5.encodeFunctionData)({
343
+ abi: erc20ApproveAbi,
344
+ functionName: "approve",
345
+ args: [PERMIT2_ADDRESS, MAX_UINT256]
346
+ });
347
+ return {
348
+ to: (0, import_viem5.getAddress)(tokenAddress),
349
+ data
350
+ };
351
+ }
352
+ function getPermit2AllowanceReadParams(params) {
353
+ return {
354
+ address: (0, import_viem5.getAddress)(params.tokenAddress),
355
+ abi: erc20AllowanceAbi,
356
+ functionName: "allowance",
357
+ args: [(0, import_viem5.getAddress)(params.ownerAddress), PERMIT2_ADDRESS]
358
+ };
359
+ }
360
+
361
+ // src/exact/client/scheme.ts
362
+ var ExactEvmScheme = class {
145
363
  /**
146
- * Creates a new ExactEvmClientV1 instance.
364
+ * Creates a new ExactEvmClient instance.
147
365
  *
148
366
  * @param signer - The EVM signer for client operations
149
367
  */
@@ -152,97 +370,22 @@ var ExactEvmSchemeV1 = class {
152
370
  this.scheme = "exact";
153
371
  }
154
372
  /**
155
- * Creates a payment payload for the Exact scheme (V1).
373
+ * Creates a payment payload for the Exact scheme.
374
+ * Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.
156
375
  *
157
376
  * @param x402Version - The x402 protocol version
158
377
  * @param paymentRequirements - The payment requirements
159
- * @returns Promise resolving to a payment payload
378
+ * @returns Promise resolving to a payment payload result
160
379
  */
161
380
  async createPaymentPayload(x402Version, paymentRequirements) {
162
- const selectedV1 = paymentRequirements;
163
- const nonce = createNonce();
164
- const now = Math.floor(Date.now() / 1e3);
165
- const authorization = {
166
- from: this.signer.address,
167
- to: (0, import_viem3.getAddress)(selectedV1.payTo),
168
- value: selectedV1.maxAmountRequired,
169
- validAfter: (now - 600).toString(),
170
- // 10 minutes before
171
- validBefore: (now + selectedV1.maxTimeoutSeconds).toString(),
172
- nonce
173
- };
174
- const signature = await this.signAuthorization(authorization, selectedV1);
175
- const payload = {
176
- authorization,
177
- signature
178
- };
179
- return {
180
- x402Version,
181
- scheme: selectedV1.scheme,
182
- network: selectedV1.network,
183
- payload
184
- };
185
- }
186
- /**
187
- * Sign the EIP-3009 authorization using EIP-712
188
- *
189
- * @param authorization - The authorization to sign
190
- * @param requirements - The payment requirements
191
- * @returns Promise resolving to the signature
192
- */
193
- async signAuthorization(authorization, requirements) {
194
- const chainId = getEvmChainId(requirements.network);
195
- if (!requirements.extra?.name || !requirements.extra?.version) {
196
- throw new Error(
197
- `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
198
- );
381
+ const assetTransferMethod = paymentRequirements.extra?.assetTransferMethod ?? "eip3009";
382
+ if (assetTransferMethod === "permit2") {
383
+ return createPermit2Payload(this.signer, x402Version, paymentRequirements);
199
384
  }
200
- const { name, version } = requirements.extra;
201
- const domain = {
202
- name,
203
- version,
204
- chainId,
205
- verifyingContract: (0, import_viem3.getAddress)(requirements.asset)
206
- };
207
- const message = {
208
- from: (0, import_viem3.getAddress)(authorization.from),
209
- to: (0, import_viem3.getAddress)(authorization.to),
210
- value: BigInt(authorization.value),
211
- validAfter: BigInt(authorization.validAfter),
212
- validBefore: BigInt(authorization.validBefore),
213
- nonce: authorization.nonce
214
- };
215
- return await this.signer.signTypedData({
216
- domain,
217
- types: authorizationTypes,
218
- primaryType: "TransferWithAuthorization",
219
- message
220
- });
385
+ return createEIP3009Payload(this.signer, x402Version, paymentRequirements);
221
386
  }
222
387
  };
223
388
 
224
- // src/exact/v1/facilitator/scheme.ts
225
- var import_viem4 = require("viem");
226
-
227
- // src/v1/index.ts
228
- var NETWORKS = [
229
- "abstract",
230
- "abstract-testnet",
231
- "base-sepolia",
232
- "base",
233
- "avalanche-fuji",
234
- "avalanche",
235
- "iotex",
236
- "sei",
237
- "sei-testnet",
238
- "polygon",
239
- "polygon-amoy",
240
- "peaq",
241
- "story",
242
- "educhain",
243
- "skale-base-sepolia"
244
- ];
245
-
246
389
  // src/exact/client/register.ts
247
390
  function registerExactEvmScheme(client, config) {
248
391
  if (config.networks && config.networks.length > 0) {
@@ -265,6 +408,9 @@ function registerExactEvmScheme(client, config) {
265
408
  // Annotate the CommonJS export names for ESM import in node:
266
409
  0 && (module.exports = {
267
410
  ExactEvmScheme,
411
+ createPermit2ApprovalTx,
412
+ erc20AllowanceAbi,
413
+ getPermit2AllowanceReadParams,
268
414
  registerExactEvmScheme
269
415
  });
270
416
  //# sourceMappingURL=index.js.map