@x402/evm 2.8.0 → 2.9.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 (79) hide show
  1. package/README.md +2 -39
  2. package/dist/cjs/exact/client/index.d.ts +3 -2
  3. package/dist/cjs/exact/client/index.js +173 -194
  4. package/dist/cjs/exact/client/index.js.map +1 -1
  5. package/dist/cjs/exact/facilitator/index.js +199 -185
  6. package/dist/cjs/exact/facilitator/index.js.map +1 -1
  7. package/dist/cjs/exact/server/index.d.ts +18 -17
  8. package/dist/cjs/exact/server/index.js +100 -55
  9. package/dist/cjs/exact/server/index.js.map +1 -1
  10. package/dist/cjs/exact/v1/client/index.js +3 -1
  11. package/dist/cjs/exact/v1/client/index.js.map +1 -1
  12. package/dist/cjs/exact/v1/facilitator/index.js +3 -1
  13. package/dist/cjs/exact/v1/facilitator/index.js.map +1 -1
  14. package/dist/cjs/index.d.ts +38 -2
  15. package/dist/cjs/index.js +441 -191
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/{permit2-U9Zolx3O.d.ts → permit2-CyZxwngN.d.ts} +278 -87
  18. package/dist/cjs/scheme-CXDF0D2A.d.ts +47 -0
  19. package/dist/cjs/upto/client/index.d.ts +32 -0
  20. package/dist/cjs/upto/client/index.js +507 -0
  21. package/dist/cjs/upto/client/index.js.map +1 -0
  22. package/dist/cjs/upto/facilitator/index.d.ts +52 -0
  23. package/dist/cjs/upto/facilitator/index.js +1233 -0
  24. package/dist/cjs/upto/facilitator/index.js.map +1 -0
  25. package/dist/cjs/upto/server/index.d.ts +77 -0
  26. package/dist/cjs/upto/server/index.js +246 -0
  27. package/dist/cjs/upto/server/index.js.map +1 -0
  28. package/dist/cjs/v1/index.d.ts +2 -0
  29. package/dist/cjs/v1/index.js +3 -1
  30. package/dist/cjs/v1/index.js.map +1 -1
  31. package/dist/esm/chunk-C4ZQMS77.mjs +629 -0
  32. package/dist/esm/chunk-C4ZQMS77.mjs.map +1 -0
  33. package/dist/esm/chunk-CRT6YNY5.mjs +529 -0
  34. package/dist/esm/chunk-CRT6YNY5.mjs.map +1 -0
  35. package/dist/esm/chunk-GJ57SZGI.mjs +121 -0
  36. package/dist/esm/chunk-GJ57SZGI.mjs.map +1 -0
  37. package/dist/esm/chunk-JII456TS.mjs +34 -0
  38. package/dist/esm/chunk-JII456TS.mjs.map +1 -0
  39. package/dist/esm/chunk-NSFLAANF.mjs +80 -0
  40. package/dist/esm/chunk-NSFLAANF.mjs.map +1 -0
  41. package/dist/esm/chunk-RN3WQM6A.mjs +158 -0
  42. package/dist/esm/chunk-RN3WQM6A.mjs.map +1 -0
  43. package/dist/esm/chunk-WKBC5YMI.mjs +291 -0
  44. package/dist/esm/chunk-WKBC5YMI.mjs.map +1 -0
  45. package/dist/esm/{chunk-IZEI7JTG.mjs → chunk-YUJQ7TLD.mjs} +29 -501
  46. package/dist/esm/chunk-YUJQ7TLD.mjs.map +1 -0
  47. package/dist/esm/exact/client/index.d.mts +3 -2
  48. package/dist/esm/exact/client/index.mjs +8 -5
  49. package/dist/esm/exact/facilitator/index.mjs +84 -430
  50. package/dist/esm/exact/facilitator/index.mjs.map +1 -1
  51. package/dist/esm/exact/server/index.d.mts +18 -17
  52. package/dist/esm/exact/server/index.mjs +28 -55
  53. package/dist/esm/exact/server/index.mjs.map +1 -1
  54. package/dist/esm/exact/v1/client/index.mjs +2 -1
  55. package/dist/esm/exact/v1/facilitator/index.mjs +2 -1
  56. package/dist/esm/index.d.mts +38 -2
  57. package/dist/esm/index.mjs +21 -8
  58. package/dist/esm/index.mjs.map +1 -1
  59. package/dist/esm/{permit2-Bbh3a8_h.d.mts → permit2-CyZxwngN.d.mts} +278 -87
  60. package/dist/esm/scheme-DCR7hsa3.d.mts +47 -0
  61. package/dist/esm/upto/client/index.d.mts +32 -0
  62. package/dist/esm/upto/client/index.mjs +18 -0
  63. package/dist/esm/upto/client/index.mjs.map +1 -0
  64. package/dist/esm/upto/facilitator/index.d.mts +52 -0
  65. package/dist/esm/upto/facilitator/index.mjs +473 -0
  66. package/dist/esm/upto/facilitator/index.mjs.map +1 -0
  67. package/dist/esm/upto/server/index.d.mts +77 -0
  68. package/dist/esm/upto/server/index.mjs +145 -0
  69. package/dist/esm/upto/server/index.mjs.map +1 -0
  70. package/dist/esm/v1/index.d.mts +2 -0
  71. package/dist/esm/v1/index.mjs +2 -1
  72. package/package.json +34 -4
  73. package/dist/esm/chunk-GD4MKCN7.mjs +0 -57
  74. package/dist/esm/chunk-GD4MKCN7.mjs.map +0 -1
  75. package/dist/esm/chunk-IZEI7JTG.mjs.map +0 -1
  76. package/dist/esm/chunk-TKN5V2BV.mjs +0 -13
  77. package/dist/esm/chunk-TKN5V2BV.mjs.map +0 -1
  78. package/dist/esm/chunk-WJWNS4G4.mjs +0 -518
  79. package/dist/esm/chunk-WJWNS4G4.mjs.map +0 -1
