@x402/evm 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/cjs/exact/client/index.d.ts +2 -2
  2. package/dist/cjs/exact/client/index.js +264 -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 +691 -281
  6. package/dist/cjs/exact/facilitator/index.js.map +1 -1
  7. package/dist/cjs/exact/v1/client/index.js +43 -17
  8. package/dist/cjs/exact/v1/client/index.js.map +1 -1
  9. package/dist/cjs/exact/v1/facilitator/index.js +59 -26
  10. package/dist/cjs/exact/v1/facilitator/index.js.map +1 -1
  11. package/dist/cjs/index.d.ts +458 -31
  12. package/dist/cjs/index.js +438 -63
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/permit2-BYv82va2.d.ts +103 -0
  15. package/dist/cjs/v1/index.d.ts +21 -1
  16. package/dist/cjs/v1/index.js +33 -29
  17. package/dist/cjs/v1/index.js.map +1 -1
  18. package/dist/esm/chunk-DSSJHWGT.mjs +658 -0
  19. package/dist/esm/chunk-DSSJHWGT.mjs.map +1 -0
  20. package/dist/esm/chunk-PFULIQAE.mjs +13 -0
  21. package/dist/esm/chunk-PFULIQAE.mjs.map +1 -0
  22. package/dist/esm/chunk-U4H6Q62Q.mjs +229 -0
  23. package/dist/esm/chunk-U4H6Q62Q.mjs.map +1 -0
  24. package/dist/esm/exact/client/index.d.mts +2 -2
  25. package/dist/esm/exact/client/index.mjs +10 -30
  26. package/dist/esm/exact/client/index.mjs.map +1 -1
  27. package/dist/esm/exact/facilitator/index.d.mts +3 -0
  28. package/dist/esm/exact/facilitator/index.mjs +491 -241
  29. package/dist/esm/exact/facilitator/index.mjs.map +1 -1
  30. package/dist/esm/exact/v1/client/index.mjs +1 -2
  31. package/dist/esm/exact/v1/facilitator/index.mjs +2 -3
  32. package/dist/esm/index.d.mts +458 -31
  33. package/dist/esm/index.mjs +31 -4
  34. package/dist/esm/index.mjs.map +1 -1
  35. package/dist/esm/permit2-BsAoJiWD.d.mts +103 -0
  36. package/dist/esm/v1/index.d.mts +21 -1
  37. package/dist/esm/v1/index.mjs +4 -6
  38. package/package.json +2 -2
  39. package/dist/esm/chunk-FOUXRQAV.mjs +0 -88
  40. package/dist/esm/chunk-FOUXRQAV.mjs.map +0 -1
  41. package/dist/esm/chunk-JYZWCLMP.mjs +0 -305
  42. package/dist/esm/chunk-JYZWCLMP.mjs.map +0 -1
  43. package/dist/esm/chunk-PSA4YVU2.mjs +0 -92
  44. package/dist/esm/chunk-PSA4YVU2.mjs.map +0 -1
  45. package/dist/esm/chunk-QLXM7BIB.mjs +0 -23
  46. package/dist/esm/chunk-QLXM7BIB.mjs.map +0 -1
  47. package/dist/esm/chunk-ZYXTTU74.mjs +0 -88
  48. 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,219 @@ 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
