@aastar/sdk 0.18.0 → 0.20.1
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/LICENSE +180 -21
- package/dist/UserClient-YUHCJJJL.js +6 -0
- package/dist/UserClient-YUHCJJJL.js.map +1 -0
- package/dist/account.d.ts +1 -0
- package/dist/account.js +6 -0
- package/dist/account.js.map +1 -0
- package/dist/admin.d.ts +1 -0
- package/dist/admin.js +6 -0
- package/dist/admin.js.map +1 -0
- package/dist/airaccount.d.ts +2 -0
- package/dist/airaccount.js +4501 -0
- package/dist/airaccount.js.map +1 -0
- package/dist/channel.d.ts +1 -0
- package/dist/channel.js +6 -0
- package/dist/channel.js.map +1 -0
- package/dist/chunk-4DVUM4MC.js +106 -0
- package/dist/chunk-4DVUM4MC.js.map +1 -0
- package/dist/chunk-4KRQXOTI.js +4421 -0
- package/dist/chunk-4KRQXOTI.js.map +1 -0
- package/dist/chunk-6JCYPTSH.js +281 -0
- package/dist/chunk-6JCYPTSH.js.map +1 -0
- package/dist/chunk-DI3E6PMI.js +426 -0
- package/dist/chunk-DI3E6PMI.js.map +1 -0
- package/dist/chunk-DSZ372PH.js +333 -0
- package/dist/chunk-DSZ372PH.js.map +1 -0
- package/dist/chunk-HVAB4TTT.js +116 -0
- package/dist/chunk-HVAB4TTT.js.map +1 -0
- package/dist/chunk-MPOMWT2J.js +1140 -0
- package/dist/chunk-MPOMWT2J.js.map +1 -0
- package/dist/chunk-NZGXB2C5.js +115 -0
- package/dist/chunk-NZGXB2C5.js.map +1 -0
- package/dist/chunk-O3Y7II3B.js +578 -0
- package/dist/chunk-O3Y7II3B.js.map +1 -0
- package/dist/chunk-OSPRJZ5T.js +113 -0
- package/dist/chunk-OSPRJZ5T.js.map +1 -0
- package/dist/chunk-PCLPYRTX.js +229 -0
- package/dist/chunk-PCLPYRTX.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +9 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-XFI3AK32.js +416 -0
- package/dist/chunk-XFI3AK32.js.map +1 -0
- package/dist/chunk-YHM77LIP.js +432 -0
- package/dist/chunk-YHM77LIP.js.map +1 -0
- package/dist/chunk-ZSSNU3UF.js +42091 -0
- package/dist/chunk-ZSSNU3UF.js.map +1 -0
- package/dist/contract-addresses-JE3X6DFY.js +4 -0
- package/dist/contract-addresses-JE3X6DFY.js.map +1 -0
- package/dist/core.d.ts +13 -0
- package/dist/core.js +5 -0
- package/dist/core.js.map +1 -0
- package/dist/dapp.d.ts +1 -0
- package/dist/dapp.js +7 -0
- package/dist/dapp.js.map +1 -0
- package/dist/dist-GHTBO7CD.js +6 -0
- package/dist/dist-GHTBO7CD.js.map +1 -0
- package/dist/enduser.d.ts +1 -0
- package/dist/enduser.js +7 -0
- package/dist/enduser.js.map +1 -0
- package/dist/identity.d.ts +1 -0
- package/dist/identity.js +6 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +601 -12
- package/dist/index.js +1640 -28
- package/dist/index.js.map +1 -0
- package/dist/index.node-55LOPHNQ.js +5 -0
- package/dist/index.node-55LOPHNQ.js.map +1 -0
- package/dist/lib-VRTYVDUO.js +1861 -0
- package/dist/lib-VRTYVDUO.js.map +1 -0
- package/dist/operator.d.ts +1 -0
- package/dist/operator.js +6 -0
- package/dist/operator.js.map +1 -0
- package/dist/paymaster.d.ts +1 -0
- package/dist/paymaster.js +6 -0
- package/dist/paymaster.js.map +1 -0
- package/dist/tokens.d.ts +1 -0
- package/dist/tokens.js +6 -0
- package/dist/tokens.js.map +1 -0
- package/dist/x402.d.ts +1 -0
- package/dist/x402.js +6 -0
- package/dist/x402.js.map +1 -0
- package/package.json +87 -18
- package/dist/clients/ExperimentClient.d.ts +0 -34
- package/dist/clients/ExperimentClient.js +0 -58
- package/dist/clients/admin.d.ts +0 -11
- package/dist/clients/admin.js +0 -20
- package/dist/clients/community.d.ts +0 -40
- package/dist/clients/community.js +0 -300
- package/dist/clients/endUser.d.ts +0 -77
- package/dist/clients/endUser.js +0 -298
- package/dist/clients/operator.d.ts +0 -66
- package/dist/clients/operator.js +0 -209
- package/dist/errors/decoder.d.ts +0 -6
- package/dist/errors/decoder.js +0 -44
- package/dist/utils/errorHandler.d.ts +0 -40
- package/dist/utils/errorHandler.js +0 -114
- package/dist/utils/funding.d.ts +0 -115
- package/dist/utils/funding.js +0 -188
- package/dist/utils/keys.d.ts +0 -61
- package/dist/utils/keys.js +0 -130
- package/dist/utils/roleData.d.ts +0 -66
- package/dist/utils/roleData.js +0 -128
- package/dist/utils/testScenarios.d.ts +0 -33
- package/dist/utils/testScenarios.js +0 -85
- package/dist/utils/userOp.d.ts +0 -89
- package/dist/utils/userOp.js +0 -231
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
import { x402Actions } from './chunk-ZSSNU3UF.js';
|
|
2
|
+
import { toHex } from 'viem';
|
|
3
|
+
|
|
4
|
+
var EIP3009_TYPES = {
|
|
5
|
+
TransferWithAuthorization: [
|
|
6
|
+
{ name: "from", type: "address" },
|
|
7
|
+
{ name: "to", type: "address" },
|
|
8
|
+
{ name: "value", type: "uint256" },
|
|
9
|
+
{ name: "validAfter", type: "uint256" },
|
|
10
|
+
{ name: "validBefore", type: "uint256" },
|
|
11
|
+
{ name: "nonce", type: "bytes32" }
|
|
12
|
+
],
|
|
13
|
+
// Distinct typehash from TransferWithAuthorization — prevents replay across variants.
|
|
14
|
+
// msg.sender must equal `to` on-chain (CallerMustBeRecipient error if violated).
|
|
15
|
+
ReceiveWithAuthorization: [
|
|
16
|
+
{ name: "from", type: "address" },
|
|
17
|
+
{ name: "to", type: "address" },
|
|
18
|
+
{ name: "value", type: "uint256" },
|
|
19
|
+
{ name: "validAfter", type: "uint256" },
|
|
20
|
+
{ name: "validBefore", type: "uint256" },
|
|
21
|
+
{ name: "nonce", type: "bytes32" }
|
|
22
|
+
],
|
|
23
|
+
CancelAuthorization: [
|
|
24
|
+
{ name: "authorizer", type: "address" },
|
|
25
|
+
{ name: "nonce", type: "bytes32" }
|
|
26
|
+
]
|
|
27
|
+
};
|
|
28
|
+
function getEIP3009Domain(tokenName, tokenVersion, chainId, verifyingContract) {
|
|
29
|
+
return {
|
|
30
|
+
name: tokenName,
|
|
31
|
+
version: tokenVersion,
|
|
32
|
+
chainId,
|
|
33
|
+
verifyingContract
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function generateNonce() {
|
|
37
|
+
const bytes = new Uint8Array(32);
|
|
38
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
39
|
+
return toHex(bytes);
|
|
40
|
+
}
|
|
41
|
+
var GTOKEN_EIP712_DOMAIN = { name: "GToken", version: "1" };
|
|
42
|
+
async function signTransferWithAuthorization(walletClient, params) {
|
|
43
|
+
const domain = getEIP3009Domain(params.tokenName, params.tokenVersion, params.chainId, params.verifyingContract);
|
|
44
|
+
const account = walletClient.account;
|
|
45
|
+
if (!account) {
|
|
46
|
+
throw new Error("WalletClient must have an account");
|
|
47
|
+
}
|
|
48
|
+
return walletClient.signTypedData({
|
|
49
|
+
account,
|
|
50
|
+
domain,
|
|
51
|
+
types: EIP3009_TYPES,
|
|
52
|
+
primaryType: "TransferWithAuthorization",
|
|
53
|
+
message: {
|
|
54
|
+
from: params.from,
|
|
55
|
+
to: params.to,
|
|
56
|
+
value: params.value,
|
|
57
|
+
validAfter: params.validAfter,
|
|
58
|
+
validBefore: params.validBefore,
|
|
59
|
+
nonce: params.nonce
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async function signGTokenTransferWithAuthorization(walletClient, params) {
|
|
64
|
+
const account = walletClient.account;
|
|
65
|
+
if (!account) {
|
|
66
|
+
throw new Error("WalletClient must have an account");
|
|
67
|
+
}
|
|
68
|
+
if (account.address.toLowerCase() !== params.from.toLowerCase()) {
|
|
69
|
+
throw new Error(`Signer ${account.address} does not match from ${params.from}`);
|
|
70
|
+
}
|
|
71
|
+
if (params.validBefore <= params.validAfter) {
|
|
72
|
+
throw new Error("validBefore must be greater than validAfter");
|
|
73
|
+
}
|
|
74
|
+
if (params.validBefore - params.validAfter > 300n) {
|
|
75
|
+
throw new Error(`Authorization window ${params.validBefore - params.validAfter}s exceeds MAX_AUTH_VALIDITY (300s)`);
|
|
76
|
+
}
|
|
77
|
+
return signTransferWithAuthorization(walletClient, params);
|
|
78
|
+
}
|
|
79
|
+
async function signReceiveWithAuthorization(walletClient, params) {
|
|
80
|
+
const account = walletClient.account;
|
|
81
|
+
if (!account) {
|
|
82
|
+
throw new Error("WalletClient must have an account");
|
|
83
|
+
}
|
|
84
|
+
if (account.address.toLowerCase() !== params.from.toLowerCase()) {
|
|
85
|
+
throw new Error(`Signer ${account.address} does not match from ${params.from}`);
|
|
86
|
+
}
|
|
87
|
+
if (params.validBefore <= params.validAfter) {
|
|
88
|
+
throw new Error("validBefore must be greater than validAfter");
|
|
89
|
+
}
|
|
90
|
+
if (params.validBefore - params.validAfter > 300n) {
|
|
91
|
+
throw new Error(`Authorization window ${params.validBefore - params.validAfter}s exceeds MAX_AUTH_VALIDITY (300s)`);
|
|
92
|
+
}
|
|
93
|
+
return walletClient.signTypedData({
|
|
94
|
+
account,
|
|
95
|
+
domain: getEIP3009Domain(params.tokenName, params.tokenVersion, params.chainId, params.verifyingContract),
|
|
96
|
+
types: EIP3009_TYPES,
|
|
97
|
+
primaryType: "ReceiveWithAuthorization",
|
|
98
|
+
message: {
|
|
99
|
+
from: params.from,
|
|
100
|
+
to: params.to,
|
|
101
|
+
value: params.value,
|
|
102
|
+
validAfter: params.validAfter,
|
|
103
|
+
validBefore: params.validBefore,
|
|
104
|
+
nonce: params.nonce
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async function signCancelAuthorization(walletClient, params) {
|
|
109
|
+
const account = walletClient.account;
|
|
110
|
+
if (!account) {
|
|
111
|
+
throw new Error("WalletClient must have an account");
|
|
112
|
+
}
|
|
113
|
+
if (account.address.toLowerCase() !== params.authorizer.toLowerCase()) {
|
|
114
|
+
throw new Error(`Signer ${account.address} does not match authorizer ${params.authorizer}`);
|
|
115
|
+
}
|
|
116
|
+
return walletClient.signTypedData({
|
|
117
|
+
account,
|
|
118
|
+
domain: getEIP3009Domain(params.tokenName, params.tokenVersion, params.chainId, params.verifyingContract),
|
|
119
|
+
types: EIP3009_TYPES,
|
|
120
|
+
primaryType: "CancelAuthorization",
|
|
121
|
+
message: {
|
|
122
|
+
authorizer: params.authorizer,
|
|
123
|
+
nonce: params.nonce
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ../x402/dist/payment-header.js
|
|
129
|
+
var HEADER_PAYMENT_REQUIRED = "PAYMENT-REQUIRED";
|
|
130
|
+
var HEADER_PAYMENT_SIGNATURE = "PAYMENT-SIGNATURE";
|
|
131
|
+
var HEADER_PAYMENT_RESPONSE = "PAYMENT-RESPONSE";
|
|
132
|
+
var HEADER_V1_PAYMENT = "X-PAYMENT";
|
|
133
|
+
var HEADER_V1_PAYMENT_RESPONSE = "X-PAYMENT-RESPONSE";
|
|
134
|
+
function toBase64(data) {
|
|
135
|
+
const json = JSON.stringify(data);
|
|
136
|
+
if (typeof Buffer !== "undefined") {
|
|
137
|
+
return Buffer.from(json).toString("base64");
|
|
138
|
+
}
|
|
139
|
+
return btoa(json);
|
|
140
|
+
}
|
|
141
|
+
function fromBase64(encoded) {
|
|
142
|
+
let json;
|
|
143
|
+
if (typeof Buffer !== "undefined") {
|
|
144
|
+
json = Buffer.from(encoded, "base64").toString("utf-8");
|
|
145
|
+
} else {
|
|
146
|
+
json = atob(encoded);
|
|
147
|
+
}
|
|
148
|
+
return JSON.parse(json);
|
|
149
|
+
}
|
|
150
|
+
function encodePaymentRequired(req) {
|
|
151
|
+
return toBase64(req);
|
|
152
|
+
}
|
|
153
|
+
function decodePaymentRequired(encoded) {
|
|
154
|
+
return fromBase64(encoded);
|
|
155
|
+
}
|
|
156
|
+
function encodePaymentPayload(payload) {
|
|
157
|
+
return toBase64(payload);
|
|
158
|
+
}
|
|
159
|
+
function decodePaymentPayload(encoded) {
|
|
160
|
+
return fromBase64(encoded);
|
|
161
|
+
}
|
|
162
|
+
function encodeSettleResponse(resp) {
|
|
163
|
+
return toBase64(resp);
|
|
164
|
+
}
|
|
165
|
+
function decodeSettleResponse(encoded) {
|
|
166
|
+
return fromBase64(encoded);
|
|
167
|
+
}
|
|
168
|
+
function extractPaymentRequired(response) {
|
|
169
|
+
const v2 = response.headers.get(HEADER_PAYMENT_REQUIRED);
|
|
170
|
+
if (v2)
|
|
171
|
+
return decodePaymentRequired(v2);
|
|
172
|
+
const v1 = response.headers.get("X-PAYMENT-REQUIRED");
|
|
173
|
+
if (v1)
|
|
174
|
+
return decodePaymentRequired(v1);
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
function extractSettleResponse(response) {
|
|
178
|
+
const v2 = response.headers.get(HEADER_PAYMENT_RESPONSE);
|
|
179
|
+
if (v2)
|
|
180
|
+
return decodeSettleResponse(v2);
|
|
181
|
+
const v1 = response.headers.get(HEADER_V1_PAYMENT_RESPONSE);
|
|
182
|
+
if (v1)
|
|
183
|
+
return decodeSettleResponse(v1);
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ../x402/dist/facilitator.js
|
|
188
|
+
var FacilitatorClient = class {
|
|
189
|
+
url;
|
|
190
|
+
createAuthHeaders;
|
|
191
|
+
constructor(config) {
|
|
192
|
+
this.url = config.url.replace(/\/$/, "");
|
|
193
|
+
this.createAuthHeaders = config.createAuthHeaders;
|
|
194
|
+
}
|
|
195
|
+
async getHeaders(endpoint) {
|
|
196
|
+
const base = { "Content-Type": "application/json" };
|
|
197
|
+
if (!this.createAuthHeaders)
|
|
198
|
+
return base;
|
|
199
|
+
const auth = await this.createAuthHeaders();
|
|
200
|
+
return { ...base, ...auth[endpoint] };
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* POST /verify — validate payment signature off-chain (~100ms).
|
|
204
|
+
*/
|
|
205
|
+
async verify(paymentPayload, paymentRequirements) {
|
|
206
|
+
const resp = await fetch(`${this.url}/verify`, {
|
|
207
|
+
method: "POST",
|
|
208
|
+
headers: await this.getHeaders("verify"),
|
|
209
|
+
body: JSON.stringify({
|
|
210
|
+
x402Version: 2,
|
|
211
|
+
paymentPayload,
|
|
212
|
+
paymentRequirements
|
|
213
|
+
})
|
|
214
|
+
});
|
|
215
|
+
if (!resp.ok) {
|
|
216
|
+
throw new Error(`Facilitator /verify failed: ${resp.status} ${await resp.text()}`);
|
|
217
|
+
}
|
|
218
|
+
return resp.json();
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* POST /settle — execute on-chain settlement (~2s on Base).
|
|
222
|
+
*/
|
|
223
|
+
async settle(paymentPayload, paymentRequirements) {
|
|
224
|
+
const resp = await fetch(`${this.url}/settle`, {
|
|
225
|
+
method: "POST",
|
|
226
|
+
headers: await this.getHeaders("settle"),
|
|
227
|
+
body: JSON.stringify({
|
|
228
|
+
x402Version: 2,
|
|
229
|
+
paymentPayload,
|
|
230
|
+
paymentRequirements
|
|
231
|
+
})
|
|
232
|
+
});
|
|
233
|
+
if (!resp.ok) {
|
|
234
|
+
throw new Error(`Facilitator /settle failed: ${resp.status} ${await resp.text()}`);
|
|
235
|
+
}
|
|
236
|
+
return resp.json();
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* GET /supported — query facilitator capabilities.
|
|
240
|
+
*/
|
|
241
|
+
async supported() {
|
|
242
|
+
const resp = await fetch(`${this.url}/supported`, {
|
|
243
|
+
method: "GET",
|
|
244
|
+
headers: await this.getHeaders("supported")
|
|
245
|
+
});
|
|
246
|
+
if (!resp.ok) {
|
|
247
|
+
throw new Error(`Facilitator /supported failed: ${resp.status} ${await resp.text()}`);
|
|
248
|
+
}
|
|
249
|
+
return resp.json();
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
// ../x402/dist/X402Client.js
|
|
254
|
+
function toNetworkId(chainId) {
|
|
255
|
+
return `eip155:${chainId}`;
|
|
256
|
+
}
|
|
257
|
+
var X402Client = class {
|
|
258
|
+
actions;
|
|
259
|
+
config;
|
|
260
|
+
facilitatorClient;
|
|
261
|
+
constructor(config) {
|
|
262
|
+
if (!config.walletClient.account) {
|
|
263
|
+
throw new Error("WalletClient must have an account configured");
|
|
264
|
+
}
|
|
265
|
+
this.config = config;
|
|
266
|
+
this.actions = x402Actions(config.superPaymasterAddress)(config.walletClient);
|
|
267
|
+
if (config.facilitator) {
|
|
268
|
+
this.facilitatorClient = new FacilitatorClient(config.facilitator);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Create a signed payment payload (EIP-3009 TransferWithAuthorization).
|
|
273
|
+
* Returns a base64-encoded PaymentPayload ready for PAYMENT-SIGNATURE header.
|
|
274
|
+
*/
|
|
275
|
+
async createPayment(params) {
|
|
276
|
+
const nonce = params.nonce || generateNonce();
|
|
277
|
+
const now = BigInt(Math.floor(Date.now() / 1e3));
|
|
278
|
+
const validAfter = params.validAfter ?? now - 600n;
|
|
279
|
+
const validBefore = params.validBefore ?? now + 3600n;
|
|
280
|
+
const tokenName = this.config.tokenName || "USDC";
|
|
281
|
+
const tokenVersion = this.config.tokenVersion || "2";
|
|
282
|
+
const signature = await signTransferWithAuthorization(this.config.walletClient, {
|
|
283
|
+
from: params.from,
|
|
284
|
+
to: params.to,
|
|
285
|
+
value: params.amount,
|
|
286
|
+
validAfter,
|
|
287
|
+
validBefore,
|
|
288
|
+
nonce,
|
|
289
|
+
tokenName,
|
|
290
|
+
tokenVersion,
|
|
291
|
+
chainId: this.config.chainId,
|
|
292
|
+
verifyingContract: params.asset
|
|
293
|
+
});
|
|
294
|
+
const payload = {
|
|
295
|
+
x402Version: 2,
|
|
296
|
+
accepted: {
|
|
297
|
+
scheme: "exact",
|
|
298
|
+
network: toNetworkId(this.config.chainId),
|
|
299
|
+
asset: params.asset,
|
|
300
|
+
amount: params.amount.toString(),
|
|
301
|
+
payTo: params.to,
|
|
302
|
+
maxTimeoutSeconds: 3600,
|
|
303
|
+
extra: { name: tokenName, version: tokenVersion }
|
|
304
|
+
},
|
|
305
|
+
payload: {
|
|
306
|
+
signature,
|
|
307
|
+
authorization: {
|
|
308
|
+
from: params.from,
|
|
309
|
+
to: params.to,
|
|
310
|
+
value: params.amount.toString(),
|
|
311
|
+
validAfter: validAfter.toString(),
|
|
312
|
+
validBefore: validBefore.toString(),
|
|
313
|
+
nonce
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
return {
|
|
318
|
+
payload,
|
|
319
|
+
encoded: encodePaymentPayload(payload),
|
|
320
|
+
nonce
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Settle payment on-chain via SuperPaymaster (self-facilitated).
|
|
325
|
+
* Uses EIP-3009 transferWithAuthorization path.
|
|
326
|
+
*/
|
|
327
|
+
async settleOnChain(params) {
|
|
328
|
+
return this.actions.settleX402Payment({
|
|
329
|
+
...params,
|
|
330
|
+
account: this.config.walletClient.account
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Settle payment on-chain via direct transfer (for xPNTs and pre-approved tokens).
|
|
335
|
+
*/
|
|
336
|
+
async settleDirectOnChain(params) {
|
|
337
|
+
return this.actions.settleX402PaymentDirect({
|
|
338
|
+
...params,
|
|
339
|
+
account: this.config.walletClient.account
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Get facilitator fee quote from on-chain contract.
|
|
344
|
+
*/
|
|
345
|
+
async getQuote() {
|
|
346
|
+
const feeBPS = await this.actions.facilitatorFeeBPS();
|
|
347
|
+
return { feeBPS };
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Check if a nonce has been used.
|
|
351
|
+
*/
|
|
352
|
+
async checkNonce(nonce) {
|
|
353
|
+
return this.actions.x402SettlementNonces({ nonce });
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Settle via external facilitator (Coinbase, self-hosted, etc.).
|
|
357
|
+
* Requires facilitator config in constructor.
|
|
358
|
+
*/
|
|
359
|
+
async settleViaFacilitator(payload, requirements) {
|
|
360
|
+
if (!this.facilitatorClient) {
|
|
361
|
+
throw new Error("No facilitator configured. Pass facilitator config to X402Client constructor.");
|
|
362
|
+
}
|
|
363
|
+
return this.facilitatorClient.settle(payload, requirements);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* x402-aware fetch wrapper.
|
|
367
|
+
* Automatically handles 402 → sign → retry flow per x402 v2 spec.
|
|
368
|
+
*
|
|
369
|
+
* Pattern from: @x402/fetch wrapFetchWithPayment
|
|
370
|
+
*
|
|
371
|
+
* Flow:
|
|
372
|
+
* 1. Make initial request
|
|
373
|
+
* 2. If 402, extract PaymentRequired from PAYMENT-REQUIRED header
|
|
374
|
+
* 3. Select best payment option (applies policy: max amount check)
|
|
375
|
+
* 4. Sign EIP-3009 authorization
|
|
376
|
+
* 5. Retry with PAYMENT-SIGNATURE header
|
|
377
|
+
*/
|
|
378
|
+
async x402Fetch(url, init) {
|
|
379
|
+
const firstResponse = await fetch(url, init);
|
|
380
|
+
if (firstResponse.status !== 402) {
|
|
381
|
+
return firstResponse;
|
|
382
|
+
}
|
|
383
|
+
const paymentRequired = extractPaymentRequired(firstResponse);
|
|
384
|
+
if (!paymentRequired || !paymentRequired.accepts?.length) {
|
|
385
|
+
throw new Error("402 response missing PAYMENT-REQUIRED header or empty accepts");
|
|
386
|
+
}
|
|
387
|
+
const myNetwork = toNetworkId(this.config.chainId);
|
|
388
|
+
let selected = paymentRequired.accepts.find((a) => a.network === myNetwork && a.scheme === "exact");
|
|
389
|
+
if (!selected) {
|
|
390
|
+
selected = paymentRequired.accepts.find((a) => a.network.startsWith("eip155:"));
|
|
391
|
+
}
|
|
392
|
+
if (!selected) {
|
|
393
|
+
throw new Error(`No compatible payment option for network ${myNetwork}`);
|
|
394
|
+
}
|
|
395
|
+
if (this.config.maxAmountPerRequest && BigInt(selected.amount) > this.config.maxAmountPerRequest) {
|
|
396
|
+
throw new Error(`Payment amount ${selected.amount} exceeds max ${this.config.maxAmountPerRequest}`);
|
|
397
|
+
}
|
|
398
|
+
const account = this.config.walletClient.account;
|
|
399
|
+
if (!account) {
|
|
400
|
+
throw new Error("WalletClient must have an account for automatic payment");
|
|
401
|
+
}
|
|
402
|
+
const { encoded } = await this.createPayment({
|
|
403
|
+
from: account.address,
|
|
404
|
+
to: selected.payTo,
|
|
405
|
+
asset: selected.asset,
|
|
406
|
+
amount: BigInt(selected.amount)
|
|
407
|
+
});
|
|
408
|
+
const retryHeaders = new Headers(init?.headers);
|
|
409
|
+
retryHeaders.set(HEADER_PAYMENT_SIGNATURE, encoded);
|
|
410
|
+
return fetch(url, { ...init, headers: retryHeaders });
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
|
|
414
|
+
export { EIP3009_TYPES, FacilitatorClient, GTOKEN_EIP712_DOMAIN, HEADER_PAYMENT_REQUIRED, HEADER_PAYMENT_RESPONSE, HEADER_PAYMENT_SIGNATURE, HEADER_V1_PAYMENT, HEADER_V1_PAYMENT_RESPONSE, X402Client, decodePaymentPayload, decodePaymentRequired, decodeSettleResponse, encodePaymentPayload, encodePaymentRequired, encodeSettleResponse, extractPaymentRequired, extractSettleResponse, generateNonce, getEIP3009Domain, signCancelAuthorization, signGTokenTransferWithAuthorization, signReceiveWithAuthorization, signTransferWithAuthorization };
|
|
415
|
+
//# sourceMappingURL=chunk-XFI3AK32.js.map
|
|
416
|
+
//# sourceMappingURL=chunk-XFI3AK32.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../x402/dist/eip3009.js","../../x402/dist/payment-header.js","../../x402/dist/facilitator.js","../../x402/dist/X402Client.js"],"names":[],"mappings":"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","file":"chunk-XFI3AK32.js","sourcesContent":["import { toHex } from 'viem';\nexport const EIP3009_TYPES = {\n TransferWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n // Distinct typehash from TransferWithAuthorization — prevents replay across variants.\n // msg.sender must equal `to` on-chain (CallerMustBeRecipient error if violated).\n ReceiveWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n CancelAuthorization: [\n { name: 'authorizer', type: 'address' },\n { name: 'nonce', type: 'bytes32' },\n ],\n};\nexport function getEIP3009Domain(tokenName, tokenVersion, chainId, verifyingContract) {\n return {\n name: tokenName,\n version: tokenVersion,\n chainId,\n verifyingContract,\n };\n}\nexport function generateNonce() {\n const bytes = new Uint8Array(32);\n globalThis.crypto.getRandomValues(bytes);\n return toHex(bytes);\n}\n// GToken EIP-712 domain constants (GTokenAuthorization v2.2.0)\nexport const GTOKEN_EIP712_DOMAIN = { name: 'GToken', version: '1' };\nexport async function signTransferWithAuthorization(walletClient, params) {\n const domain = getEIP3009Domain(params.tokenName, params.tokenVersion, params.chainId, params.verifyingContract);\n const account = walletClient.account;\n if (!account) {\n throw new Error('WalletClient must have an account');\n }\n return walletClient.signTypedData({\n account,\n domain,\n types: EIP3009_TYPES,\n primaryType: 'TransferWithAuthorization',\n message: {\n from: params.from,\n to: params.to,\n value: params.value,\n validAfter: params.validAfter,\n validBefore: params.validBefore,\n nonce: params.nonce,\n },\n });\n}\n/**\n * Sign a TransferWithAuthorization for GTokenAuthorization (EIP-3009).\n * GToken-specific wrapper: enforces MAX_AUTH_VALIDITY = 300s before signing.\n * Use this instead of the generic signTransferWithAuthorization when the\n * verifying contract is GTokenAuthorization.\n */\nexport async function signGTokenTransferWithAuthorization(walletClient, params) {\n const account = walletClient.account;\n if (!account) {\n throw new Error('WalletClient must have an account');\n }\n if (account.address.toLowerCase() !== params.from.toLowerCase()) {\n throw new Error(`Signer ${account.address} does not match from ${params.from}`);\n }\n // GTokenAuthorization enforces MAX_AUTH_VALIDITY = 300s on-chain.\n if (params.validBefore <= params.validAfter) {\n throw new Error('validBefore must be greater than validAfter');\n }\n if (params.validBefore - params.validAfter > 300n) {\n throw new Error(`Authorization window ${params.validBefore - params.validAfter}s exceeds MAX_AUTH_VALIDITY (300s)`);\n }\n return signTransferWithAuthorization(walletClient, params);\n}\n/**\n * Sign a ReceiveWithAuthorization for GTokenAuthorization (EIP-3009).\n * The signed `to` address must be the one submitting the transaction on-chain.\n * Note: `xPNTsToken` is NOT included in the signature (it's a relay-supplied hint for RC-2).\n */\nexport async function signReceiveWithAuthorization(walletClient, params) {\n const account = walletClient.account;\n if (!account) {\n throw new Error('WalletClient must have an account');\n }\n if (account.address.toLowerCase() !== params.from.toLowerCase()) {\n throw new Error(`Signer ${account.address} does not match from ${params.from}`);\n }\n // GTokenAuthorization enforces MAX_AUTH_VALIDITY = 300s on-chain (RC-1).\n if (params.validBefore <= params.validAfter) {\n throw new Error('validBefore must be greater than validAfter');\n }\n if (params.validBefore - params.validAfter > 300n) {\n throw new Error(`Authorization window ${params.validBefore - params.validAfter}s exceeds MAX_AUTH_VALIDITY (300s)`);\n }\n return walletClient.signTypedData({\n account,\n domain: getEIP3009Domain(params.tokenName, params.tokenVersion, params.chainId, params.verifyingContract),\n types: EIP3009_TYPES,\n primaryType: 'ReceiveWithAuthorization',\n message: {\n from: params.from,\n to: params.to,\n value: params.value,\n validAfter: params.validAfter,\n validBefore: params.validBefore,\n nonce: params.nonce,\n },\n });\n}\n/**\n * Sign a CancelAuthorization for GTokenAuthorization (EIP-3009).\n * Must be signed by the original `authorizer` address.\n */\nexport async function signCancelAuthorization(walletClient, params) {\n const account = walletClient.account;\n if (!account) {\n throw new Error('WalletClient must have an account');\n }\n if (account.address.toLowerCase() !== params.authorizer.toLowerCase()) {\n throw new Error(`Signer ${account.address} does not match authorizer ${params.authorizer}`);\n }\n return walletClient.signTypedData({\n account,\n domain: getEIP3009Domain(params.tokenName, params.tokenVersion, params.chainId, params.verifyingContract),\n types: EIP3009_TYPES,\n primaryType: 'CancelAuthorization',\n message: {\n authorizer: params.authorizer,\n nonce: params.nonce,\n },\n });\n}\n","// ============================================================\n// x402 v2 HTTP Header Names\n// Ref: github.com/coinbase/x402/blob/main/specs/x402-specification-v2.md\n// ============================================================\n/** v2 header names (standard) */\nexport const HEADER_PAYMENT_REQUIRED = 'PAYMENT-REQUIRED';\nexport const HEADER_PAYMENT_SIGNATURE = 'PAYMENT-SIGNATURE';\nexport const HEADER_PAYMENT_RESPONSE = 'PAYMENT-RESPONSE';\n/** v1 header names (backward compat) */\nexport const HEADER_V1_PAYMENT = 'X-PAYMENT';\nexport const HEADER_V1_PAYMENT_RESPONSE = 'X-PAYMENT-RESPONSE';\n// ============================================================\n// Encoding / Decoding (Base64 JSON — per x402 spec)\n// ============================================================\nfunction toBase64(data) {\n const json = JSON.stringify(data);\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(json).toString('base64');\n }\n return btoa(json);\n}\nfunction fromBase64(encoded) {\n let json;\n if (typeof Buffer !== 'undefined') {\n json = Buffer.from(encoded, 'base64').toString('utf-8');\n }\n else {\n json = atob(encoded);\n }\n return JSON.parse(json);\n}\n// --- PaymentRequired (402 response) ---\nexport function encodePaymentRequired(req) {\n return toBase64(req);\n}\nexport function decodePaymentRequired(encoded) {\n return fromBase64(encoded);\n}\n// --- PaymentPayload (client → server) ---\nexport function encodePaymentPayload(payload) {\n return toBase64(payload);\n}\nexport function decodePaymentPayload(encoded) {\n return fromBase64(encoded);\n}\n// --- SettleResponse (server → client) ---\nexport function encodeSettleResponse(resp) {\n return toBase64(resp);\n}\nexport function decodeSettleResponse(encoded) {\n return fromBase64(encoded);\n}\n// ============================================================\n// Header Extraction Helpers\n// ============================================================\n/**\n * Extract PaymentRequired from a 402 Response.\n * Tries v2 header first, falls back to v1.\n */\nexport function extractPaymentRequired(response) {\n const v2 = response.headers.get(HEADER_PAYMENT_REQUIRED);\n if (v2)\n return decodePaymentRequired(v2);\n // v1 fallback: check body or X-PAYMENT-REQUIRED\n const v1 = response.headers.get('X-PAYMENT-REQUIRED');\n if (v1)\n return decodePaymentRequired(v1);\n return null;\n}\n/**\n * Extract SettleResponse from a successful response.\n */\nexport function extractSettleResponse(response) {\n const v2 = response.headers.get(HEADER_PAYMENT_RESPONSE);\n if (v2)\n return decodeSettleResponse(v2);\n const v1 = response.headers.get(HEADER_V1_PAYMENT_RESPONSE);\n if (v1)\n return decodeSettleResponse(v1);\n return null;\n}\n","/**\n * HTTP Facilitator Client — standard x402 v2 facilitator API.\n * Compatible with Coinbase hosted facilitator and self-hosted instances.\n *\n * Ref: coinbase/x402 HTTPFacilitatorClient pattern\n */\nexport class FacilitatorClient {\n url;\n createAuthHeaders;\n constructor(config) {\n this.url = config.url.replace(/\\/$/, '');\n this.createAuthHeaders = config.createAuthHeaders;\n }\n async getHeaders(endpoint) {\n const base = { 'Content-Type': 'application/json' };\n if (!this.createAuthHeaders)\n return base;\n const auth = await this.createAuthHeaders();\n return { ...base, ...auth[endpoint] };\n }\n /**\n * POST /verify — validate payment signature off-chain (~100ms).\n */\n async verify(paymentPayload, paymentRequirements) {\n const resp = await fetch(`${this.url}/verify`, {\n method: 'POST',\n headers: await this.getHeaders('verify'),\n body: JSON.stringify({\n x402Version: 2,\n paymentPayload,\n paymentRequirements,\n }),\n });\n if (!resp.ok) {\n throw new Error(`Facilitator /verify failed: ${resp.status} ${await resp.text()}`);\n }\n return resp.json();\n }\n /**\n * POST /settle — execute on-chain settlement (~2s on Base).\n */\n async settle(paymentPayload, paymentRequirements) {\n const resp = await fetch(`${this.url}/settle`, {\n method: 'POST',\n headers: await this.getHeaders('settle'),\n body: JSON.stringify({\n x402Version: 2,\n paymentPayload,\n paymentRequirements,\n }),\n });\n if (!resp.ok) {\n throw new Error(`Facilitator /settle failed: ${resp.status} ${await resp.text()}`);\n }\n return resp.json();\n }\n /**\n * GET /supported — query facilitator capabilities.\n */\n async supported() {\n const resp = await fetch(`${this.url}/supported`, {\n method: 'GET',\n headers: await this.getHeaders('supported'),\n });\n if (!resp.ok) {\n throw new Error(`Facilitator /supported failed: ${resp.status} ${await resp.text()}`);\n }\n return resp.json();\n }\n}\n","import { x402Actions } from '@aastar/core';\nimport { signTransferWithAuthorization, generateNonce } from './eip3009.js';\nimport { encodePaymentPayload, extractPaymentRequired, HEADER_PAYMENT_SIGNATURE, } from './payment-header.js';\nimport { FacilitatorClient } from './facilitator.js';\n/** CAIP-2 network identifier from chainId */\nfunction toNetworkId(chainId) {\n return `eip155:${chainId}`;\n}\nexport class X402Client {\n actions;\n config;\n facilitatorClient;\n constructor(config) {\n if (!config.walletClient.account) {\n throw new Error('WalletClient must have an account configured');\n }\n this.config = config;\n // walletClient supports both readContract and writeContract — single instance suffices\n this.actions = x402Actions(config.superPaymasterAddress)(config.walletClient);\n if (config.facilitator) {\n this.facilitatorClient = new FacilitatorClient(config.facilitator);\n }\n }\n /**\n * Create a signed payment payload (EIP-3009 TransferWithAuthorization).\n * Returns a base64-encoded PaymentPayload ready for PAYMENT-SIGNATURE header.\n */\n async createPayment(params) {\n const nonce = params.nonce || generateNonce();\n const now = BigInt(Math.floor(Date.now() / 1000));\n const validAfter = params.validAfter ?? (now - 600n); // 10 min grace (per x402 spec)\n const validBefore = params.validBefore ?? (now + 3600n);\n const tokenName = this.config.tokenName || 'USDC';\n const tokenVersion = this.config.tokenVersion || '2';\n const signature = await signTransferWithAuthorization(this.config.walletClient, {\n from: params.from,\n to: params.to,\n value: params.amount,\n validAfter,\n validBefore,\n nonce,\n tokenName,\n tokenVersion,\n chainId: this.config.chainId,\n verifyingContract: params.asset,\n });\n const payload = {\n x402Version: 2,\n accepted: {\n scheme: 'exact',\n network: toNetworkId(this.config.chainId),\n asset: params.asset,\n amount: params.amount.toString(),\n payTo: params.to,\n maxTimeoutSeconds: 3600,\n extra: { name: tokenName, version: tokenVersion },\n },\n payload: {\n signature,\n authorization: {\n from: params.from,\n to: params.to,\n value: params.amount.toString(),\n validAfter: validAfter.toString(),\n validBefore: validBefore.toString(),\n nonce,\n },\n },\n };\n return {\n payload,\n encoded: encodePaymentPayload(payload),\n nonce,\n };\n }\n /**\n * Settle payment on-chain via SuperPaymaster (self-facilitated).\n * Uses EIP-3009 transferWithAuthorization path.\n */\n async settleOnChain(params) {\n return this.actions.settleX402Payment({\n ...params,\n account: this.config.walletClient.account,\n });\n }\n /**\n * Settle payment on-chain via direct transfer (for xPNTs and pre-approved tokens).\n */\n async settleDirectOnChain(params) {\n return this.actions.settleX402PaymentDirect({\n ...params,\n account: this.config.walletClient.account,\n });\n }\n /**\n * Get facilitator fee quote from on-chain contract.\n */\n async getQuote() {\n const feeBPS = await this.actions.facilitatorFeeBPS();\n return { feeBPS };\n }\n /**\n * Check if a nonce has been used.\n */\n async checkNonce(nonce) {\n return this.actions.x402SettlementNonces({ nonce });\n }\n /**\n * Settle via external facilitator (Coinbase, self-hosted, etc.).\n * Requires facilitator config in constructor.\n */\n async settleViaFacilitator(payload, requirements) {\n if (!this.facilitatorClient) {\n throw new Error('No facilitator configured. Pass facilitator config to X402Client constructor.');\n }\n return this.facilitatorClient.settle(payload, requirements);\n }\n /**\n * x402-aware fetch wrapper.\n * Automatically handles 402 → sign → retry flow per x402 v2 spec.\n *\n * Pattern from: @x402/fetch wrapFetchWithPayment\n *\n * Flow:\n * 1. Make initial request\n * 2. If 402, extract PaymentRequired from PAYMENT-REQUIRED header\n * 3. Select best payment option (applies policy: max amount check)\n * 4. Sign EIP-3009 authorization\n * 5. Retry with PAYMENT-SIGNATURE header\n */\n async x402Fetch(url, init) {\n const firstResponse = await fetch(url, init);\n if (firstResponse.status !== 402) {\n return firstResponse;\n }\n // Step 2: Extract payment requirements\n // TODO: some server implementations put PaymentRequired in the response body instead of headers\n const paymentRequired = extractPaymentRequired(firstResponse);\n if (!paymentRequired || !paymentRequired.accepts?.length) {\n throw new Error('402 response missing PAYMENT-REQUIRED header or empty accepts');\n }\n // Step 3: Select payment option (filter by network + policy)\n const myNetwork = toNetworkId(this.config.chainId);\n let selected = paymentRequired.accepts.find((a) => a.network === myNetwork && a.scheme === 'exact');\n if (!selected) {\n // Fallback: any EVM option\n selected = paymentRequired.accepts.find((a) => a.network.startsWith('eip155:'));\n }\n if (!selected) {\n throw new Error(`No compatible payment option for network ${myNetwork}`);\n }\n // Policy check: max amount\n if (this.config.maxAmountPerRequest && BigInt(selected.amount) > this.config.maxAmountPerRequest) {\n throw new Error(`Payment amount ${selected.amount} exceeds max ${this.config.maxAmountPerRequest}`);\n }\n const account = this.config.walletClient.account;\n if (!account) {\n throw new Error('WalletClient must have an account for automatic payment');\n }\n // Step 4: Sign\n const { encoded } = await this.createPayment({\n from: account.address,\n to: selected.payTo,\n asset: selected.asset,\n amount: BigInt(selected.amount),\n });\n // Step 5: Retry with payment signature\n const retryHeaders = new Headers(init?.headers);\n retryHeaders.set(HEADER_PAYMENT_SIGNATURE, encoded);\n return fetch(url, { ...init, headers: retryHeaders });\n }\n}\n"]}
|