package/README.md CHANGED
@@ -57,33 +57,6 @@ This package provides three main components for handling x402 payments on EVM-co
57
57
  ]
58
58
  ```
59
59
 
60
- ### Client Builder (`@x402/evm/client`)
61
-
62
- **Convenience builder** for creating fully-configured EVM clients
63
-
64
- **Exports:**
65
- - `createEvmClient(config)` - Creates x402Client with EVM support
66
- - `EvmClientConfig` - Configuration interface
67
-
68
- **What it does:**
69
- - Automatically registers V2 wildcard scheme (`eip155:*`)
70
- - Automatically registers all V1 networks from `NETWORKS`
71
- - Optionally applies payment policies
72
- - Optionally uses custom payment selector
73
-
74
- **Example:**
75
- ```typescript
76
- import { createEvmClient } from "@x402/evm/client";
77
- import { toClientEvmSigner } from "@x402/evm";
78
- import { privateKeyToAccount } from "viem/accounts";
79
-
80
- const account = privateKeyToAccount("0x...");
81
- const signer = toClientEvmSigner(account);
82
-
83
- const client = createEvmClient({ signer });
84
- // Ready to use with both V1 and V2!
85
- ```
86
-
87
60
  ## Version Differences
88
61
 
89
62
  ### V2 (Main Package)
@@ -102,17 +75,7 @@ const client = createEvmClient({ signer });
102
75
 
103
76
  ## Usage Patterns
104
77
 
105
- ### 1. Using Pre-built Builder (Recommended)
106
-
107
- ```typescript
108
- import { createEvmClient } from "@x402/evm/client";
109
- import { wrapFetchWithPayment } from "@x402/fetch";
110
-
111
- const client = createEvmClient({ signer: myEvmSigner });
112
- const paidFetch = wrapFetchWithPayment(fetch, client);
113
- ```
114
-
115
- ### 2. Direct Registration (Full Control)
78
+ ### 1. Direct Registration (Full Control)
116
79
 
117
80
  ```typescript
118
81
  import { x402Client } from "@x402/core/client";
@@ -149,7 +112,7 @@ const wildcardClient = new x402Client().register(
149
112
  );
150
113
  ```
151
114
 
152
- ### 3. Using Config (Flexible)
115
+ ### 2. Using Config (Flexible)
153
116
 
154
117
  ```typescript