+ };
174
+ var NETWORKS = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);
175
+
176
+ // src/utils.ts
177
+ function getEvmChainId(network) {
178
+ const chainId = EVM_NETWORK_CHAIN_ID_MAP[network];
179
+ if (!chainId) {
180
+ throw new Error(`Unsupported network: ${network}`);
181
+ }
182
+ return chainId;
183
+ }
184
+ function getCrypto() {
185
+ const cryptoObj = globalThis.crypto;
186
+ if (!cryptoObj) {
187
+ throw new Error("Crypto API not available");
188
+ }
189
+ return cryptoObj;
190
+ }
191
+ function createNonce() {
192
+ return (0, import_viem3.toHex)(getCrypto().getRandomValues(new Uint8Array(32)));
193
+ }
194
+ function createPermit2Nonce() {
195
+ const randomBytes = getCrypto().getRandomValues(new Uint8Array(32));
196
+ return BigInt((0, import_viem3.toHex)(randomBytes)).toString();
197
+ }
198
+
199
+ // src/exact/client/eip3009.ts
200
+ async function createEIP3009Payload(signer, x402Version, paymentRequirements) {
201
+ const nonce = createNonce();
202
+ const now = Math.floor(Date.now() / 1e3);
203
+ const authorization = {
204
+ from: signer.address,
205
+ to: (0, import_viem4.getAddress)(paymentRequirements.payTo),
206
+ value: paymentRequirements.amount,
207
+ validAfter: (now - 600).toString(),
208
+ validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),
209
+ nonce
210
+ };
211
+ const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);
212
+ const payload = {
213
+ authorization,
214
+ signature
215
+ };
216
+ return {
217
+ x402Version,
218
+ payload
219
+ };
220
+ }
221
+ async function signEIP3009Authorization(signer, authorization, requirements) {
222
+ const chainId = parseInt(requirements.network.split(":")[1]);
223
+ if (!requirements.extra?.name || !requirements.extra?.version) {
224
+ throw new Error(
225
+ `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
226
+ );
227
+ }
228
+ const { name, version } = requirements.extra;
229
+ const domain = {
230
+ name,
231
+ version,
232
+ chainId,
233
+ verifyingContract: (0, import_viem4.getAddress)(requirements.asset)
234
+ };
235
+ const message = {
236
+ from: (0, import_viem4.getAddress)(authorization.from),
237
+ to: (0, import_viem4.getAddress)(authorization.to),
238
+ value: BigInt(authorization.value),
239
+ validAfter: BigInt(authorization.validAfter),
240
+ validBefore: BigInt(authorization.validBefore),
241
+ nonce: authorization.nonce
242
+ };
243
+ return await signer.signTypedData({
244
+ domain,
245
+ types: authorizationTypes,
246
+ primaryType: "TransferWithAuthorization",
247
+ message
248
+ });
249
+ }
250
+
251
+ // src/exact/client/permit2.ts
252
+ var import_viem5 = require("viem");
253
+ var MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
254
+ async function createPermit2Payload(signer, x402Version, paymentRequirements) {
255
+ const now = Math.floor(Date.now() / 1e3);
256
+ const nonce = createPermit2Nonce();
257
+ const validAfter = (now - 600).toString();
258
+ const deadline = (now + paymentRequirements.maxTimeoutSeconds).toString();
259
+ const permit2Authorization = {
260
+ from: signer.address,
261
+ permitted: {
262
+ token: (0, import_viem5.getAddress)(paymentRequirements.asset),
263
+ amount: paymentRequirements.amount
264
+ },
265
+ spender: x402ExactPermit2ProxyAddress,
266
+ nonce,
267
+ deadline,
268
+ witness: {
269
+ to: (0, import_viem5.getAddress)(paymentRequirements.payTo),
270
+ validAfter,
271
+ extra: "0x"
272
+ }
273
+ };
274
+ const signature = await signPermit2Authorization(
275
+ signer,
276
+ permit2Authorization,
277
+ paymentRequirements
278
+ );
279
+ const payload = {
280
+ signature,
281
+ permit2Authorization
282
+ };
283
+ return {
284
+ x402Version,
285
+ payload
286
+ };
287
+ }
288
+ async function signPermit2Authorization(signer, permit2Authorization, requirements) {
289
+ const chainId = parseInt(requirements.network.split(":")[1]);
290
+ const domain = {
291
+ name: "Permit2",
292
+ chainId,
293
+ verifyingContract: PERMIT2_ADDRESS
294
+ };
295
+ const message = {
296
+ permitted: {
297
+ token: (0, import_viem5.getAddress)(permit2Authorization.permitted.token),
298
+ amount: BigInt(permit2Authorization.permitted.amount)
299
+ },
300
+ spender: (0, import_viem5.getAddress)(permit2Authorization.spender),
301
+ nonce: BigInt(permit2Authorization.nonce),
302
+ deadline: BigInt(permit2Authorization.deadline),
303
+ witness: {
304
+ to: (0, import_viem5.getAddress)(permit2Authorization.witness.to),
305
+ validAfter: BigInt(permit2Authorization.witness.validAfter),
306
+ extra: permit2Authorization.witness.extra
307
+ }
308
+ };
309
+ return await signer.signTypedData({
310
+ domain,
311
+ types: permit2WitnessTypes,
312
+ primaryType: "PermitWitnessTransferFrom",
313
+ message
314
+ });
315
+ }
316
+ var erc20ApproveAbi = [
317
+ {
318
+ type: "function",
319
+ name: "approve",
320
+ inputs: [
321
+ { name: "spender", type: "address" },
322
+ { name: "amount", type: "uint256" }
323
+ ],
324
+ outputs: [{ type: "bool" }],
325
+ stateMutability: "nonpayable"
326
+ }
327
+ ];
328
+ var erc20AllowanceAbi = [
329
+ {
330
+ type: "function",
331
+ name: "allowance",
332
+ inputs: [
333
+ { name: "owner", type: "address" },
334
+ { name: "spender", type: "address" }
335
+ ],
336
+ outputs: [{ type: "uint256" }],
337
+ stateMutability: "view"
338
+ }
339
+ ];
340
+ function createPermit2ApprovalTx(tokenAddress) {
341
+ const data = (0, import_viem5.encodeFunctionData)({
342
+ abi: erc20ApproveAbi,
343
+ functionName: "approve",
344
+ args: [PERMIT2_ADDRESS, MAX_UINT256]
345
+ });
346
+ return {
347
+ to: (0, import_viem5.getAddress)(tokenAddress),
348
+ data
349
+ };
350
+ }
351
+ function getPermit2AllowanceReadParams(params) {
352
+ return {
353
+ address: (0, import_viem5.getAddress)(params.tokenAddress),
354
+ abi: erc20AllowanceAbi,
355
+ functionName: "allowance",
356
+ args: [(0, import_viem5.getAddress)(params.ownerAddress), PERMIT2_ADDRESS]
357
+ };
358
+ }
359
+
360
+ // src/exact/client/scheme.ts
361
+ var ExactEvmScheme = class {
145
362
  /**
146
- * Creates a new ExactEvmClientV1 instance.
363
+ * Creates a new ExactEvmClient instance.
147
364
  *
148
365
  * @param signer - The EVM signer for client operations
149
366
  */
@@ -152,97 +369,22 @@ var ExactEvmSchemeV1 = class {
152
369
  this.scheme = "exact";
153
370
  }
154
371
  /**
155
- * Creates a payment payload for the Exact scheme (V1).
372
+ * Creates a payment payload for the Exact scheme.
373
+ * Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.
156
374
  *
157
375
  * @param x402Version - The x402 protocol version
158
376
  * @param paymentRequirements - The payment requirements
159
- * @returns Promise resolving to a payment payload
377
+ * @returns Promise resolving to a payment payload result
160
378
  */
161
379
  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
- );
380
+ const assetTransferMethod = paymentRequirements.extra?.assetTransferMethod ?? "eip3009";
381
+ if (assetTransferMethod === "permit2") {
382
+ return createPermit2Payload(this.signer, x402Version, paymentRequirements);
199
383
  }
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
- });
384
+ return createEIP3009Payload(this.signer, x402Version, paymentRequirements);
221
385
  }
222
386
  };
223
387
 
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
388
  // src/exact/client/register.ts
247
389
  function registerExactEvmScheme(client, config) {
248
390
  if (config.networks && config.networks.length > 0) {
@@ -265,6 +407,9 @@ function registerExactEvmScheme(client, config) {
265
407
  // Annotate the CommonJS export names for ESM import in node:
266
408
  0 && (module.exports = {
267
409
  ExactEvmScheme,
410
+ createPermit2ApprovalTx,
411
+ erc20AllowanceAbi,
412
+ getPermit2AllowanceReadParams,
268
413
  registerExactEvmScheme
269
414
  });
270
415
  //# sourceMappingURL=index.js.map