@payai/x402-evm 2.3.6 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/cjs/exact/client/index.d.ts +3 -2
  2. package/dist/cjs/exact/client/index.js +173 -194
  3. package/dist/cjs/exact/client/index.js.map +1 -1
  4. package/dist/cjs/exact/facilitator/index.js +199 -185
  5. package/dist/cjs/exact/facilitator/index.js.map +1 -1
  6. package/dist/cjs/exact/server/index.d.ts +18 -17
  7. package/dist/cjs/exact/server/index.js +100 -55
  8. package/dist/cjs/exact/server/index.js.map +1 -1
  9. package/dist/cjs/exact/v1/client/index.js +3 -1
  10. package/dist/cjs/exact/v1/client/index.js.map +1 -1
  11. package/dist/cjs/exact/v1/facilitator/index.js +3 -1
  12. package/dist/cjs/exact/v1/facilitator/index.js.map +1 -1
  13. package/dist/cjs/index.d.ts +38 -2
  14. package/dist/cjs/index.js +441 -191
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/{permit2-U9Zolx3O.d.ts → permit2-CyZxwngN.d.ts} +278 -87
  17. package/dist/cjs/scheme-CXDF0D2A.d.ts +47 -0
  18. package/dist/cjs/upto/client/index.d.ts +32 -0
  19. package/dist/cjs/upto/client/index.js +507 -0
  20. package/dist/cjs/upto/client/index.js.map +1 -0
  21. package/dist/cjs/upto/facilitator/index.d.ts +52 -0
  22. package/dist/cjs/upto/facilitator/index.js +1233 -0
  23. package/dist/cjs/upto/facilitator/index.js.map +1 -0
  24. package/dist/cjs/upto/server/index.d.ts +77 -0
  25. package/dist/cjs/upto/server/index.js +246 -0
  26. package/dist/cjs/upto/server/index.js.map +1 -0
  27. package/dist/cjs/v1/index.d.ts +2 -0
  28. package/dist/cjs/v1/index.js +3 -1
  29. package/dist/cjs/v1/index.js.map +1 -1
  30. package/dist/esm/chunk-C4ZQMS77.mjs +629 -0
  31. package/dist/esm/chunk-C4ZQMS77.mjs.map +1 -0
  32. package/dist/esm/chunk-CRT6YNY5.mjs +529 -0
  33. package/dist/esm/chunk-CRT6YNY5.mjs.map +1 -0
  34. package/dist/esm/chunk-D6RXZXOS.mjs +158 -0
  35. package/dist/esm/chunk-D6RXZXOS.mjs.map +1 -0
  36. package/dist/esm/chunk-GJ57SZGI.mjs +121 -0
  37. package/dist/esm/chunk-GJ57SZGI.mjs.map +1 -0
  38. package/dist/esm/chunk-JII456TS.mjs +34 -0
  39. package/dist/esm/chunk-JII456TS.mjs.map +1 -0
  40. package/dist/esm/chunk-NSFLAANF.mjs +80 -0
  41. package/dist/esm/chunk-NSFLAANF.mjs.map +1 -0
  42. package/dist/esm/{chunk-PCJKIY5G.mjs → chunk-RYT6M3PA.mjs} +29 -501
  43. package/dist/esm/chunk-RYT6M3PA.mjs.map +1 -0
  44. package/dist/esm/chunk-WKBC5YMI.mjs +291 -0
  45. package/dist/esm/chunk-WKBC5YMI.mjs.map +1 -0
  46. package/dist/esm/exact/client/index.d.mts +3 -2
  47. package/dist/esm/exact/client/index.mjs +8 -5
  48. package/dist/esm/exact/facilitator/index.mjs +84 -430
  49. package/dist/esm/exact/facilitator/index.mjs.map +1 -1
  50. package/dist/esm/exact/server/index.d.mts +18 -17
  51. package/dist/esm/exact/server/index.mjs +28 -55
  52. package/dist/esm/exact/server/index.mjs.map +1 -1
  53. package/dist/esm/exact/v1/client/index.mjs +2 -1
  54. package/dist/esm/exact/v1/facilitator/index.mjs +2 -1
  55. package/dist/esm/index.d.mts +38 -2
  56. package/dist/esm/index.mjs +21 -8
  57. package/dist/esm/index.mjs.map +1 -1
  58. package/dist/esm/{permit2-Bbh3a8_h.d.mts → permit2-CyZxwngN.d.mts} +278 -87
  59. package/dist/esm/scheme-DCR7hsa3.d.mts +47 -0
  60. package/dist/esm/upto/client/index.d.mts +32 -0
  61. package/dist/esm/upto/client/index.mjs +18 -0
  62. package/dist/esm/upto/client/index.mjs.map +1 -0
  63. package/dist/esm/upto/facilitator/index.d.mts +52 -0
  64. package/dist/esm/upto/facilitator/index.mjs +473 -0
  65. package/dist/esm/upto/facilitator/index.mjs.map +1 -0
  66. package/dist/esm/upto/server/index.d.mts +77 -0
  67. package/dist/esm/upto/server/index.mjs +145 -0
  68. package/dist/esm/upto/server/index.mjs.map +1 -0
  69. package/dist/esm/v1/index.d.mts +2 -0
  70. package/dist/esm/v1/index.mjs +2 -1
  71. package/package.json +31 -1
  72. package/dist/esm/chunk-GD4MKCN7.mjs +0 -57
  73. package/dist/esm/chunk-GD4MKCN7.mjs.map +0 -1
  74. package/dist/esm/chunk-LWO35IGS.mjs +0 -518
  75. package/dist/esm/chunk-LWO35IGS.mjs.map +0 -1
  76. package/dist/esm/chunk-PCJKIY5G.mjs.map +0 -1
  77. package/dist/esm/chunk-TKN5V2BV.mjs +0 -13
  78. package/dist/esm/chunk-TKN5V2BV.mjs.map +0 -1
