@aastar/sdk 0.20.8 → 0.20.9
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/BaseClient-CkBhQ1ou.d.cts +88 -0
- package/dist/UserClient-2J6XMTNV.cjs +15 -0
- package/dist/UserClient-2J6XMTNV.cjs.map +1 -0
- package/dist/account.cjs +31 -0
- package/dist/account.cjs.map +1 -0
- package/dist/account.d.cts +48 -0
- package/dist/admin.cjs +15 -0
- package/dist/admin.cjs.map +1 -0
- package/dist/admin.d.cts +62 -0
- package/dist/airaccount.cjs +452 -0
- package/dist/airaccount.cjs.map +1 -0
- package/dist/airaccount.d.cts +4 -0
- package/dist/channel-CkRRbzT8.d.cts +77 -0
- package/dist/channel.cjs +27 -0
- package/dist/channel.cjs.map +1 -0
- package/dist/channel.d.cts +64 -0
- package/dist/chunk-2RCJBWPO.cjs +1168 -0
- package/dist/chunk-2RCJBWPO.cjs.map +1 -0
- package/dist/chunk-FTJD2DWE.cjs +42472 -0
- package/dist/chunk-FTJD2DWE.cjs.map +1 -0
- package/dist/chunk-GRDC6ZRA.cjs +118 -0
- package/dist/chunk-GRDC6ZRA.cjs.map +1 -0
- package/dist/chunk-GX7NROST.cjs +421 -0
- package/dist/chunk-GX7NROST.cjs.map +1 -0
- package/dist/chunk-HSVQIFIK.cjs +128 -0
- package/dist/chunk-HSVQIFIK.cjs.map +1 -0
- package/dist/chunk-JTWY2XEG.cjs +115 -0
- package/dist/chunk-JTWY2XEG.cjs.map +1 -0
- package/dist/chunk-MRREGCWN.cjs +585 -0
- package/dist/chunk-MRREGCWN.cjs.map +1 -0
- package/dist/chunk-NT26BDGN.cjs +228 -0
- package/dist/chunk-NT26BDGN.cjs.map +1 -0
- package/dist/chunk-Q7SFCCGT.cjs +11 -0
- package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
- package/dist/chunk-QLF7N6H7.cjs +448 -0
- package/dist/chunk-QLF7N6H7.cjs.map +1 -0
- package/dist/chunk-RNHSA3LO.cjs +108 -0
- package/dist/chunk-RNHSA3LO.cjs.map +1 -0
- package/dist/chunk-S5IKOOUR.cjs +393 -0
- package/dist/chunk-S5IKOOUR.cjs.map +1 -0
- package/dist/chunk-TFLZETWB.cjs +4693 -0
- package/dist/chunk-TFLZETWB.cjs.map +1 -0
- package/dist/chunk-WQREDGUF.cjs +435 -0
- package/dist/chunk-WQREDGUF.cjs.map +1 -0
- package/dist/chunk-XQROKLZI.cjs +4521 -0
- package/dist/chunk-XQROKLZI.cjs.map +1 -0
- package/dist/contract-addresses-TANQ5DLX.cjs +49 -0
- package/dist/contract-addresses-TANQ5DLX.cjs.map +1 -0
- package/dist/core.cjs +894 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +6930 -0
- package/dist/dapp.cjs +289 -0
- package/dist/dapp.cjs.map +1 -0
- package/dist/dapp.d.cts +127 -0
- package/dist/doc-types-471vSmPO.d.cts +16 -0
- package/dist/enduser.cjs +24 -0
- package/dist/enduser.cjs.map +1 -0
- package/dist/enduser.d.cts +261 -0
- package/dist/identity.cjs +23 -0
- package/dist/identity.cjs.map +1 -0
- package/dist/identity.d.cts +81 -0
- package/dist/index-B6SfEQxo.d.cts +47 -0
- package/dist/index.cjs +2814 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +656 -0
- package/dist/kms.cjs +452 -0
- package/dist/kms.cjs.map +1 -0
- package/dist/kms.d.cts +3054 -0
- package/dist/lib-FE4GR7TO.cjs +1865 -0
- package/dist/lib-FE4GR7TO.cjs.map +1 -0
- package/dist/operator.cjs +27 -0
- package/dist/operator.cjs.map +1 -0
- package/dist/operator.d.cts +164 -0
- package/dist/paymaster.cjs +63 -0
- package/dist/paymaster.cjs.map +1 -0
- package/dist/paymaster.d.cts +312 -0
- package/dist/src-ENPA7D2S.cjs +63 -0
- package/dist/src-ENPA7D2S.cjs.map +1 -0
- package/dist/src-TQKEO2I4.cjs +894 -0
- package/dist/src-TQKEO2I4.cjs.map +1 -0
- package/dist/tier-router-DeeVg69O.d.cts +370 -0
- package/dist/tokens.cjs +15 -0
- package/dist/tokens.cjs.map +1 -0
- package/dist/tokens.d.cts +64 -0
- package/dist/x402.cjs +103 -0
- package/dist/x402.cjs.map +1 -0
- package/dist/x402.d.cts +373 -0
- package/package.json +32 -32
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkFTJD2DWE_cjs = require('./chunk-FTJD2DWE.cjs');
|
|
4
|
+
var viem = require('viem');
|
|
5
|
+
|
|
6
|
+
var EIP3009_TYPES = {
|
|
7
|
+
TransferWithAuthorization: [
|
|
8
|
+
{ name: "from", type: "address" },
|
|
9
|
+
{ name: "to", type: "address" },
|
|
10
|
+
{ name: "value", type: "uint256" },
|
|
11
|
+
{ name: "validAfter", type: "uint256" },
|
|
12
|
+
{ name: "validBefore", type: "uint256" },
|
|
13
|
+
{ name: "nonce", type: "bytes32" }
|
|
14
|
+
],
|
|
15
|
+
// Distinct typehash from TransferWithAuthorization — prevents replay across variants.
|
|
16
|
+
// msg.sender must equal `to` on-chain (CallerMustBeRecipient error if violated).
|
|
17
|
+
ReceiveWithAuthorization: [
|
|
18
|
+
{ name: "from", type: "address" },
|
|
19
|
+
{ name: "to", type: "address" },
|
|
20
|
+
{ name: "value", type: "uint256" },
|
|
21
|
+
{ name: "validAfter", type: "uint256" },
|
|
22
|
+
{ name: "validBefore", type: "uint256" },
|
|
23
|
+
{ name: "nonce", type: "bytes32" }
|
|
24
|
+
],
|
|
25
|
+
CancelAuthorization: [
|
|
26
|
+
{ name: "authorizer", type: "address" },
|
|
27
|
+
{ name: "nonce", type: "bytes32" }
|
|
28
|
+
]
|
|
29
|
+
};
|
|
30
|
+
function getEIP3009Domain(tokenName, tokenVersion, chainId, verifyingContract) {
|
|
31
|
+
return {
|
|
32
|
+
name: tokenName,
|
|
33
|
+
version: tokenVersion,
|
|
34
|
+
chainId,
|
|
35
|
+
verifyingContract
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function generateNonce() {
|
|
39
|
+
const bytes = new Uint8Array(32);
|
|
40
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
41
|
+
return viem.toHex(bytes);
|
|
42
|
+
}
|
|
43
|
+
var GTOKEN_EIP712_DOMAIN = { name: "GToken", version: "1" };
|
|
44
|
+
async function signTransferWithAuthorization(walletClient, params) {
|
|
45
|
+
const domain = getEIP3009Domain(
|
|
46
|
+
params.tokenName,
|
|
47
|
+
params.tokenVersion,
|
|
48
|
+
params.chainId,
|
|
49
|
+
params.verifyingContract
|
|
50
|
+
);
|
|
51
|
+
const account = walletClient.account;
|
|
52
|
+
if (!account) {
|
|
53
|
+
throw new Error("WalletClient must have an account");
|
|
54
|
+
}
|
|
55
|
+
return walletClient.signTypedData({
|
|
56
|
+
account,
|
|
57
|
+
domain,
|
|
58
|
+
types: EIP3009_TYPES,
|
|
59
|
+
primaryType: "TransferWithAuthorization",
|
|
60
|
+
message: {
|
|
61
|
+
from: params.from,
|
|
62
|
+
to: params.to,
|
|
63
|
+
value: params.value,
|
|
64
|
+
validAfter: params.validAfter,
|
|
65
|
+
validBefore: params.validBefore,
|
|
66
|
+
nonce: params.nonce
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async function signGTokenTransferWithAuthorization(walletClient, params) {
|
|
71
|
+
const account = walletClient.account;
|
|
72
|
+
if (!account) {
|
|
73
|
+
throw new Error("WalletClient must have an account");
|
|
74
|
+
}
|
|
75
|
+
if (account.address.toLowerCase() !== params.from.toLowerCase()) {
|
|
76
|
+
throw new Error(`Signer ${account.address} does not match from ${params.from}`);
|
|
77
|
+
}
|
|
78
|
+
if (params.validBefore <= params.validAfter) {
|
|
79
|
+
throw new Error("validBefore must be greater than validAfter");
|
|
80
|
+
}
|
|
81
|
+
if (params.validBefore - params.validAfter > 300n) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
`Authorization window ${params.validBefore - params.validAfter}s exceeds MAX_AUTH_VALIDITY (300s)`
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
return signTransferWithAuthorization(walletClient, params);
|
|
87
|
+
}
|
|
88
|
+
async function signReceiveWithAuthorization(walletClient, params) {
|
|
89
|
+
const account = walletClient.account;
|
|
90
|
+
if (!account) {
|
|
91
|
+
throw new Error("WalletClient must have an account");
|
|
92
|
+
}
|
|
93
|
+
if (account.address.toLowerCase() !== params.from.toLowerCase()) {
|
|
94
|
+
throw new Error(`Signer ${account.address} does not match from ${params.from}`);
|
|
95
|
+
}
|
|
96
|
+
if (params.validBefore <= params.validAfter) {
|
|
97
|
+
throw new Error("validBefore must be greater than validAfter");
|
|
98
|
+
}
|
|
99
|
+
if (params.validBefore - params.validAfter > 300n) {
|
|
100
|
+
throw new Error(
|
|
101
|
+
`Authorization window ${params.validBefore - params.validAfter}s exceeds MAX_AUTH_VALIDITY (300s)`
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
return walletClient.signTypedData({
|
|
105
|
+
account,
|
|
106
|
+
domain: getEIP3009Domain(params.tokenName, params.tokenVersion, params.chainId, params.verifyingContract),
|
|
107
|
+
types: EIP3009_TYPES,
|
|
108
|
+
primaryType: "ReceiveWithAuthorization",
|
|
109
|
+
message: {
|
|
110
|
+
from: params.from,
|
|
111
|
+
to: params.to,
|
|
112
|
+
value: params.value,
|
|
113
|
+
validAfter: params.validAfter,
|
|
114
|
+
validBefore: params.validBefore,
|
|
115
|
+
nonce: params.nonce
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async function signCancelAuthorization(walletClient, params) {
|
|
120
|
+
const account = walletClient.account;
|
|
121
|
+
if (!account) {
|
|
122
|
+
throw new Error("WalletClient must have an account");
|
|
123
|
+
}
|
|
124
|
+
if (account.address.toLowerCase() !== params.authorizer.toLowerCase()) {
|
|
125
|
+
throw new Error(`Signer ${account.address} does not match authorizer ${params.authorizer}`);
|
|
126
|
+
}
|
|
127
|
+
return walletClient.signTypedData({
|
|
128
|
+
account,
|
|
129
|
+
domain: getEIP3009Domain(params.tokenName, params.tokenVersion, params.chainId, params.verifyingContract),
|
|
130
|
+
types: EIP3009_TYPES,
|
|
131
|
+
primaryType: "CancelAuthorization",
|
|
132
|
+
message: {
|
|
133
|
+
authorizer: params.authorizer,
|
|
134
|
+
nonce: params.nonce
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ../x402/src/payment-header.ts
|
|
140
|
+
var HEADER_PAYMENT_REQUIRED = "PAYMENT-REQUIRED";
|
|
141
|
+
var HEADER_PAYMENT_SIGNATURE = "PAYMENT-SIGNATURE";
|
|
142
|
+
var HEADER_PAYMENT_RESPONSE = "PAYMENT-RESPONSE";
|
|
143
|
+
var HEADER_V1_PAYMENT = "X-PAYMENT";
|
|
144
|
+
var HEADER_V1_PAYMENT_RESPONSE = "X-PAYMENT-RESPONSE";
|
|
145
|
+
function toBase64(data) {
|
|
146
|
+
const json = JSON.stringify(data);
|
|
147
|
+
if (typeof Buffer !== "undefined") {
|
|
148
|
+
return Buffer.from(json).toString("base64");
|
|
149
|
+
}
|
|
150
|
+
return btoa(json);
|
|
151
|
+
}
|
|
152
|
+
function fromBase64(encoded) {
|
|
153
|
+
let json;
|
|
154
|
+
if (typeof Buffer !== "undefined") {
|
|
155
|
+
json = Buffer.from(encoded, "base64").toString("utf-8");
|
|
156
|
+
} else {
|
|
157
|
+
json = atob(encoded);
|
|
158
|
+
}
|
|
159
|
+
return JSON.parse(json);
|
|
160
|
+
}
|
|
161
|
+
function encodePaymentRequired(req) {
|
|
162
|
+
return toBase64(req);
|
|
163
|
+
}
|
|
164
|
+
function decodePaymentRequired(encoded) {
|
|
165
|
+
return fromBase64(encoded);
|
|
166
|
+
}
|
|
167
|
+
function encodePaymentPayload(payload) {
|
|
168
|
+
return toBase64(payload);
|
|
169
|
+
}
|
|
170
|
+
function decodePaymentPayload(encoded) {
|
|
171
|
+
return fromBase64(encoded);
|
|
172
|
+
}
|
|
173
|
+
function encodeSettleResponse(resp) {
|
|
174
|
+
return toBase64(resp);
|
|
175
|
+
}
|
|
176
|
+
function decodeSettleResponse(encoded) {
|
|
177
|
+
return fromBase64(encoded);
|
|
178
|
+
}
|
|
179
|
+
function extractPaymentRequired(response) {
|
|
180
|
+
const v2 = response.headers.get(HEADER_PAYMENT_REQUIRED);
|
|
181
|
+
if (v2) return decodePaymentRequired(v2);
|
|
182
|
+
const v1 = response.headers.get("X-PAYMENT-REQUIRED");
|
|
183
|
+
if (v1) return decodePaymentRequired(v1);
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
function extractSettleResponse(response) {
|
|
187
|
+
const v2 = response.headers.get(HEADER_PAYMENT_RESPONSE);
|
|
188
|
+
if (v2) return decodeSettleResponse(v2);
|
|
189
|
+
const v1 = response.headers.get(HEADER_V1_PAYMENT_RESPONSE);
|
|
190
|
+
if (v1) return decodeSettleResponse(v1);
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// ../x402/src/facilitator.ts
|
|
195
|
+
var FacilitatorClient = class {
|
|
196
|
+
url;
|
|
197
|
+
createAuthHeaders;
|
|
198
|
+
constructor(config) {
|
|
199
|
+
this.url = config.url.replace(/\/$/, "");
|
|
200
|
+
this.createAuthHeaders = config.createAuthHeaders;
|
|
201
|
+
}
|
|
202
|
+
async getHeaders(endpoint) {
|
|
203
|
+
const base = { "Content-Type": "application/json" };
|
|
204
|
+
if (!this.createAuthHeaders) return base;
|
|
205
|
+
const auth = await this.createAuthHeaders();
|
|
206
|
+
return { ...base, ...auth[endpoint] };
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* POST /verify — validate payment signature off-chain (~100ms).
|
|
210
|
+
*/
|
|
211
|
+
async verify(paymentPayload, paymentRequirements) {
|
|
212
|
+
const resp = await fetch(`${this.url}/verify`, {
|
|
213
|
+
method: "POST",
|
|
214
|
+
headers: await this.getHeaders("verify"),
|
|
215
|
+
body: JSON.stringify({
|
|
216
|
+
x402Version: 2,
|
|
217
|
+
paymentPayload,
|
|
218
|
+
paymentRequirements
|
|
219
|
+
})
|
|
220
|
+
});
|
|
221
|
+
if (!resp.ok) {
|
|
222
|
+
throw new Error(`Facilitator /verify failed: ${resp.status} ${await resp.text()}`);
|
|
223
|
+
}
|
|
224
|
+
return resp.json();
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* POST /settle — execute on-chain settlement (~2s on Base).
|
|
228
|
+
*/
|
|
229
|
+
async settle(paymentPayload, paymentRequirements) {
|
|
230
|
+
const resp = await fetch(`${this.url}/settle`, {
|
|
231
|
+
method: "POST",
|
|
232
|
+
headers: await this.getHeaders("settle"),
|
|
233
|
+
body: JSON.stringify({
|
|
234
|
+
x402Version: 2,
|
|
235
|
+
paymentPayload,
|
|
236
|
+
paymentRequirements
|
|
237
|
+
})
|
|
238
|
+
});
|
|
239
|
+
if (!resp.ok) {
|
|
240
|
+
throw new Error(`Facilitator /settle failed: ${resp.status} ${await resp.text()}`);
|
|
241
|
+
}
|
|
242
|
+
return resp.json();
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* GET /supported — query facilitator capabilities.
|
|
246
|
+
*/
|
|
247
|
+
async supported() {
|
|
248
|
+
const resp = await fetch(`${this.url}/supported`, {
|
|
249
|
+
method: "GET",
|
|
250
|
+
headers: await this.getHeaders("supported")
|
|
251
|
+
});
|
|
252
|
+
if (!resp.ok) {
|
|
253
|
+
throw new Error(`Facilitator /supported failed: ${resp.status} ${await resp.text()}`);
|
|
254
|
+
}
|
|
255
|
+
return resp.json();
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
// ../x402/src/X402Client.ts
|
|
260
|
+
function toNetworkId(chainId) {
|
|
261
|
+
return `eip155:${chainId}`;
|
|
262
|
+
}
|
|
263
|
+
var X402Client = class {
|
|
264
|
+
actions;
|
|
265
|
+
config;
|
|
266
|
+
facilitatorClient;
|
|
267
|
+
constructor(config) {
|
|
268
|
+
if (!config.walletClient.account) {
|
|
269
|
+
throw new Error("WalletClient must have an account configured");
|
|
270
|
+
}
|
|
271
|
+
this.config = config;
|
|
272
|
+
this.actions = chunkFTJD2DWE_cjs.x402Actions(config.superPaymasterAddress)(config.walletClient);
|
|
273
|
+
if (config.facilitator) {
|
|
274
|
+
this.facilitatorClient = new FacilitatorClient(config.facilitator);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Create a signed payment payload (EIP-3009 TransferWithAuthorization).
|
|
279
|
+
* Returns a base64-encoded PaymentPayload ready for PAYMENT-SIGNATURE header.
|
|
280
|
+
*/
|
|
281
|
+
async createPayment(params) {
|
|
282
|
+
const nonce = params.nonce || generateNonce();
|
|
283
|
+
const now = BigInt(Math.floor(Date.now() / 1e3));
|
|
284
|
+
const validAfter = params.validAfter ?? now - 600n;
|
|
285
|
+
const validBefore = params.validBefore ?? now + 3600n;
|
|
286
|
+
const tokenName = this.config.tokenName || "USDC";
|
|
287
|
+
const tokenVersion = this.config.tokenVersion || "2";
|
|
288
|
+
const signature = await signTransferWithAuthorization(this.config.walletClient, {
|
|
289
|
+
from: params.from,
|
|
290
|
+
to: params.to,
|
|
291
|
+
value: params.amount,
|
|
292
|
+
validAfter,
|
|
293
|
+
validBefore,
|
|
294
|
+
nonce,
|
|
295
|
+
tokenName,
|
|
296
|
+
tokenVersion,
|
|
297
|
+
chainId: this.config.chainId,
|
|
298
|
+
verifyingContract: params.asset
|
|
299
|
+
});
|
|
300
|
+
const payload = {
|
|
301
|
+
x402Version: 2,
|
|
302
|
+
accepted: {
|
|
303
|
+
scheme: "exact",
|
|
304
|
+
network: toNetworkId(this.config.chainId),
|
|
305
|
+
asset: params.asset,
|
|
306
|
+
amount: params.amount.toString(),
|
|
307
|
+
payTo: params.to,
|
|
308
|
+
maxTimeoutSeconds: 3600,
|
|
309
|
+
extra: { name: tokenName, version: tokenVersion }
|
|
310
|
+
},
|
|
311
|
+
payload: {
|
|
312
|
+
signature,
|
|
313
|
+
authorization: {
|
|
314
|
+
from: params.from,
|
|
315
|
+
to: params.to,
|
|
316
|
+
value: params.amount.toString(),
|
|
317
|
+
validAfter: validAfter.toString(),
|
|
318
|
+
validBefore: validBefore.toString(),
|
|
319
|
+
nonce
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
return {
|
|
324
|
+
payload,
|
|
325
|
+
encoded: encodePaymentPayload(payload),
|
|
326
|
+
nonce
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Settle payment on-chain via SuperPaymaster (self-facilitated).
|
|
331
|
+
* Uses EIP-3009 transferWithAuthorization path.
|
|
332
|
+
*/
|
|
333
|
+
async settleOnChain(params) {
|
|
334
|
+
return this.actions.settleX402Payment({
|
|
335
|
+
...params,
|
|
336
|
+
account: this.config.walletClient.account
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Settle payment on-chain via direct transfer (for xPNTs and pre-approved tokens).
|
|
341
|
+
*/
|
|
342
|
+
async settleDirectOnChain(params) {
|
|
343
|
+
return this.actions.settleX402PaymentDirect({
|
|
344
|
+
...params,
|
|
345
|
+
account: this.config.walletClient.account
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Get facilitator fee quote from on-chain contract.
|
|
350
|
+
*/
|
|
351
|
+
async getQuote() {
|
|
352
|
+
const feeBPS = await this.actions.facilitatorFeeBPS();
|
|
353
|
+
return { feeBPS };
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Check if a nonce has been used.
|
|
357
|
+
*/
|
|
358
|
+
async checkNonce(nonce) {
|
|
359
|
+
return this.actions.x402SettlementNonces({ nonce });
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Settle via external facilitator (Coinbase, self-hosted, etc.).
|
|
363
|
+
* Requires facilitator config in constructor.
|
|
364
|
+
*/
|
|
365
|
+
async settleViaFacilitator(payload, requirements) {
|
|
366
|
+
if (!this.facilitatorClient) {
|
|
367
|
+
throw new Error("No facilitator configured. Pass facilitator config to X402Client constructor.");
|
|
368
|
+
}
|
|
369
|
+
return this.facilitatorClient.settle(payload, requirements);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* x402-aware fetch wrapper.
|
|
373
|
+
* Automatically handles 402 → sign → retry flow per x402 v2 spec.
|
|
374
|
+
*
|
|
375
|
+
* Pattern from: @x402/fetch wrapFetchWithPayment
|
|
376
|
+
*
|
|
377
|
+
* Flow:
|
|
378
|
+
* 1. Make initial request
|
|
379
|
+
* 2. If 402, extract PaymentRequired from PAYMENT-REQUIRED header
|
|
380
|
+
* 3. Select best payment option (applies policy: max amount check)
|
|
381
|
+
* 4. Sign EIP-3009 authorization
|
|
382
|
+
* 5. Retry with PAYMENT-SIGNATURE header
|
|
383
|
+
*/
|
|
384
|
+
async x402Fetch(url, init) {
|
|
385
|
+
const firstResponse = await fetch(url, init);
|
|
386
|
+
if (firstResponse.status !== 402) {
|
|
387
|
+
return firstResponse;
|
|
388
|
+
}
|
|
389
|
+
const paymentRequired = extractPaymentRequired(firstResponse);
|
|
390
|
+
if (!paymentRequired || !paymentRequired.accepts?.length) {
|
|
391
|
+
throw new Error("402 response missing PAYMENT-REQUIRED header or empty accepts");
|
|
392
|
+
}
|
|
393
|
+
const myNetwork = toNetworkId(this.config.chainId);
|
|
394
|
+
let selected = paymentRequired.accepts.find(
|
|
395
|
+
(a) => a.network === myNetwork && a.scheme === "exact"
|
|
396
|
+
);
|
|
397
|
+
if (!selected) {
|
|
398
|
+
selected = paymentRequired.accepts.find((a) => a.network.startsWith("eip155:"));
|
|
399
|
+
}
|
|
400
|
+
if (!selected) {
|
|
401
|
+
throw new Error(`No compatible payment option for network ${myNetwork}`);
|
|
402
|
+
}
|
|
403
|
+
if (this.config.maxAmountPerRequest && BigInt(selected.amount) > this.config.maxAmountPerRequest) {
|
|
404
|
+
throw new Error(
|
|
405
|
+
`Payment amount ${selected.amount} exceeds max ${this.config.maxAmountPerRequest}`
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
const account = this.config.walletClient.account;
|
|
409
|
+
if (!account) {
|
|
410
|
+
throw new Error("WalletClient must have an account for automatic payment");
|
|
411
|
+
}
|
|
412
|
+
const { encoded } = await this.createPayment({
|
|
413
|
+
from: account.address,
|
|
414
|
+
to: selected.payTo,
|
|
415
|
+
asset: selected.asset,
|
|
416
|
+
amount: BigInt(selected.amount)
|
|
417
|
+
});
|
|
418
|
+
const retryHeaders = new Headers(init?.headers);
|
|
419
|
+
retryHeaders.set(HEADER_PAYMENT_SIGNATURE, encoded);
|
|
420
|
+
return fetch(url, { ...init, headers: retryHeaders });
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
exports.EIP3009_TYPES = EIP3009_TYPES;
|
|
425
|
+
exports.FacilitatorClient = FacilitatorClient;
|
|
426
|
+
exports.GTOKEN_EIP712_DOMAIN = GTOKEN_EIP712_DOMAIN;
|
|
427
|
+
exports.HEADER_PAYMENT_REQUIRED = HEADER_PAYMENT_REQUIRED;
|
|
428
|
+
exports.HEADER_PAYMENT_RESPONSE = HEADER_PAYMENT_RESPONSE;
|
|
429
|
+
exports.HEADER_PAYMENT_SIGNATURE = HEADER_PAYMENT_SIGNATURE;
|
|
430
|
+
exports.HEADER_V1_PAYMENT = HEADER_V1_PAYMENT;
|
|
431
|
+
exports.HEADER_V1_PAYMENT_RESPONSE = HEADER_V1_PAYMENT_RESPONSE;
|
|
432
|
+
exports.X402Client = X402Client;
|
|
433
|
+
exports.decodePaymentPayload = decodePaymentPayload;
|
|
434
|
+
exports.decodePaymentRequired = decodePaymentRequired;
|
|
435
|
+
exports.decodeSettleResponse = decodeSettleResponse;
|
|
436
|
+
exports.encodePaymentPayload = encodePaymentPayload;
|
|
437
|
+
exports.encodePaymentRequired = encodePaymentRequired;
|
|
438
|
+
exports.encodeSettleResponse = encodeSettleResponse;
|
|
439
|
+
exports.extractPaymentRequired = extractPaymentRequired;
|
|
440
|
+
exports.extractSettleResponse = extractSettleResponse;
|
|
441
|
+
exports.generateNonce = generateNonce;
|
|
442
|
+
exports.getEIP3009Domain = getEIP3009Domain;
|
|
443
|
+
exports.signCancelAuthorization = signCancelAuthorization;
|
|
444
|
+
exports.signGTokenTransferWithAuthorization = signGTokenTransferWithAuthorization;
|
|
445
|
+
exports.signReceiveWithAuthorization = signReceiveWithAuthorization;
|
|
446
|
+
exports.signTransferWithAuthorization = signTransferWithAuthorization;
|
|
447
|
+
//# sourceMappingURL=chunk-QLF7N6H7.cjs.map
|
|
448
|
+
//# sourceMappingURL=chunk-QLF7N6H7.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../x402/src/eip3009.ts","../../x402/src/payment-header.ts","../../x402/src/facilitator.ts","../../x402/src/X402Client.ts"],"names":["toHex","x402Actions"],"mappings":"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","file":"chunk-QLF7N6H7.cjs","sourcesContent":["import { type Address, type Hex, type WalletClient, toHex } from 'viem';\n\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} as const;\n\nexport function getEIP3009Domain(tokenName: string, tokenVersion: string, chainId: number, verifyingContract: Address) {\n return {\n name: tokenName,\n version: tokenVersion,\n chainId,\n verifyingContract,\n };\n}\n\nexport function generateNonce(): Hex {\n const bytes = new Uint8Array(32);\n globalThis.crypto.getRandomValues(bytes);\n return toHex(bytes);\n}\n\n// GToken EIP-712 domain constants (GTokenAuthorization v2.2.0)\nexport const GTOKEN_EIP712_DOMAIN = { name: 'GToken', version: '1' } as const;\n\nexport async function signTransferWithAuthorization(\n walletClient: WalletClient,\n params: {\n from: Address;\n to: Address;\n value: bigint;\n validAfter: bigint;\n validBefore: bigint;\n nonce: Hex;\n tokenName: string;\n tokenVersion: string;\n chainId: number;\n verifyingContract: Address;\n }\n): Promise<Hex> {\n const domain = getEIP3009Domain(\n params.tokenName,\n params.tokenVersion,\n params.chainId,\n params.verifyingContract\n );\n\n const account = walletClient.account;\n if (!account) {\n throw new Error('WalletClient must have an account');\n }\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/**\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(\n walletClient: WalletClient,\n params: {\n from: Address;\n to: Address;\n value: bigint;\n validAfter: bigint;\n validBefore: bigint;\n nonce: Hex;\n tokenName: string;\n tokenVersion: string;\n chainId: number;\n verifyingContract: Address;\n }\n): Promise<Hex> {\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(\n `Authorization window ${params.validBefore - params.validAfter}s exceeds MAX_AUTH_VALIDITY (300s)`\n );\n }\n return signTransferWithAuthorization(walletClient, params);\n}\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(\n walletClient: WalletClient,\n params: {\n from: Address;\n to: Address;\n value: bigint;\n validAfter: bigint;\n validBefore: bigint;\n nonce: Hex;\n tokenName: string;\n tokenVersion: string;\n chainId: number;\n verifyingContract: Address;\n }\n): Promise<Hex> {\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(\n `Authorization window ${params.validBefore - params.validAfter}s exceeds MAX_AUTH_VALIDITY (300s)`\n );\n }\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/**\n * Sign a CancelAuthorization for GTokenAuthorization (EIP-3009).\n * Must be signed by the original `authorizer` address.\n */\nexport async function signCancelAuthorization(\n walletClient: WalletClient,\n params: {\n authorizer: Address;\n nonce: Hex;\n tokenName: string;\n tokenVersion: string;\n chainId: number;\n verifyingContract: Address;\n }\n): Promise<Hex> {\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\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","import type { PaymentRequired, PaymentPayload, SettleResponse } from './types.js';\n\n// ============================================================\n// x402 v2 HTTP Header Names\n// Ref: github.com/coinbase/x402/blob/main/specs/x402-specification-v2.md\n// ============================================================\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\n/** v1 header names (backward compat) */\nexport const HEADER_V1_PAYMENT = 'X-PAYMENT';\nexport const HEADER_V1_PAYMENT_RESPONSE = 'X-PAYMENT-RESPONSE';\n\n// ============================================================\n// Encoding / Decoding (Base64 JSON — per x402 spec)\n// ============================================================\n\nfunction toBase64(data: unknown): string {\n const json = JSON.stringify(data);\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(json).toString('base64');\n }\n return btoa(json);\n}\n\nfunction fromBase64<T>(encoded: string): T {\n let json: string;\n if (typeof Buffer !== 'undefined') {\n json = Buffer.from(encoded, 'base64').toString('utf-8');\n } else {\n json = atob(encoded);\n }\n return JSON.parse(json) as T;\n}\n\n// --- PaymentRequired (402 response) ---\n\nexport function encodePaymentRequired(req: PaymentRequired): string {\n return toBase64(req);\n}\n\nexport function decodePaymentRequired(encoded: string): PaymentRequired {\n return fromBase64<PaymentRequired>(encoded);\n}\n\n// --- PaymentPayload (client → server) ---\n\nexport function encodePaymentPayload(payload: PaymentPayload): string {\n return toBase64(payload);\n}\n\nexport function decodePaymentPayload(encoded: string): PaymentPayload {\n return fromBase64<PaymentPayload>(encoded);\n}\n\n// --- SettleResponse (server → client) ---\n\nexport function encodeSettleResponse(resp: SettleResponse): string {\n return toBase64(resp);\n}\n\nexport function decodeSettleResponse(encoded: string): SettleResponse {\n return fromBase64<SettleResponse>(encoded);\n}\n\n// ============================================================\n// Header Extraction Helpers\n// ============================================================\n\n/**\n * Extract PaymentRequired from a 402 Response.\n * Tries v2 header first, falls back to v1.\n */\nexport function extractPaymentRequired(response: Response): PaymentRequired | null {\n const v2 = response.headers.get(HEADER_PAYMENT_REQUIRED);\n if (v2) return decodePaymentRequired(v2);\n\n // v1 fallback: check body or X-PAYMENT-REQUIRED\n const v1 = response.headers.get('X-PAYMENT-REQUIRED');\n if (v1) return decodePaymentRequired(v1);\n\n return null;\n}\n\n/**\n * Extract SettleResponse from a successful response.\n */\nexport function extractSettleResponse(response: Response): SettleResponse | null {\n const v2 = response.headers.get(HEADER_PAYMENT_RESPONSE);\n if (v2) return decodeSettleResponse(v2);\n\n const v1 = response.headers.get(HEADER_V1_PAYMENT_RESPONSE);\n if (v1) return decodeSettleResponse(v1);\n\n return null;\n}\n","import type {\n PaymentPayload,\n PaymentRequirements,\n VerifyResponse,\n SettleResponse,\n FacilitatorSupported,\n FacilitatorConfig,\n} from './types.js';\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 private readonly url: string;\n private readonly createAuthHeaders: FacilitatorConfig['createAuthHeaders'];\n\n constructor(config: FacilitatorConfig) {\n this.url = config.url.replace(/\\/$/, '');\n this.createAuthHeaders = config.createAuthHeaders;\n }\n\n private async getHeaders(endpoint: 'verify' | 'settle' | 'supported'): Promise<Record<string, string>> {\n const base: Record<string, string> = { 'Content-Type': 'application/json' };\n if (!this.createAuthHeaders) return base;\n const auth = await this.createAuthHeaders();\n return { ...base, ...auth[endpoint] };\n }\n\n /**\n * POST /verify — validate payment signature off-chain (~100ms).\n */\n async verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\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() as Promise<VerifyResponse>;\n }\n\n /**\n * POST /settle — execute on-chain settlement (~2s on Base).\n */\n async settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<SettleResponse> {\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() as Promise<SettleResponse>;\n }\n\n /**\n * GET /supported — query facilitator capabilities.\n */\n async supported(): Promise<FacilitatorSupported> {\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() as Promise<FacilitatorSupported>;\n }\n}\n","import { type Address, type Hex, type Hash, type PublicClient, type WalletClient } from 'viem';\nimport { x402Actions } from '@aastar/core';\nimport type {\n X402PaymentParams, PaymentRequired, PaymentPayload,\n PaymentRequirements, SettleResponse, FacilitatorConfig,\n} from './types.js';\nimport { signTransferWithAuthorization, generateNonce } from './eip3009.js';\nimport {\n encodePaymentPayload,\n extractPaymentRequired,\n extractSettleResponse,\n HEADER_PAYMENT_SIGNATURE,\n} from './payment-header.js';\nimport { FacilitatorClient } from './facilitator.js';\n\n// ============================================================\n// x402 Client — aligned with @x402/fetch + @x402/core patterns\n// Ref: coinbase/x402, Cloudflare Workers x402, MPP mppx\n// ============================================================\n\nexport type X402ClientConfig = {\n publicClient: PublicClient;\n walletClient: WalletClient;\n superPaymasterAddress: Address;\n chainId: number;\n /** Facilitator endpoint (default: self-facilitated via SuperPaymaster) */\n facilitator?: FacilitatorConfig;\n /** EIP-712 domain for asset token (defaults: USDC / version \"2\") */\n tokenName?: string;\n tokenVersion?: string;\n /** Payment policy: max amount per request (in atomic units) */\n maxAmountPerRequest?: bigint;\n};\n\n/** CAIP-2 network identifier from chainId */\nfunction toNetworkId(chainId: number): `eip155:${number}` {\n return `eip155:${chainId}`;\n}\n\nexport class X402Client {\n private readonly actions;\n private readonly config: X402ClientConfig;\n private readonly facilitatorClient?: FacilitatorClient;\n\n constructor(config: X402ClientConfig) {\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 /**\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: X402PaymentParams): Promise<{\n payload: PaymentPayload;\n encoded: string;\n nonce: Hex;\n }> {\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\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\n const payload: PaymentPayload = {\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\n return {\n payload,\n encoded: encodePaymentPayload(payload),\n nonce,\n };\n }\n\n /**\n * Settle payment on-chain via SuperPaymaster (self-facilitated).\n * Uses EIP-3009 transferWithAuthorization path.\n */\n async settleOnChain(params: {\n from: Address; to: Address; asset: Address; amount: bigint;\n validAfter: bigint; validBefore: bigint; nonce: Hex; signature: Hex;\n }): Promise<Hex> {\n return this.actions.settleX402Payment({\n ...params,\n account: this.config.walletClient.account!,\n });\n }\n\n /**\n * Settle payment on-chain via direct transfer (for xPNTs and pre-approved tokens).\n */\n async settleDirectOnChain(params: {\n from: Address; to: Address; asset: Address; amount: bigint; nonce: Hex;\n }): Promise<Hex> {\n return this.actions.settleX402PaymentDirect({\n ...params,\n account: this.config.walletClient.account!,\n });\n }\n\n /**\n * Get facilitator fee quote from on-chain contract.\n */\n async getQuote(): Promise<{ feeBPS: bigint }> {\n const feeBPS = await this.actions.facilitatorFeeBPS();\n return { feeBPS };\n }\n\n /**\n * Check if a nonce has been used.\n */\n async checkNonce(nonce: Hex): Promise<boolean> {\n return this.actions.x402SettlementNonces({ nonce });\n }\n\n /**\n * Settle via external facilitator (Coinbase, self-hosted, etc.).\n * Requires facilitator config in constructor.\n */\n async settleViaFacilitator(payload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse> {\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 /**\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: string, init?: RequestInit): Promise<Response> {\n const firstResponse = await fetch(url, init);\n\n if (firstResponse.status !== 402) {\n return firstResponse;\n }\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\n // Step 3: Select payment option (filter by network + policy)\n const myNetwork = toNetworkId(this.config.chainId);\n let selected = paymentRequired.accepts.find(\n (a) => a.network === myNetwork && a.scheme === 'exact'\n );\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\n // Policy check: max amount\n if (this.config.maxAmountPerRequest && BigInt(selected.amount) > this.config.maxAmountPerRequest) {\n throw new Error(\n `Payment amount ${selected.amount} exceeds max ${this.config.maxAmountPerRequest}`\n );\n }\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\n // Step 4: Sign\n const { encoded } = await this.createPayment({\n from: account.address,\n to: selected.payTo,\n asset: selected.asset as Address,\n amount: BigInt(selected.amount),\n });\n\n // Step 5: Retry with payment signature\n const retryHeaders = new Headers(init?.headers);\n retryHeaders.set(HEADER_PAYMENT_SIGNATURE, encoded);\n\n return fetch(url, { ...init, headers: retryHeaders });\n }\n}\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkFTJD2DWE_cjs = require('./chunk-FTJD2DWE.cjs');
|
|
4
|
+
|
|
5
|
+
// ../admin/src/ProtocolGovernance.ts
|
|
6
|
+
var ProtocolGovernance = class extends chunkFTJD2DWE_cjs.BaseClient {
|
|
7
|
+
registryAddress;
|
|
8
|
+
entryPointAddress;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
super(config);
|
|
11
|
+
this.registryAddress = config.registryAddress;
|
|
12
|
+
this.entryPointAddress = config.entryPointAddress;
|
|
13
|
+
}
|
|
14
|
+
// ===========================================
|
|
15
|
+
// 1. Global Parameter Management
|
|
16
|
+
// ===========================================
|
|
17
|
+
/**
|
|
18
|
+
* Update the Global Treasury Address where protocol fees are collected
|
|
19
|
+
*/
|
|
20
|
+
async setTreasury(treasury, options) {
|
|
21
|
+
throw new Error("Method not mapped to RegistryABI v1. Please verify contract capabilities.");
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Update the supported EntryPoint address
|
|
25
|
+
*/
|
|
26
|
+
async updateEntryPoint(entryPoint, options) {
|
|
27
|
+
throw new Error("Method not mapped to RegistryABI v1.");
|
|
28
|
+
}
|
|
29
|
+
// ===========================================
|
|
30
|
+
// 2. Role & Module Governance
|
|
31
|
+
// ===========================================
|
|
32
|
+
/**
|
|
33
|
+
* Approve a new SuperPaymaster contract address
|
|
34
|
+
*/
|
|
35
|
+
async setSuperPaymaster(paymaster, options) {
|
|
36
|
+
const registry = chunkFTJD2DWE_cjs.registryActions(this.registryAddress);
|
|
37
|
+
return await registry(this.client).setSuperPaymaster({
|
|
38
|
+
paymaster,
|
|
39
|
+
account: options?.account
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Set the Staking contract address
|
|
44
|
+
*/
|
|
45
|
+
async setStaking(staking, options) {
|
|
46
|
+
const registry = chunkFTJD2DWE_cjs.registryActions(this.registryAddress);
|
|
47
|
+
return await registry(this.client).setStaking({
|
|
48
|
+
staking,
|
|
49
|
+
account: options?.account
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Configure a Role's parameters (Admin only).
|
|
54
|
+
* Reads the current on-chain config first, then merges the provided overrides
|
|
55
|
+
* and writes back the full struct via configureRole.
|
|
56
|
+
*/
|
|
57
|
+
async configureRole(params, options) {
|
|
58
|
+
const registry = chunkFTJD2DWE_cjs.registryActions(this.registryAddress)(this.client);
|
|
59
|
+
const current = await registry.getRoleConfig({ roleId: params.roleId });
|
|
60
|
+
return await registry.configureRole({
|
|
61
|
+
roleId: params.roleId,
|
|
62
|
+
config: {
|
|
63
|
+
...current,
|
|
64
|
+
...params.minStake !== void 0 && { minStake: params.minStake },
|
|
65
|
+
...params.ticketPrice !== void 0 && { ticketPrice: params.ticketPrice },
|
|
66
|
+
...params.exitFeePercent !== void 0 && { exitFeePercent: params.exitFeePercent },
|
|
67
|
+
...params.minExitFee !== void 0 && { minExitFee: params.minExitFee }
|
|
68
|
+
},
|
|
69
|
+
account: options?.account
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// ===========================================
|
|
73
|
+
// 3. Transfer to DAO (Exit/Upgrade)
|
|
74
|
+
// ===========================================
|
|
75
|
+
/**
|
|
76
|
+
* Transfer Protocol Ownership to a DAO (Multisig/Timelock)
|
|
77
|
+
* This is the final step of "Protocol Admin" lifecycle.
|
|
78
|
+
*/
|
|
79
|
+
async transferToDAO(daoAddress, options) {
|
|
80
|
+
const registry = chunkFTJD2DWE_cjs.registryActions(this.registryAddress);
|
|
81
|
+
return await registry(this.client).transferOwnership({
|
|
82
|
+
newOwner: daoAddress,
|
|
83
|
+
account: options?.account
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// ===========================================
|
|
87
|
+
// 4. Query Capabilities
|
|
88
|
+
// ===========================================
|
|
89
|
+
async getProtocolParams() {
|
|
90
|
+
const registry = chunkFTJD2DWE_cjs.registryActions(this.registryAddress)(this.client);
|
|
91
|
+
const [sp, staking] = await Promise.all([
|
|
92
|
+
registry.SUPER_PAYMASTER(),
|
|
93
|
+
registry.GTOKEN_STAKING()
|
|
94
|
+
]);
|
|
95
|
+
return {
|
|
96
|
+
minStake: 0n,
|
|
97
|
+
// Global default not directly exposed, usually per role
|
|
98
|
+
treasury: await registry.owner(),
|
|
99
|
+
// Approximation for now
|
|
100
|
+
entryPoint: this.entryPointAddress,
|
|
101
|
+
superPaymaster: sp
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
exports.ProtocolGovernance = ProtocolGovernance;
|
|
107
|
+
//# sourceMappingURL=chunk-RNHSA3LO.cjs.map
|
|
108
|
+
//# sourceMappingURL=chunk-RNHSA3LO.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../admin/src/ProtocolGovernance.ts"],"names":["BaseClient","registryActions"],"mappings":"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","file":"chunk-RNHSA3LO.cjs","sourcesContent":["import { type Address, type Hash, type Hex } from 'viem';\nimport { BaseClient, type ClientConfig, type TransactionOptions } from '@aastar/core';\nimport { registryActions, entryPointActions } from '@aastar/core'; // L2/L1 Actions\n\nexport interface ProtocolParams {\n minStake: bigint;\n treasury: Address;\n entryPoint: Address;\n superPaymaster: Address;\n}\n\n/**\n * ProtocolGovernance - L3 Pattern\n * \n * Responsibilities:\n * 1. Global Protocol Parameter Management (Registry, EntryPoint)\n * 2. High-level Governance Operations (DAO Transfer, Upgrades)\n * 3. SuperPaymaster & Module Approval\n */\nexport class ProtocolGovernance extends BaseClient {\n public registryAddress: Address;\n public entryPointAddress: Address;\n\n constructor(config: ClientConfig & { \n registryAddress: Address; \n entryPointAddress: Address \n }) {\n super(config);\n this.registryAddress = config.registryAddress;\n this.entryPointAddress = config.entryPointAddress;\n }\n\n // ===========================================\n // 1. Global Parameter Management\n // ===========================================\n\n /**\n * Update the Global Treasury Address where protocol fees are collected\n */\n async setTreasury(treasury: Address, options?: TransactionOptions): Promise<Hash> {\n // Note: Registry might not have direct setTreasury if it relies on SuperPaymaster's config.\n // Assuming Registry has ownership pointers or config pointers.\n // If Logic resides in SuperPaymaster, we would use superPaymasterActions.\n // Based on provided ABI/Actions, Registry manages Role Configs mainly.\n // Let's assume we are updating a System Role or similar global config if available,\n // OR adhering to what registryActions provides.\n \n // Checking registryActions... it has 'transferOwnership' but maybe not direct 'setTreasury' depending on version.\n // If strictly following ABI, we might need to update a specific Role Parameter (e.g. AOA/Super config).\n \n throw new Error(\"Method not mapped to RegistryABI v1. Please verify contract capabilities.\");\n }\n\n /**\n * Update the supported EntryPoint address\n */\n async updateEntryPoint(entryPoint: Address, options?: TransactionOptions): Promise<Hash> {\n // Placeholder: Real implementation depends on if Registry stores EntryPoint\n // registryActions typically provides getters. Setters usually restricted to Owner.\n // If action not available, throw standard error.\n throw new Error(\"Method not mapped to RegistryABI v1.\");\n }\n\n // ===========================================\n // 2. Role & Module Governance\n // ===========================================\n\n /**\n * Approve a new SuperPaymaster contract address\n */\n async setSuperPaymaster(paymaster: Address, options?: TransactionOptions): Promise<Hash> {\n const registry = registryActions(this.registryAddress);\n return await registry(this.client).setSuperPaymaster({\n paymaster,\n account: options?.account\n });\n }\n\n /**\n * Set the Staking contract address\n */\n async setStaking(staking: Address, options?: TransactionOptions): Promise<Hash> {\n const registry = registryActions(this.registryAddress);\n return await registry(this.client).setStaking({\n staking,\n account: options?.account\n });\n }\n\n /**\n * Configure a Role's parameters (Admin only).\n * Reads the current on-chain config first, then merges the provided overrides\n * and writes back the full struct via configureRole.\n */\n async configureRole(params: {\n roleId: Hex;\n minStake?: bigint;\n ticketPrice?: bigint;\n exitFeePercent?: bigint;\n minExitFee?: bigint;\n }, options?: TransactionOptions): Promise<Hash> {\n const registry = registryActions(this.registryAddress)(this.client);\n const current = await registry.getRoleConfig({ roleId: params.roleId });\n return await (registry as any).configureRole({\n roleId: params.roleId,\n config: {\n ...current,\n ...(params.minStake !== undefined && { minStake: params.minStake }),\n ...(params.ticketPrice !== undefined && { ticketPrice: params.ticketPrice }),\n ...(params.exitFeePercent !== undefined && { exitFeePercent: params.exitFeePercent }),\n ...(params.minExitFee !== undefined && { minExitFee: params.minExitFee }),\n },\n account: options?.account,\n });\n }\n\n // ===========================================\n // 3. Transfer to DAO (Exit/Upgrade)\n // ===========================================\n\n /**\n * Transfer Protocol Ownership to a DAO (Multisig/Timelock)\n * This is the final step of \"Protocol Admin\" lifecycle.\n */\n async transferToDAO(daoAddress: Address, options?: TransactionOptions): Promise<Hash> {\n const registry = registryActions(this.registryAddress);\n return await registry(this.client).transferOwnership({\n newOwner: daoAddress,\n account: options?.account\n });\n }\n\n // ===========================================\n // 4. Query Capabilities\n // ===========================================\n\n async getProtocolParams(): Promise<ProtocolParams> {\n const registry = registryActions(this.registryAddress)(this.client); // Read-only via Client\n \n // Parallel fetch\n const [sp, staking] = await Promise.all([\n registry.SUPER_PAYMASTER(),\n registry.GTOKEN_STAKING()\n ]);\n\n return {\n minStake: 0n, // Global default not directly exposed, usually per role\n treasury: await registry.owner(), // Approximation for now\n entryPoint: this.entryPointAddress,\n superPaymaster: sp\n };\n }\n}\n"]}
|