@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
|
@@ -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 };
|