@payai/x402-evm 2.3.6 → 2.4.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 (78) hide show
  1. package/dist/cjs/exact/client/index.d.ts +3 -2
  2. package/dist/cjs/exact/client/index.js +173 -194
  3. package/dist/cjs/exact/client/index.js.map +1 -1
  4. package/dist/cjs/exact/facilitator/index.js +199 -185
  5. package/dist/cjs/exact/facilitator/index.js.map +1 -1
  6. package/dist/cjs/exact/server/index.d.ts +18 -17
  7. package/dist/cjs/exact/server/index.js +100 -55
  8. package/dist/cjs/exact/server/index.js.map +1 -1
  9. package/dist/cjs/exact/v1/client/index.js +3 -1
  10. package/dist/cjs/exact/v1/client/index.js.map +1 -1
  11. package/dist/cjs/exact/v1/facilitator/index.js +3 -1
  12. package/dist/cjs/exact/v1/facilitator/index.js.map +1 -1
  13. package/dist/cjs/index.d.ts +38 -2
  14. package/dist/cjs/index.js +441 -191
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/{permit2-U9Zolx3O.d.ts → permit2-CyZxwngN.d.ts} +278 -87
  17. package/dist/cjs/scheme-CXDF0D2A.d.ts +47 -0
  18. package/dist/cjs/upto/client/index.d.ts +32 -0
  19. package/dist/cjs/upto/client/index.js +507 -0
  20. package/dist/cjs/upto/client/index.js.map +1 -0
  21. package/dist/cjs/upto/facilitator/index.d.ts +52 -0
  22. package/dist/cjs/upto/facilitator/index.js +1233 -0
  23. package/dist/cjs/upto/facilitator/index.js.map +1 -0
  24. package/dist/cjs/upto/server/index.d.ts +77 -0
  25. package/dist/cjs/upto/server/index.js +246 -0
  26. package/dist/cjs/upto/server/index.js.map +1 -0
  27. package/dist/cjs/v1/index.d.ts +2 -0
  28. package/dist/cjs/v1/index.js +3 -1
  29. package/dist/cjs/v1/index.js.map +1 -1
  30. package/dist/esm/chunk-C4ZQMS77.mjs +629 -0
  31. package/dist/esm/chunk-C4ZQMS77.mjs.map +1 -0
  32. package/dist/esm/chunk-CRT6YNY5.mjs +529 -0
  33. package/dist/esm/chunk-CRT6YNY5.mjs.map +1 -0
  34. package/dist/esm/chunk-D6RXZXOS.mjs +158 -0
  35. package/dist/esm/chunk-D6RXZXOS.mjs.map +1 -0
  36. package/dist/esm/chunk-GJ57SZGI.mjs +121 -0
  37. package/dist/esm/chunk-GJ57SZGI.mjs.map +1 -0
  38. package/dist/esm/chunk-JII456TS.mjs +34 -0
  39. package/dist/esm/chunk-JII456TS.mjs.map +1 -0
  40. package/dist/esm/chunk-NSFLAANF.mjs +80 -0
  41. package/dist/esm/chunk-NSFLAANF.mjs.map +1 -0
  42. package/dist/esm/{chunk-PCJKIY5G.mjs → chunk-RYT6M3PA.mjs} +29 -501
  43. package/dist/esm/chunk-RYT6M3PA.mjs.map +1 -0
  44. package/dist/esm/chunk-WKBC5YMI.mjs +291 -0
  45. package/dist/esm/chunk-WKBC5YMI.mjs.map +1 -0
  46. package/dist/esm/exact/client/index.d.mts +3 -2
  47. package/dist/esm/exact/client/index.mjs +8 -5
  48. package/dist/esm/exact/facilitator/index.mjs +84 -430
  49. package/dist/esm/exact/facilitator/index.mjs.map +1 -1
  50. package/dist/esm/exact/server/index.d.mts +18 -17
  51. package/dist/esm/exact/server/index.mjs +28 -55
  52. package/dist/esm/exact/server/index.mjs.map +1 -1
  53. package/dist/esm/exact/v1/client/index.mjs +2 -1
  54. package/dist/esm/exact/v1/facilitator/index.mjs +2 -1
  55. package/dist/esm/index.d.mts +38 -2
  56. package/dist/esm/index.mjs +21 -8
  57. package/dist/esm/index.mjs.map +1 -1
  58. package/dist/esm/{permit2-Bbh3a8_h.d.mts → permit2-CyZxwngN.d.mts} +278 -87
  59. package/dist/esm/scheme-DCR7hsa3.d.mts +47 -0
  60. package/dist/esm/upto/client/index.d.mts +32 -0
  61. package/dist/esm/upto/client/index.mjs +18 -0
  62. package/dist/esm/upto/client/index.mjs.map +1 -0
  63. package/dist/esm/upto/facilitator/index.d.mts +52 -0
  64. package/dist/esm/upto/facilitator/index.mjs +473 -0
  65. package/dist/esm/upto/facilitator/index.mjs.map +1 -0
  66. package/dist/esm/upto/server/index.d.mts +77 -0
  67. package/dist/esm/upto/server/index.mjs +145 -0
  68. package/dist/esm/upto/server/index.mjs.map +1 -0
  69. package/dist/esm/v1/index.d.mts +2 -0
  70. package/dist/esm/v1/index.mjs +2 -1
  71. package/package.json +31 -1
  72. package/dist/esm/chunk-GD4MKCN7.mjs +0 -57
  73. package/dist/esm/chunk-GD4MKCN7.mjs.map +0 -1
  74. package/dist/esm/chunk-LWO35IGS.mjs +0 -518
  75. package/dist/esm/chunk-LWO35IGS.mjs.map +0 -1
  76. package/dist/esm/chunk-PCJKIY5G.mjs.map +0 -1
  77. package/dist/esm/chunk-TKN5V2BV.mjs +0 -13
  78. package/dist/esm/chunk-TKN5V2BV.mjs.map +0 -1
