@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.
- package/dist/cjs/exact/client/index.d.ts +3 -2
- package/dist/cjs/exact/client/index.js +173 -194
- package/dist/cjs/exact/client/index.js.map +1 -1
- package/dist/cjs/exact/facilitator/index.js +199 -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 +3 -1
- package/dist/cjs/exact/v1/client/index.js.map +1 -1
- package/dist/cjs/exact/v1/facilitator/index.js +3 -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 +441 -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 +2 -0
- package/dist/cjs/v1/index.js +3 -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-PCJKIY5G.mjs → chunk-RYT6M3PA.mjs} +29 -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 +2 -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-LWO35IGS.mjs +0 -518
- package/dist/esm/chunk-LWO35IGS.mjs.map +0 -1
- package/dist/esm/chunk-PCJKIY5G.mjs.map +0 -1
- package/dist/esm/chunk-TKN5V2BV.mjs +0 -13
- package/dist/esm/chunk-TKN5V2BV.mjs.map +0 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EIP2612_GAS_SPONSORING_KEY,
|
|
3
|
+
ERC20_APPROVAL_GAS_SPONSORING_KEY,
|
|
4
|
+
ERC20_APPROVAL_GAS_SPONSORING_VERSION,
|
|
5
|
+
createPermit2PayloadForProxy
|
|
6
|
+
} from "./chunk-CRT6YNY5.mjs";
|
|
7
|
+
import {
|
|
8
|
+
DEFAULT_MAX_FEE_PER_GAS,
|
|
9
|
+
DEFAULT_MAX_PRIORITY_FEE_PER_GAS,
|
|
10
|
+
ERC20_APPROVE_GAS_LIMIT,
|
|
11
|
+
PERMIT2_ADDRESS,
|
|
12
|
+
eip2612NoncesAbi,
|
|
13
|
+
eip2612PermitTypes,
|
|
14
|
+
erc20AllowanceAbi,
|
|
15
|
+
erc20ApproveAbi,
|
|
16
|
+
getEvmChainId,
|
|
17
|
+
x402ExactPermit2ProxyAddress
|
|
18
|
+
} from "./chunk-C4ZQMS77.mjs";
|
|
19
|
+
|
|
20
|
+
// src/exact/client/permit2.ts
|
|
21
|
+
import { encodeFunctionData, getAddress } from "viem";
|
|
22
|
+
var MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
23
|
+
async function createPermit2Payload(signer, x402Version, paymentRequirements) {
|
|
24
|
+
return createPermit2PayloadForProxy(
|
|
25
|
+
x402ExactPermit2ProxyAddress,
|
|
26
|
+
signer,
|
|
27
|
+
x402Version,
|
|
28
|
+
paymentRequirements
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
function createPermit2ApprovalTx(tokenAddress) {
|
|
32
|
+
const data = encodeFunctionData({
|
|
33
|
+
abi: erc20ApproveAbi,
|
|
34
|
+
functionName: "approve",
|
|
35
|
+
args: [PERMIT2_ADDRESS, MAX_UINT256]
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
to: getAddress(tokenAddress),
|
|
39
|
+
data
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function getPermit2AllowanceReadParams(params) {
|
|
43
|
+
return {
|
|
44
|
+
address: getAddress(params.tokenAddress),
|
|
45
|
+
abi: erc20AllowanceAbi,
|
|
46
|
+
functionName: "allowance",
|
|
47
|
+
args: [getAddress(params.ownerAddress), PERMIT2_ADDRESS]
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// src/shared/extensions.ts
|
|
52
|
+
import { getAddress as getAddress4 } from "viem";
|
|
53
|
+
|
|
54
|
+
// src/exact/client/eip2612.ts
|
|
55
|
+
import { getAddress as getAddress2 } from "viem";
|
|
56
|
+
async function signEip2612Permit(signer, tokenAddress, tokenName, tokenVersion, chainId, deadline, permittedAmount) {
|
|
57
|
+
const owner = signer.address;
|
|
58
|
+
const spender = getAddress2(PERMIT2_ADDRESS);
|
|
59
|
+
const nonce = await signer.readContract({
|
|
60
|
+
address: tokenAddress,
|
|
61
|
+
abi: eip2612NoncesAbi,
|
|
62
|
+
functionName: "nonces",
|
|
63
|
+
args: [owner]
|
|
64
|
+
});
|
|
65
|
+
const domain = {
|
|
66
|
+
name: tokenName,
|
|
67
|
+
version: tokenVersion,
|
|
68
|
+
chainId,
|
|
69
|
+
verifyingContract: tokenAddress
|
|
70
|
+
};
|
|
71
|
+
const approvalAmount = BigInt(permittedAmount);
|
|
72
|
+
const message = {
|
|
73
|
+
owner,
|
|
74
|
+
spender,
|
|
75
|
+
value: approvalAmount,
|
|
76
|
+
nonce,
|
|
77
|
+
deadline: BigInt(deadline)
|
|
78
|
+
};
|
|
79
|
+
const signature = await signer.signTypedData({
|
|
80
|
+
domain,
|
|
81
|
+
types: eip2612PermitTypes,
|
|
82
|
+
primaryType: "Permit",
|
|
83
|
+
message
|
|
84
|
+
});
|
|
85
|
+
return {
|
|
86
|
+
from: owner,
|
|
87
|
+
asset: tokenAddress,
|
|
88
|
+
spender,
|
|
89
|
+
amount: approvalAmount.toString(),
|
|
90
|
+
nonce: nonce.toString(),
|
|
91
|
+
deadline,
|
|
92
|
+
signature,
|
|
93
|
+
version: "1"
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// src/exact/client/erc20approval.ts
|
|
98
|
+
import { encodeFunctionData as encodeFunctionData2, getAddress as getAddress3, maxUint256 } from "viem";
|
|
99
|
+
async function signErc20ApprovalTransaction(signer, tokenAddress, chainId) {
|
|
100
|
+
const from = signer.address;
|
|
101
|
+
const spender = getAddress3(PERMIT2_ADDRESS);
|
|
102
|
+
const data = encodeFunctionData2({
|
|
103
|
+
abi: erc20ApproveAbi,
|
|
104
|
+
functionName: "approve",
|
|
105
|
+
args: [spender, maxUint256]
|
|
106
|
+
});
|
|
107
|
+
const nonce = await signer.getTransactionCount({ address: from });
|
|
108
|
+
let maxFeePerGas;
|
|
109
|
+
let maxPriorityFeePerGas;
|
|
110
|
+
try {
|
|
111
|
+
const fees = await signer.estimateFeesPerGas?.();
|
|
112
|
+
if (!fees) {
|
|
113
|
+
throw new Error("no fee estimates available");
|
|
114
|
+
}
|
|
115
|
+
maxFeePerGas = fees.maxFeePerGas;
|
|
116
|
+
maxPriorityFeePerGas = fees.maxPriorityFeePerGas;
|
|
117
|
+
} catch {
|
|
118
|
+
maxFeePerGas = DEFAULT_MAX_FEE_PER_GAS;
|
|
119
|
+
maxPriorityFeePerGas = DEFAULT_MAX_PRIORITY_FEE_PER_GAS;
|
|
120
|
+
}
|
|
121
|
+
const signedTransaction = await signer.signTransaction({
|
|
122
|
+
to: tokenAddress,
|
|
123
|
+
data,
|
|
124
|
+
nonce,
|
|
125
|
+
gas: ERC20_APPROVE_GAS_LIMIT,
|
|
126
|
+
maxFeePerGas,
|
|
127
|
+
maxPriorityFeePerGas,
|
|
128
|
+
chainId
|
|
129
|
+
});
|
|
130
|
+
return {
|
|
131
|
+
from,
|
|
132
|
+
asset: tokenAddress,
|
|
133
|
+
spender,
|
|
134
|
+
amount: maxUint256.toString(),
|
|
135
|
+
signedTransaction,
|
|
136
|
+
version: ERC20_APPROVAL_GAS_SPONSORING_VERSION
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// src/shared/rpc.ts
|
|
141
|
+
import { createPublicClient, http } from "viem";
|
|
142
|
+
var rpcClientCache = /* @__PURE__ */ new Map();
|
|
143
|
+
function isConfigByChainId(options) {
|
|
144
|
+
const keys = Object.keys(options);
|
|
145
|
+
return keys.length > 0 && keys.every((key) => /^\d+$/.test(key));
|
|
146
|
+
}
|
|
147
|
+
function getRpcClient(rpcUrl) {
|
|
148
|
+
const existing = rpcClientCache.get(rpcUrl);
|
|
149
|
+
if (existing) {
|
|
150
|
+
return existing;
|
|
151
|
+
}
|
|
152
|
+
const client = createPublicClient({
|
|
153
|
+
transport: http(rpcUrl)
|
|
154
|
+
});
|
|
155
|
+
rpcClientCache.set(rpcUrl, client);
|
|
156
|
+
return client;
|
|
157
|
+
}
|
|
158
|
+
function resolveRpcUrl(network, options) {
|
|
159
|
+
if (!options) {
|
|
160
|
+
return void 0;
|
|
161
|
+
}
|
|
162
|
+
if (isConfigByChainId(options)) {
|
|
163
|
+
const chainId = getEvmChainId(network);
|
|
164
|
+
const optionsByChainId = options;
|
|
165
|
+
return optionsByChainId[chainId]?.rpcUrl;
|
|
166
|
+
}
|
|
167
|
+
return options.rpcUrl;
|
|
168
|
+
}
|
|
169
|
+
function resolveExtensionRpcCapabilities(network, signer, options) {
|
|
170
|
+
const capabilities = {
|
|
171
|
+
signTransaction: signer.signTransaction,
|
|
172
|
+
readContract: signer.readContract,
|
|
173
|
+
getTransactionCount: signer.getTransactionCount,
|
|
174
|
+
estimateFeesPerGas: signer.estimateFeesPerGas
|
|
175
|
+
};
|
|
176
|
+
const needsRpcBackfill = !capabilities.readContract || !capabilities.getTransactionCount || !capabilities.estimateFeesPerGas;
|
|
177
|
+
if (!needsRpcBackfill) {
|
|
178
|
+
return capabilities;
|
|
179
|
+
}
|
|
180
|
+
const rpcUrl = resolveRpcUrl(network, options);
|
|
181
|
+
if (!rpcUrl) {
|
|
182
|
+
return capabilities;
|
|
183
|
+
}
|
|
184
|
+
const rpcClient = getRpcClient(rpcUrl);
|
|
185
|
+
if (!capabilities.readContract) {
|
|
186
|
+
capabilities.readContract = (args) => rpcClient.readContract(args);
|
|
187
|
+
}
|
|
188
|
+
if (!capabilities.getTransactionCount) {
|
|
189
|
+
capabilities.getTransactionCount = async (args) => rpcClient.getTransactionCount({ address: args.address });
|
|
190
|
+
}
|
|
191
|
+
if (!capabilities.estimateFeesPerGas) {
|
|
192
|
+
capabilities.estimateFeesPerGas = async () => rpcClient.estimateFeesPerGas();
|
|
193
|
+
}
|
|
194
|
+
return capabilities;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// src/shared/extensions.ts
|
|
198
|
+
async function trySignEip2612PermitExtension(signer, options, requirements, result, context) {
|
|
199
|
+
const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);
|
|
200
|
+
if (!capabilities.readContract) {
|
|
201
|
+
return void 0;
|
|
202
|
+
}
|
|
203
|
+
if (!context?.extensions?.[EIP2612_GAS_SPONSORING_KEY]) {
|
|
204
|
+
return void 0;
|
|
205
|
+
}
|
|
206
|
+
const tokenName = requirements.extra?.name;
|
|
207
|
+
const tokenVersion = requirements.extra?.version;
|
|
208
|
+
if (!tokenName || !tokenVersion) {
|
|
209
|
+
return void 0;
|
|
210
|
+
}
|
|
211
|
+
const chainId = getEvmChainId(requirements.network);
|
|
212
|
+
const tokenAddress = getAddress4(requirements.asset);
|
|
213
|
+
try {
|
|
214
|
+
const allowance = await capabilities.readContract({
|
|
215
|
+
address: tokenAddress,
|
|
216
|
+
abi: erc20AllowanceAbi,
|
|
217
|
+
functionName: "allowance",
|
|
218
|
+
args: [signer.address, PERMIT2_ADDRESS]
|
|
219
|
+
});
|
|
220
|
+
if (allowance >= BigInt(requirements.amount)) {
|
|
221
|
+
return void 0;
|
|
222
|
+
}
|
|
223
|
+
} catch {
|
|
224
|
+
}
|
|
225
|
+
const permit2Auth = result.payload?.permit2Authorization;
|
|
226
|
+
const deadline = permit2Auth?.deadline ?? Math.floor(Date.now() / 1e3 + requirements.maxTimeoutSeconds).toString();
|
|
227
|
+
const info = await signEip2612Permit(
|
|
228
|
+
{
|
|
229
|
+
address: signer.address,
|
|
230
|
+
signTypedData: (msg) => signer.signTypedData(msg),
|
|
231
|
+
readContract: capabilities.readContract
|
|
232
|
+
},
|
|
233
|
+
tokenAddress,
|
|
234
|
+
tokenName,
|
|
235
|
+
tokenVersion,
|
|
236
|
+
chainId,
|
|
237
|
+
deadline,
|
|
238
|
+
requirements.amount
|
|
239
|
+
);
|
|
240
|
+
return {
|
|
241
|
+
[EIP2612_GAS_SPONSORING_KEY]: { info }
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
async function trySignErc20ApprovalExtension(signer, options, requirements, context) {
|
|
245
|
+
const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);
|
|
246
|
+
if (!capabilities.readContract) {
|
|
247
|
+
return void 0;
|
|
248
|
+
}
|
|
249
|
+
if (!context?.extensions?.[ERC20_APPROVAL_GAS_SPONSORING_KEY]) {
|
|
250
|
+
return void 0;
|
|
251
|
+
}
|
|
252
|
+
if (!capabilities.signTransaction || !capabilities.getTransactionCount) {
|
|
253
|
+
return void 0;
|
|
254
|
+
}
|
|
255
|
+
const chainId = getEvmChainId(requirements.network);
|
|
256
|
+
const tokenAddress = getAddress4(requirements.asset);
|
|
257
|
+
try {
|
|
258
|
+
const allowance = await capabilities.readContract({
|
|
259
|
+
address: tokenAddress,
|
|
260
|
+
abi: erc20AllowanceAbi,
|
|
261
|
+
functionName: "allowance",
|
|
262
|
+
args: [signer.address, PERMIT2_ADDRESS]
|
|
263
|
+
});
|
|
264
|
+
if (allowance >= BigInt(requirements.amount)) {
|
|
265
|
+
return void 0;
|
|
266
|
+
}
|
|
267
|
+
} catch {
|
|
268
|
+
}
|
|
269
|
+
const info = await signErc20ApprovalTransaction(
|
|
270
|
+
{
|
|
271
|
+
address: signer.address,
|
|
272
|
+
signTransaction: capabilities.signTransaction,
|
|
273
|
+
getTransactionCount: capabilities.getTransactionCount,
|
|
274
|
+
estimateFeesPerGas: capabilities.estimateFeesPerGas
|
|
275
|
+
},
|
|
276
|
+
tokenAddress,
|
|
277
|
+
chainId
|
|
278
|
+
);
|
|
279
|
+
return {
|
|
280
|
+
[ERC20_APPROVAL_GAS_SPONSORING_KEY]: { info }
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export {
|
|
285
|
+
createPermit2Payload,
|
|
286
|
+
createPermit2ApprovalTx,
|
|
287
|
+
getPermit2AllowanceReadParams,
|
|
288
|
+
trySignEip2612PermitExtension,
|
|
289
|
+
trySignErc20ApprovalExtension
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=chunk-WKBC5YMI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/exact/client/permit2.ts","../../src/shared/extensions.ts","../../src/exact/client/eip2612.ts","../../src/exact/client/erc20approval.ts","../../src/shared/rpc.ts"],"sourcesContent":["import { PaymentRequirements, PaymentPayloadResult } from \"@payai/x402/types\";\nimport { encodeFunctionData, getAddress } from \"viem\";\nimport {\n PERMIT2_ADDRESS,\n x402ExactPermit2ProxyAddress,\n erc20ApproveAbi,\n erc20AllowanceAbi,\n} from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { createPermit2PayloadForProxy } from \"../../shared/permit2\";\n\n/** Maximum uint256 value for unlimited approval. */\nconst MAX_UINT256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n\n/**\n * Creates a Permit2 payload using the x402Permit2Proxy witness pattern.\n * The spender is set to x402Permit2Proxy, which enforces that funds\n * can only be sent to the witness.to address.\n *\n * @param signer - The EVM signer for client operations\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createPermit2Payload(\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise<PaymentPayloadResult> {\n return createPermit2PayloadForProxy(\n x402ExactPermit2ProxyAddress,\n signer,\n x402Version,\n paymentRequirements,\n );\n}\n\n/**\n * Creates transaction data to approve Permit2 to spend tokens.\n * The user sends this transaction (paying gas) before using Permit2 flow.\n *\n * @param tokenAddress - The ERC20 token contract address\n * @returns Transaction data to send for approval\n *\n * @example\n * ```typescript\n * const tx = createPermit2ApprovalTx(\"0x...\");\n * await walletClient.sendTransaction({\n * to: tx.to,\n * data: tx.data,\n * });\n * ```\n */\nexport function createPermit2ApprovalTx(tokenAddress: `0x${string}`): {\n to: `0x${string}`;\n data: `0x${string}`;\n} {\n const data = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: \"approve\",\n args: [PERMIT2_ADDRESS, MAX_UINT256],\n });\n\n return {\n to: getAddress(tokenAddress),\n data,\n };\n}\n\n/**\n * Parameters for checking Permit2 allowance.\n * Application provides these to check if approval is needed.\n */\nexport interface Permit2AllowanceParams {\n tokenAddress: `0x${string}`;\n ownerAddress: `0x${string}`;\n}\n\n/**\n * Returns contract read parameters for checking Permit2 allowance.\n * Use with a public client to check if the user has approved Permit2.\n *\n * @param params - The allowance check parameters\n * @returns Contract read parameters for checking allowance\n *\n * @example\n * ```typescript\n * const readParams = getPermit2AllowanceReadParams({\n * tokenAddress: \"0x...\",\n * ownerAddress: \"0x...\",\n * });\n *\n * const allowance = await publicClient.readContract(readParams);\n * const needsApproval = allowance < requiredAmount;\n * ```\n */\nexport function getPermit2AllowanceReadParams(params: Permit2AllowanceParams): {\n address: `0x${string}`;\n abi: typeof erc20AllowanceAbi;\n functionName: \"allowance\";\n args: [`0x${string}`, `0x${string}`];\n} {\n return {\n address: getAddress(params.tokenAddress),\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [getAddress(params.ownerAddress), PERMIT2_ADDRESS],\n };\n}\n","import { PaymentRequirements, PaymentPayloadResult, PaymentPayloadContext } from \"@payai/x402/types\";\nimport { EIP2612_GAS_SPONSORING_KEY, ERC20_APPROVAL_GAS_SPONSORING_KEY } from \"../exact/extensions\";\nimport { getAddress } from \"viem\";\nimport { PERMIT2_ADDRESS, erc20AllowanceAbi } from \"../constants\";\nimport { getEvmChainId } from \"../utils\";\nimport { ClientEvmSigner } from \"../signer\";\nimport { signEip2612Permit } from \"../exact/client/eip2612\";\nimport { signErc20ApprovalTransaction } from \"../exact/client/erc20approval\";\nimport { resolveExtensionRpcCapabilities, type ExactEvmSchemeOptions } from \"./rpc\";\n\n/**\n * Attempts to sign an EIP-2612 permit for gasless Permit2 approval.\n *\n * @param signer - The EVM client signer\n * @param options - Optional RPC configuration for backfilling capabilities\n * @param requirements - The payment requirements from the server\n * @param result - The payment payload result from the scheme\n * @param context - Optional context containing server extensions and metadata\n * @returns Extension data for EIP-2612 gas sponsoring, or undefined if not applicable\n */\nexport async function trySignEip2612PermitExtension(\n signer: ClientEvmSigner,\n options: ExactEvmSchemeOptions | undefined,\n requirements: PaymentRequirements,\n result: PaymentPayloadResult,\n context?: PaymentPayloadContext,\n): Promise<Record<string, unknown> | undefined> {\n const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);\n\n if (!capabilities.readContract) {\n return undefined;\n }\n\n if (!context?.extensions?.[EIP2612_GAS_SPONSORING_KEY]) {\n return undefined;\n }\n\n const tokenName = requirements.extra?.name as string | undefined;\n const tokenVersion = requirements.extra?.version as string | undefined;\n if (!tokenName || !tokenVersion) {\n return undefined;\n }\n\n const chainId = getEvmChainId(requirements.network);\n const tokenAddress = getAddress(requirements.asset) as `0x${string}`;\n\n try {\n const allowance = (await capabilities.readContract({\n address: tokenAddress,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [signer.address, PERMIT2_ADDRESS],\n })) as bigint;\n\n if (allowance >= BigInt(requirements.amount)) {\n return undefined;\n }\n } catch {\n // Allowance check failed, proceed with signing\n }\n\n const permit2Auth = result.payload?.permit2Authorization as Record<string, unknown> | undefined;\n const deadline =\n (permit2Auth?.deadline as string) ??\n Math.floor(Date.now() / 1000 + requirements.maxTimeoutSeconds).toString();\n\n const info = await signEip2612Permit(\n {\n address: signer.address,\n signTypedData: msg => signer.signTypedData(msg),\n readContract: capabilities.readContract,\n },\n tokenAddress,\n tokenName,\n tokenVersion,\n chainId,\n deadline,\n requirements.amount,\n );\n\n return {\n [EIP2612_GAS_SPONSORING_KEY]: { info },\n };\n}\n\n/**\n * Attempts to sign an ERC-20 approval transaction for gasless Permit2 approval.\n *\n * @param signer - The EVM client signer\n * @param options - Optional RPC configuration for backfilling capabilities\n * @param requirements - The payment requirements from the server\n * @param context - Optional context containing server extensions and metadata\n * @returns Extension data for ERC-20 approval gas sponsoring, or undefined if not applicable\n */\nexport async function trySignErc20ApprovalExtension(\n signer: ClientEvmSigner,\n options: ExactEvmSchemeOptions | undefined,\n requirements: PaymentRequirements,\n context?: PaymentPayloadContext,\n): Promise<Record<string, unknown> | undefined> {\n const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);\n\n if (!capabilities.readContract) {\n return undefined;\n }\n\n if (!context?.extensions?.[ERC20_APPROVAL_GAS_SPONSORING_KEY]) {\n return undefined;\n }\n\n if (!capabilities.signTransaction || !capabilities.getTransactionCount) {\n return undefined;\n }\n\n const chainId = getEvmChainId(requirements.network);\n const tokenAddress = getAddress(requirements.asset) as `0x${string}`;\n\n try {\n const allowance = (await capabilities.readContract({\n address: tokenAddress,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [signer.address, PERMIT2_ADDRESS],\n })) as bigint;\n\n if (allowance >= BigInt(requirements.amount)) {\n return undefined;\n }\n } catch {\n // Allowance check failed, proceed with signing\n }\n\n const info = await signErc20ApprovalTransaction(\n {\n address: signer.address,\n signTransaction: capabilities.signTransaction,\n getTransactionCount: capabilities.getTransactionCount,\n estimateFeesPerGas: capabilities.estimateFeesPerGas,\n },\n tokenAddress,\n chainId,\n );\n\n return {\n [ERC20_APPROVAL_GAS_SPONSORING_KEY]: { info },\n };\n}\n","import { getAddress } from \"viem\";\nimport { eip2612PermitTypes, eip2612NoncesAbi, PERMIT2_ADDRESS } from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport type { Eip2612GasSponsoringInfo } from \"../extensions\";\n\nexport type Eip2612PermitSigner = Pick<ClientEvmSigner, \"address\" | \"signTypedData\"> & {\n readContract: NonNullable<ClientEvmSigner[\"readContract\"]>;\n};\n\n/**\n * Signs an EIP-2612 permit authorizing the Permit2 contract to spend tokens.\n *\n * This creates a gasless off-chain signature that the facilitator can submit\n * on-chain via `x402Permit2Proxy.settleWithPermit()`.\n *\n * The `permittedAmount` must match the Permit2 `permitted.amount` exactly, as the\n * proxy contract enforces `permit2612.value == permittedAmount`.\n *\n * @param signer - The client EVM signer (must support readContract for nonce query)\n * @param tokenAddress - The ERC-20 token contract address\n * @param tokenName - The token name (from paymentRequirements.extra.name)\n * @param tokenVersion - The token version (from paymentRequirements.extra.version)\n * @param chainId - The chain ID\n * @param deadline - The deadline for the permit (unix timestamp as string)\n * @param permittedAmount - The Permit2 permitted amount (must match exactly)\n * @returns The EIP-2612 gas sponsoring info object\n */\nexport async function signEip2612Permit(\n signer: Eip2612PermitSigner,\n tokenAddress: `0x${string}`,\n tokenName: string,\n tokenVersion: string,\n chainId: number,\n deadline: string,\n permittedAmount: string,\n): Promise<Eip2612GasSponsoringInfo> {\n const owner = signer.address;\n const spender = getAddress(PERMIT2_ADDRESS);\n\n // Query the current EIP-2612 nonce from the token contract\n const nonce = (await signer.readContract({\n address: tokenAddress,\n abi: eip2612NoncesAbi,\n functionName: \"nonces\",\n args: [owner],\n })) as bigint;\n\n // Construct EIP-712 domain for the token's permit function\n const domain = {\n name: tokenName,\n version: tokenVersion,\n chainId,\n verifyingContract: tokenAddress,\n };\n\n const approvalAmount = BigInt(permittedAmount);\n\n const message = {\n owner,\n spender,\n value: approvalAmount,\n nonce,\n deadline: BigInt(deadline),\n };\n\n // Sign the EIP-2612 permit\n const signature = await signer.signTypedData({\n domain,\n types: eip2612PermitTypes,\n primaryType: \"Permit\",\n message,\n });\n\n return {\n from: owner,\n asset: tokenAddress,\n spender,\n amount: approvalAmount.toString(),\n nonce: nonce.toString(),\n deadline,\n signature,\n version: \"1\",\n };\n}\n","import { encodeFunctionData, getAddress, maxUint256 } from \"viem\";\nimport {\n PERMIT2_ADDRESS,\n erc20ApproveAbi,\n ERC20_APPROVE_GAS_LIMIT,\n DEFAULT_MAX_FEE_PER_GAS,\n DEFAULT_MAX_PRIORITY_FEE_PER_GAS,\n} from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport {\n ERC20_APPROVAL_GAS_SPONSORING_VERSION,\n type Erc20ApprovalGasSponsoringInfo,\n} from \"../extensions\";\n\nexport type Erc20ApprovalTxSigner = Pick<ClientEvmSigner, \"address\"> & {\n signTransaction: NonNullable<ClientEvmSigner[\"signTransaction\"]>;\n getTransactionCount: NonNullable<ClientEvmSigner[\"getTransactionCount\"]>;\n estimateFeesPerGas?: NonNullable<ClientEvmSigner[\"estimateFeesPerGas\"]>;\n};\n\n/**\n * Signs an EIP-1559 `approve(Permit2, MaxUint256)` transaction for the given token.\n *\n * The signed transaction is NOT broadcast here — the facilitator broadcasts it\n * atomically before settling the Permit2 payment. This enables Permit2 payments\n * for generic ERC-20 tokens that do NOT implement EIP-2612.\n *\n * Always approves MaxUint256 regardless of the payment amount.\n *\n * @param signer - The client EVM signer (must support signTransaction, getTransactionCount)\n * @param tokenAddress - The ERC-20 token contract address\n * @param chainId - The chain ID\n * @returns The ERC-20 approval gas sponsoring info object\n */\nexport async function signErc20ApprovalTransaction(\n signer: Erc20ApprovalTxSigner,\n tokenAddress: `0x${string}`,\n chainId: number,\n): Promise<Erc20ApprovalGasSponsoringInfo> {\n const from = signer.address;\n const spender = getAddress(PERMIT2_ADDRESS);\n\n // Encode approve(PERMIT2_ADDRESS, MaxUint256) calldata\n const data = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: \"approve\",\n args: [spender, maxUint256],\n });\n\n // Get current nonce for the sender\n const nonce = await signer.getTransactionCount({ address: from });\n\n // Get current fee estimates, with fallback values\n let maxFeePerGas: bigint;\n let maxPriorityFeePerGas: bigint;\n try {\n const fees = await signer.estimateFeesPerGas?.();\n if (!fees) {\n throw new Error(\"no fee estimates available\");\n }\n maxFeePerGas = fees.maxFeePerGas;\n maxPriorityFeePerGas = fees.maxPriorityFeePerGas;\n } catch {\n maxFeePerGas = DEFAULT_MAX_FEE_PER_GAS;\n maxPriorityFeePerGas = DEFAULT_MAX_PRIORITY_FEE_PER_GAS;\n }\n\n // Sign the EIP-1559 transaction (not broadcast)\n const signedTransaction = await signer.signTransaction({\n to: tokenAddress,\n data,\n nonce,\n gas: ERC20_APPROVE_GAS_LIMIT,\n maxFeePerGas,\n maxPriorityFeePerGas,\n chainId,\n });\n\n return {\n from,\n asset: tokenAddress,\n spender,\n amount: maxUint256.toString(),\n signedTransaction,\n version: ERC20_APPROVAL_GAS_SPONSORING_VERSION,\n };\n}\n","import { createPublicClient, http } from \"viem\";\nimport type { ClientEvmSigner } from \"../signer\";\nimport { getEvmChainId } from \"../utils\";\n\nexport type EvmSchemeConfig = {\n rpcUrl?: string;\n};\n\nexport type EvmSchemeConfigByChainId = Record<number, EvmSchemeConfig>;\n\nexport type EvmSchemeOptions = EvmSchemeConfig | EvmSchemeConfigByChainId;\n\n/** @deprecated Use EvmSchemeConfig */\nexport type ExactEvmSchemeConfig = EvmSchemeConfig;\n/** @deprecated Use EvmSchemeConfigByChainId */\nexport type ExactEvmSchemeConfigByChainId = EvmSchemeConfigByChainId;\n/** @deprecated Use EvmSchemeOptions */\nexport type ExactEvmSchemeOptions = EvmSchemeOptions;\n\ntype ExtensionRpcCapabilities = Pick<\n ClientEvmSigner,\n \"readContract\" | \"signTransaction\" | \"getTransactionCount\" | \"estimateFeesPerGas\"\n>;\n\nconst rpcClientCache = new Map<string, ReturnType<typeof createPublicClient>>();\n\n/**\n * Check if options is a per-chain-id configuration map.\n *\n * @param options - The EVM scheme options to check\n * @returns True if the options are keyed by chain ID\n */\nfunction isConfigByChainId(options: EvmSchemeOptions): options is EvmSchemeConfigByChainId {\n const keys = Object.keys(options);\n return keys.length > 0 && keys.every(key => /^\\d+$/.test(key));\n}\n\n/**\n * Get or create a cached viem public client for the given RPC URL.\n *\n * @param rpcUrl - The JSON-RPC endpoint URL\n * @returns A viem PublicClient instance\n */\nfunction getRpcClient(rpcUrl: string): ReturnType<typeof createPublicClient> {\n const existing = rpcClientCache.get(rpcUrl);\n if (existing) {\n return existing;\n }\n\n const client = createPublicClient({\n transport: http(rpcUrl),\n });\n rpcClientCache.set(rpcUrl, client);\n return client;\n}\n\n/**\n * Resolve an RPC URL from scheme options for the given network.\n *\n * @param network - The CAIP-2 network identifier\n * @param options - Optional EVM scheme options (flat or per-chain-id)\n * @returns The resolved RPC URL, or undefined if not configured\n */\nexport function resolveRpcUrl(network: string, options?: EvmSchemeOptions): string | undefined {\n if (!options) {\n return undefined;\n }\n\n if (isConfigByChainId(options)) {\n const chainId = getEvmChainId(network);\n const optionsByChainId = options as EvmSchemeConfigByChainId;\n return optionsByChainId[chainId]?.rpcUrl;\n }\n\n return (options as EvmSchemeConfig).rpcUrl;\n}\n\n/**\n * Resolve RPC capabilities for extensions, backfilling from a public RPC client when the signer lacks them.\n *\n * @param network - The CAIP-2 network identifier\n * @param signer - The client EVM signer\n * @param options - Optional EVM scheme options for RPC URL resolution\n * @returns Extension RPC capabilities (readContract, signTransaction, etc.)\n */\nexport function resolveExtensionRpcCapabilities(\n network: string,\n signer: ClientEvmSigner,\n options?: EvmSchemeOptions,\n): ExtensionRpcCapabilities {\n const capabilities: ExtensionRpcCapabilities = {\n signTransaction: signer.signTransaction,\n readContract: signer.readContract,\n getTransactionCount: signer.getTransactionCount,\n estimateFeesPerGas: signer.estimateFeesPerGas,\n };\n\n const needsRpcBackfill =\n !capabilities.readContract ||\n !capabilities.getTransactionCount ||\n !capabilities.estimateFeesPerGas;\n if (!needsRpcBackfill) {\n return capabilities;\n }\n\n const rpcUrl = resolveRpcUrl(network, options);\n if (!rpcUrl) {\n return capabilities;\n }\n const rpcClient = getRpcClient(rpcUrl);\n if (!capabilities.readContract) {\n capabilities.readContract = args => rpcClient.readContract(args as never) as Promise<unknown>;\n }\n if (!capabilities.getTransactionCount) {\n capabilities.getTransactionCount = async args =>\n rpcClient.getTransactionCount({ address: args.address });\n }\n if (!capabilities.estimateFeesPerGas) {\n capabilities.estimateFeesPerGas = async () => rpcClient.estimateFeesPerGas();\n }\n\n return capabilities;\n}\n"],"mappings":"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","names":["getAddress","getAddress","getAddress","encodeFunctionData","getAddress","getAddress","encodeFunctionData","getAddress"]}
|
|
@@ -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-Bbh3a8_h.mjs';
|
|
1
|
+
export { E as ExactEvmScheme } from '../../scheme-DCR7hsa3.mjs';
|
|
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.mjs';
|
|
5
|
+
import { E as ExactEvmSchemeOptions } from '../../permit2-CyZxwngN.mjs';
|
|
6
|
+
export { j as ExactEvmSchemeConfig, k as ExactEvmSchemeConfigByChainId, P as Permit2AllowanceParams, c as createPermit2ApprovalTx, e as erc20AllowanceAbi, g as getPermit2AllowanceReadParams } from '../../permit2-CyZxwngN.mjs';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Configuration options for registering EVM schemes to an x402Client
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ExactEvmScheme,
|
|
3
|
-
createPermit2ApprovalTx,
|
|
4
|
-
getPermit2AllowanceReadParams,
|
|
5
3
|
registerExactEvmScheme
|
|
6
|
-
} from "../../chunk-
|
|
7
|
-
import "../../chunk-
|
|
4
|
+
} from "../../chunk-D6RXZXOS.mjs";
|
|
5
|
+
import "../../chunk-RYT6M3PA.mjs";
|
|
6
|
+
import {
|
|
7
|
+
createPermit2ApprovalTx,
|
|
8
|
+
getPermit2AllowanceReadParams
|
|
9
|
+
} from "../../chunk-WKBC5YMI.mjs";
|
|
10
|
+
import "../../chunk-CRT6YNY5.mjs";
|
|
8
11
|
import {
|
|
9
12
|
erc20AllowanceAbi
|
|
10
|
-
} from "../../chunk-
|
|
13
|
+
} from "../../chunk-C4ZQMS77.mjs";
|
|
11
14
|
export {
|
|
12
15
|
ExactEvmScheme,
|
|
13
16
|
createPermit2ApprovalTx,
|