@payai/x402-evm 2.3.5 → 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.
- package/dist/cjs/exact/client/index.d.ts +3 -2
- package/dist/cjs/exact/client/index.js +175 -194
- package/dist/cjs/exact/client/index.js.map +1 -1
- package/dist/cjs/exact/facilitator/index.js +201 -185
- package/dist/cjs/exact/facilitator/index.js.map +1 -1
- package/dist/cjs/exact/server/index.d.ts +18 -17
- package/dist/cjs/exact/server/index.js +100 -55
- package/dist/cjs/exact/server/index.js.map +1 -1
- package/dist/cjs/exact/v1/client/index.js +5 -1
- package/dist/cjs/exact/v1/client/index.js.map +1 -1
- package/dist/cjs/exact/v1/facilitator/index.js +5 -1
- package/dist/cjs/exact/v1/facilitator/index.js.map +1 -1
- package/dist/cjs/index.d.ts +38 -2
- package/dist/cjs/index.js +443 -191
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/{permit2-U9Zolx3O.d.ts → permit2-CyZxwngN.d.ts} +278 -87
- package/dist/cjs/scheme-CXDF0D2A.d.ts +47 -0
- package/dist/cjs/upto/client/index.d.ts +32 -0
- package/dist/cjs/upto/client/index.js +507 -0
- package/dist/cjs/upto/client/index.js.map +1 -0
- package/dist/cjs/upto/facilitator/index.d.ts +52 -0
- package/dist/cjs/upto/facilitator/index.js +1233 -0
- package/dist/cjs/upto/facilitator/index.js.map +1 -0
- package/dist/cjs/upto/server/index.d.ts +77 -0
- package/dist/cjs/upto/server/index.js +246 -0
- package/dist/cjs/upto/server/index.js.map +1 -0
- package/dist/cjs/v1/index.d.ts +4 -0
- package/dist/cjs/v1/index.js +5 -1
- package/dist/cjs/v1/index.js.map +1 -1
- package/dist/esm/chunk-C4ZQMS77.mjs +629 -0
- package/dist/esm/chunk-C4ZQMS77.mjs.map +1 -0
- package/dist/esm/chunk-CRT6YNY5.mjs +529 -0
- package/dist/esm/chunk-CRT6YNY5.mjs.map +1 -0
- package/dist/esm/chunk-D6RXZXOS.mjs +158 -0
- package/dist/esm/chunk-D6RXZXOS.mjs.map +1 -0
- package/dist/esm/chunk-GJ57SZGI.mjs +121 -0
- package/dist/esm/chunk-GJ57SZGI.mjs.map +1 -0
- package/dist/esm/chunk-JII456TS.mjs +34 -0
- package/dist/esm/chunk-JII456TS.mjs.map +1 -0
- package/dist/esm/chunk-NSFLAANF.mjs +80 -0
- package/dist/esm/chunk-NSFLAANF.mjs.map +1 -0
- package/dist/esm/{chunk-IZEI7JTG.mjs → chunk-RYT6M3PA.mjs} +31 -501
- package/dist/esm/chunk-RYT6M3PA.mjs.map +1 -0
- package/dist/esm/chunk-WKBC5YMI.mjs +291 -0
- package/dist/esm/chunk-WKBC5YMI.mjs.map +1 -0
- package/dist/esm/exact/client/index.d.mts +3 -2
- package/dist/esm/exact/client/index.mjs +8 -5
- package/dist/esm/exact/facilitator/index.mjs +84 -430
- package/dist/esm/exact/facilitator/index.mjs.map +1 -1
- package/dist/esm/exact/server/index.d.mts +18 -17
- package/dist/esm/exact/server/index.mjs +28 -55
- package/dist/esm/exact/server/index.mjs.map +1 -1
- package/dist/esm/exact/v1/client/index.mjs +2 -1
- package/dist/esm/exact/v1/facilitator/index.mjs +2 -1
- package/dist/esm/index.d.mts +38 -2
- package/dist/esm/index.mjs +21 -8
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/{permit2-Bbh3a8_h.d.mts → permit2-CyZxwngN.d.mts} +278 -87
- package/dist/esm/scheme-DCR7hsa3.d.mts +47 -0
- package/dist/esm/upto/client/index.d.mts +32 -0
- package/dist/esm/upto/client/index.mjs +18 -0
- package/dist/esm/upto/client/index.mjs.map +1 -0
- package/dist/esm/upto/facilitator/index.d.mts +52 -0
- package/dist/esm/upto/facilitator/index.mjs +473 -0
- package/dist/esm/upto/facilitator/index.mjs.map +1 -0
- package/dist/esm/upto/server/index.d.mts +77 -0
- package/dist/esm/upto/server/index.mjs +145 -0
- package/dist/esm/upto/server/index.mjs.map +1 -0
- package/dist/esm/v1/index.d.mts +4 -0
- package/dist/esm/v1/index.mjs +2 -1
- package/package.json +31 -1
- package/dist/esm/chunk-GD4MKCN7.mjs +0 -57
- package/dist/esm/chunk-GD4MKCN7.mjs.map +0 -1
- package/dist/esm/chunk-IZEI7JTG.mjs.map +0 -1
- package/dist/esm/chunk-TKN5V2BV.mjs +0 -13
- package/dist/esm/chunk-TKN5V2BV.mjs.map +0 -1
- package/dist/esm/chunk-WJWNS4G4.mjs +0 -518
- package/dist/esm/chunk-WJWNS4G4.mjs.map +0 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
199
|
-
|
|
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,
|
|
216
|
+
token: (0, import_viem5.getAddress)(paymentRequirements.asset),
|
|
208
217
|
amount: paymentRequirements.amount
|
|
209
218
|
},
|
|
210
|
-
spender:
|
|
219
|
+
spender: proxyAddress,
|
|
211
220
|
nonce,
|
|
212
221
|
deadline,
|
|
213
222
|
witness: {
|
|
214
|
-
to: (0,
|
|
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,
|
|
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,
|
|
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,
|
|
282
|
+
address: (0, import_viem6.getAddress)(params.tokenAddress),
|
|
273
283
|
abi: erc20AllowanceAbi,
|
|
274
284
|
functionName: "allowance",
|
|
275
|
-
args: [(0,
|
|
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
|
|
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,
|
|
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
|
|
336
|
+
var import_viem8 = require("viem");
|
|
324
337
|
async function signErc20ApprovalTransaction(signer, tokenAddress, chainId) {
|
|
325
338
|
const from = signer.address;
|
|
326
|
-
const spender = (0,
|
|
327
|
-
const data = (0,
|
|
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,
|
|
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:
|
|
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/
|
|
366
|
-
var
|
|
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,
|
|
378
|
-
transport: (0,
|
|
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
|
|
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
|
|
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
|
|
587
|
+
var import_viem13 = require("viem");
|
|
608
588
|
|
|
609
589
|
// src/exact/v1/facilitator/scheme.ts
|
|
610
|
-
var
|
|
590
|
+
var import_viem12 = require("viem");
|
|
611
591
|
|
|
612
592
|
// src/exact/facilitator/eip3009-utils.ts
|
|
613
|
-
var
|
|
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,11 @@ 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
|
+
kiteai: 2366,
|
|
617
|
+
"kiteai-testnet": 2368,
|
|
618
|
+
stable: 988,
|
|
619
|
+
"stable-testnet": 2201
|
|
639
620
|
};
|
|
640
621
|
var NETWORKS = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);
|
|
641
622
|
function getEvmChainIdV1(network) {
|
|
@@ -670,7 +651,7 @@ var ExactEvmSchemeV1 = class {
|
|
|
670
651
|
const now = Math.floor(Date.now() / 1e3);
|
|
671
652
|
const authorization = {
|
|
672
653
|
from: this.signer.address,
|
|
673
|
-
to: (0,
|
|
654
|
+
to: (0, import_viem13.getAddress)(selectedV1.payTo),
|
|
674
655
|
value: selectedV1.maxAmountRequired,
|
|
675
656
|
validAfter: (now - 600).toString(),
|
|
676
657
|
// 10 minutes before
|
|
@@ -708,11 +689,11 @@ var ExactEvmSchemeV1 = class {
|
|
|
708
689
|
name,
|
|
709
690
|
version,
|
|
710
691
|
chainId,
|
|
711
|
-
verifyingContract: (0,
|
|
692
|
+
verifyingContract: (0, import_viem13.getAddress)(requirements.asset)
|
|
712
693
|
};
|
|
713
694
|
const message = {
|
|
714
|
-
from: (0,
|
|
715
|
-
to: (0,
|
|
695
|
+
from: (0, import_viem13.getAddress)(authorization.from),
|
|
696
|
+
to: (0, import_viem13.getAddress)(authorization.to),
|
|
716
697
|
value: BigInt(authorization.value),
|
|
717
698
|
validAfter: BigInt(authorization.validAfter),
|
|
718
699
|
validBefore: BigInt(authorization.validBefore),
|