155
118
  import { x402Client } from "@x402/core/client";
@@ -1,8 +1,9 @@
1
- import { i as ExactEvmSchemeOptions } from '../../permit2-U9Zolx3O.js';
2
- export { E as ExactEvmScheme, j as ExactEvmSchemeConfig, k as ExactEvmSchemeConfigByChainId, P as Permit2AllowanceParams, c as createPermit2ApprovalTx, e as erc20AllowanceAbi, g as getPermit2AllowanceReadParams } from '../../permit2-U9Zolx3O.js';
1
+ export { E as ExactEvmScheme } from '../../scheme-CXDF0D2A.js';
3
2
  import { x402Client, SelectPaymentRequirements, PaymentPolicy } from '@x402/core/client';
4
3
  import { Network } from '@x402/core/types';
5
4
  import { C as ClientEvmSigner } from '../../signer-D912R4mq.js';
5
+ import { E as ExactEvmSchemeOptions } from '../../permit2-CyZxwngN.js';
6
+ export { j as ExactEvmSchemeConfig, k as ExactEvmSchemeConfigByChainId, P as Permit2AllowanceParams, c as createPermit2ApprovalTx, e as erc20AllowanceAbi, g as getPermit2AllowanceReadParams } from '../../permit2-CyZxwngN.js';
6
7
 
