@ashlar-blue/x402-trust 0.5.91 → 0.5.92
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 +1 -1
- package/README.md +1 -1
- package/dist/agent-switchboard.d.ts +1 -1
- package/dist/agent-switchboard.js +2 -2
- package/dist/agent-switchboard.js.map +1 -1
- package/dist/attested-directory.js +1 -1
- package/dist/attested-directory.js.map +1 -1
- package/dist/badges.js +1 -1
- package/dist/badges.js.map +1 -1
- package/dist/catalog-mcp.d.ts +1 -1
- package/dist/catalog-mcp.js +4 -4
- package/dist/catalog-mcp.js.map +1 -1
- package/dist/census-reconcile.js +1 -1
- package/dist/census-reconcile.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/client-core.d.ts +233 -0
- package/dist/client-core.d.ts.map +1 -0
- package/dist/client-core.js +431 -0
- package/dist/client-core.js.map +1 -0
- package/dist/directory-classify.js +1 -1
- package/dist/directory-classify.js.map +1 -1
- package/dist/discovery.d.ts +6 -0
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +29 -10
- package/dist/discovery.js.map +1 -1
- package/dist/dynamic-discovery.js +1 -1
- package/dist/dynamic-discovery.js.map +1 -1
- package/dist/evidence-ref.js +1 -1
- package/dist/evidence-ref.js.map +1 -1
- package/dist/facilitator-config.d.ts +1 -1
- package/dist/facilitator-config.js +2 -2
- package/dist/facilitator-config.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/institutional-gate.d.ts +72 -0
- package/dist/institutional-gate.d.ts.map +1 -0
- package/dist/institutional-gate.js +240 -0
- package/dist/institutional-gate.js.map +1 -0
- package/dist/institutional-onboarding.d.ts +86 -0
- package/dist/institutional-onboarding.d.ts.map +1 -0
- package/dist/institutional-onboarding.js +278 -0
- package/dist/institutional-onboarding.js.map +1 -0
- package/dist/isda-cdm.js +1 -1
- package/dist/isda-cdm.js.map +1 -1
- package/dist/manifest-sig.d.ts +1 -1
- package/dist/manifest-sig.js +2 -2
- package/dist/manifest-sig.js.map +1 -1
- package/dist/mcp-server.js +2 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/merkle-transcript.js +1 -1
- package/dist/merkle-transcript.js.map +1 -1
- package/dist/open-catalog.js +1 -1
- package/dist/open-catalog.js.map +1 -1
- package/dist/reconcile.js +1 -1
- package/dist/reconcile.js.map +1 -1
- package/dist/trust-sdk.d.ts +3 -2
- package/dist/trust-sdk.d.ts.map +1 -1
- package/dist/trust-sdk.js +5 -3
- package/dist/trust-sdk.js.map +1 -1
- package/dist/types.d.ts +7 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -3
- package/dist/types.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
// GENERATED from src/x402/client-core.ts by scripts/sdk/sync-sdk.ts — do not edit here.
|
|
2
|
+
// The canonical module is the one Ashlar Blue runs in production; this is a copy so
|
|
3
|
+
// that what we publish and what we run cannot diverge. Edit the canonical file.
|
|
4
|
+
/**
|
|
5
|
+
* Ashlar Blue — Official Thin-Client SDK (`AshlarClient`)
|
|
6
|
+
*
|
|
7
|
+
* Provides unified, zero-dependency access to:
|
|
8
|
+
* 1. Pre-flight trust verification (`checkService`, `safeToPay`)
|
|
9
|
+
* 2. Automated RFC 9110 HTTP 402 caller-pays execution
|
|
10
|
+
* 3. Client-side agent spend mandates & budget vouchers
|
|
11
|
+
* 4. IETF SCITT notary calldata parsing & Merkle receipts
|
|
12
|
+
* 5. Audit transcripts & offline inclusion proofs
|
|
13
|
+
*
|
|
14
|
+
* Copyright (c) 2026 Corrente Labs, Inc. All rights reserved.
|
|
15
|
+
* Licensed under the Apache License, Version 2.0.
|
|
16
|
+
*/
|
|
17
|
+
import { Buffer } from 'node:buffer';
|
|
18
|
+
import { createHash, createHmac, randomBytes } from 'node:crypto';
|
|
19
|
+
import { checkService, verifyReceipt, verifyDirectoryEntry, verifyReconcileRow, Transcript, } from './trust-sdk.js';
|
|
20
|
+
import { resolveX402, } from './discovery.js';
|
|
21
|
+
import { encodeEvidenceRef, parseEvidenceRef } from './evidence-ref.js';
|
|
22
|
+
import { ASHLAR_INSTITUTIONAL_CONFIG, } from './institutional-gate.js';
|
|
23
|
+
import { isRetailEmailDomain, } from './institutional-onboarding.js';
|
|
24
|
+
export class PaymentRequiredError extends Error {
|
|
25
|
+
challenge;
|
|
26
|
+
response;
|
|
27
|
+
constructor(message, challenge, response) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.challenge = challenge;
|
|
30
|
+
this.response = response;
|
|
31
|
+
this.name = 'PaymentRequiredError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class InstitutionalAccessRequiredError extends Error {
|
|
35
|
+
response;
|
|
36
|
+
details;
|
|
37
|
+
statusCode = 403;
|
|
38
|
+
policy = 'INSTITUTIONAL_ONLY_TIER';
|
|
39
|
+
acceptedCredentials = [
|
|
40
|
+
'XRPL_SOULBOUND_NFTOKEN_XLS20',
|
|
41
|
+
'FLARE_ATTESTED_CREDENTIAL_GATE_NFT',
|
|
42
|
+
'INTEL_TDX_MRENCLAVE_LEI_QUOTE',
|
|
43
|
+
'ISDA_WHOLESALE_QIB_TOKEN',
|
|
44
|
+
];
|
|
45
|
+
onboardingUrl = 'https://ashlar.blue/compliance.html';
|
|
46
|
+
constructor(message = 'Ashlar Blue is strictly institutional infrastructure. Retail and commercial traffic without an attested Ashlar Institutional Credential NFT or ISDA wholesale license is refused.', response, details) {
|
|
47
|
+
super(message);
|
|
48
|
+
this.response = response;
|
|
49
|
+
this.details = details;
|
|
50
|
+
this.name = 'InstitutionalAccessRequiredError';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// ──────────────────── ASHLAR CLIENT CLASS ────────────────────
|
|
54
|
+
export class AshlarClient {
|
|
55
|
+
baseUrl;
|
|
56
|
+
apiKey;
|
|
57
|
+
privateKey;
|
|
58
|
+
signerFn;
|
|
59
|
+
credential;
|
|
60
|
+
defaultRail;
|
|
61
|
+
timeoutMs;
|
|
62
|
+
fetchFn;
|
|
63
|
+
constructor(options = {}) {
|
|
64
|
+
this.baseUrl = (options.baseUrl || 'https://api.ashlar.blue').replace(/\/+$/, '');
|
|
65
|
+
this.apiKey = options.apiKey || (typeof process !== 'undefined' ? process.env?.ASHLAR_API_KEY : undefined);
|
|
66
|
+
this.privateKey = options.privateKey || (typeof process !== 'undefined' ? process.env?.ASHLAR_PRIVATE_KEY : undefined);
|
|
67
|
+
this.signerFn = options.signer;
|
|
68
|
+
this.credential = options.credential || (typeof process !== 'undefined' ? process.env?.ASHLAR_CREDENTIAL : undefined);
|
|
69
|
+
this.defaultRail = options.defaultRail || 'eip155:8453';
|
|
70
|
+
this.timeoutMs = options.timeoutMs || 15_000;
|
|
71
|
+
this.fetchFn = options.fetch || globalThis.fetch.bind(globalThis);
|
|
72
|
+
}
|
|
73
|
+
// ──────────────────── INSTITUTIONAL ONBOARDING & TURNSTILE ────────────────────
|
|
74
|
+
onboard = {
|
|
75
|
+
/**
|
|
76
|
+
* Submit a formal institutional onboarding application.
|
|
77
|
+
* Strictly blocks retail emails and requires ISO 17442 Legal Entity Identifier (LEI).
|
|
78
|
+
*/
|
|
79
|
+
apply: async (req) => {
|
|
80
|
+
if (isRetailEmailDomain(req.officialEmail)) {
|
|
81
|
+
throw new InstitutionalAccessRequiredError('Ashlar Blue is strictly institutional infrastructure. Retail email domains (@gmail, @yahoo, etc.) are prohibited.');
|
|
82
|
+
}
|
|
83
|
+
const res = await this.fetchFn(`${this.baseUrl}/onboarding/apply`, {
|
|
84
|
+
method: 'POST',
|
|
85
|
+
headers: { 'Content-Type': 'application/json' },
|
|
86
|
+
body: JSON.stringify(req),
|
|
87
|
+
});
|
|
88
|
+
return res.json();
|
|
89
|
+
},
|
|
90
|
+
/**
|
|
91
|
+
* Issue an approved soulbound credential NFT once vetted by institutional compliance.
|
|
92
|
+
*/
|
|
93
|
+
issue: async (ticketId) => {
|
|
94
|
+
const res = await this.fetchFn(`${this.baseUrl}/onboarding/issue`, {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
headers: { 'Content-Type': 'application/json' },
|
|
97
|
+
body: JSON.stringify({ ticketId }),
|
|
98
|
+
});
|
|
99
|
+
return res.json();
|
|
100
|
+
},
|
|
101
|
+
/**
|
|
102
|
+
* Check the status of a pending institutional intake ticket.
|
|
103
|
+
*/
|
|
104
|
+
getStatus: async (ticketId) => {
|
|
105
|
+
const res = await this.fetchFn(`${this.baseUrl}/onboarding/status/${encodeURIComponent(ticketId)}`, {
|
|
106
|
+
method: 'GET',
|
|
107
|
+
});
|
|
108
|
+
return res.json();
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
// ──────────────────── TRUST & VERIFICATION NAMESPACE ────────────────────
|
|
112
|
+
trust = {
|
|
113
|
+
/**
|
|
114
|
+
* Pre-flight trust probe: resolves domain manifest, checks same-origin attestation,
|
|
115
|
+
* executes live /supported parity probe, and returns an authoritative safeToPay verdict.
|
|
116
|
+
*/
|
|
117
|
+
checkService: async (domain, options) => {
|
|
118
|
+
return checkService(domain, options);
|
|
119
|
+
},
|
|
120
|
+
/**
|
|
121
|
+
* Resolves the canonical x402 discovery manifest via DNS TXT or /.well-known/x402.
|
|
122
|
+
*/
|
|
123
|
+
resolveX402: async (domain, options) => {
|
|
124
|
+
return resolveX402(domain, options);
|
|
125
|
+
},
|
|
126
|
+
/**
|
|
127
|
+
* Offline Merkle inclusion verification (RFC 6962). Proves that an entry exists
|
|
128
|
+
* within a signed root with zero trust in third parties.
|
|
129
|
+
*/
|
|
130
|
+
verifyReceipt: (proof) => {
|
|
131
|
+
return verifyReceipt(proof);
|
|
132
|
+
},
|
|
133
|
+
/**
|
|
134
|
+
* Verifies an entry within an attested platform directory census root.
|
|
135
|
+
*/
|
|
136
|
+
verifyDirectoryEntry: (entry, index, size, proof, outputRoot) => {
|
|
137
|
+
return verifyDirectoryEntry(entry, index, size, proof, outputRoot);
|
|
138
|
+
},
|
|
139
|
+
/**
|
|
140
|
+
* Verifies a single reconciliation audit row against a signed census root.
|
|
141
|
+
*/
|
|
142
|
+
verifyReconcileRow: (row, index, size, proof, rowsRoot) => {
|
|
143
|
+
return verifyReconcileRow(row, index, size, proof, rowsRoot);
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
// ──────────────────── TRANSCRIPTS & AUDIT PROOFS ────────────────────
|
|
147
|
+
/**
|
|
148
|
+
* Creates an append-only audit transcript accumulator for session work verification.
|
|
149
|
+
*/
|
|
150
|
+
createTranscript() {
|
|
151
|
+
return new Transcript();
|
|
152
|
+
}
|
|
153
|
+
// ──────────────────── NOTARY & SCITT PROOFS ────────────────────
|
|
154
|
+
notary = {
|
|
155
|
+
/**
|
|
156
|
+
* Validates a SHA-256 digest string ("sha256:<64 hex chars>").
|
|
157
|
+
*/
|
|
158
|
+
parseDigest: (input) => {
|
|
159
|
+
if (typeof input !== 'string')
|
|
160
|
+
throw new Error('digest must be string of form sha256:<64 hex>');
|
|
161
|
+
const d = input.trim();
|
|
162
|
+
if (!/^sha256:[0-9a-f]{64}$/.test(d)) {
|
|
163
|
+
throw new Error('digest must be exactly "sha256:" + 64 lowercase hex chars');
|
|
164
|
+
}
|
|
165
|
+
return d;
|
|
166
|
+
},
|
|
167
|
+
/**
|
|
168
|
+
* Formats canonical IETF SCITT / x402 notary anchor calldata ("x402note/1;sha256:...;for=0x...").
|
|
169
|
+
*/
|
|
170
|
+
formatCalldata: (digest, payer) => {
|
|
171
|
+
const d = this.notary.parseDigest(digest);
|
|
172
|
+
const p = payer.toLowerCase();
|
|
173
|
+
if (!/^0x[0-9a-f]{40}$/.test(p))
|
|
174
|
+
throw new Error('payer must be 20-byte hex address');
|
|
175
|
+
return `x402note/1;${d};for=${p}`;
|
|
176
|
+
},
|
|
177
|
+
/**
|
|
178
|
+
* Parses and verifies notary anchor calldata string.
|
|
179
|
+
*/
|
|
180
|
+
parseCalldata: (data) => {
|
|
181
|
+
const parts = data.split(';');
|
|
182
|
+
if (parts.length !== 3 || parts[0] !== 'x402note/1')
|
|
183
|
+
return null;
|
|
184
|
+
if (!/^sha256:[0-9a-f]{64}$/.test(parts[1]))
|
|
185
|
+
return null;
|
|
186
|
+
const forMatch = /^for=(0x[0-9a-f]{40})$/.exec(parts[2]);
|
|
187
|
+
if (!forMatch)
|
|
188
|
+
return null;
|
|
189
|
+
return { digest: parts[1], payer: forMatch[1] };
|
|
190
|
+
},
|
|
191
|
+
/**
|
|
192
|
+
* Formats portable evidence reference string (x402ev/1).
|
|
193
|
+
*/
|
|
194
|
+
formatEvidenceRef: (ref) => {
|
|
195
|
+
return encodeEvidenceRef(ref);
|
|
196
|
+
},
|
|
197
|
+
/**
|
|
198
|
+
* Parses portable evidence reference string (x402ev/1).
|
|
199
|
+
*/
|
|
200
|
+
parseEvidenceRef: (s) => {
|
|
201
|
+
return parseEvidenceRef(s);
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
// ──────────────────── AGENT SPEND MANDATES ────────────────────
|
|
205
|
+
mandates = {
|
|
206
|
+
/**
|
|
207
|
+
* Computes canonical deterministic SHA-256 digest for a mandate voucher.
|
|
208
|
+
*/
|
|
209
|
+
computeVoucherDigest: (params) => {
|
|
210
|
+
const canonical = JSON.stringify({
|
|
211
|
+
amount: params.amount,
|
|
212
|
+
currency: params.currency || 'USD',
|
|
213
|
+
mandateId: params.mandateId,
|
|
214
|
+
nonce: params.nonce || '0',
|
|
215
|
+
payer: params.payer.toLowerCase(),
|
|
216
|
+
recipient: params.recipient.toLowerCase(),
|
|
217
|
+
validUntil: params.validUntil,
|
|
218
|
+
});
|
|
219
|
+
return createHash('sha256').update(canonical).digest('hex');
|
|
220
|
+
},
|
|
221
|
+
/**
|
|
222
|
+
* Creates a signed agent spending voucher bounded by a mandate leash.
|
|
223
|
+
*/
|
|
224
|
+
signVoucher: (params, secretKey) => {
|
|
225
|
+
const key = secretKey || this.privateKey;
|
|
226
|
+
if (!key) {
|
|
227
|
+
throw new Error('Signing a mandate voucher requires a privateKey in client options or parameter');
|
|
228
|
+
}
|
|
229
|
+
const nonce = params.nonce || randomBytes(16).toString('hex');
|
|
230
|
+
const voucherParams = { ...params, nonce };
|
|
231
|
+
const digest = this.mandates.computeVoucherDigest(voucherParams);
|
|
232
|
+
const signature = createHmac('sha256', key).update(digest).digest('hex');
|
|
233
|
+
return {
|
|
234
|
+
...voucherParams,
|
|
235
|
+
digest,
|
|
236
|
+
signature,
|
|
237
|
+
};
|
|
238
|
+
},
|
|
239
|
+
/**
|
|
240
|
+
* Verifies a signed agent spending voucher offline.
|
|
241
|
+
*/
|
|
242
|
+
verifyVoucher: (voucher, secretKey, nowSeconds) => {
|
|
243
|
+
const key = secretKey || this.privateKey;
|
|
244
|
+
if (!key)
|
|
245
|
+
return false;
|
|
246
|
+
const now = nowSeconds !== undefined ? nowSeconds : Math.floor(Date.now() / 1000);
|
|
247
|
+
if (voucher.validUntil < now)
|
|
248
|
+
return false;
|
|
249
|
+
const expectedDigest = this.mandates.computeVoucherDigest(voucher);
|
|
250
|
+
if (voucher.digest !== expectedDigest)
|
|
251
|
+
return false;
|
|
252
|
+
const expectedSignature = createHmac('sha256', key).update(expectedDigest).digest('hex');
|
|
253
|
+
return voucher.signature === expectedSignature;
|
|
254
|
+
},
|
|
255
|
+
/**
|
|
256
|
+
* Creates a structured mandate envelope bounding an agent's authority.
|
|
257
|
+
*/
|
|
258
|
+
createEnvelope: (params) => {
|
|
259
|
+
const envelopeId = `mnd_${randomBytes(12).toString('hex')}`;
|
|
260
|
+
const createdAt = Math.floor(Date.now() / 1000);
|
|
261
|
+
const allowedRecipients = params.allowedRecipients ? params.allowedRecipients.map(r => r.toLowerCase()) : ['*'];
|
|
262
|
+
const allowedRails = params.allowedRails || ['eip155:8453'];
|
|
263
|
+
const principalId = params.principalId.toLowerCase();
|
|
264
|
+
const canonical = JSON.stringify({
|
|
265
|
+
allowedRails,
|
|
266
|
+
allowedRecipients,
|
|
267
|
+
createdAt,
|
|
268
|
+
currency: params.currency,
|
|
269
|
+
envelopeId,
|
|
270
|
+
maxSpend: params.maxSpend,
|
|
271
|
+
principalId,
|
|
272
|
+
validUntil: params.validUntil,
|
|
273
|
+
});
|
|
274
|
+
const digest = createHash('sha256').update(canonical).digest('hex');
|
|
275
|
+
return {
|
|
276
|
+
...params,
|
|
277
|
+
principalId,
|
|
278
|
+
allowedRecipients,
|
|
279
|
+
allowedRails,
|
|
280
|
+
envelopeId,
|
|
281
|
+
createdAt,
|
|
282
|
+
digest,
|
|
283
|
+
};
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
// ──────────────────── AUTONOMOUS CALLER-PAYS HTTP 402 CLIENT ────────────────────
|
|
287
|
+
/**
|
|
288
|
+
* Executes a fetch request with automated RFC 9110 HTTP 402 challenge negotiation.
|
|
289
|
+
* If the endpoint requires payment, the client inspects requirements, validates safety bounds,
|
|
290
|
+
* signs the authorization payload via local signer, and re-dispatches with payment headers.
|
|
291
|
+
*/
|
|
292
|
+
async fetchWithPayment(input, init, options = {}) {
|
|
293
|
+
// Prepare initial headers including institutional credentials
|
|
294
|
+
const initialHeaders = new Headers(init?.headers || {});
|
|
295
|
+
const cred = options.credential || this.credential;
|
|
296
|
+
if (cred) {
|
|
297
|
+
const credStr = typeof cred === 'string' ? cred : JSON.stringify(cred);
|
|
298
|
+
if (!initialHeaders.has('X-Ashlar-Credential-NFT')) {
|
|
299
|
+
initialHeaders.set('X-Ashlar-Credential-NFT', credStr);
|
|
300
|
+
}
|
|
301
|
+
if (!initialHeaders.has('X-Institutional-Token')) {
|
|
302
|
+
initialHeaders.set('X-Institutional-Token', credStr);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
if (this.apiKey && !initialHeaders.has('Authorization')) {
|
|
306
|
+
initialHeaders.set('Authorization', `Bearer ${this.apiKey}`);
|
|
307
|
+
}
|
|
308
|
+
// Initial request
|
|
309
|
+
const res = await this.fetchFn(input, { ...init, headers: initialHeaders });
|
|
310
|
+
// Institutional Credential Gate refusal check (HTTP 403)
|
|
311
|
+
if (res.status === 403) {
|
|
312
|
+
let errorJson = null;
|
|
313
|
+
try {
|
|
314
|
+
errorJson = await res.clone().json();
|
|
315
|
+
}
|
|
316
|
+
catch { /* not json */ }
|
|
317
|
+
if (errorJson?.error === 'INSTITUTIONAL_CREDENTIAL_REQUIRED' || errorJson?.compliancePolicy === 'INSTITUTIONAL_ONLY_TIER') {
|
|
318
|
+
throw new InstitutionalAccessRequiredError(errorJson.message || ASHLAR_INSTITUTIONAL_CONFIG.POLICY_DISCLAIMER, res, errorJson);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Not a 402? Return response directly
|
|
322
|
+
if (res.status !== 402) {
|
|
323
|
+
return { response: res };
|
|
324
|
+
}
|
|
325
|
+
// Parse 402 Payment Required Challenge
|
|
326
|
+
const challenge = await this.parse402Challenge(res);
|
|
327
|
+
if (!challenge.accepts || challenge.accepts.length === 0) {
|
|
328
|
+
throw new PaymentRequiredError('Received HTTP 402 Payment Required without valid payment options', challenge, res);
|
|
329
|
+
}
|
|
330
|
+
// Match preferred rail or default rail
|
|
331
|
+
const targetRail = options.network || this.defaultRail;
|
|
332
|
+
const requirement = challenge.accepts.find(a => a.network === targetRail) || challenge.accepts[0];
|
|
333
|
+
// Check safety constraints
|
|
334
|
+
if (options.expectPayTo && requirement.payTo.toLowerCase() !== options.expectPayTo.toLowerCase()) {
|
|
335
|
+
throw new Error(`Payment safety check failed: payTo ${requirement.payTo} does not match expected ${options.expectPayTo}`);
|
|
336
|
+
}
|
|
337
|
+
if (options.expectAsset && requirement.asset.toLowerCase() !== options.expectAsset.toLowerCase()) {
|
|
338
|
+
throw new Error(`Payment safety check failed: asset ${requirement.asset} does not match expected ${options.expectAsset}`);
|
|
339
|
+
}
|
|
340
|
+
if (options.maxAtomicAmount !== undefined) {
|
|
341
|
+
const max = BigInt(options.maxAtomicAmount);
|
|
342
|
+
const reqAmount = BigInt(requirement.amount);
|
|
343
|
+
if (reqAmount > max) {
|
|
344
|
+
throw new Error(`Payment safety check failed: required amount ${reqAmount} exceeds maximum budget ${max}`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// Produce payment authorization signature
|
|
348
|
+
let signature = '';
|
|
349
|
+
if (this.signerFn) {
|
|
350
|
+
signature = await this.signerFn({
|
|
351
|
+
network: requirement.network,
|
|
352
|
+
amount: requirement.amount,
|
|
353
|
+
asset: requirement.asset,
|
|
354
|
+
payTo: requirement.payTo,
|
|
355
|
+
challenge,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
else if (this.privateKey) {
|
|
359
|
+
// Local deterministic voucher signature
|
|
360
|
+
const payload = `${requirement.network}:${requirement.asset}:${requirement.payTo}:${requirement.amount}`;
|
|
361
|
+
signature = createHmac('sha256', this.privateKey).update(payload).digest('hex');
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
// No signer provided
|
|
365
|
+
throw new PaymentRequiredError(`Payment required: ${requirement.amount} on ${requirement.network} (asset: ${requirement.asset}, payTo: ${requirement.payTo}). Provide privateKey or signer to automate payment.`, challenge, res);
|
|
366
|
+
}
|
|
367
|
+
// Construct payment payload header
|
|
368
|
+
const paymentHeaderJson = JSON.stringify({
|
|
369
|
+
x402Version: challenge.x402Version || 2,
|
|
370
|
+
network: requirement.network,
|
|
371
|
+
asset: requirement.asset,
|
|
372
|
+
amount: requirement.amount,
|
|
373
|
+
payTo: requirement.payTo,
|
|
374
|
+
signature,
|
|
375
|
+
});
|
|
376
|
+
const paymentHeaderB64 = Buffer.from(paymentHeaderJson, 'utf-8').toString('base64');
|
|
377
|
+
// Re-dispatch with dual payment headers (v1 X-PAYMENT and v2 payment-signature)
|
|
378
|
+
const retryHeaders = new Headers(initialHeaders);
|
|
379
|
+
retryHeaders.set('X-PAYMENT', paymentHeaderB64);
|
|
380
|
+
retryHeaders.set('payment-signature', paymentHeaderB64);
|
|
381
|
+
retryHeaders.set('Payment-Signature', signature);
|
|
382
|
+
const retryInit = {
|
|
383
|
+
...init,
|
|
384
|
+
headers: retryHeaders,
|
|
385
|
+
};
|
|
386
|
+
const retryRes = await this.fetchFn(input, retryInit);
|
|
387
|
+
return {
|
|
388
|
+
response: retryRes,
|
|
389
|
+
paid: {
|
|
390
|
+
network: requirement.network,
|
|
391
|
+
amount: requirement.amount,
|
|
392
|
+
asset: requirement.asset,
|
|
393
|
+
payTo: requirement.payTo,
|
|
394
|
+
signature,
|
|
395
|
+
},
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Parses an HTTP 402 response into a canonical PaymentChallenge object.
|
|
400
|
+
*/
|
|
401
|
+
async parse402Challenge(response) {
|
|
402
|
+
// 1. Check PAYMENT-REQUIRED header (Coinbase x402 v2 Base64 format)
|
|
403
|
+
const header = response.headers.get('PAYMENT-REQUIRED') || response.headers.get('payment-required');
|
|
404
|
+
if (header) {
|
|
405
|
+
try {
|
|
406
|
+
const decoded = Buffer.from(header, 'base64').toString('utf-8');
|
|
407
|
+
return JSON.parse(decoded);
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
try {
|
|
411
|
+
return JSON.parse(header);
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
// Fall through to body
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// 2. Check JSON response body
|
|
419
|
+
try {
|
|
420
|
+
const body = await response.clone().json();
|
|
421
|
+
if (body && typeof body === 'object') {
|
|
422
|
+
return body;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
// Body is not JSON
|
|
427
|
+
}
|
|
428
|
+
return { error: 'Could not parse HTTP 402 payment requirements' };
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=client-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-core.js","sourceRoot":"","sources":["../src/client-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// GENERATED from src/x402/directory-classify.ts by scripts/sdk/sync-sdk.ts — do not edit here.
|
|
2
|
-
// The canonical module is the one
|
|
2
|
+
// The canonical module is the one Ashlar Blue runs in production; this is a copy so
|
|
3
3
|
// that what we publish and what we run cannot diverge. Edit the canonical file.
|
|
4
4
|
/** A TXT answer with at least one non-blank string. `[]` and `[""]` are empty. */
|
|
5
5
|
export function hasContent(a) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory-classify.js","sourceRoot":"","sources":["../src/directory-classify.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,
|
|
1
|
+
{"version":3,"file":"directory-classify.js","sourceRoot":"","sources":["../src/directory-classify.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,oFAAoF;AACpF,gFAAgF;AAkChF,kFAAkF;AAClF,MAAM,UAAU,UAAU,CAAC,CAAkB;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW;IACxC,0EAA0E;IAC1E,uEAAuE;IACvE,uDAAuD;IACvD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACH,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC,yBAAyB;SACtG,CAAC;IACN,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO;YACH,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,0DAA0D;SACrE,CAAC;IACN,CAAC;IACD,wEAAwE;IACxE,qEAAqE;IACrE,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO;QACH,MAAM,EAAE,CAAC,CAAC,IAAI;QACd,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,cAAc;QAC1D,MAAM,EAAE,MAAM;YACV,CAAC,CAAC,uDAAuD;YACzD,CAAC,CAAC,wCAAwC;QAC9C,MAAM,EAAE,GAAG;KACd,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC"}
|
package/dist/discovery.d.ts
CHANGED
|
@@ -225,6 +225,10 @@ export interface ResolveResult {
|
|
|
225
225
|
manifestUrl: string;
|
|
226
226
|
via: 'dns-txt' | 'well-known';
|
|
227
227
|
txtRecord?: X402TxtRecord;
|
|
228
|
+
/** RFC 9110 ETag header if served by host. */
|
|
229
|
+
etag?: string;
|
|
230
|
+
/** True if server returned HTTP 304 Not Modified based on supplied ifNoneMatch. */
|
|
231
|
+
notModified?: boolean;
|
|
228
232
|
/** Live GET {baseUrl}{endpoints.supported} result (authoritative over manifest kinds). */
|
|
229
233
|
liveKinds?: SupportedKind[];
|
|
230
234
|
/** True when live kinds and manifest kinds agree (spec: divergence = misconfiguration). */
|
|
@@ -296,6 +300,8 @@ export declare function resolveX402(domain: string, opts?: {
|
|
|
296
300
|
lookupImpl?: LookupImpl;
|
|
297
301
|
/** Skip the negative cache for this call (forced refresh). */
|
|
298
302
|
noCache?: boolean;
|
|
303
|
+
/** Send If-None-Match header for RFC 9110 conditional revalidation. */
|
|
304
|
+
ifNoneMatch?: string;
|
|
299
305
|
/** Override negative TTLs (tests, aggressive crawlers). */
|
|
300
306
|
negativeTtlMs?: Partial<Record<NegativeReason, number>>;
|
|
301
307
|
/** Injectable clock so TTL expiry is testable without waiting. */
|
package/dist/discovery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/discovery.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// GENERATED from src/x402/discovery.ts by scripts/sdk/sync-sdk.ts — do not edit here.
|
|
2
|
-
// The canonical module is the one
|
|
2
|
+
// The canonical module is the one Ashlar Blue runs in production; this is a copy so
|
|
3
3
|
// that what we publish and what we run cannot diverge. Edit the canonical file.
|
|
4
4
|
// ──────────────────── TXT record grammar ────────────────────
|
|
5
5
|
const TXT_VERSION = 'x402-1';
|
|
@@ -207,8 +207,8 @@ export function isWkInDomain(wkUrl, domain) {
|
|
|
207
207
|
// `_x402.<domain>` and never says which domain a consumer holding a RESOURCE
|
|
208
208
|
// URL should ask for. A census of 1,609 hosts on 2026-08-22 asked
|
|
209
209
|
// `_x402.<exact-host>` and recorded the draft's own author as a non-publisher:
|
|
210
|
-
// our record is at the apex `
|
|
211
|
-
// subdomain `api.
|
|
210
|
+
// our record is at the apex `ashlar.blue` with `wk=` pointing at the
|
|
211
|
+
// subdomain `api.ashlar.blue`. Publishing at the apex is the natural choice
|
|
212
212
|
// for an operator with one DNS zone and several service hosts, and the naive
|
|
213
213
|
// reading makes them invisible.
|
|
214
214
|
//
|
|
@@ -217,7 +217,7 @@ export function isWkInDomain(wkUrl, domain) {
|
|
|
217
217
|
// belongs to the PLATFORM, not the tenant, and one record there would make
|
|
218
218
|
// every tenant beneath it discoverable — including tenants who never published
|
|
219
219
|
// anything, and including hosts that do not exist. Our own control demonstrates
|
|
220
|
-
// it: `zzq-...-9931.
|
|
220
|
+
// it: `zzq-...-9931.ashlar.blue` inherits our apex record.
|
|
221
221
|
//
|
|
222
222
|
// A public-suffix list would answer "is this ancestor an operator or a
|
|
223
223
|
// platform", and we deliberately do NOT use one: it is a mutable external
|
|
@@ -567,12 +567,18 @@ async function defaultLookup(hostname) {
|
|
|
567
567
|
* strangers, so an unbounded read is a denial-of-service handed to
|
|
568
568
|
* anyone who publishes a TXT record.
|
|
569
569
|
*/
|
|
570
|
-
async function fetchBounded(url, fetchImpl) {
|
|
570
|
+
async function fetchBounded(url, fetchImpl, ifNoneMatch) {
|
|
571
|
+
const headers = { Accept: 'application/json' };
|
|
572
|
+
if (ifNoneMatch) {
|
|
573
|
+
headers['If-None-Match'] = ifNoneMatch;
|
|
574
|
+
}
|
|
571
575
|
const res = await fetchImpl(url, {
|
|
572
|
-
headers
|
|
576
|
+
headers,
|
|
573
577
|
redirect: 'manual',
|
|
574
578
|
signal: AbortSignal.timeout(MANIFEST_TIMEOUT_MS),
|
|
575
579
|
});
|
|
580
|
+
if (res.status === 304)
|
|
581
|
+
return { res, body: undefined };
|
|
576
582
|
if (res.status >= 300 && res.status < 400)
|
|
577
583
|
return { res, body: undefined };
|
|
578
584
|
if (!res.ok)
|
|
@@ -748,10 +754,10 @@ export async function resolveX402(domain, opts) {
|
|
|
748
754
|
let res;
|
|
749
755
|
try {
|
|
750
756
|
await guard(manifestUrl);
|
|
751
|
-
fetched = await fetchBounded(manifestUrl, fetchImpl);
|
|
757
|
+
fetched = await fetchBounded(manifestUrl, fetchImpl, opts?.ifNoneMatch);
|
|
752
758
|
res = fetched.res;
|
|
753
|
-
for (let hop = 0; res.status >= 300 && res.status < 400 && hop < MAX_MANIFEST_REDIRECTS; hop++) {
|
|
754
|
-
const location = res.headers
|
|
759
|
+
for (let hop = 0; res.status >= 300 && res.status < 400 && res.status !== 304 && hop < MAX_MANIFEST_REDIRECTS; hop++) {
|
|
760
|
+
const location = res.headers?.get?.('location');
|
|
755
761
|
if (!location)
|
|
756
762
|
break;
|
|
757
763
|
const nextUrl = new URL(location, manifestUrl);
|
|
@@ -768,7 +774,7 @@ export async function resolveX402(domain, opts) {
|
|
|
768
774
|
}
|
|
769
775
|
manifestUrl = next; // report where the bytes ACTUALLY came from
|
|
770
776
|
await guard(manifestUrl); // every hop — a public host redirecting inward is the classic bypass
|
|
771
|
-
fetched = await fetchBounded(manifestUrl, fetchImpl);
|
|
777
|
+
fetched = await fetchBounded(manifestUrl, fetchImpl, opts?.ifNoneMatch);
|
|
772
778
|
res = fetched.res;
|
|
773
779
|
}
|
|
774
780
|
}
|
|
@@ -783,6 +789,17 @@ export async function resolveX402(domain, opts) {
|
|
|
783
789
|
return failWith('invalid', e);
|
|
784
790
|
return failWith('unreachable', e);
|
|
785
791
|
}
|
|
792
|
+
if (res.status === 304) {
|
|
793
|
+
return {
|
|
794
|
+
manifest: null,
|
|
795
|
+
manifestUrl,
|
|
796
|
+
via,
|
|
797
|
+
notModified: true,
|
|
798
|
+
etag: res.headers?.get?.('etag') || opts?.ifNoneMatch,
|
|
799
|
+
liveCheck: 'skipped',
|
|
800
|
+
...(txtRecord ? { txtRecord } : {}),
|
|
801
|
+
};
|
|
802
|
+
}
|
|
786
803
|
if (res.status >= 300 && res.status < 400) {
|
|
787
804
|
failWith('invalid', new Error(`[x402-discovery] too many manifest redirects for ${domain}`));
|
|
788
805
|
}
|
|
@@ -854,8 +871,10 @@ export async function resolveX402(domain, opts) {
|
|
|
854
871
|
if (manifest.peers !== undefined) {
|
|
855
872
|
manifest.peers = peerScan.peers;
|
|
856
873
|
}
|
|
874
|
+
const etag = res.headers?.get?.('etag') || undefined;
|
|
857
875
|
const out = {
|
|
858
876
|
manifest, manifestUrl, via, attestationUsable,
|
|
877
|
+
...(etag ? { etag } : {}),
|
|
859
878
|
...(peerScan.peers.length ? { peers: peerScan.peers } : {}),
|
|
860
879
|
...(peerScan.dropped.length ? { droppedPeers: peerScan.dropped } : {}),
|
|
861
880
|
...(droppedResources.length ? { droppedResources } : {}),
|