@@ -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 '@payai/x402/client';
4
3
  import { Network } from '@payai/x402/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 = {
@@ -637,7 +614,9 @@ var EVM_NETWORK_CHAIN_ID_MAP = {
637
614
  megaeth: 4326,
638
615
  monad: 143,
639
616
  kiteai: 2366,
640
- "kiteai-testnet": 2368
617
+ "kiteai-testnet": 2368,
618
+ stable: 988,
619
+ "stable-testnet": 2201
641
620
  };
642
621
  var NETWORKS = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);
643
622
  function getEvmChainIdV1(network) {
@@ -672,7 +651,7 @@ var ExactEvmSchemeV1 = class {
672
651
  const now = Math.floor(Date.now() / 1e3);
673
652
  const authorization = {
674
653
  from: this.signer.address,
675
- to: (0, import_viem11.getAddress)(selectedV1.payTo),
654
+ to: (0, import_viem13.getAddress)(selectedV1.payTo),
676
655
  value: selectedV1.maxAmountRequired,
677
656
  validAfter: (now - 600).toString(),
678
657
  // 10 minutes before
@@ -710,11 +689,11 @@ var ExactEvmSchemeV1 = class {
710
689
  name,
711
690
  version,
712
691
  chainId,
713
- verifyingContract: (0, import_viem11.getAddress)(requirements.asset)
692
+ verifyingContract: (0, import_viem13.getAddress)(requirements.asset)
714
693
  };
715
694
  const message = {
716
- from: (0, import_viem11.getAddress)(authorization.from),
717
- to: (0, import_viem11.getAddress)(authorization.to),
695
+ from: (0, import_viem13.getAddress)(authorization.from),
696
+ to: (0, import_viem13.getAddress)(authorization.to),
718
697
  value: BigInt(authorization.value),
719
698
  validAfter: BigInt(authorization.validAfter),
720
699
  validBefore: BigInt(authorization.validBefore),