@@ -0,0 +1,473 @@
1
+ import {
2
+ isUptoPermit2Payload
3
+ } from "../../chunk-JII456TS.mjs";
4
+ import {
5
+ ERC20_APPROVAL_GAS_SPONSORING_KEY,
6
+ ErrUptoFacilitatorMismatch,
7
+ ErrUptoInvalidScheme,
8
+ ErrUptoNetworkMismatch,
9
+ ErrUptoSettlementExceedsAmount,
10
+ buildUptoPermit2SettleArgs,
11
+ checkPermit2Prerequisites,
12
+ diagnosePermit2SimulationFailure,
13
+ extractEip2612GasSponsoringInfo,
14
+ extractErc20ApprovalGasSponsoringInfo,
15
+ mapSettleError,
16
+ resolveErc20ApprovalExtensionSigner,
17
+ simulatePermit2Settle,
18
+ simulatePermit2SettleWithErc20Approval,
19
+ simulatePermit2SettleWithPermit,
20
+ splitEip2612Signature,
21
+ validateEip2612PermitForPayment,
22
+ validateErc20ApprovalForPayment,
23
+ waitAndReturnSettleResponse
24
+ } from "../../chunk-CRT6YNY5.mjs";
25
+ import {
26
+ ErrPermit2AmountMismatch,
27
+ PERMIT2_ADDRESS,
28
+ getEvmChainId,
29
+ uptoPermit2WitnessTypes,
30
+ x402UptoPermit2ProxyABI,
31
+ x402UptoPermit2ProxyAddress
32
+ } from "../../chunk-C4ZQMS77.mjs";
33
+
34
+ // src/upto/facilitator/permit2.ts
35
+ import { getAddress, encodeFunctionData } from "viem";
36
+ var uptoProxyConfig = {
37
+ proxyAddress: x402UptoPermit2ProxyAddress,
38
+ proxyABI: x402UptoPermit2ProxyABI
39
+ };
40
+ async function verifyUptoPermit2(signer, payload, requirements, permit2Payload, context, options) {
41
+ const payer = permit2Payload.permit2Authorization.from;
42
+ if (payload.accepted.scheme !== "upto" || requirements.scheme !== "upto") {
43
+ return {
44
+ isValid: false,
45
+ invalidReason: ErrUptoInvalidScheme,
46
+ payer
47
+ };
48
+ }
49
+ if (payload.accepted.network !== requirements.network) {
50
+ return {
51
+ isValid: false,
52
+ invalidReason: ErrUptoNetworkMismatch,
53
+ payer
54
+ };
55
+ }
56
+ const chainId = getEvmChainId(requirements.network);
57
+ const tokenAddress = getAddress(requirements.asset);
58
+ if (getAddress(permit2Payload.permit2Authorization.spender) !== getAddress(x402UptoPermit2ProxyAddress)) {
59
+ return {
60
+ isValid: false,
61
+ invalidReason: "invalid_permit2_spender",
62
+ payer
63
+ };
64
+ }
65
+ if (getAddress(permit2Payload.permit2Authorization.witness.to) !== getAddress(requirements.payTo)) {
66
+ return {
67
+ isValid: false,
68
+ invalidReason: "invalid_permit2_recipient_mismatch",
69
+ payer
70
+ };
71
+ }
72
+ const facilitatorAddresses = signer.getAddresses();
73
+ const witnessFacilitator = getAddress(permit2Payload.permit2Authorization.witness.facilitator);
74
+ const isFacilitatorMatch = facilitatorAddresses.some(
75
+ (addr) => getAddress(addr) === witnessFacilitator
76
+ );
77
+ if (!isFacilitatorMatch) {
78
+ return {
79
+ isValid: false,
80
+ invalidReason: ErrUptoFacilitatorMismatch,
81
+ payer
82
+ };
83
+ }
84
+ const now = Math.floor(Date.now() / 1e3);
85
+ if (BigInt(permit2Payload.permit2Authorization.deadline) < BigInt(now + 6)) {
86
+ return {
87
+ isValid: false,
88
+ invalidReason: "permit2_deadline_expired",
89
+ payer
90
+ };
91
+ }
92
+ if (BigInt(permit2Payload.permit2Authorization.witness.validAfter) > BigInt(now)) {
93
+ return {
94
+ isValid: false,
95
+ invalidReason: "permit2_not_yet_valid",
96
+ payer
97
+ };
98
+ }
99
+ if (BigInt(permit2Payload.permit2Authorization.permitted.amount) !== BigInt(requirements.amount)) {
100
+ return {
101
+ isValid: false,
102
+ invalidReason: ErrPermit2AmountMismatch,
103
+ payer
104
+ };
105
+ }
106
+ if (getAddress(permit2Payload.permit2Authorization.permitted.token) !== tokenAddress) {
107
+ return {
108
+ isValid: false,
109
+ invalidReason: "permit2_token_mismatch",
110
+ payer
111
+ };
112
+ }
113
+ const permit2TypedData = {
114
+ types: uptoPermit2WitnessTypes,
115
+ primaryType: "PermitWitnessTransferFrom",
116
+ domain: {
117
+ name: "Permit2",
118
+ chainId,
119
+ verifyingContract: PERMIT2_ADDRESS
120
+ },
121
+ message: {
122
+ permitted: {
123
+ token: getAddress(permit2Payload.permit2Authorization.permitted.token),
124
+ amount: BigInt(permit2Payload.permit2Authorization.permitted.amount)
125
+ },
126
+ spender: getAddress(permit2Payload.permit2Authorization.spender),
127
+ nonce: BigInt(permit2Payload.permit2Authorization.nonce),
128
+ deadline: BigInt(permit2Payload.permit2Authorization.deadline),
129
+ witness: {
130
+ to: getAddress(permit2Payload.permit2Authorization.witness.to),
131
+ facilitator: getAddress(permit2Payload.permit2Authorization.witness.facilitator),
132
+ validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter)
133
+ }
134
+ }
135
+ };
136
+ let signatureValid = false;
137
+ try {
138
+ signatureValid = await signer.verifyTypedData({
139
+ address: payer,
140
+ ...permit2TypedData,
141
+ signature: permit2Payload.signature
142
+ });
143
+ } catch {
144
+ signatureValid = false;
145
+ }
146
+ if (!signatureValid) {
147
+ const bytecode = await signer.getCode({ address: payer });
148
+ const isDeployedContract = bytecode && bytecode !== "0x";
149
+ if (!isDeployedContract) {
150
+ return {
151
+ isValid: false,
152
+ invalidReason: "invalid_permit2_signature",
153
+ payer
154
+ };
155
+ }
156
+ }
157
+ if (options?.simulate === false) {
158
+ return { isValid: true, invalidReason: void 0, payer };
159
+ }
160
+ const facilitatorAddress = getAddress(permit2Payload.permit2Authorization.witness.facilitator);
161
+ const uptoSettleArgs = buildUptoPermit2SettleArgs(
162
+ permit2Payload,
163
+ BigInt(requirements.amount),
164
+ facilitatorAddress
165
+ );
166
+ const eip2612InfoForSim = extractEip2612GasSponsoringInfo(payload);
167
+ if (eip2612InfoForSim) {
168
+ const fieldResult = validateEip2612PermitForPayment(eip2612InfoForSim, payer, tokenAddress);
169
+ if (!fieldResult.isValid) {
170
+ return { isValid: false, invalidReason: fieldResult.invalidReason, payer };
171
+ }
172
+ const simOk2 = await simulatePermit2SettleWithPermit(
173
+ uptoProxyConfig,
174
+ signer,
175
+ uptoSettleArgs,
176
+ eip2612InfoForSim
177
+ );
178
+ if (!simOk2) {
179
+ return diagnosePermit2SimulationFailure(
180
+ uptoProxyConfig,
181
+ signer,
182
+ tokenAddress,
183
+ permit2Payload,
184
+ requirements.amount
185
+ );
186
+ }
187
+ return { isValid: true, invalidReason: void 0, payer };
188
+ }
189
+ const erc20GasSponsorshipExtension = context?.getExtension(
190
+ ERC20_APPROVAL_GAS_SPONSORING_KEY
191
+ );
192
+ if (erc20GasSponsorshipExtension) {
193
+ const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);
194
+ if (erc20Info) {
195
+ const fieldResult = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);
196
+ if (!fieldResult.isValid) {
197
+ return { isValid: false, invalidReason: fieldResult.invalidReason, payer };
198
+ }
199
+ const extensionSigner = resolveErc20ApprovalExtensionSigner(
200
+ erc20GasSponsorshipExtension,
201
+ requirements.network
202
+ );
203
+ if (extensionSigner?.simulateTransactions) {
204
+ const simOk2 = await simulatePermit2SettleWithErc20Approval(
205
+ uptoProxyConfig,
206
+ extensionSigner,
207
+ uptoSettleArgs,
208
+ erc20Info
209
+ );
210
+ if (!simOk2) {
211
+ return diagnosePermit2SimulationFailure(
212
+ uptoProxyConfig,
213
+ signer,
214
+ tokenAddress,
215
+ permit2Payload,
216
+ requirements.amount
217
+ );
218
+ }
219
+ return { isValid: true, invalidReason: void 0, payer };
220
+ }
221
+ return checkPermit2Prerequisites(
222
+ uptoProxyConfig,
223
+ signer,
224
+ tokenAddress,
225
+ payer,
226
+ requirements.amount
227
+ );
228
+ }
229
+ }
230
+ const simOk = await simulatePermit2Settle(uptoProxyConfig, signer, uptoSettleArgs);
231
+ if (!simOk) {
232
+ return diagnosePermit2SimulationFailure(
233
+ uptoProxyConfig,
234
+ signer,
235
+ tokenAddress,
236
+ permit2Payload,
237
+ requirements.amount
238
+ );
239
+ }
240
+ return {
241
+ isValid: true,
242
+ invalidReason: void 0,
243
+ payer
244
+ };
245
+ }
246
+ async function settleUptoPermit2(signer, payload, requirements, permit2Payload, context, config) {
247
+ const payer = permit2Payload.permit2Authorization.from;
248
+ const settlementAmount = BigInt(requirements.amount);
249
+ const verifyRequirements = {
250
+ ...requirements,
251
+ amount: permit2Payload.permit2Authorization.permitted.amount
252
+ };
253
+ const valid = await verifyUptoPermit2(
254
+ signer,
255
+ payload,
256
+ verifyRequirements,
257
+ permit2Payload,
258
+ context,
259
+ { simulate: config?.simulateInSettle ?? true }
260
+ );
261
+ if (!valid.isValid) {
262
+ return {
263
+ success: false,
264
+ network: payload.accepted.network,
265
+ transaction: "",
266
+ errorReason: valid.invalidReason ?? "invalid_scheme",
267
+ payer
268
+ };
269
+ }
270
+ if (settlementAmount === 0n) {
271
+ return {
272
+ success: true,
273
+ transaction: "",
274
+ network: payload.accepted.network,
275
+ payer,
276
+ amount: "0"
277
+ };
278
+ }
279
+ if (settlementAmount > BigInt(permit2Payload.permit2Authorization.permitted.amount)) {
280
+ return {
281
+ success: false,
282
+ network: payload.accepted.network,
283
+ transaction: "",
284
+ errorReason: ErrUptoSettlementExceedsAmount,
285
+ payer
286
+ };
287
+ }
288
+ const facilitatorAddress = getAddress(permit2Payload.permit2Authorization.witness.facilitator);
289
+ const eip2612Info = extractEip2612GasSponsoringInfo(payload);
290
+ if (eip2612Info) {
291
+ return settleUptoWithEIP2612(
292
+ signer,
293
+ payload,
294
+ permit2Payload,
295
+ eip2612Info,
296
+ settlementAmount,
297
+ facilitatorAddress
298
+ );
299
+ }
300
+ const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);
301
+ if (erc20Info) {
302
+ const erc20GasSponsorshipExtension = context?.getExtension(
303
+ ERC20_APPROVAL_GAS_SPONSORING_KEY
304
+ );
305
+ const extensionSigner = resolveErc20ApprovalExtensionSigner(
306
+ erc20GasSponsorshipExtension,
307
+ payload.accepted.network
308
+ );
309
+ if (extensionSigner) {
310
+ return settleUptoWithERC20Approval(
311
+ extensionSigner,
312
+ payload,
313
+ permit2Payload,
314
+ erc20Info,
315
+ settlementAmount,
316
+ facilitatorAddress
317
+ );
318
+ }
319
+ }
320
+ return settleUptoDirect(signer, payload, permit2Payload, settlementAmount, facilitatorAddress);
321
+ }
322
+ async function settleUptoWithEIP2612(signer, payload, permit2Payload, eip2612Info, settlementAmount, facilitatorAddress) {
323
+ const payer = permit2Payload.permit2Authorization.from;
324
+ try {
325
+ const { v, r, s } = splitEip2612Signature(eip2612Info.signature);
326
+ const tx = await signer.writeContract({
327
+ address: uptoProxyConfig.proxyAddress,
328
+ abi: uptoProxyConfig.proxyABI,
329
+ functionName: "settleWithPermit",
330
+ args: [
331
+ {
332
+ value: BigInt(eip2612Info.amount),
333
+ deadline: BigInt(eip2612Info.deadline),
334
+ r,
335
+ s,
336
+ v
337
+ },
338
+ ...buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress)
339
+ ]
340
+ });
341
+ const response = await waitAndReturnSettleResponse(signer, tx, payload, payer);
342
+ return { ...response, amount: settlementAmount.toString() };
343
+ } catch (error) {
344
+ return mapSettleError(error, payload, payer);
345
+ }
346
+ }
347
+ async function settleUptoWithERC20Approval(extensionSigner, payload, permit2Payload, erc20Info, settlementAmount, facilitatorAddress) {
348
+ const payer = permit2Payload.permit2Authorization.from;
349
+ try {
350
+ const settleData = encodeFunctionData({
351
+ abi: uptoProxyConfig.proxyABI,
352
+ functionName: "settle",
353
+ args: buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress)
354
+ });
355
+ const txHashes = await extensionSigner.sendTransactions([
356
+ erc20Info.signedTransaction,
357
+ { to: uptoProxyConfig.proxyAddress, data: settleData, gas: BigInt(3e5) }
358
+ ]);
359
+ const settleTxHash = txHashes[txHashes.length - 1];
360
+ const response = await waitAndReturnSettleResponse(
361
+ extensionSigner,
362
+ settleTxHash,
363
+ payload,
364
+ payer
365
+ );
366
+ return { ...response, amount: settlementAmount.toString() };
367
+ } catch (error) {
368
+ return mapSettleError(error, payload, payer);
369
+ }
370
+ }
371
+ async function settleUptoDirect(signer, payload, permit2Payload, settlementAmount, facilitatorAddress) {
372
+ const payer = permit2Payload.permit2Authorization.from;
373
+ try {
374
+ const tx = await signer.writeContract({
375
+ address: uptoProxyConfig.proxyAddress,
376
+ abi: uptoProxyConfig.proxyABI,
377
+ functionName: "settle",
378
+ args: buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress)
379
+ });
380
+ const response = await waitAndReturnSettleResponse(signer, tx, payload, payer);
381
+ return { ...response, amount: settlementAmount.toString() };
382
+ } catch (error) {
383
+ return mapSettleError(error, payload, payer);
384
+ }
385
+ }
386
+
387
+ // src/upto/facilitator/scheme.ts
388
+ var UptoEvmScheme = class {
389
+ /**
390
+ * Creates a new UptoEvmScheme facilitator instance.
391
+ *
392
+ * @param signer - The EVM signer for facilitator operations
393
+ */
394
+ constructor(signer) {
395
+ this.signer = signer;
396
+ this.scheme = "upto";
397
+ this.caipFamily = "eip155:*";
398
+ }
399
+ /**
400
+ * Returns extra metadata required by the upto scheme, including the facilitator address.
401
+ *
402
+ * @param _ - The network identifier (unused)
403
+ * @returns Object with facilitatorAddress, or undefined if no signer addresses are available
404
+ */
405
+ getExtra(_) {
406
+ const addresses = this.signer.getAddresses();
407
+ if (addresses.length === 0) {
408
+ return void 0;
409
+ }
410
+ return { facilitatorAddress: addresses[Math.floor(Math.random() * addresses.length)] };
411
+ }
412
+ /**
413
+ * Returns the list of facilitator signer addresses for the upto scheme.
414
+ *
415
+ * @param _ - The network identifier (unused)
416
+ * @returns Array of facilitator signer addresses
417
+ */
418
+ getSigners(_) {
419
+ return [...this.signer.getAddresses()];
420
+ }
421
+ /**
422
+ * Verifies an upto Permit2 payment payload against the given requirements.
423
+ *
424
+ * @param payload - The payment payload to verify
425
+ * @param requirements - The payment requirements to verify against
426
+ * @param context - Optional facilitator context
427
+ * @returns Promise resolving to a verification response
428
+ */
429
+ async verify(payload, requirements, context) {
430
+ const rawPayload = payload.payload;
431
+ if (!isUptoPermit2Payload(rawPayload)) {
432
+ return { isValid: false, invalidReason: "unsupported_payload_type", payer: "" };
433
+ }
434
+ return verifyUptoPermit2(
435
+ this.signer,
436
+ payload,
437
+ requirements,
438
+ rawPayload,
439
+ context
440
+ );
441
+ }
442
+ /**
443
+ * Settles an upto Permit2 payment on-chain.
444
+ *
445
+ * @param payload - The payment payload to settle
446
+ * @param requirements - The payment requirements
447
+ * @param context - Optional facilitator context
448
+ * @returns Promise resolving to a settlement response
449
+ */
450
+ async settle(payload, requirements, context) {
451
+ const rawPayload = payload.payload;
452
+ if (!isUptoPermit2Payload(rawPayload)) {
453
+ return {
454
+ success: false,
455
+ network: payload.accepted.network,
456
+ transaction: "",
457
+ errorReason: "unsupported_payload_type",
458
+ payer: ""
459
+ };
460
+ }
461
+ return settleUptoPermit2(
462
+ this.signer,
463
+ payload,
464
+ requirements,
465
+ rawPayload,
466
+ context
467
+ );
468
+ }
469
+ };
470
+ export {
471
+ UptoEvmScheme
472
+ };
473
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/upto/facilitator/permit2.ts","../../../../src/upto/facilitator/scheme.ts"],"sourcesContent":["import {\n PaymentPayload,\n PaymentRequirements,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@payai/x402/types\";\nimport {\n extractEip2612GasSponsoringInfo,\n extractErc20ApprovalGasSponsoringInfo,\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n resolveErc20ApprovalExtensionSigner,\n type Erc20ApprovalGasSponsoringFacilitatorExtension,\n type Erc20ApprovalGasSponsoringSigner,\n} from \"../../exact/extensions\";\nimport { getAddress, encodeFunctionData } from \"viem\";\nimport {\n PERMIT2_ADDRESS,\n uptoPermit2WitnessTypes,\n x402UptoPermit2ProxyABI,\n x402UptoPermit2ProxyAddress,\n} from \"../../constants\";\nimport {\n ErrPermit2AmountMismatch,\n ErrUptoSettlementExceedsAmount,\n ErrUptoFacilitatorMismatch,\n ErrUptoInvalidScheme,\n ErrUptoNetworkMismatch,\n} from \"./errors\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { UptoPermit2Payload } from \"../../types\";\nimport { getEvmChainId } from \"../../utils\";\nimport { validateErc20ApprovalForPayment } from \"../../shared/erc20approval\";\nimport {\n buildUptoPermit2SettleArgs,\n waitAndReturnSettleResponse,\n mapSettleError,\n splitEip2612Signature,\n simulatePermit2Settle,\n simulatePermit2SettleWithPermit,\n simulatePermit2SettleWithErc20Approval,\n diagnosePermit2SimulationFailure,\n checkPermit2Prerequisites,\n validateEip2612PermitForPayment,\n type Permit2ProxyConfig,\n} from \"../../shared/permit2\";\nimport type { Eip2612GasSponsoringInfo } from \"../../exact/extensions\";\n\nconst uptoProxyConfig: Permit2ProxyConfig = {\n proxyAddress: x402UptoPermit2ProxyAddress,\n proxyABI: x402UptoPermit2ProxyABI,\n};\n\nexport interface VerifyUptoPermit2Options {\n simulate?: boolean;\n}\n\nexport interface UptoPermit2FacilitatorConfig {\n simulateInSettle?: boolean;\n}\n\n/**\n * Verifies an upto Permit2 payment payload against the given requirements.\n *\n * Validates scheme, network, spender, recipient, facilitator, deadline, amount,\n * token, signature, Permit2 allowance, and payer balance.\n *\n * @param signer - The facilitator signer for contract reads and signature verification\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements to verify against\n * @param permit2Payload - The upto Permit2 specific payload with witness data\n * @param context - Optional facilitator context for extension-provided capabilities\n * @param options - Optional verification options (e.g., skip simulation)\n * @returns Promise resolving to a verification response indicating validity\n */\nexport async function verifyUptoPermit2(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n permit2Payload: UptoPermit2Payload,\n context?: FacilitatorContext,\n options?: VerifyUptoPermit2Options,\n): Promise<VerifyResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n if (payload.accepted.scheme !== \"upto\" || requirements.scheme !== \"upto\") {\n return {\n isValid: false,\n invalidReason: ErrUptoInvalidScheme,\n payer,\n };\n }\n\n if (payload.accepted.network !== requirements.network) {\n return {\n isValid: false,\n invalidReason: ErrUptoNetworkMismatch,\n payer,\n };\n }\n\n const chainId = getEvmChainId(requirements.network);\n const tokenAddress = getAddress(requirements.asset);\n\n if (\n getAddress(permit2Payload.permit2Authorization.spender) !==\n getAddress(x402UptoPermit2ProxyAddress)\n ) {\n return {\n isValid: false,\n invalidReason: \"invalid_permit2_spender\",\n payer,\n };\n }\n\n if (\n getAddress(permit2Payload.permit2Authorization.witness.to) !== getAddress(requirements.payTo)\n ) {\n return {\n isValid: false,\n invalidReason: \"invalid_permit2_recipient_mismatch\",\n payer,\n };\n }\n\n // Verify the facilitator address in the witness matches our own address\n const facilitatorAddresses = signer.getAddresses();\n const witnessFacilitator = getAddress(permit2Payload.permit2Authorization.witness.facilitator);\n const isFacilitatorMatch = facilitatorAddresses.some(\n addr => getAddress(addr) === witnessFacilitator,\n );\n if (!isFacilitatorMatch) {\n return {\n isValid: false,\n invalidReason: ErrUptoFacilitatorMismatch,\n payer,\n };\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(permit2Payload.permit2Authorization.deadline) < BigInt(now + 6)) {\n return {\n isValid: false,\n invalidReason: \"permit2_deadline_expired\",\n payer,\n };\n }\n\n if (BigInt(permit2Payload.permit2Authorization.witness.validAfter) > BigInt(now)) {\n return {\n isValid: false,\n invalidReason: \"permit2_not_yet_valid\",\n payer,\n };\n }\n\n if (\n BigInt(permit2Payload.permit2Authorization.permitted.amount) !== BigInt(requirements.amount)\n ) {\n return {\n isValid: false,\n invalidReason: ErrPermit2AmountMismatch,\n payer,\n };\n }\n\n if (getAddress(permit2Payload.permit2Authorization.permitted.token) !== tokenAddress) {\n return {\n isValid: false,\n invalidReason: \"permit2_token_mismatch\",\n payer,\n };\n }\n\n // Verify signature using upto-specific witness types (includes facilitator)\n const permit2TypedData = {\n types: uptoPermit2WitnessTypes,\n primaryType: \"PermitWitnessTransferFrom\" as const,\n domain: {\n name: \"Permit2\",\n chainId,\n verifyingContract: PERMIT2_ADDRESS,\n },\n message: {\n permitted: {\n token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n },\n spender: getAddress(permit2Payload.permit2Authorization.spender),\n nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n witness: {\n to: getAddress(permit2Payload.permit2Authorization.witness.to),\n facilitator: getAddress(permit2Payload.permit2Authorization.witness.facilitator),\n validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n },\n },\n };\n\n // Verify signature\n // Note: verifyTypedData is implementation-dependent and pluggable on FacilitatorEvmSigner\n // Some implementations only do EOA-style ECDSA recovery (e.g. viem/utils verifyTypedData, ethers.verifyTypedData)\n // Viem's publicClient.verifyTypedData supports EOA and Smart Contract Account (ERC-1271 / ERC-6492) signature verification\n let signatureValid = false;\n try {\n signatureValid = await signer.verifyTypedData({\n address: payer,\n ...permit2TypedData,\n signature: permit2Payload.signature,\n });\n } catch {\n signatureValid = false;\n }\n\n if (!signatureValid) {\n // Check if the payer is a deployed smart contract (ERC-1271 / ERC-6492)\n const bytecode = await signer.getCode({ address: payer });\n const isDeployedContract = bytecode && bytecode !== \"0x\";\n\n if (!isDeployedContract) {\n return {\n isValid: false,\n invalidReason: \"invalid_permit2_signature\",\n payer,\n };\n }\n // Deployed smart contract: fall through to simulation\n }\n\n // If simulation is disabled, return early\n if (options?.simulate === false) {\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n const facilitatorAddress = getAddress(permit2Payload.permit2Authorization.witness.facilitator);\n // Per spec §Phase 3 Step 7: simulate with requirements.amount (the worst-case charge).\n // At verify time, requirements.amount = max authorized amount.\n // At settle time, requirements.amount = actual settlement amount (≤ max).\n const uptoSettleArgs = buildUptoPermit2SettleArgs(\n permit2Payload,\n BigInt(requirements.amount),\n facilitatorAddress,\n );\n\n const eip2612InfoForSim = extractEip2612GasSponsoringInfo(payload);\n if (eip2612InfoForSim) {\n const fieldResult = validateEip2612PermitForPayment(eip2612InfoForSim, payer, tokenAddress);\n if (!fieldResult.isValid) {\n return { isValid: false, invalidReason: fieldResult.invalidReason!, payer };\n }\n\n const simOk = await simulatePermit2SettleWithPermit(\n uptoProxyConfig,\n signer,\n uptoSettleArgs,\n eip2612InfoForSim,\n );\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n uptoProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n const erc20GasSponsorshipExtension =\n context?.getExtension<Erc20ApprovalGasSponsoringFacilitatorExtension>(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n if (erc20GasSponsorshipExtension) {\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const fieldResult = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n if (!fieldResult.isValid) {\n return { isValid: false, invalidReason: fieldResult.invalidReason!, payer };\n }\n\n const extensionSigner = resolveErc20ApprovalExtensionSigner(\n erc20GasSponsorshipExtension,\n requirements.network,\n );\n\n if (extensionSigner?.simulateTransactions) {\n const simOk = await simulatePermit2SettleWithErc20Approval(\n uptoProxyConfig,\n extensionSigner,\n uptoSettleArgs,\n erc20Info,\n );\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n uptoProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n return checkPermit2Prerequisites(\n uptoProxyConfig,\n signer,\n tokenAddress,\n payer,\n requirements.amount,\n );\n }\n }\n\n const simOk = await simulatePermit2Settle(uptoProxyConfig, signer, uptoSettleArgs);\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n uptoProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n\n return {\n isValid: true,\n invalidReason: undefined,\n payer,\n };\n}\n\n/**\n * Settles an upto Permit2 payment on-chain.\n *\n * Verifies the payment first, then selects the appropriate settlement path:\n * EIP-2612 atomic permit, ERC-20 approval extension, or direct settlement.\n *\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param permit2Payload - The upto Permit2 specific payload with witness data\n * @param context - Optional facilitator context for extension-provided capabilities\n * @param config - Optional facilitator configuration (e.g., simulation settings for settle)\n * @returns Promise resolving to a settlement response indicating success or failure\n */\nexport async function settleUptoPermit2(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n permit2Payload: UptoPermit2Payload,\n context?: FacilitatorContext,\n config?: UptoPermit2FacilitatorConfig,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n const settlementAmount = BigInt(requirements.amount);\n\n // Re-verify the signature before settling. We override `requirements.amount`\n // with the *authorized maximum* (`permitted.amount`) — NOT the actual\n // settlement amount — because `verifyUptoPermit2` performs strict equality\n // (`permitted.amount === requirements.amount`) to confirm the payload matches\n // what the client signed. The actual settlement amount, which may be lower\n // than the authorized maximum, is validated separately in the guard below\n // (`settlementAmount > permitted.amount`).\n const verifyRequirements: PaymentRequirements = {\n ...requirements,\n amount: permit2Payload.permit2Authorization.permitted.amount,\n };\n\n const valid = await verifyUptoPermit2(\n signer,\n payload,\n verifyRequirements,\n permit2Payload,\n context,\n { simulate: config?.simulateInSettle ?? true },\n );\n if (!valid.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: valid.invalidReason ?? \"invalid_scheme\",\n payer,\n };\n }\n\n // Zero settlement — no on-chain tx needed\n if (settlementAmount === 0n) {\n return {\n success: true,\n transaction: \"\",\n network: payload.accepted.network,\n payer,\n amount: \"0\",\n };\n }\n\n if (settlementAmount > BigInt(permit2Payload.permit2Authorization.permitted.amount)) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: ErrUptoSettlementExceedsAmount,\n payer,\n };\n }\n\n const facilitatorAddress = getAddress(permit2Payload.permit2Authorization.witness.facilitator);\n\n // Branch: EIP-2612 gas sponsoring (atomic settleWithPermit via contract)\n const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n if (eip2612Info) {\n return settleUptoWithEIP2612(\n signer,\n payload,\n permit2Payload,\n eip2612Info,\n settlementAmount,\n facilitatorAddress,\n );\n }\n\n // Branch: ERC-20 approval gas sponsoring (broadcast approval + settle via extension signer)\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const erc20GasSponsorshipExtension =\n context?.getExtension<Erc20ApprovalGasSponsoringFacilitatorExtension>(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n const extensionSigner = resolveErc20ApprovalExtensionSigner(\n erc20GasSponsorshipExtension,\n payload.accepted.network,\n );\n if (extensionSigner) {\n return settleUptoWithERC20Approval(\n extensionSigner,\n payload,\n permit2Payload,\n erc20Info,\n settlementAmount,\n facilitatorAddress,\n );\n }\n }\n\n // Branch: standard settle (allowance already on-chain)\n return settleUptoDirect(signer, payload, permit2Payload, settlementAmount, facilitatorAddress);\n}\n\n/**\n * Settles an upto Permit2 payment via settleWithPermit, including the EIP-2612 permit atomically.\n *\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload for network info\n * @param permit2Payload - The upto Permit2 specific payload with authorization and signature\n * @param eip2612Info - The EIP-2612 gas sponsoring info from the payload extension\n * @param settlementAmount - The amount to settle on-chain\n * @param facilitatorAddress - The facilitator address authorized in the witness\n * @returns Promise resolving to a settlement response\n */\nasync function settleUptoWithEIP2612(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n permit2Payload: UptoPermit2Payload,\n eip2612Info: Eip2612GasSponsoringInfo,\n settlementAmount: bigint,\n facilitatorAddress: `0x${string}`,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n try {\n const { v, r, s } = splitEip2612Signature(eip2612Info.signature);\n\n const tx = await signer.writeContract({\n address: uptoProxyConfig.proxyAddress,\n abi: uptoProxyConfig.proxyABI,\n functionName: \"settleWithPermit\",\n args: [\n {\n value: BigInt(eip2612Info.amount),\n deadline: BigInt(eip2612Info.deadline),\n r,\n s,\n v,\n },\n ...buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress),\n ],\n });\n\n const response = await waitAndReturnSettleResponse(signer, tx, payload, payer);\n return { ...response, amount: settlementAmount.toString() };\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n\n/**\n * Settles an upto Permit2 payment using an ERC-20 approval gas sponsoring extension.\n *\n * Broadcasts the pre-signed approval transaction followed by the settle transaction\n * via the extension signer.\n *\n * @param extensionSigner - The extension signer with sendTransactions capability\n * @param payload - The payment payload for network info\n * @param permit2Payload - The upto Permit2 specific payload with authorization and signature\n * @param erc20Info - Object containing the signed approval transaction\n * @param erc20Info.signedTransaction - The RLP-encoded signed ERC-20 approve transaction hex string\n * @param settlementAmount - The amount to settle on-chain\n * @param facilitatorAddress - The facilitator address authorized in the witness\n * @returns Promise resolving to a settlement response\n */\nasync function settleUptoWithERC20Approval(\n extensionSigner: Erc20ApprovalGasSponsoringSigner,\n payload: PaymentPayload,\n permit2Payload: UptoPermit2Payload,\n erc20Info: { signedTransaction: string },\n settlementAmount: bigint,\n facilitatorAddress: `0x${string}`,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n try {\n const settleData = encodeFunctionData({\n abi: uptoProxyConfig.proxyABI,\n functionName: \"settle\",\n args: buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress),\n });\n\n const txHashes = await extensionSigner.sendTransactions([\n erc20Info.signedTransaction as `0x${string}`,\n { to: uptoProxyConfig.proxyAddress, data: settleData, gas: BigInt(300_000) },\n ]);\n\n const settleTxHash = txHashes[txHashes.length - 1];\n const response = await waitAndReturnSettleResponse(\n extensionSigner,\n settleTxHash,\n payload,\n payer,\n );\n return { ...response, amount: settlementAmount.toString() };\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n\n/**\n * Settles an upto Permit2 payment directly when Permit2 allowance is already on-chain.\n *\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload for network info\n * @param permit2Payload - The upto Permit2 specific payload with authorization and signature\n * @param settlementAmount - The amount to settle on-chain\n * @param facilitatorAddress - The facilitator address authorized in the witness\n * @returns Promise resolving to a settlement response\n */\nasync function settleUptoDirect(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n permit2Payload: UptoPermit2Payload,\n settlementAmount: bigint,\n facilitatorAddress: `0x${string}`,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n try {\n const tx = await signer.writeContract({\n address: uptoProxyConfig.proxyAddress,\n abi: uptoProxyConfig.proxyABI,\n functionName: \"settle\",\n args: buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress),\n });\n\n const response = await waitAndReturnSettleResponse(signer, tx, payload, payer);\n return { ...response, amount: settlementAmount.toString() };\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n","import {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@payai/x402/types\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { UptoPermit2Payload, isUptoPermit2Payload } from \"../../types\";\nimport { verifyUptoPermit2, settleUptoPermit2 } from \"./permit2\";\n\n/**\n * EVM facilitator implementation for the Upto payment scheme.\n * Handles verification and settlement of Permit2-based payments.\n */\nexport class UptoEvmScheme implements SchemeNetworkFacilitator {\n readonly scheme = \"upto\";\n readonly caipFamily = \"eip155:*\";\n\n /**\n * Creates a new UptoEvmScheme facilitator instance.\n *\n * @param signer - The EVM signer for facilitator operations\n */\n constructor(private readonly signer: FacilitatorEvmSigner) {}\n\n /**\n * Returns extra metadata required by the upto scheme, including the facilitator address.\n *\n * @param _ - The network identifier (unused)\n * @returns Object with facilitatorAddress, or undefined if no signer addresses are available\n */\n getExtra(_: string): Record<string, unknown> | undefined {\n const addresses = this.signer.getAddresses();\n if (addresses.length === 0) {\n return undefined;\n }\n return { facilitatorAddress: addresses[Math.floor(Math.random() * addresses.length)] };\n }\n\n /**\n * Returns the list of facilitator signer addresses for the upto scheme.\n *\n * @param _ - The network identifier (unused)\n * @returns Array of facilitator signer addresses\n */\n getSigners(_: string): string[] {\n return [...this.signer.getAddresses()];\n }\n\n /**\n * Verifies an upto Permit2 payment payload against the given requirements.\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements to verify against\n * @param context - Optional facilitator context\n * @returns Promise resolving to a verification response\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\n ): Promise<VerifyResponse> {\n const rawPayload = payload.payload as Record<string, unknown>;\n if (!isUptoPermit2Payload(rawPayload)) {\n return { isValid: false, invalidReason: \"unsupported_payload_type\", payer: \"\" };\n }\n return verifyUptoPermit2(\n this.signer,\n payload,\n requirements,\n rawPayload as UptoPermit2Payload,\n context,\n );\n }\n\n /**\n * Settles an upto Permit2 payment on-chain.\n *\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param context - Optional facilitator context\n * @returns Promise resolving to a settlement response\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\n ): Promise<SettleResponse> {\n const rawPayload = payload.payload as Record<string, unknown>;\n if (!isUptoPermit2Payload(rawPayload)) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: \"unsupported_payload_type\",\n payer: \"\",\n };\n }\n return settleUptoPermit2(\n this.signer,\n payload,\n requirements,\n rawPayload as UptoPermit2Payload,\n context,\n );\n }\n}\n"],"mappings":"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","names":["simOk"]}
@@ -0,0 +1,77 @@
1
+ import { SchemeNetworkServer, MoneyParser, Network, Price, AssetAmount, PaymentRequirements } from '@payai/x402/types';
2
+
3
+ /**
4
+ * EVM server implementation for the Upto payment scheme.
5
+ * Handles price parsing, payment requirements enhancement, and default asset resolution.
6
+ */
7
+ declare class UptoEvmScheme implements SchemeNetworkServer {
8
+ readonly scheme = "upto";
9
+ private moneyParsers;
10
+ /**
11
+ * Registers a custom money parser for converting prices to asset amounts.
12
+ *
13
+ * @param parser - The money parser function to register
14
+ * @returns This instance for chaining
15
+ */
16
+ registerMoneyParser(parser: MoneyParser): UptoEvmScheme;
17
+ /**
18
+ * Returns the decimal precision of the default stablecoin for the given network.
19
+ * Implements the optional AssetDecimalsProvider interface used by resolveSettlementOverrideAmount.
20
+ *
21
+ * @param _asset - The asset symbol (unused; defaults to the network's default stablecoin)
22
+ * @param network - The network to look up the default asset for
23
+ * @returns The number of decimal places for the asset
24
+ */
25
+ getAssetDecimals(_asset: string, network: Network): number;
26
+ /**
27
+ * Parses a price into an asset amount for the given network.
28
+ *
29
+ * @param price - The price to parse (string, number, or AssetAmount)
30
+ * @param network - The target network
31
+ * @returns Promise resolving to an asset amount
32
+ */
33
+ parsePrice(price: Price, network: Network): Promise<AssetAmount>;
34
+ /**
35
+ * Enhances payment requirements with upto-specific metadata.
36
+ *
37
+ * @param paymentRequirements - The base payment requirements
38
+ * @param supportedKind - The supported scheme/network kind
39
+ * @param supportedKind.x402Version - The x402 protocol version
40
+ * @param supportedKind.scheme - The payment scheme name
41
+ * @param supportedKind.network - The target network
42
+ * @param supportedKind.extra - Optional extra metadata
43
+ * @param extensionKeys - Extension keys to include
44
+ * @returns Promise resolving to enhanced payment requirements
45
+ */
46
+ enhancePaymentRequirements(paymentRequirements: PaymentRequirements, supportedKind: {
47
+ x402Version: number;
48
+ scheme: string;
49
+ network: Network;
50
+ extra?: Record<string, unknown>;
51
+ }, extensionKeys: string[]): Promise<PaymentRequirements>;
52
+ /**
53
+ * Parses a money string or number into a decimal value.
54
+ *
55
+ * @param money - The money value to parse
56
+ * @returns The parsed decimal amount
57
+ */
58
+ private parseMoneyToDecimal;
59
+ /**
60
+ * Converts a numeric dollar amount to an AssetAmount using the default token for the network.
61
+ *
62
+ * @param amount - The dollar amount as a number
63
+ * @param network - The target network
64
+ * @returns The converted asset amount with token metadata
65
+ */
66
+ private defaultMoneyConversion;
67
+ /**
68
+ * Converts a decimal string amount to an integer token amount using the given decimals.
69
+ *
70
+ * @param decimalAmount - The amount as a decimal string (e.g. "1.5")
71
+ * @param decimals - The number of decimal places for the token
72
+ * @returns The token amount as an integer string in smallest units
73
+ */
74
+ private convertToTokenAmount;
75
+ }
76
+
77
+ export { UptoEvmScheme };