7
8
  /**
8
9
  * Configuration options for registering EVM schemes to an x402Client
@@ -28,6 +28,9 @@ __export(client_exports, {
28
28
  });
29
29
  module.exports = __toCommonJS(client_exports);
30
30
 
31
+ // src/exact/client/eip3009.ts
32
+ var import_viem2 = require("viem");
33
+
31
34
  // src/constants.ts
32
35
  var authorizationTypes = {
33
36
  TransferWithAuthorization: [
@@ -104,9 +107,6 @@ var DEFAULT_MAX_PRIORITY_FEE_PER_GAS = 100000000n;
104
107
  var PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
105
108
  var x402ExactPermit2ProxyAddress = "0x402085c248EeA27D92E8b30b2C58ed07f9E20001";
106
109
 
107
- // src/exact/client/scheme.ts
108
- var import_viem7 = require("viem");
109
-
110
110
  // src/utils.ts
111
111
  var import_viem = require("viem");
112
112
  function getEvmChainId(network) {
@@ -135,13 +135,7 @@ function createPermit2Nonce() {
135
135
  return BigInt((0, import_viem.toHex)(randomBytes)).toString();
136
136
  }
137
137
 
138
- // src/exact/extensions.ts
139
- var EIP2612_GAS_SPONSORING_KEY = "eip2612GasSponsoring";
140
- var ERC20_APPROVAL_GAS_SPONSORING_KEY = "erc20ApprovalGasSponsoring";
141
- var ERC20_APPROVAL_GAS_SPONSORING_VERSION = "1";
142
-
143
138
  // src/exact/client/eip3009.ts
144
- var import_viem2 = require("viem");
145
139
  async function createEIP3009Payload(signer, x402Version, paymentRequirements) {
146
140
  const nonce = createNonce();
147
141
  const now = Math.floor(Date.now() / 1e3);
@@ -194,9 +188,24 @@ async function signEIP3009Authorization(signer, authorization, requirements) {
194
188
  }
195
189
 
196
190
  // src/exact/client/permit2.ts
191
+ var import_viem6 = require("viem");
192
+
193
+ // src/exact/extensions.ts
194
+ var EIP2612_GAS_SPONSORING_KEY = "eip2612GasSponsoring";
195
+ var ERC20_APPROVAL_GAS_SPONSORING_KEY = "erc20ApprovalGasSponsoring";
196
+ var ERC20_APPROVAL_GAS_SPONSORING_VERSION = "1";
197
+
198
+ // src/shared/permit2.ts
199
+ var import_viem5 = require("viem");
200
+
201
+ // src/multicall.ts
197
202
  var import_viem3 = require("viem");
198
- var MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
199
- async function createPermit2Payload(signer, x402Version, paymentRequirements) {
203
+
204
+ // src/shared/erc20approval.ts
205
+ var import_viem4 = require("viem");
206
+
207
+ // src/shared/permit2.ts
208
+ async function createPermit2PayloadForProxy(proxyAddress, signer, x402Version, paymentRequirements) {
200
209
  const now = Math.floor(Date.now() / 1e3);
201
210
  const nonce = createPermit2Nonce();
202
211
  const validAfter = (now - 600).toString();
@@ -204,14 +213,14 @@ async function createPermit2Payload(signer, x402Version, paymentRequirements) {
204
213
  const permit2Authorization = {
205
214
  from: signer.address,
206
215
  permitted: {
207
- token: (0, import_viem3.getAddress)(paymentRequirements.asset),
216
+ token: (0, import_viem5.getAddress)(paymentRequirements.asset),
208
217
  amount: paymentRequirements.amount
209
218
  },
210
- spender: x402ExactPermit2ProxyAddress,
219
+ spender: proxyAddress,
211
220
  nonce,
212
221
  deadline,
213
222
  witness: {
214
- to: (0, import_viem3.getAddress)(paymentRequirements.payTo),
223
+ to: (0, import_viem5.getAddress)(paymentRequirements.payTo),
215
224
  validAfter
216
225
  }
217
226
  };
@@ -220,67 +229,71 @@ async function createPermit2Payload(signer, x402Version, paymentRequirements) {
220
229
  permit2Authorization,
221
230
  paymentRequirements
222
231
  );
223
- const payload = {
224
- signature,
225
- permit2Authorization
226
- };
227
232
  return {
228
233
  x402Version,
229
- payload
234
+ payload: { signature, permit2Authorization }
230
235
  };
231
236
  }
232
237
  async function signPermit2Authorization(signer, permit2Authorization, requirements) {
233
238
  const chainId = getEvmChainId(requirements.network);
234
- const domain = {
235
- name: "Permit2",
236
- chainId,
237
- verifyingContract: PERMIT2_ADDRESS
238
- };
239
- const message = {
240
- permitted: {
241
- token: (0, import_viem3.getAddress)(permit2Authorization.permitted.token),
242
- amount: BigInt(permit2Authorization.permitted.amount)
243
- },
244
- spender: (0, import_viem3.getAddress)(permit2Authorization.spender),
245
- nonce: BigInt(permit2Authorization.nonce),
246
- deadline: BigInt(permit2Authorization.deadline),
247
- witness: {
248
- to: (0, import_viem3.getAddress)(permit2Authorization.witness.to),
249
- validAfter: BigInt(permit2Authorization.witness.validAfter)
250
- }
251
- };
252
239
  return await signer.signTypedData({
253
- domain,
240
+ domain: { name: "Permit2", chainId, verifyingContract: PERMIT2_ADDRESS },
254
241
  types: permit2WitnessTypes,
255
242
  primaryType: "PermitWitnessTransferFrom",
256
- message
243
+ message: {
244
+ permitted: {
245
+ token: (0, import_viem5.getAddress)(permit2Authorization.permitted.token),
246
+ amount: BigInt(permit2Authorization.permitted.amount)
247
+ },
248
+ spender: (0, import_viem5.getAddress)(permit2Authorization.spender),
249
+ nonce: BigInt(permit2Authorization.nonce),
250
+ deadline: BigInt(permit2Authorization.deadline),
251
+ witness: {
252
+ to: (0, import_viem5.getAddress)(permit2Authorization.witness.to),
253
+ validAfter: BigInt(permit2Authorization.witness.validAfter)
254
+ }
255
+ }
257
256
  });
258
257
  }
258
+
259
+ // src/exact/client/permit2.ts
260
+ var MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
261
+ async function createPermit2Payload(signer, x402Version, paymentRequirements) {
262
+ return createPermit2PayloadForProxy(
263
+ x402ExactPermit2ProxyAddress,
264
+ signer,
265
+ x402Version,
266
+ paymentRequirements
267
+ );
268
+ }
259
269
  function createPermit2ApprovalTx(tokenAddress) {
260
- const data = (0, import_viem3.encodeFunctionData)({
270
+ const data = (0, import_viem6.encodeFunctionData)({
261
271
  abi: erc20ApproveAbi,
262
272
  functionName: "approve",
263
273
  args: [PERMIT2_ADDRESS, MAX_UINT256]
264
274
  });
265
275
  return {
266
- to: (0, import_viem3.getAddress)(tokenAddress),
276
+ to: (0, import_viem6.getAddress)(tokenAddress),
267
277
  data
268
278
  };
269
279
  }
270
280
  function getPermit2AllowanceReadParams(params) {
271
281
  return {
272
- address: (0, import_viem3.getAddress)(params.tokenAddress),
282
+ address: (0, import_viem6.getAddress)(params.tokenAddress),
273
283
  abi: erc20AllowanceAbi,
274
284
  functionName: "allowance",
275
- args: [(0, import_viem3.getAddress)(params.ownerAddress), PERMIT2_ADDRESS]
285
+ args: [(0, import_viem6.getAddress)(params.ownerAddress), PERMIT2_ADDRESS]
276
286
  };
277
287
  }
278
288
 
289
+ // src/shared/extensions.ts
290
+ var import_viem10 = require("viem");
291
+
279
292
  // src/exact/client/eip2612.ts
280
- var import_viem4 = require("viem");
293
+ var import_viem7 = require("viem");
281
294
  async function signEip2612Permit(signer, tokenAddress, tokenName, tokenVersion, chainId, deadline, permittedAmount) {
282
295
  const owner = signer.address;
283
- const spender = (0, import_viem4.getAddress)(PERMIT2_ADDRESS);
296
+ const spender = (0, import_viem7.getAddress)(PERMIT2_ADDRESS);
284
297
  const nonce = await signer.readContract({
285
298
  address: tokenAddress,
286
299
  abi: eip2612NoncesAbi,
@@ -320,14 +333,14 @@ async function signEip2612Permit(signer, tokenAddress, tokenName, tokenVersion,
320
333
  }
321
334
 
322
335
  // src/exact/client/erc20approval.ts
323
- var import_viem5 = require("viem");
336
+ var import_viem8 = require("viem");
324
337
  async function signErc20ApprovalTransaction(signer, tokenAddress, chainId) {
325
338
  const from = signer.address;
326
- const spender = (0, import_viem5.getAddress)(PERMIT2_ADDRESS);
327
- const data = (0, import_viem5.encodeFunctionData)({
339
+ const spender = (0, import_viem8.getAddress)(PERMIT2_ADDRESS);
340
+ const data = (0, import_viem8.encodeFunctionData)({
328
341
  abi: erc20ApproveAbi,
329
342
  functionName: "approve",
330
- args: [spender, import_viem5.maxUint256]
343
+ args: [spender, import_viem8.maxUint256]
331
344
  });
332
345
  const nonce = await signer.getTransactionCount({ address: from });
333
346
  let maxFeePerGas;
@@ -356,14 +369,14 @@ async function signErc20ApprovalTransaction(signer, tokenAddress, chainId) {
356
369
  from,
357
370
  asset: tokenAddress,
358
371
  spender,
359
- amount: import_viem5.maxUint256.toString(),
372
+ amount: import_viem8.maxUint256.toString(),
360
373
  signedTransaction,
361
374
  version: ERC20_APPROVAL_GAS_SPONSORING_VERSION
362
375
  };
363
376
  }
364
377
 
365
- // src/exact/client/rpc.ts
366
- var import_viem6 = require("viem");
378
+ // src/shared/rpc.ts
379
+ var import_viem9 = require("viem");
367
380
  var rpcClientCache = /* @__PURE__ */ new Map();
