@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,518 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
EIP2612_GAS_SPONSORING_KEY,
|
|
3
|
-
ERC20_APPROVAL_GAS_SPONSORING_KEY,
|
|
4
|
-
ERC20_APPROVAL_GAS_SPONSORING_VERSION
|
|
5
|
-
} from "./chunk-GD4MKCN7.mjs";
|
|
6
|
-
import {
|
|
7
|
-
DEFAULT_MAX_FEE_PER_GAS,
|
|
8
|
-
DEFAULT_MAX_PRIORITY_FEE_PER_GAS,
|
|
9
|
-
ERC20_APPROVE_GAS_LIMIT,
|
|
10
|
-
ExactEvmSchemeV12 as ExactEvmSchemeV1,
|
|
11
|
-
NETWORKS,
|
|
12
|
-
PERMIT2_ADDRESS,
|
|
13
|
-
authorizationTypes,
|
|
14
|
-
createNonce,
|
|
15
|
-
createPermit2Nonce,
|
|
16
|
-
eip2612NoncesAbi,
|
|
17
|
-
eip2612PermitTypes,
|
|
18
|
-
erc20AllowanceAbi,
|
|
19
|
-
erc20ApproveAbi,
|
|
20
|
-
getEvmChainId,
|
|
21
|
-
permit2WitnessTypes,
|
|
22
|
-
x402ExactPermit2ProxyAddress
|
|
23
|
-
} from "./chunk-IZEI7JTG.mjs";
|
|
24
|
-
|
|
25
|
-
// src/exact/client/scheme.ts
|
|
26
|
-
import { getAddress as getAddress5 } from "viem";
|
|
27
|
-
|
|
28
|
-
// src/exact/client/eip3009.ts
|
|
29
|
-
import { getAddress } from "viem";
|
|
30
|
-
async function createEIP3009Payload(signer, x402Version, paymentRequirements) {
|
|
31
|
-
const nonce = createNonce();
|
|
32
|
-
const now = Math.floor(Date.now() / 1e3);
|
|
33
|
-
const authorization = {
|
|
34
|
-
from: signer.address,
|
|
35
|
-
to: getAddress(paymentRequirements.payTo),
|
|
36
|
-
value: paymentRequirements.amount,
|
|
37
|
-
validAfter: (now - 600).toString(),
|
|
38
|
-
validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),
|
|
39
|
-
nonce
|
|
40
|
-
};
|
|
41
|
-
const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);
|
|
42
|
-
const payload = {
|
|
43
|
-
authorization,
|
|
44
|
-
signature
|
|
45
|
-
};
|
|
46
|
-
return {
|
|
47
|
-
x402Version,
|
|
48
|
-
payload
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
async function signEIP3009Authorization(signer, authorization, requirements) {
|
|
52
|
-
const chainId = getEvmChainId(requirements.network);
|
|
53
|
-
if (!requirements.extra?.name || !requirements.extra?.version) {
|
|
54
|
-
throw new Error(
|
|
55
|
-
`EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
const { name, version } = requirements.extra;
|
|
59
|
-
const domain = {
|
|
60
|
-
name,
|
|
61
|
-
version,
|
|
62
|
-
chainId,
|
|
63
|
-
verifyingContract: getAddress(requirements.asset)
|
|
64
|
-
};
|
|
65
|
-
const message = {
|
|
66
|
-
from: getAddress(authorization.from),
|
|
67
|
-
to: getAddress(authorization.to),
|
|
68
|
-
value: BigInt(authorization.value),
|
|
69
|
-
validAfter: BigInt(authorization.validAfter),
|
|
70
|
-
validBefore: BigInt(authorization.validBefore),
|
|
71
|
-
nonce: authorization.nonce
|
|
72
|
-
};
|
|
73
|
-
return await signer.signTypedData({
|
|
74
|
-
domain,
|
|
75
|
-
types: authorizationTypes,
|
|
76
|
-
primaryType: "TransferWithAuthorization",
|
|
77
|
-
message
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// src/exact/client/permit2.ts
|
|
82
|
-
import { encodeFunctionData, getAddress as getAddress2 } from "viem";
|
|
83
|
-
var MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
84
|
-
async function createPermit2Payload(signer, x402Version, paymentRequirements) {
|
|
85
|
-
const now = Math.floor(Date.now() / 1e3);
|
|
86
|
-
const nonce = createPermit2Nonce();
|
|
87
|
-
const validAfter = (now - 600).toString();
|
|
88
|
-
const deadline = (now + paymentRequirements.maxTimeoutSeconds).toString();
|
|
89
|
-
const permit2Authorization = {
|
|
90
|
-
from: signer.address,
|
|
91
|
-
permitted: {
|
|
92
|
-
token: getAddress2(paymentRequirements.asset),
|
|
93
|
-
amount: paymentRequirements.amount
|
|
94
|
-
},
|
|
95
|
-
spender: x402ExactPermit2ProxyAddress,
|
|
96
|
-
nonce,
|
|
97
|
-
deadline,
|
|
98
|
-
witness: {
|
|
99
|
-
to: getAddress2(paymentRequirements.payTo),
|
|
100
|
-
validAfter
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
const signature = await signPermit2Authorization(
|
|
104
|
-
signer,
|
|
105
|
-
permit2Authorization,
|
|
106
|
-
paymentRequirements
|
|
107
|
-
);
|
|
108
|
-
const payload = {
|
|
109
|
-
signature,
|
|
110
|
-
permit2Authorization
|
|
111
|
-
};
|
|
112
|
-
return {
|
|
113
|
-
x402Version,
|
|
114
|
-
payload
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
async function signPermit2Authorization(signer, permit2Authorization, requirements) {
|
|
118
|
-
const chainId = getEvmChainId(requirements.network);
|
|
119
|
-
const domain = {
|
|
120
|
-
name: "Permit2",
|
|
121
|
-
chainId,
|
|
122
|
-
verifyingContract: PERMIT2_ADDRESS
|
|
123
|
-
};
|
|
124
|
-
const message = {
|
|
125
|
-
permitted: {
|
|
126
|
-
token: getAddress2(permit2Authorization.permitted.token),
|
|
127
|
-
amount: BigInt(permit2Authorization.permitted.amount)
|
|
128
|
-
},
|
|
129
|
-
spender: getAddress2(permit2Authorization.spender),
|
|
130
|
-
nonce: BigInt(permit2Authorization.nonce),
|
|
131
|
-
deadline: BigInt(permit2Authorization.deadline),
|
|
132
|
-
witness: {
|
|
133
|
-
to: getAddress2(permit2Authorization.witness.to),
|
|
134
|
-
validAfter: BigInt(permit2Authorization.witness.validAfter)
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
return await signer.signTypedData({
|
|
138
|
-
domain,
|
|
139
|
-
types: permit2WitnessTypes,
|
|
140
|
-
primaryType: "PermitWitnessTransferFrom",
|
|
141
|
-
message
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
function createPermit2ApprovalTx(tokenAddress) {
|
|
145
|
-
const data = encodeFunctionData({
|
|
146
|
-
abi: erc20ApproveAbi,
|
|
147
|
-
functionName: "approve",
|
|
148
|
-
args: [PERMIT2_ADDRESS, MAX_UINT256]
|
|
149
|
-
});
|
|
150
|
-
return {
|
|
151
|
-
to: getAddress2(tokenAddress),
|
|
152
|
-
data
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
function getPermit2AllowanceReadParams(params) {
|
|
156
|
-
return {
|
|
157
|
-
address: getAddress2(params.tokenAddress),
|
|
158
|
-
abi: erc20AllowanceAbi,
|
|
159
|
-
functionName: "allowance",
|
|
160
|
-
args: [getAddress2(params.ownerAddress), PERMIT2_ADDRESS]
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// src/exact/client/eip2612.ts
|
|
165
|
-
import { getAddress as getAddress3 } from "viem";
|
|
166
|
-
async function signEip2612Permit(signer, tokenAddress, tokenName, tokenVersion, chainId, deadline, permittedAmount) {
|
|
167
|
-
const owner = signer.address;
|
|
168
|
-
const spender = getAddress3(PERMIT2_ADDRESS);
|
|
169
|
-
const nonce = await signer.readContract({
|
|
170
|
-
address: tokenAddress,
|
|
171
|
-
abi: eip2612NoncesAbi,
|
|
172
|
-
functionName: "nonces",
|
|
173
|
-
args: [owner]
|
|
174
|
-
});
|
|
175
|
-
const domain = {
|
|
176
|
-
name: tokenName,
|
|
177
|
-
version: tokenVersion,
|
|
178
|
-
chainId,
|
|
179
|
-
verifyingContract: tokenAddress
|
|
180
|
-
};
|
|
181
|
-
const approvalAmount = BigInt(permittedAmount);
|
|
182
|
-
const message = {
|
|
183
|
-
owner,
|
|
184
|
-
spender,
|
|
185
|
-
value: approvalAmount,
|
|
186
|
-
nonce,
|
|
187
|
-
deadline: BigInt(deadline)
|
|
188
|
-
};
|
|
189
|
-
const signature = await signer.signTypedData({
|
|
190
|
-
domain,
|
|
191
|
-
types: eip2612PermitTypes,
|
|
192
|
-
primaryType: "Permit",
|
|
193
|
-
message
|
|
194
|
-
});
|
|
195
|
-
return {
|
|
196
|
-
from: owner,
|
|
197
|
-
asset: tokenAddress,
|
|
198
|
-
spender,
|
|
199
|
-
amount: approvalAmount.toString(),
|
|
200
|
-
nonce: nonce.toString(),
|
|
201
|
-
deadline,
|
|
202
|
-
signature,
|
|
203
|
-
version: "1"
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// src/exact/client/erc20approval.ts
|
|
208
|
-
import { encodeFunctionData as encodeFunctionData2, getAddress as getAddress4, maxUint256 } from "viem";
|
|
209
|
-
async function signErc20ApprovalTransaction(signer, tokenAddress, chainId) {
|
|
210
|
-
const from = signer.address;
|
|
211
|
-
const spender = getAddress4(PERMIT2_ADDRESS);
|
|
212
|
-
const data = encodeFunctionData2({
|
|
213
|
-
abi: erc20ApproveAbi,
|
|
214
|
-
functionName: "approve",
|
|
215
|
-
args: [spender, maxUint256]
|
|
216
|
-
});
|
|
217
|
-
const nonce = await signer.getTransactionCount({ address: from });
|
|
218
|
-
let maxFeePerGas;
|
|
219
|
-
let maxPriorityFeePerGas;
|
|
220
|
-
try {
|
|
221
|
-
const fees = await signer.estimateFeesPerGas?.();
|
|
222
|
-
if (!fees) {
|
|
223
|
-
throw new Error("no fee estimates available");
|
|
224
|
-
}
|
|
225
|
-
maxFeePerGas = fees.maxFeePerGas;
|
|
226
|
-
maxPriorityFeePerGas = fees.maxPriorityFeePerGas;
|
|
227
|
-
} catch {
|
|
228
|
-
maxFeePerGas = DEFAULT_MAX_FEE_PER_GAS;
|
|
229
|
-
maxPriorityFeePerGas = DEFAULT_MAX_PRIORITY_FEE_PER_GAS;
|
|
230
|
-
}
|
|
231
|
-
const signedTransaction = await signer.signTransaction({
|
|
232
|
-
to: tokenAddress,
|
|
233
|
-
data,
|
|
234
|
-
nonce,
|
|
235
|
-
gas: ERC20_APPROVE_GAS_LIMIT,
|
|
236
|
-
maxFeePerGas,
|
|
237
|
-
maxPriorityFeePerGas,
|
|
238
|
-
chainId
|
|
239
|
-
});
|
|
240
|
-
return {
|
|
241
|
-
from,
|
|
242
|
-
asset: tokenAddress,
|
|
243
|
-
spender,
|
|
244
|
-
amount: maxUint256.toString(),
|
|
245
|
-
signedTransaction,
|
|
246
|
-
version: ERC20_APPROVAL_GAS_SPONSORING_VERSION
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// src/exact/client/rpc.ts
|
|
251
|
-
import { createPublicClient, http } from "viem";
|
|
252
|
-
var rpcClientCache = /* @__PURE__ */ new Map();
|
|
253
|
-
function isConfigByChainId(options) {
|
|
254
|
-
const keys = Object.keys(options);
|
|
255
|
-
return keys.length > 0 && keys.every((key) => /^\d+$/.test(key));
|
|
256
|
-
}
|
|
257
|
-
function getRpcClient(rpcUrl) {
|
|
258
|
-
const existing = rpcClientCache.get(rpcUrl);
|
|
259
|
-
if (existing) {
|
|
260
|
-
return existing;
|
|
261
|
-
}
|
|
262
|
-
const client = createPublicClient({
|
|
263
|
-
transport: http(rpcUrl)
|
|
264
|
-
});
|
|
265
|
-
rpcClientCache.set(rpcUrl, client);
|
|
266
|
-
return client;
|
|
267
|
-
}
|
|
268
|
-
function resolveRpcUrl(network, options) {
|
|
269
|
-
if (!options) {
|
|
270
|
-
return void 0;
|
|
271
|
-
}
|
|
272
|
-
if (isConfigByChainId(options)) {
|
|
273
|
-
const chainId = getEvmChainId(network);
|
|
274
|
-
const optionsByChainId = options;
|
|
275
|
-
return optionsByChainId[chainId]?.rpcUrl;
|
|
276
|
-
}
|
|
277
|
-
return options.rpcUrl;
|
|
278
|
-
}
|
|
279
|
-
function resolveExtensionRpcCapabilities(network, signer, options) {
|
|
280
|
-
const capabilities = {
|
|
281
|
-
signTransaction: signer.signTransaction,
|
|
282
|
-
readContract: signer.readContract,
|
|
283
|
-
getTransactionCount: signer.getTransactionCount,
|
|
284
|
-
estimateFeesPerGas: signer.estimateFeesPerGas
|
|
285
|
-
};
|
|
286
|
-
const needsRpcBackfill = !capabilities.readContract || !capabilities.getTransactionCount || !capabilities.estimateFeesPerGas;
|
|
287
|
-
if (!needsRpcBackfill) {
|
|
288
|
-
return capabilities;
|
|
289
|
-
}
|
|
290
|
-
const rpcUrl = resolveRpcUrl(network, options);
|
|
291
|
-
if (!rpcUrl) {
|
|
292
|
-
return capabilities;
|
|
293
|
-
}
|
|
294
|
-
const rpcClient = getRpcClient(rpcUrl);
|
|
295
|
-
if (!capabilities.readContract) {
|
|
296
|
-
capabilities.readContract = (args) => rpcClient.readContract(args);
|
|
297
|
-
}
|
|
298
|
-
if (!capabilities.getTransactionCount) {
|
|
299
|
-
capabilities.getTransactionCount = async (args) => rpcClient.getTransactionCount({ address: args.address });
|
|
300
|
-
}
|
|
301
|
-
if (!capabilities.estimateFeesPerGas) {
|
|
302
|
-
capabilities.estimateFeesPerGas = async () => rpcClient.estimateFeesPerGas();
|
|
303
|
-
}
|
|
304
|
-
return capabilities;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
// src/exact/client/scheme.ts
|
|
308
|
-
var ExactEvmScheme = class {
|
|
309
|
-
/**
|
|
310
|
-
* Creates a new ExactEvmClient instance.
|
|
311
|
-
*
|
|
312
|
-
* @param signer - The EVM signer for client operations.
|
|
313
|
-
* Base flow only requires `address` + `signTypedData`.
|
|
314
|
-
* Extension enrichment (EIP-2612 / ERC-20 approval sponsoring) additionally
|
|
315
|
-
* requires optional capabilities like `readContract` and tx signing helpers.
|
|
316
|
-
* @param options - Optional RPC configuration used to backfill extension capabilities.
|
|
317
|
-
*/
|
|
318
|
-
constructor(signer, options) {
|
|
319
|
-
this.signer = signer;
|
|
320
|
-
this.options = options;
|
|
321
|
-
this.scheme = "exact";
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Creates a payment payload for the Exact scheme.
|
|
325
|
-
* Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.
|
|
326
|
-
*
|
|
327
|
-
* For Permit2 flows, if the server advertises `eip2612GasSponsoring` and the
|
|
328
|
-
* signer supports `readContract`, automatically signs an EIP-2612 permit
|
|
329
|
-
* when Permit2 allowance is insufficient.
|
|
330
|
-
*
|
|
331
|
-
* @param x402Version - The x402 protocol version
|
|
332
|
-
* @param paymentRequirements - The payment requirements
|
|
333
|
-
* @param context - Optional context with server-declared extensions
|
|
334
|
-
* @returns Promise resolving to a payment payload result (with optional extensions)
|
|
335
|
-
*/
|
|
336
|
-
async createPaymentPayload(x402Version, paymentRequirements, context) {
|
|
337
|
-
const assetTransferMethod = paymentRequirements.extra?.assetTransferMethod ?? "eip3009";
|
|
338
|
-
if (assetTransferMethod === "permit2") {
|
|
339
|
-
const result = await createPermit2Payload(this.signer, x402Version, paymentRequirements);
|
|
340
|
-
const eip2612Extensions = await this.trySignEip2612Permit(
|
|
341
|
-
paymentRequirements,
|
|
342
|
-
result,
|
|
343
|
-
context
|
|
344
|
-
);
|
|
345
|
-
if (eip2612Extensions) {
|
|
346
|
-
return {
|
|
347
|
-
...result,
|
|
348
|
-
extensions: eip2612Extensions
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
const erc20Extensions = await this.trySignErc20Approval(paymentRequirements, result, context);
|
|
352
|
-
if (erc20Extensions) {
|
|
353
|
-
return {
|
|
354
|
-
...result,
|
|
355
|
-
extensions: erc20Extensions
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
return result;
|
|
359
|
-
}
|
|
360
|
-
return createEIP3009Payload(this.signer, x402Version, paymentRequirements);
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* Attempts to sign an EIP-2612 permit for gasless Permit2 approval.
|
|
364
|
-
*
|
|
365
|
-
* Returns extension data if:
|
|
366
|
-
* 1. Server advertises eip2612GasSponsoring
|
|
367
|
-
* 2. Signer has readContract capability
|
|
368
|
-
* 3. Current Permit2 allowance is insufficient
|
|
369
|
-
*
|
|
370
|
-
* Returns undefined if the extension should not be used.
|
|
371
|
-
*
|
|
372
|
-
* @param requirements - The payment requirements from the server
|
|
373
|
-
* @param result - The payment payload result from the scheme
|
|
374
|
-
* @param context - Optional context containing server extensions and metadata
|
|
375
|
-
* @returns Extension data for EIP-2612 gas sponsoring, or undefined if not applicable
|
|
376
|
-
*/
|
|
377
|
-
async trySignEip2612Permit(requirements, result, context) {
|
|
378
|
-
const capabilities = resolveExtensionRpcCapabilities(
|
|
379
|
-
requirements.network,
|
|
380
|
-
this.signer,
|
|
381
|
-
this.options
|
|
382
|
-
);
|
|
383
|
-
if (!capabilities.readContract) {
|
|
384
|
-
return void 0;
|
|
385
|
-
}
|
|
386
|
-
if (!context?.extensions?.[EIP2612_GAS_SPONSORING_KEY]) {
|
|
387
|
-
return void 0;
|
|
388
|
-
}
|
|
389
|
-
const tokenName = requirements.extra?.name;
|
|
390
|
-
const tokenVersion = requirements.extra?.version;
|
|
391
|
-
if (!tokenName || !tokenVersion) {
|
|
392
|
-
return void 0;
|
|
393
|
-
}
|
|
394
|
-
const chainId = getEvmChainId(requirements.network);
|
|
395
|
-
const tokenAddress = getAddress5(requirements.asset);
|
|
396
|
-
try {
|
|
397
|
-
const allowance = await capabilities.readContract({
|
|
398
|
-
address: tokenAddress,
|
|
399
|
-
abi: erc20AllowanceAbi,
|
|
400
|
-
functionName: "allowance",
|
|
401
|
-
args: [this.signer.address, PERMIT2_ADDRESS]
|
|
402
|
-
});
|
|
403
|
-
if (allowance >= BigInt(requirements.amount)) {
|
|
404
|
-
return void 0;
|
|
405
|
-
}
|
|
406
|
-
} catch {
|
|
407
|
-
}
|
|
408
|
-
const permit2Auth = result.payload?.permit2Authorization;
|
|
409
|
-
const deadline = permit2Auth?.deadline ?? Math.floor(Date.now() / 1e3 + requirements.maxTimeoutSeconds).toString();
|
|
410
|
-
const info = await signEip2612Permit(
|
|
411
|
-
{
|
|
412
|
-
address: this.signer.address,
|
|
413
|
-
signTypedData: (msg) => this.signer.signTypedData(msg),
|
|
414
|
-
readContract: capabilities.readContract
|
|
415
|
-
},
|
|
416
|
-
tokenAddress,
|
|
417
|
-
tokenName,
|
|
418
|
-
tokenVersion,
|
|
419
|
-
chainId,
|
|
420
|
-
deadline,
|
|
421
|
-
requirements.amount
|
|
422
|
-
);
|
|
423
|
-
return {
|
|
424
|
-
[EIP2612_GAS_SPONSORING_KEY]: { info }
|
|
425
|
-
};
|
|
426
|
-
}
|
|
427
|
-
/**
|
|
428
|
-
* Attempts to sign an ERC-20 approval transaction for gasless Permit2 approval.
|
|
429
|
-
*
|
|
430
|
-
* This is the fallback path when the token does not support EIP-2612. The client
|
|
431
|
-
* signs (but does not broadcast) a raw `approve(Permit2, MaxUint256)` transaction.
|
|
432
|
-
* The facilitator broadcasts it atomically before settling.
|
|
433
|
-
*
|
|
434
|
-
* Returns extension data if:
|
|
435
|
-
* 1. Server advertises erc20ApprovalGasSponsoring
|
|
436
|
-
* 2. Signer has signTransaction + getTransactionCount capabilities
|
|
437
|
-
* 3. Current Permit2 allowance is insufficient
|
|
438
|
-
*
|
|
439
|
-
* Returns undefined if the extension should not be used.
|
|
440
|
-
*
|
|
441
|
-
* @param requirements - The payment requirements from the server
|
|
442
|
-
* @param _result - The payment payload result from the scheme (unused)
|
|
443
|
-
* @param context - Optional context containing server extensions and metadata
|
|
444
|
-
* @returns Extension data for ERC-20 approval gas sponsoring, or undefined if not applicable
|
|
445
|
-
*/
|
|
446
|
-
async trySignErc20Approval(requirements, _result, context) {
|
|
447
|
-
const capabilities = resolveExtensionRpcCapabilities(
|
|
448
|
-
requirements.network,
|
|
449
|
-
this.signer,
|
|
450
|
-
this.options
|
|
451
|
-
);
|
|
452
|
-
if (!capabilities.readContract) {
|
|
453
|
-
return void 0;
|
|
454
|
-
}
|
|
455
|
-
if (!context?.extensions?.[ERC20_APPROVAL_GAS_SPONSORING_KEY]) {
|
|
456
|
-
return void 0;
|
|
457
|
-
}
|
|
458
|
-
if (!capabilities.signTransaction || !capabilities.getTransactionCount) {
|
|
459
|
-
return void 0;
|
|
460
|
-
}
|
|
461
|
-
const chainId = getEvmChainId(requirements.network);
|
|
462
|
-
const tokenAddress = getAddress5(requirements.asset);
|
|
463
|
-
try {
|
|
464
|
-
const allowance = await capabilities.readContract({
|
|
465
|
-
address: tokenAddress,
|
|
466
|
-
abi: erc20AllowanceAbi,
|
|
467
|
-
functionName: "allowance",
|
|
468
|
-
args: [this.signer.address, PERMIT2_ADDRESS]
|
|
469
|
-
});
|
|
470
|
-
if (allowance >= BigInt(requirements.amount)) {
|
|
471
|
-
return void 0;
|
|
472
|
-
}
|
|
473
|
-
} catch {
|
|
474
|
-
}
|
|
475
|
-
const info = await signErc20ApprovalTransaction(
|
|
476
|
-
{
|
|
477
|
-
address: this.signer.address,
|
|
478
|
-
signTransaction: capabilities.signTransaction,
|
|
479
|
-
getTransactionCount: capabilities.getTransactionCount,
|
|
480
|
-
estimateFeesPerGas: capabilities.estimateFeesPerGas
|
|
481
|
-
},
|
|
482
|
-
tokenAddress,
|
|
483
|
-
chainId
|
|
484
|
-
);
|
|
485
|
-
return {
|
|
486
|
-
[ERC20_APPROVAL_GAS_SPONSORING_KEY]: { info }
|
|
487
|
-
};
|
|
488
|
-
}
|
|
489
|
-
};
|
|
490
|
-
|
|
491
|
-
// src/exact/client/register.ts
|
|
492
|
-
function registerExactEvmScheme(client, config) {
|
|
493
|
-
const evmScheme = new ExactEvmScheme(config.signer, config.schemeOptions);
|
|
494
|
-
if (config.networks && config.networks.length > 0) {
|
|
495
|
-
config.networks.forEach((network) => {
|
|
496
|
-
client.register(network, evmScheme);
|
|
497
|
-
});
|
|
498
|
-
} else {
|
|
499
|
-
client.register("eip155:*", evmScheme);
|
|
500
|
-
}
|
|
501
|
-
NETWORKS.forEach((network) => {
|
|
502
|
-
client.registerV1(network, new ExactEvmSchemeV1(config.signer));
|
|
503
|
-
});
|
|
504
|
-
if (config.policies) {
|
|
505
|
-
config.policies.forEach((policy) => {
|
|
506
|
-
client.registerPolicy(policy);
|
|
507
|
-
});
|
|
508
|
-
}
|
|
509
|
-
return client;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
export {
|
|
513
|
-
createPermit2ApprovalTx,
|
|
514
|
-
getPermit2AllowanceReadParams,
|
|
515
|
-
ExactEvmScheme,
|
|
516
|
-
registerExactEvmScheme
|
|
517
|
-
};
|
|
518
|
-
//# sourceMappingURL=chunk-WJWNS4G4.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/exact/client/scheme.ts","../../src/exact/client/eip3009.ts","../../src/exact/client/permit2.ts","../../src/exact/client/eip2612.ts","../../src/exact/client/erc20approval.ts","../../src/exact/client/rpc.ts","../../src/exact/client/register.ts"],"sourcesContent":["import {\n SchemeNetworkClient,\n PaymentRequirements,\n PaymentPayloadResult,\n PaymentPayloadContext,\n} from \"@payai/x402/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { AssetTransferMethod } from \"../../types\";\nimport { PERMIT2_ADDRESS, erc20AllowanceAbi } from \"../../constants\";\nimport { getAddress } from \"viem\";\nimport { getEvmChainId } from \"../../utils\";\nimport { EIP2612_GAS_SPONSORING_KEY, ERC20_APPROVAL_GAS_SPONSORING_KEY } from \"../extensions\";\nimport { createEIP3009Payload } from \"./eip3009\";\nimport { createPermit2Payload } from \"./permit2\";\nimport { signEip2612Permit } from \"./eip2612\";\nimport { signErc20ApprovalTransaction } from \"./erc20approval\";\nimport { ExactEvmSchemeOptions, resolveExtensionRpcCapabilities } from \"./rpc\";\n\n/**\n * EVM client implementation for the Exact payment scheme.\n * Supports both EIP-3009 (transferWithAuthorization) and Permit2 flows.\n *\n * Routes to the appropriate authorization method based on\n * `requirements.extra.assetTransferMethod`. Defaults to EIP-3009\n * for backward compatibility with older facilitators.\n *\n * When the server advertises `eip2612GasSponsoring` and the asset transfer\n * method is `permit2`, the scheme automatically signs an EIP-2612 permit\n * if the user lacks Permit2 approval. This requires `readContract` on the signer.\n */\nexport class ExactEvmScheme implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactEvmClient instance.\n *\n * @param signer - The EVM signer for client operations.\n * Base flow only requires `address` + `signTypedData`.\n * Extension enrichment (EIP-2612 / ERC-20 approval sponsoring) additionally\n * requires optional capabilities like `readContract` and tx signing helpers.\n * @param options - Optional RPC configuration used to backfill extension capabilities.\n */\n constructor(\n private readonly signer: ClientEvmSigner,\n private readonly options?: ExactEvmSchemeOptions,\n ) {}\n\n /**\n * Creates a payment payload for the Exact scheme.\n * Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.\n *\n * For Permit2 flows, if the server advertises `eip2612GasSponsoring` and the\n * signer supports `readContract`, automatically signs an EIP-2612 permit\n * when Permit2 allowance is insufficient.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @param context - Optional context with server-declared extensions\n * @returns Promise resolving to a payment payload result (with optional extensions)\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n context?: PaymentPayloadContext,\n ): Promise<PaymentPayloadResult> {\n const assetTransferMethod =\n (paymentRequirements.extra?.assetTransferMethod as AssetTransferMethod) ?? \"eip3009\";\n\n if (assetTransferMethod === \"permit2\") {\n const result = await createPermit2Payload(this.signer, x402Version, paymentRequirements);\n\n const eip2612Extensions = await this.trySignEip2612Permit(\n paymentRequirements,\n result,\n context,\n );\n\n if (eip2612Extensions) {\n return {\n ...result,\n extensions: eip2612Extensions,\n };\n }\n\n const erc20Extensions = await this.trySignErc20Approval(paymentRequirements, result, context);\n if (erc20Extensions) {\n return {\n ...result,\n extensions: erc20Extensions,\n };\n }\n\n return result;\n }\n\n return createEIP3009Payload(this.signer, x402Version, paymentRequirements);\n }\n\n /**\n * Attempts to sign an EIP-2612 permit for gasless Permit2 approval.\n *\n * Returns extension data if:\n * 1. Server advertises eip2612GasSponsoring\n * 2. Signer has readContract capability\n * 3. Current Permit2 allowance is insufficient\n *\n * Returns undefined if the extension should not be used.\n *\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 */\n private async trySignEip2612Permit(\n requirements: PaymentRequirements,\n result: PaymentPayloadResult,\n context?: PaymentPayloadContext,\n ): Promise<Record<string, unknown> | undefined> {\n const capabilities = resolveExtensionRpcCapabilities(\n requirements.network,\n this.signer,\n this.options,\n );\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: [this.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: this.signer.address,\n signTypedData: msg => this.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 * This is the fallback path when the token does not support EIP-2612. The client\n * signs (but does not broadcast) a raw `approve(Permit2, MaxUint256)` transaction.\n * The facilitator broadcasts it atomically before settling.\n *\n * Returns extension data if:\n * 1. Server advertises erc20ApprovalGasSponsoring\n * 2. Signer has signTransaction + getTransactionCount capabilities\n * 3. Current Permit2 allowance is insufficient\n *\n * Returns undefined if the extension should not be used.\n *\n * @param requirements - The payment requirements from the server\n * @param _result - The payment payload result from the scheme (unused)\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 */\n private async trySignErc20Approval(\n requirements: PaymentRequirements,\n _result: PaymentPayloadResult,\n context?: PaymentPayloadContext,\n ): Promise<Record<string, unknown> | undefined> {\n const capabilities = resolveExtensionRpcCapabilities(\n requirements.network,\n this.signer,\n this.options,\n );\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: [this.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: this.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}\n","import { PaymentRequirements, PaymentPayloadResult } from \"@payai/x402/types\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport { createNonce, getEvmChainId } from \"../../utils\";\n\n/**\n * Creates an EIP-3009 (transferWithAuthorization) payload.\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 createEIP3009Payload(\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise<PaymentPayloadResult> {\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization: ExactEIP3009Payload[\"authorization\"] = {\n from: signer.address,\n to: getAddress(paymentRequirements.payTo),\n value: paymentRequirements.amount,\n validAfter: (now - 600).toString(),\n validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);\n\n const payload: ExactEIP3009Payload = {\n authorization,\n signature,\n };\n\n return {\n x402Version,\n payload,\n };\n}\n\n/**\n * Sign the EIP-3009 authorization using EIP-712.\n *\n * @param signer - The EVM signer\n * @param authorization - The authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\nasync function signEIP3009Authorization(\n signer: ClientEvmSigner,\n authorization: ExactEIP3009Payload[\"authorization\"],\n requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n const chainId = getEvmChainId(requirements.network);\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`,\n );\n }\n\n const { name, version } = requirements.extra;\n\n const domain = {\n name,\n version,\n chainId,\n verifyingContract: getAddress(requirements.asset),\n };\n\n const message = {\n from: getAddress(authorization.from),\n to: getAddress(authorization.to),\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n };\n\n return await signer.signTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n}\n","import { PaymentRequirements, PaymentPayloadResult } from \"@payai/x402/types\";\nimport { encodeFunctionData, getAddress } from \"viem\";\nimport {\n permit2WitnessTypes,\n PERMIT2_ADDRESS,\n x402ExactPermit2ProxyAddress,\n erc20ApproveAbi,\n erc20AllowanceAbi,\n} from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactPermit2Payload } from \"../../types\";\nimport { createPermit2Nonce, getEvmChainId } from \"../../utils\";\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 const now = Math.floor(Date.now() / 1000);\n const nonce = createPermit2Nonce();\n\n // Lower time bound - allow some clock skew\n const validAfter = (now - 600).toString();\n // Upper time bound is enforced by Permit2's deadline field\n const deadline = (now + paymentRequirements.maxTimeoutSeconds).toString();\n\n const permit2Authorization: ExactPermit2Payload[\"permit2Authorization\"] = {\n from: signer.address,\n permitted: {\n token: getAddress(paymentRequirements.asset),\n amount: paymentRequirements.amount,\n },\n spender: x402ExactPermit2ProxyAddress,\n nonce,\n deadline,\n witness: {\n to: getAddress(paymentRequirements.payTo),\n validAfter,\n },\n };\n\n const signature = await signPermit2Authorization(\n signer,\n permit2Authorization,\n paymentRequirements,\n );\n\n const payload: ExactPermit2Payload = {\n signature,\n permit2Authorization,\n };\n\n return {\n x402Version,\n payload,\n };\n}\n\n/**\n * Sign the Permit2 authorization using EIP-712 with witness data.\n * The signature authorizes the x402Permit2Proxy to transfer tokens on behalf of the signer.\n *\n * @param signer - The EVM signer\n * @param permit2Authorization - The Permit2 authorization parameters\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\nasync function signPermit2Authorization(\n signer: ClientEvmSigner,\n permit2Authorization: ExactPermit2Payload[\"permit2Authorization\"],\n requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n const chainId = getEvmChainId(requirements.network);\n\n const domain = {\n name: \"Permit2\",\n chainId,\n verifyingContract: PERMIT2_ADDRESS,\n };\n\n const message = {\n permitted: {\n token: getAddress(permit2Authorization.permitted.token),\n amount: BigInt(permit2Authorization.permitted.amount),\n },\n spender: getAddress(permit2Authorization.spender),\n nonce: BigInt(permit2Authorization.nonce),\n deadline: BigInt(permit2Authorization.deadline),\n witness: {\n to: getAddress(permit2Authorization.witness.to),\n validAfter: BigInt(permit2Authorization.witness.validAfter),\n },\n };\n\n return await signer.signTypedData({\n domain,\n types: permit2WitnessTypes,\n primaryType: \"PermitWitnessTransferFrom\",\n message,\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 { 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 ExactEvmSchemeConfig = {\n rpcUrl?: string;\n};\n\nexport type ExactEvmSchemeConfigByChainId = Record<number, ExactEvmSchemeConfig>;\n\nexport type ExactEvmSchemeOptions = ExactEvmSchemeConfig | ExactEvmSchemeConfigByChainId;\n\ntype ExtensionRpcCapabilities = Pick<\n ClientEvmSigner,\n \"readContract\" | \"signTransaction\" | \"getTransactionCount\" | \"estimateFeesPerGas\"\n>;\n\nconst rpcClientCache = new Map<string, ReturnType<typeof createPublicClient>>();\n\n/**\n * Determines whether scheme options are keyed by numeric chain id.\n *\n * @param options - Exact EVM scheme options provided by the client.\n * @returns True when options are a chainId-to-config mapping.\n */\nfunction isConfigByChainId(\n options: ExactEvmSchemeOptions,\n): options is ExactEvmSchemeConfigByChainId {\n const keys = Object.keys(options);\n return keys.length > 0 && keys.every(key => /^\\d+$/.test(key));\n}\n\n/**\n * Returns a cached viem public client for a specific RPC URL.\n *\n * @param rpcUrl - The RPC endpoint URL used to construct the client.\n * @returns A cached or newly created viem public client 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 * Resolves the RPC URL for a given CAIP-2 network from scheme options.\n *\n * @param network - CAIP-2 network identifier.\n * @param options - Optional scheme configuration (single config or chain map).\n * @returns The configured RPC URL for the network, if available.\n */\nexport function resolveRpcUrl(\n network: string,\n options?: ExactEvmSchemeOptions,\n): string | undefined {\n if (!options) {\n return undefined;\n }\n\n if (isConfigByChainId(options)) {\n const chainId = getEvmChainId(network);\n const optionsByChainId = options as ExactEvmSchemeConfigByChainId;\n return optionsByChainId[chainId]?.rpcUrl;\n }\n\n return (options as ExactEvmSchemeConfig).rpcUrl;\n}\n\n/**\n * Resolves extension RPC capabilities from signer methods and optional RPC backfill.\n *\n * @param network - CAIP-2 network identifier for chain resolution.\n * @param signer - Client signer with optional RPC-like methods.\n * @param options - Optional scheme configuration used for RPC backfill.\n * @returns The best available capability set for extension enrichment flows.\n */\nexport function resolveExtensionRpcCapabilities(\n network: string,\n signer: ClientEvmSigner,\n options?: ExactEvmSchemeOptions,\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","import { x402Client, SelectPaymentRequirements, PaymentPolicy } from \"@payai/x402/client\";\nimport { Network } from \"@payai/x402/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEvmScheme } from \"./scheme\";\nimport { ExactEvmSchemeOptions } from \"./rpc\";\nimport { ExactEvmSchemeV1 } from \"../v1/client/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering EVM schemes to an x402Client\n */\nexport interface EvmClientConfig {\n /**\n * The EVM signer to use for creating payment payloads\n */\n signer: ClientEvmSigner;\n\n /**\n * Optional payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Optional Exact EVM client scheme options.\n * Supports either a single config ({ rpcUrl }) or per-chain configs\n * keyed by EVM chain ID ({ 8453: { rpcUrl: \"...\" } }).\n */\n schemeOptions?: ExactEvmSchemeOptions;\n\n /**\n * Optional specific networks to register.\n * If not provided, registers wildcard support (eip155:*).\n */\n networks?: Network[];\n}\n\n/**\n * Registers EVM exact payment schemes to an x402Client instance.\n *\n * This function registers:\n * - V2: eip155:* wildcard scheme with ExactEvmScheme (or specific networks if provided)\n * - V1: All supported EVM networks with ExactEvmSchemeV1\n *\n * @param client - The x402Client instance to register schemes to\n * @param config - Configuration for EVM client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactEvmScheme } from \"@payai/x402-evm/exact/client/register\";\n * import { x402Client } from \"@payai/x402/client\";\n * import { privateKeyToAccount } from \"viem/accounts\";\n *\n * const account = privateKeyToAccount(\"0x...\");\n * const client = new x402Client();\n * registerExactEvmScheme(client, { signer: account });\n * ```\n */\nexport function registerExactEvmScheme(client: x402Client, config: EvmClientConfig): x402Client {\n const evmScheme = new ExactEvmScheme(config.signer, config.schemeOptions);\n\n // Register V2 scheme\n // EIP-2612 gas sponsoring is handled internally by the scheme when the\n // server advertises support - no separate extension registration needed.\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach(network => {\n client.register(network, evmScheme);\n });\n } else {\n // Register wildcard for all EVM chains\n client.register(\"eip155:*\", evmScheme);\n }\n\n // Register all V1 networks\n NETWORKS.forEach(network => {\n client.registerV1(network as Network, new ExactEvmSchemeV1(config.signer));\n });\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach(policy => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AASA,SAAS,cAAAA,mBAAkB;;;ACR3B,SAAS,kBAAkB;AAc3B,eAAsB,qBACpB,QACA,aACA,qBAC+B;AAC/B,QAAM,QAAQ,YAAY;AAC1B,QAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAExC,QAAM,gBAAsD;AAAA,IAC1D,MAAM,OAAO;AAAA,IACb,IAAI,WAAW,oBAAoB,KAAK;AAAA,IACxC,OAAO,oBAAoB;AAAA,IAC3B,aAAa,MAAM,KAAK,SAAS;AAAA,IACjC,cAAc,MAAM,oBAAoB,mBAAmB,SAAS;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,yBAAyB,QAAQ,eAAe,mBAAmB;AAE3F,QAAM,UAA+B;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAUA,eAAe,yBACb,QACA,eACA,cACwB;AACxB,QAAM,UAAU,cAAc,aAAa,OAAO;AAElD,MAAI,CAAC,aAAa,OAAO,QAAQ,CAAC,aAAa,OAAO,SAAS;AAC7D,UAAM,IAAI;AAAA,MACR,4FAA4F,aAAa,KAAK;AAAA,IAChH;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,QAAQ,IAAI,aAAa;AAEvC,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,WAAW,aAAa,KAAK;AAAA,EAClD;AAEA,QAAM,UAAU;AAAA,IACd,MAAM,WAAW,cAAc,IAAI;AAAA,IACnC,IAAI,WAAW,cAAc,EAAE;AAAA,IAC/B,OAAO,OAAO,cAAc,KAAK;AAAA,IACjC,YAAY,OAAO,cAAc,UAAU;AAAA,IAC3C,aAAa,OAAO,cAAc,WAAW;AAAA,IAC7C,OAAO,cAAc;AAAA,EACvB;AAEA,SAAO,MAAM,OAAO,cAAc;AAAA,IAChC;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACH;;;ACzFA,SAAS,oBAAoB,cAAAC,mBAAkB;AAa/C,IAAM,cAAc,OAAO,oEAAoE;AAY/F,eAAsB,qBACpB,QACA,aACA,qBAC+B;AAC/B,QAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,QAAM,QAAQ,mBAAmB;AAGjC,QAAM,cAAc,MAAM,KAAK,SAAS;AAExC,QAAM,YAAY,MAAM,oBAAoB,mBAAmB,SAAS;AAExE,QAAM,uBAAoE;AAAA,IACxE,MAAM,OAAO;AAAA,IACb,WAAW;AAAA,MACT,OAAOC,YAAW,oBAAoB,KAAK;AAAA,MAC3C,QAAQ,oBAAoB;AAAA,IAC9B;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,IAAIA,YAAW,oBAAoB,KAAK;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAA+B;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAWA,eAAe,yBACb,QACA,sBACA,cACwB;AACxB,QAAM,UAAU,cAAc,aAAa,OAAO;AAElD,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN;AAAA,IACA,mBAAmB;AAAA,EACrB;AAEA,QAAM,UAAU;AAAA,IACd,WAAW;AAAA,MACT,OAAOA,YAAW,qBAAqB,UAAU,KAAK;AAAA,MACtD,QAAQ,OAAO,qBAAqB,UAAU,MAAM;AAAA,IACtD;AAAA,IACA,SAASA,YAAW,qBAAqB,OAAO;AAAA,IAChD,OAAO,OAAO,qBAAqB,KAAK;AAAA,IACxC,UAAU,OAAO,qBAAqB,QAAQ;AAAA,IAC9C,SAAS;AAAA,MACP,IAAIA,YAAW,qBAAqB,QAAQ,EAAE;AAAA,MAC9C,YAAY,OAAO,qBAAqB,QAAQ,UAAU;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO,MAAM,OAAO,cAAc;AAAA,IAChC;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACH;AAkBO,SAAS,wBAAwB,cAGtC;AACA,QAAM,OAAO,mBAAmB;AAAA,IAC9B,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,iBAAiB,WAAW;AAAA,EACrC,CAAC;AAED,SAAO;AAAA,IACL,IAAIA,YAAW,YAAY;AAAA,IAC3B;AAAA,EACF;AACF;AA6BO,SAAS,8BAA8B,QAK5C;AACA,SAAO;AAAA,IACL,SAASA,YAAW,OAAO,YAAY;AAAA,IACvC,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAACA,YAAW,OAAO,YAAY,GAAG,eAAe;AAAA,EACzD;AACF;;;AC1LA,SAAS,cAAAC,mBAAkB;AA2B3B,eAAsB,kBACpB,QACA,cACA,WACA,cACA,SACA,UACA,iBACmC;AACnC,QAAM,QAAQ,OAAO;AACrB,QAAM,UAAUC,YAAW,eAAe;AAG1C,QAAM,QAAS,MAAM,OAAO,aAAa;AAAA,IACvC,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,KAAK;AAAA,EACd,CAAC;AAGD,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA,mBAAmB;AAAA,EACrB;AAEA,QAAM,iBAAiB,OAAO,eAAe;AAE7C,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,UAAU,OAAO,QAAQ;AAAA,EAC3B;AAGA,QAAM,YAAY,MAAM,OAAO,cAAc;AAAA,IAC3C;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA,QAAQ,eAAe,SAAS;AAAA,IAChC,OAAO,MAAM,SAAS;AAAA,IACtB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;ACnFA,SAAS,sBAAAC,qBAAoB,cAAAC,aAAY,kBAAkB;AAkC3D,eAAsB,6BACpB,QACA,cACA,SACyC;AACzC,QAAM,OAAO,OAAO;AACpB,QAAM,UAAUC,YAAW,eAAe;AAG1C,QAAM,OAAOC,oBAAmB;AAAA,IAC9B,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,SAAS,UAAU;AAAA,EAC5B,CAAC;AAGD,QAAM,QAAQ,MAAM,OAAO,oBAAoB,EAAE,SAAS,KAAK,CAAC;AAGhE,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,qBAAqB;AAC/C,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,mBAAe,KAAK;AACpB,2BAAuB,KAAK;AAAA,EAC9B,QAAQ;AACN,mBAAe;AACf,2BAAuB;AAAA,EACzB;AAGA,QAAM,oBAAoB,MAAM,OAAO,gBAAgB;AAAA,IACrD,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,QAAQ,WAAW,SAAS;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;ACtFA,SAAS,oBAAoB,YAAY;AAiBzC,IAAM,iBAAiB,oBAAI,IAAmD;AAQ9E,SAAS,kBACP,SAC0C;AAC1C,QAAM,OAAO,OAAO,KAAK,OAAO;AAChC,SAAO,KAAK,SAAS,KAAK,KAAK,MAAM,SAAO,QAAQ,KAAK,GAAG,CAAC;AAC/D;AAQA,SAAS,aAAa,QAAuD;AAC3E,QAAM,WAAW,eAAe,IAAI,MAAM;AAC1C,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,mBAAmB;AAAA,IAChC,WAAW,KAAK,MAAM;AAAA,EACxB,CAAC;AACD,iBAAe,IAAI,QAAQ,MAAM;AACjC,SAAO;AACT;AASO,SAAS,cACd,SACA,SACoB;AACpB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,kBAAkB,OAAO,GAAG;AAC9B,UAAM,UAAU,cAAc,OAAO;AACrC,UAAM,mBAAmB;AACzB,WAAO,iBAAiB,OAAO,GAAG;AAAA,EACpC;AAEA,SAAQ,QAAiC;AAC3C;AAUO,SAAS,gCACd,SACA,QACA,SAC0B;AAC1B,QAAM,eAAyC;AAAA,IAC7C,iBAAiB,OAAO;AAAA,IACxB,cAAc,OAAO;AAAA,IACrB,qBAAqB,OAAO;AAAA,IAC5B,oBAAoB,OAAO;AAAA,EAC7B;AAEA,QAAM,mBACJ,CAAC,aAAa,gBACd,CAAC,aAAa,uBACd,CAAC,aAAa;AAChB,MAAI,CAAC,kBAAkB;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,cAAc,SAAS,OAAO;AAC7C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,QAAM,YAAY,aAAa,MAAM;AACrC,MAAI,CAAC,aAAa,cAAc;AAC9B,iBAAa,eAAe,UAAQ,UAAU,aAAa,IAAa;AAAA,EAC1E;AACA,MAAI,CAAC,aAAa,qBAAqB;AACrC,iBAAa,sBAAsB,OAAM,SACvC,UAAU,oBAAoB,EAAE,SAAS,KAAK,QAAQ,CAAC;AAAA,EAC3D;AACA,MAAI,CAAC,aAAa,oBAAoB;AACpC,iBAAa,qBAAqB,YAAY,UAAU,mBAAmB;AAAA,EAC7E;AAEA,SAAO;AACT;;;AL1FO,IAAM,iBAAN,MAAoD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYzD,YACmB,QACA,SACjB;AAFiB;AACA;AAbnB,SAAS,SAAS;AAAA,EAcf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeH,MAAM,qBACJ,aACA,qBACA,SAC+B;AAC/B,UAAM,sBACH,oBAAoB,OAAO,uBAA+C;AAE7E,QAAI,wBAAwB,WAAW;AACrC,YAAM,SAAS,MAAM,qBAAqB,KAAK,QAAQ,aAAa,mBAAmB;AAEvF,YAAM,oBAAoB,MAAM,KAAK;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,mBAAmB;AACrB,eAAO;AAAA,UACL,GAAG;AAAA,UACH,YAAY;AAAA,QACd;AAAA,MACF;AAEA,YAAM,kBAAkB,MAAM,KAAK,qBAAqB,qBAAqB,QAAQ,OAAO;AAC5F,UAAI,iBAAiB;AACnB,eAAO;AAAA,UACL,GAAG;AAAA,UACH,YAAY;AAAA,QACd;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,WAAO,qBAAqB,KAAK,QAAQ,aAAa,mBAAmB;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAc,qBACZ,cACA,QACA,SAC8C;AAC9C,UAAM,eAAe;AAAA,MACnB,aAAa;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,QAAI,CAAC,aAAa,cAAc;AAC9B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,aAAa,0BAA0B,GAAG;AACtD,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,aAAa,OAAO;AACtC,UAAM,eAAe,aAAa,OAAO;AACzC,QAAI,CAAC,aAAa,CAAC,cAAc;AAC/B,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,cAAc,aAAa,OAAO;AAClD,UAAM,eAAeC,YAAW,aAAa,KAAK;AAElD,QAAI;AACF,YAAM,YAAa,MAAM,aAAa,aAAa;AAAA,QACjD,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,KAAK,OAAO,SAAS,eAAe;AAAA,MAC7C,CAAC;AAED,UAAI,aAAa,OAAO,aAAa,MAAM,GAAG;AAC5C,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,WACH,aAAa,YACd,KAAK,MAAM,KAAK,IAAI,IAAI,MAAO,aAAa,iBAAiB,EAAE,SAAS;AAE1E,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,QACE,SAAS,KAAK,OAAO;AAAA,QACrB,eAAe,SAAO,KAAK,OAAO,cAAc,GAAG;AAAA,QACnD,cAAc,aAAa;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AAEA,WAAO;AAAA,MACL,CAAC,0BAA0B,GAAG,EAAE,KAAK;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAc,qBACZ,cACA,SACA,SAC8C;AAC9C,UAAM,eAAe;AAAA,MACnB,aAAa;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,QAAI,CAAC,aAAa,cAAc;AAC9B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,aAAa,iCAAiC,GAAG;AAC7D,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,aAAa,mBAAmB,CAAC,aAAa,qBAAqB;AACtE,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,cAAc,aAAa,OAAO;AAClD,UAAM,eAAeA,YAAW,aAAa,KAAK;AAElD,QAAI;AACF,YAAM,YAAa,MAAM,aAAa,aAAa;AAAA,QACjD,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,KAAK,OAAO,SAAS,eAAe;AAAA,MAC7C,CAAC;AAED,UAAI,aAAa,OAAO,aAAa,MAAM,GAAG;AAC5C,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,QACE,SAAS,KAAK,OAAO;AAAA,QACrB,iBAAiB,aAAa;AAAA,QAC9B,qBAAqB,aAAa;AAAA,QAClC,oBAAoB,aAAa;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,CAAC,iCAAiC,GAAG,EAAE,KAAK;AAAA,IAC9C;AAAA,EACF;AACF;;;AM/LO,SAAS,uBAAuB,QAAoB,QAAqC;AAC9F,QAAM,YAAY,IAAI,eAAe,OAAO,QAAQ,OAAO,aAAa;AAKxE,MAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AAEjD,WAAO,SAAS,QAAQ,aAAW;AACjC,aAAO,SAAS,SAAS,SAAS;AAAA,IACpC,CAAC;AAAA,EACH,OAAO;AAEL,WAAO,SAAS,YAAY,SAAS;AAAA,EACvC;AAGA,WAAS,QAAQ,aAAW;AAC1B,WAAO,WAAW,SAAoB,IAAI,iBAAiB,OAAO,MAAM,CAAC;AAAA,EAC3E,CAAC;AAGD,MAAI,OAAO,UAAU;AACnB,WAAO,SAAS,QAAQ,YAAU;AAChC,aAAO,eAAe,MAAM;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;","names":["getAddress","getAddress","getAddress","getAddress","getAddress","encodeFunctionData","getAddress","getAddress","encodeFunctionData","getAddress"]}
|