368
381
  function isConfigByChainId(options) {
369
382
  const keys = Object.keys(options);
@@ -374,8 +387,8 @@ function getRpcClient(rpcUrl) {
374
387
  if (existing) {
375
388
  return existing;
376
389
  }
377
- const client = (0, import_viem6.createPublicClient)({
378
- transport: (0, import_viem6.http)(rpcUrl)
390
+ const client = (0, import_viem9.createPublicClient)({
391
+ transport: (0, import_viem9.http)(rpcUrl)
379
392
  });
380
393
  rpcClientCache.set(rpcUrl, client);
381
394
  return client;
@@ -419,6 +432,93 @@ function resolveExtensionRpcCapabilities(network, signer, options) {
419
432
  return capabilities;
420
433
  }
421
434
 
435
+ // src/shared/extensions.ts
436
+ async function trySignEip2612PermitExtension(signer, options, requirements, result, context) {
437
+ const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);
438
+ if (!capabilities.readContract) {
439
+ return void 0;
440
+ }
441
+ if (!context?.extensions?.[EIP2612_GAS_SPONSORING_KEY]) {
442
+ return void 0;
443
+ }
444
+ const tokenName = requirements.extra?.name;
445
+ const tokenVersion = requirements.extra?.version;
446
+ if (!tokenName || !tokenVersion) {
447
+ return void 0;
448
+ }
449
+ const chainId = getEvmChainId(requirements.network);
450
+ const tokenAddress = (0, import_viem10.getAddress)(requirements.asset);
451
+ try {
452
+ const allowance = await capabilities.readContract({
453
+ address: tokenAddress,
454
+ abi: erc20AllowanceAbi,
455
+ functionName: "allowance",
456
+ args: [signer.address, PERMIT2_ADDRESS]
457
+ });
458
+ if (allowance >= BigInt(requirements.amount)) {
459
+ return void 0;
460
+ }
461
+ } catch {
462
+ }
463
+ const permit2Auth = result.payload?.permit2Authorization;
464
+ const deadline = permit2Auth?.deadline ?? Math.floor(Date.now() / 1e3 + requirements.maxTimeoutSeconds).toString();
465
+ const info = await signEip2612Permit(
466
+ {
467
+ address: signer.address,
468
+ signTypedData: (msg) => signer.signTypedData(msg),
469
+ readContract: capabilities.readContract
470
+ },
471
+ tokenAddress,
472
+ tokenName,
473
+ tokenVersion,
474
+ chainId,
475
+ deadline,
476
+ requirements.amount
477
+ );
478
+ return {
479
+ [EIP2612_GAS_SPONSORING_KEY]: { info }
480
+ };
481
+ }
482
+ async function trySignErc20ApprovalExtension(signer, options, requirements, context) {
483
+ const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);
484
+ if (!capabilities.readContract) {
485
+ return void 0;
486
+ }
487
+ if (!context?.extensions?.[ERC20_APPROVAL_GAS_SPONSORING_KEY]) {
488
+ return void 0;
489
+ }
490
+ if (!capabilities.signTransaction || !capabilities.getTransactionCount) {
491
+ return void 0;
492
+ }
493
+ const chainId = getEvmChainId(requirements.network);
494
+ const tokenAddress = (0, import_viem10.getAddress)(requirements.asset);
495
+ try {
496
+ const allowance = await capabilities.readContract({
497
+ address: tokenAddress,
498
+ abi: erc20AllowanceAbi,
499
+ functionName: "allowance",
500
+ args: [signer.address, PERMIT2_ADDRESS]
501
+ });
502
+ if (allowance >= BigInt(requirements.amount)) {
503
+ return void 0;
504
+ }
505
+ } catch {
506
+ }
507
+ const info = await signErc20ApprovalTransaction(
508
+ {
509
+ address: signer.address,
510
+ signTransaction: capabilities.signTransaction,
511
+ getTransactionCount: capabilities.getTransactionCount,
512
+ estimateFeesPerGas: capabilities.estimateFeesPerGas
513
+ },
514
+ tokenAddress,
515
+ chainId
516
+ );
517
+ return {
518
+ [ERC20_APPROVAL_GAS_SPONSORING_KEY]: { info }
519
+ };
520
+ }
521
+
422
522
  // src/exact/client/scheme.ts
423
523
  var ExactEvmScheme = class {
424
524
  /**
@@ -452,7 +552,9 @@ var ExactEvmScheme = class {
452
552
  const assetTransferMethod = paymentRequirements.extra?.assetTransferMethod ?? "eip3009";
453
553
  if (assetTransferMethod === "permit2") {
454
554
  const result = await createPermit2Payload(this.signer, x402Version, paymentRequirements);
455
- const eip2612Extensions = await this.trySignEip2612Permit(
555
+ const eip2612Extensions = await trySignEip2612PermitExtension(
556
+ this.signer,
557
+ this.options,
456
558
  paymentRequirements,
457
559
  result,
458
560
  context
@@ -463,7 +565,12 @@ var ExactEvmScheme = class {
463
565
  extensions: eip2612Extensions
464
566
  };
465
567
  }
466
- const erc20Extensions = await this.trySignErc20Approval(paymentRequirements, result, context);
568
+ const erc20Extensions = await trySignErc20ApprovalExtension(
569
+ this.signer,
570
+ this.options,
571
+ paymentRequirements,
572
+ context
573
+ );
467
574
  if (erc20Extensions) {
468
575
  return {
469
576
  ...result,
@@ -474,146 +581,16 @@ var ExactEvmScheme = class {
474
581
  }
475
582
  return createEIP3009Payload(this.signer, x402Version, paymentRequirements);
476
583
  }
477
- /**
478
- * Attempts to sign an EIP-2612 permit for gasless Permit2 approval.
479
- *
480
- * Returns extension data if:
481
- * 1. Server advertises eip2612GasSponsoring
482
- * 2. Signer has readContract capability
483
- * 3. Current Permit2 allowance is insufficient
484
- *
485
- * Returns undefined if the extension should not be used.
486
- *
487
- * @param requirements - The payment requirements from the server
488
- * @param result - The payment payload result from the scheme
489
- * @param context - Optional context containing server extensions and metadata
490
- * @returns Extension data for EIP-2612 gas sponsoring, or undefined if not applicable
491
- */
492
- async trySignEip2612Permit(requirements, result, context) {
493
- const capabilities = resolveExtensionRpcCapabilities(
494
- requirements.network,
495
- this.signer,
496
- this.options
497
- );
498
- if (!capabilities.readContract) {
499
- return void 0;
500
- }
501
- if (!context?.extensions?.[EIP2612_GAS_SPONSORING_KEY]) {
502
- return void 0;
503
- }
504
- const tokenName = requirements.extra?.name;
505
- const tokenVersion = requirements.extra?.version;
506
- if (!tokenName || !tokenVersion) {
507
- return void 0;
508
- }
509
- const chainId = getEvmChainId(requirements.network);
510
- const tokenAddress = (0, import_viem7.getAddress)(requirements.asset);
511
- try {
512
- const allowance = await capabilities.readContract({
513
- address: tokenAddress,
514
- abi: erc20AllowanceAbi,
515
- functionName: "allowance",
516
- args: [this.signer.address, PERMIT2_ADDRESS]
517
- });
518
- if (allowance >= BigInt(requirements.amount)) {
519
- return void 0;
520
- }
521
- } catch {
522
- }
523
- const permit2Auth = result.payload?.permit2Authorization;
524
- const deadline = permit2Auth?.deadline ?? Math.floor(Date.now() / 1e3 + requirements.maxTimeoutSeconds).toString();
525
- const info = await signEip2612Permit(
526
- {
527
- address: this.signer.address,
528
- signTypedData: (msg) => this.signer.signTypedData(msg),
529
- readContract: capabilities.readContract
530
- },
531
- tokenAddress,
532
- tokenName,
533
- tokenVersion,
534
- chainId,
535
- deadline,
536
- requirements.amount
537
- );
538
- return {
539
- [EIP2612_GAS_SPONSORING_KEY]: { info }
540
- };
541
- }
542
- /**
543
- * Attempts to sign an ERC-20 approval transaction for gasless Permit2 approval.
544
- *
545
- * This is the fallback path when the token does not support EIP-2612. The client
546
- * signs (but does not broadcast) a raw `approve(Permit2, MaxUint256)` transaction.
547
- * The facilitator broadcasts it atomically before settling.
548
- *
549
- * Returns extension data if:
550
- * 1. Server advertises erc20ApprovalGasSponsoring
551
- * 2. Signer has signTransaction + getTransactionCount capabilities
552
- * 3. Current Permit2 allowance is insufficient
553
- *
554
- * Returns undefined if the extension should not be used.
555
- *
556
- * @param requirements - The payment requirements from the server
557
- * @param _result - The payment payload result from the scheme (unused)
558
- * @param context - Optional context containing server extensions and metadata
559
- * @returns Extension data for ERC-20 approval gas sponsoring, or undefined if not applicable
560
- */
561
- async trySignErc20Approval(requirements, _result, context) {
562
- const capabilities = resolveExtensionRpcCapabilities(
563
- requirements.network,
564
- this.signer,
565
- this.options
566
- );
567
- if (!capabilities.readContract) {
568
- return void 0;
569
- }
570
- if (!context?.extensions?.[ERC20_APPROVAL_GAS_SPONSORING_KEY]) {
571
- return void 0;
572
- }
573
- if (!capabilities.signTransaction || !capabilities.getTransactionCount) {
574
- return void 0;
575
- }
576
- const chainId = getEvmChainId(requirements.network);
577
- const tokenAddress = (0, import_viem7.getAddress)(requirements.asset);
578
- try {
579
- const allowance = await capabilities.readContract({
580
- address: tokenAddress,
581
- abi: erc20AllowanceAbi,
582
- functionName: "allowance",
583
- args: [this.signer.address, PERMIT2_ADDRESS]
584
- });
585
- if (allowance >= BigInt(requirements.amount)) {
586
- return void 0;
587
- }
588
- } catch {
589
- }
590
- const info = await signErc20ApprovalTransaction(
591
- {
592
- address: this.signer.address,
593
- signTransaction: capabilities.signTransaction,
594
- getTransactionCount: capabilities.getTransactionCount,
595
- estimateFeesPerGas: capabilities.estimateFeesPerGas
596
- },
597
- tokenAddress,
598
- chainId
599
- );
600
- return {
601
- [ERC20_APPROVAL_GAS_SPONSORING_KEY]: { info }
602
- };
603
- }
604
584
  };
605
585
 
606
586
  // src/exact/v1/client/scheme.ts
607
- var import_viem11 = require("viem");
587
+ var import_viem13 = require("viem");
608
588
 
609
589
  // src/exact/v1/facilitator/scheme.ts
610
- var import_viem10 = require("viem");
590
+ var import_viem12 = require("viem");
611
591
 
612
592
  // src/exact/facilitator/eip3009-utils.ts
613
- var import_viem9 = require("viem");
614
-
615
- // src/multicall.ts
616
- var import_viem8 = require("viem");
593
+ var import_viem11 = require("viem");
617
594
 
618
595
  // src/v1/index.ts
619
596
  var EVM_NETWORK_CHAIN_ID_MAP = {
@@ -635,7 +612,9 @@ var EVM_NETWORK_CHAIN_ID_MAP = {
635
612
  educhain: 41923,
636
613
  "skale-base-sepolia": 324705682,
637
614
  megaeth: 4326,
638
- monad: 143
615
+ monad: 143,
616
+ stable: 988,
617
+ "stable-testnet": 2201
639
618
  };
640
619
  var NETWORKS = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);
641
620
  function getEvmChainIdV1(network) {
@@ -670,7 +649,7 @@ var ExactEvmSchemeV1 = class {
670
649
  const now = Math.floor(Date.now() / 1e3);
671
650
  const authorization = {
672
651
  from: this.signer.address,
673
- to: (0, import_viem11.getAddress)(selectedV1.payTo),
652
+ to: (0, import_viem13.getAddress)(selectedV1.payTo),
674
653
  value: selectedV1.maxAmountRequired,
675
654
  validAfter: (now - 600).toString(),
676
655
  // 10 minutes before
@@ -708,11 +687,11 @@ var ExactEvmSchemeV1 = class {
708
687
  name,
709
688
  version,
710
689
  chainId,
711
- verifyingContract: (0, import_viem11.getAddress)(requirements.asset)
690
+ verifyingContract: (0, import_viem13.getAddress)(requirements.asset)
712
691
  };
713
692
  const message = {
714
- from: (0, import_viem11.getAddress)(authorization.from),
715
- to: (0, import_viem11.getAddress)(authorization.to),
693
+ from: (0, import_viem13.getAddress)(authorization.from),
694
+ to: (0, import_viem13.getAddress)(authorization.to),
716
695
  value: BigInt(authorization.value),
717
696
  validAfter: BigInt(authorization.validAfter),
718
697
  validBefore: BigInt(authorization.validBefore),