@run402/sdk 4.121.0 → 4.122.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.
Files changed (46) hide show
  1. package/dist/namespaces/deploy.d.ts.map +1 -1
  2. package/dist/namespaces/deploy.js +87 -31
  3. package/dist/namespaces/deploy.js.map +1 -1
  4. package/dist/namespaces/deploy.types.d.ts +4 -2
  5. package/dist/namespaces/deploy.types.d.ts.map +1 -1
  6. package/dist/namespaces/deploy.types.js +4 -0
  7. package/dist/namespaces/deploy.types.js.map +1 -1
  8. package/dist/namespaces/pay.d.ts +7 -0
  9. package/dist/namespaces/pay.d.ts.map +1 -1
  10. package/dist/namespaces/pay.js +5 -0
  11. package/dist/namespaces/pay.js.map +1 -1
  12. package/dist/namespaces/projects.d.ts +6 -2
  13. package/dist/namespaces/projects.d.ts.map +1 -1
  14. package/dist/namespaces/projects.js +46 -31
  15. package/dist/namespaces/projects.js.map +1 -1
  16. package/dist/namespaces/projects.types.d.ts +14 -8
  17. package/dist/namespaces/projects.types.d.ts.map +1 -1
  18. package/dist/node/_paid-stack.d.ts +8 -3
  19. package/dist/node/_paid-stack.d.ts.map +1 -1
  20. package/dist/node/_paid-stack.js.map +1 -1
  21. package/dist/node/lightning-paid-fetch.d.ts.map +1 -1
  22. package/dist/node/lightning-paid-fetch.js +2 -0
  23. package/dist/node/lightning-paid-fetch.js.map +1 -1
  24. package/dist/node/mpp-pay-executor.d.ts +40 -0
  25. package/dist/node/mpp-pay-executor.d.ts.map +1 -0
  26. package/dist/node/mpp-pay-executor.js +352 -0
  27. package/dist/node/mpp-pay-executor.js.map +1 -0
  28. package/dist/node/paid-fetch.d.ts +2 -1
  29. package/dist/node/paid-fetch.d.ts.map +1 -1
  30. package/dist/node/paid-fetch.js +44 -18
  31. package/dist/node/paid-fetch.js.map +1 -1
  32. package/dist/node/payment-attempts.d.ts +2 -2
  33. package/dist/node/payment-attempts.d.ts.map +1 -1
  34. package/dist/node/payment-attempts.js +2 -2
  35. package/dist/node/payment-attempts.js.map +1 -1
  36. package/dist/node/payment-offers.d.ts +35 -0
  37. package/dist/node/payment-offers.d.ts.map +1 -0
  38. package/dist/node/payment-offers.js +145 -0
  39. package/dist/node/payment-offers.js.map +1 -0
  40. package/dist/stale-project-key.d.ts +14 -0
  41. package/dist/stale-project-key.d.ts.map +1 -0
  42. package/dist/stale-project-key.js +88 -0
  43. package/dist/stale-project-key.js.map +1 -0
  44. package/dist/type-contract.d.ts.map +1 -1
  45. package/dist/type-contract.js.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,352 @@
1
+ /**
2
+ * `pay.fetch` on the `mpp` rail: buy an arbitrary URL whose 402 carries an
3
+ * MPP Tempo charge challenge (spec `tenant-x402-payment-client-surface`,
4
+ * design D9 of `tenant-mpp-priced-routes`).
5
+ *
6
+ * Send the request; on 402 select the first offered Tempo chain the wallet
7
+ * covers (`orderTempoCandidates`, through mppx's own selection), apply the USD
8
+ * spend guard to the selected challenge before anything is signed, sign, and
9
+ * retry the identical request with `Authorization: Payment`. The attempt is
10
+ * journaled before the signed request leaves.
11
+ *
12
+ * An MPP payment's identity is its credential, not the caller key: the
13
+ * gateway resolves a re-presented credential to the original payment and
14
+ * treats `Idempotency-Key` as correlation only. So the signed credential stays
15
+ * in this instance's memory for the identical request, and an ambiguous or
16
+ * pending outcome is answered by re-presenting it, never by signing a second
17
+ * one. A clean refusal (no funds moved) forgets it.
18
+ */
19
+ import { createHash } from "node:crypto";
20
+ import { LocalError } from "../errors.js";
21
+ import { PaymentBuyerError, gatewayPaymentBuyerError, isTrustedRun402PendingResponse, merchantReceiptRequiredError, payResponseMetadata, paymentExceedsMaxError, readPaymentErrorEnvelope, responseSignalsReplay, } from "../namespaces/pay.js";
22
+ import { createFilePaymentAttemptStore, createPaymentAttemptId, requestSummary, withPaymentAttemptHeader, } from "./payment-attempts.js";
23
+ import { mppChallenges, paymentOffers } from "./payment-offers.js";
24
+ import { PATH_USD, tempoChainById } from "./tempo.js";
25
+ /** Bounded waits for the gateway's "settlement still pending" answer to the paid request. */
26
+ export const MPP_PENDING_RETRY_LIMIT = 4;
27
+ const PENDING_RETRY_MIN_MS = 1_000;
28
+ const PENDING_RETRY_MAX_MS = 10_000;
29
+ export function createMppPayExecutor(options) {
30
+ const held = new Map();
31
+ const store = options.store ?? createFilePaymentAttemptStore();
32
+ const makeId = options.createAttemptId ?? createPaymentAttemptId;
33
+ const now = options.now ?? (() => new Date().toISOString());
34
+ const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
35
+ return async (url, init, payOptions) => {
36
+ const fingerprint = await options.fingerprint(url, init, payOptions.maxUsdMicros, payOptions.requireReceipt);
37
+ const request = new Request(url, init);
38
+ let hold = held.get(fingerprint);
39
+ if (!hold) {
40
+ const first = await options.baseFetch(request.clone());
41
+ if (first.status !== 402) {
42
+ return {
43
+ response: first,
44
+ payment: null,
45
+ outcome: "not_required",
46
+ replay: await responseSignalsReplay(first, payOptions.idempotencyKey !== undefined),
47
+ ...payResponseMetadata(first),
48
+ };
49
+ }
50
+ hold = await signForChallenge(first, request, payOptions, options, makeId);
51
+ held.set(fingerprint, hold);
52
+ }
53
+ const record = journalIntent(store, hold.attemptId, url, init, now);
54
+ write(store, record, now, "submitting", "in_progress", { provider_started_at: now() });
55
+ let response;
56
+ try {
57
+ // From here a thrown transport error leaves the outcome unknown.
58
+ response = await sendPaid(request, hold, options, sleep);
59
+ }
60
+ catch (cause) {
61
+ writeBestEffort(store, record, now, "ambiguous", "ambiguous", { last_error_code: "MPP_PAYMENT_OUTCOME_AMBIGUOUS" });
62
+ throw outcomeUnknown("The MPP payment request failed after the credential was sent; its outcome is unknown.", hold, cause);
63
+ }
64
+ return settleOutcome(url, response, hold, payOptions.idempotencyKey !== undefined, options, {
65
+ forget: () => held.delete(fingerprint),
66
+ journal: (state, mutation, extra) => writeBestEffort(store, record, now, state, mutation, extra),
67
+ });
68
+ };
69
+ }
70
+ async function signForChallenge(response, request, payOptions, options, makeId) {
71
+ const tempoOffered = mppChallenges(response).some((challenge) => challenge.method === "tempo" && challenge.intent === "charge");
72
+ if (!tempoOffered) {
73
+ await response.body?.cancel().catch(() => undefined);
74
+ throw options.unsupported(paymentOffers(response));
75
+ }
76
+ if (payOptions.requireReceipt) {
77
+ // MPP carries a protocol receipt, never a wallet-rooted merchant receipt.
78
+ await response.body?.cancel().catch(() => undefined);
79
+ throw merchantReceiptRequiredError({ protocol: "mpp" });
80
+ }
81
+ const prepared = await options.prepare(response, { method: request.method, headers: request.headers });
82
+ await response.body?.cancel().catch(() => undefined);
83
+ const offer = tempoChargeOffer(prepared.challenge);
84
+ if (offer.amountUsdMicros > payOptions.maxUsdMicros) {
85
+ throw paymentExceedsMaxError(offer.amountUsdMicros, payOptions.maxUsdMicros);
86
+ }
87
+ const credential = await prepared.createCredential();
88
+ // Keep exactly the header(s) mppx sets for this challenge; the request itself is rebuilt from `request`.
89
+ const credentialHeaders = [...new Headers(prepared.setCredential({ headers: new Headers() }, credential).headers).entries()];
90
+ return { credentialHeaders, challenge: offer, attemptId: makeId() };
91
+ }
92
+ /** Read the selected Tempo charge: pathUSD only, so base units are USD micros. */
93
+ function tempoChargeOffer(challenge) {
94
+ const request = (challenge.request ?? {});
95
+ const chain = tempoChainById(request.methodDetails?.chainId);
96
+ const amount = typeof request.amount === "string" && /^\d+$/.test(request.amount) ? Number(request.amount) : NaN;
97
+ const currency = typeof request.currency === "string" ? request.currency.toLowerCase() : "";
98
+ if (!chain || !Number.isSafeInteger(amount) || currency !== PATH_USD || typeof request.recipient !== "string") {
99
+ throw new PaymentBuyerError({
100
+ code: "PAYMENT_NETWORK_UNSUPPORTED",
101
+ message: "The MPP Tempo challenge is not a pathUSD charge on a Tempo chain this wallet pays.",
102
+ fundsMoved: false,
103
+ details: {
104
+ protocol: "mpp",
105
+ chain_id: request.methodDetails?.chainId ?? null,
106
+ currency: request.currency ?? null,
107
+ },
108
+ nextActions: [{ type: "edit_request", why: "Use a priced endpoint that charges pathUSD on Tempo mainnet or Moderato." }],
109
+ });
110
+ }
111
+ return { chainId: chain.id, network: chain.network, amountUsdMicros: amount, recipient: request.recipient };
112
+ }
113
+ async function sendPaid(request, hold, options, sleep) {
114
+ const paidRequest = () => {
115
+ const headers = new Headers(request.headers);
116
+ for (const [name, value] of hold.credentialHeaders)
117
+ headers.set(name, value);
118
+ const [, paidInit] = withPaymentAttemptHeader(request.url, { headers }, hold.attemptId, true);
119
+ return new Request(request.clone(), paidInit);
120
+ };
121
+ let response = await options.baseFetch(paidRequest());
122
+ for (let waits = 0; waits < MPP_PENDING_RETRY_LIMIT; waits += 1) {
123
+ const delayMs = await pendingRetryDelay(request.url, response, options.allowTestLocalhost === true);
124
+ if (delayMs === null)
125
+ break;
126
+ await response.body?.cancel().catch(() => undefined);
127
+ await sleep(delayMs);
128
+ // The same credential: the gateway resolves it to the same payment.
129
+ response = await options.baseFetch(paidRequest());
130
+ }
131
+ return response;
132
+ }
133
+ async function pendingRetryDelay(url, response, allowTestLocalhost) {
134
+ const envelope = await readPaymentErrorEnvelope(response);
135
+ const pending = isTrustedRun402PendingResponse({
136
+ requestUrl: url,
137
+ response,
138
+ envelope,
139
+ paymentBearing: true,
140
+ redirectsDisabled: true,
141
+ allowTestLocalhost,
142
+ });
143
+ if (!pending)
144
+ return null;
145
+ const seconds = Number(response.headers.get("retry-after"));
146
+ const ms = Number.isFinite(seconds) && seconds > 0 ? seconds * 1000 : PENDING_RETRY_MIN_MS;
147
+ return Math.min(PENDING_RETRY_MAX_MS, Math.max(PENDING_RETRY_MIN_MS, ms));
148
+ }
149
+ async function settleOutcome(url, response, hold, keyed, options, hooks) {
150
+ const receipt = readPaymentReceipt(response);
151
+ if (response.ok || receipt) {
152
+ // A Payment-Receipt on a non-2xx proves the transfer: paid, delivery failed.
153
+ hooks.journal("completed", "completed", { response_status: response.status });
154
+ return paidResult(url, response, hold, receipt, options.payer, keyed);
155
+ }
156
+ const envelope = await readPaymentErrorEnvelope(response);
157
+ const trusted = envelope ? gatewayPaymentBuyerError(response, envelope) : null;
158
+ if (trusted) {
159
+ const pending = trusted.code === "PAYMENT_INTENT_PENDING";
160
+ hooks.journal(pending ? "intent_pending" : trusted.fundsMoved === false ? "failed" : "ambiguous", pending || trusted.fundsMoved !== false ? "ambiguous" : "not_started", { response_status: response.status, last_error_code: trusted.code });
161
+ if (trusted.fundsMoved === false)
162
+ hooks.forget();
163
+ throw trusted;
164
+ }
165
+ const fundsMoved = refusalFundsMoved(response, envelope);
166
+ hooks.journal(fundsMoved === false ? "failed" : "ambiguous", fundsMoved === false ? "not_started" : "ambiguous", {
167
+ response_status: response.status,
168
+ ...(typeof envelope?.code === "string" ? { last_error_code: envelope.code } : {}),
169
+ });
170
+ if (fundsMoved === false) {
171
+ hooks.forget();
172
+ throw new PaymentBuyerError({
173
+ code: "PAYMENT_SETTLEMENT_FAILED",
174
+ message: "The seller refused the MPP Tempo credential; no funds moved.",
175
+ fundsMoved: false,
176
+ details: { protocol: "mpp", network: hold.challenge.network, upstream_status: response.status, ...upstreamCode(envelope) },
177
+ nextActions: [{ type: "retry", why: "No funds moved; retry to receive a fresh challenge." }],
178
+ safeToRetry: true,
179
+ });
180
+ }
181
+ throw outcomeUnknown("The seller answered the MPP payment without a receipt; whether the transfer landed is unknown.", hold, null, {
182
+ upstream_status: response.status,
183
+ ...upstreamCode(envelope),
184
+ });
185
+ }
186
+ /**
187
+ * A 402 is the seller re-challenging: it did not accept the credential. This
188
+ * client pays Tempo in pull mode (it signs, the seller broadcasts), so a
189
+ * refusal moved nothing unless the seller says otherwise. Any other non-2xx
190
+ * without a receipt is unknown.
191
+ */
192
+ function refusalFundsMoved(response, envelope) {
193
+ const details = envelope?.details;
194
+ const declared = envelope?.funds_moved ?? details?.funds_moved;
195
+ if (declared === true || declared === false || declared === "unknown")
196
+ return declared;
197
+ return response.status === 402 ? false : "unknown";
198
+ }
199
+ function upstreamCode(envelope) {
200
+ return typeof envelope?.code === "string" ? { upstream_code: envelope.code } : {};
201
+ }
202
+ function outcomeUnknown(message, hold, cause, details = {}) {
203
+ return new PaymentBuyerError({
204
+ code: "PAYMENT_SETTLEMENT_FAILED",
205
+ message,
206
+ fundsMoved: "unknown",
207
+ details: { protocol: "mpp", network: hold.challenge.network, payment_attempt_id: hold.attemptId, ...details },
208
+ nextActions: [{
209
+ type: "retry",
210
+ request: "repeat_identical",
211
+ why: "Repeat the identical request from this client: it re-presents the same credential, which the seller resolves to the same payment and never charges twice.",
212
+ }],
213
+ retryable: true,
214
+ safeToRetry: false,
215
+ ...(cause !== null ? { cause } : {}),
216
+ });
217
+ }
218
+ async function paidResult(url, response, hold, receipt, payer, keyed) {
219
+ const metadata = payResponseMetadata(response);
220
+ const deduplicated = metadata.deduplicated ?? false;
221
+ // MPP carries no merchant receipt and no signer authorization, so these instants are absent.
222
+ const noInstant = null;
223
+ const payment = {
224
+ protocol: "mpp",
225
+ method: "tempo",
226
+ network: hold.challenge.network,
227
+ paymentId: metadata.paymentId,
228
+ amountUsdMicros: hold.challenge.amountUsdMicros,
229
+ asset: PATH_USD,
230
+ payer,
231
+ payTo: hold.challenge.recipient,
232
+ transaction: receipt?.reference ?? "",
233
+ resourceUrl: url,
234
+ settlement: { status: receipt ? "verified" : "unavailable" },
235
+ fundsMoved: metadata.fundsMoved ?? (deduplicated ? false : true),
236
+ deduplicated,
237
+ delivery: { status: response.ok ? "fulfilled" : "failed", replay: deduplicated },
238
+ offer: { status: "unavailable", resourceUrl: null, validUntil: null },
239
+ merchantReceipt: { status: "unavailable", claim: null, issuedAt: noInstant },
240
+ signerRelationship: { kind: null, merchantRoot: null, signer: null, authorizationExpiresAt: noInstant },
241
+ policy: { requireReceipt: false, status: "not_required" },
242
+ evidence: { offer: null, merchantReceipt: null, signerAuthorization: null, protocolReceipt: receipt },
243
+ };
244
+ return {
245
+ response,
246
+ payment,
247
+ outcome: deduplicated ? "already_settled" : "settled",
248
+ replay: deduplicated || await responseSignalsReplay(response, keyed),
249
+ ...metadata,
250
+ };
251
+ }
252
+ /** The standard MPP `Payment-Receipt`: base64url JSON `{ method, reference, status, timestamp }`. */
253
+ function readPaymentReceipt(response) {
254
+ const header = response.headers.get("payment-receipt");
255
+ if (!header)
256
+ return null;
257
+ try {
258
+ const parsed = JSON.parse(Buffer.from(header, "base64url").toString("utf8"));
259
+ if (parsed.status !== "success" || typeof parsed.reference !== "string" || typeof parsed.method !== "string")
260
+ return null;
261
+ return {
262
+ method: parsed.method,
263
+ reference: parsed.reference,
264
+ status: parsed.status,
265
+ timestamp: typeof parsed.timestamp === "string" ? parsed.timestamp : null,
266
+ };
267
+ }
268
+ catch {
269
+ return null;
270
+ }
271
+ }
272
+ function journalIntent(store, attemptId, url, init, now) {
273
+ const existing = safeRead(store, attemptId);
274
+ if (existing)
275
+ return existing;
276
+ const summary = requestSummary(url, init);
277
+ const at = now();
278
+ const record = {
279
+ version: 1,
280
+ payment_attempt_id: attemptId,
281
+ rail: "mpp",
282
+ state: "intent",
283
+ mutation_state: "not_started",
284
+ method: summary.method,
285
+ origin: summary.origin,
286
+ path_sha256: summary.path_sha256,
287
+ ...(summary.caller_key_sha256 ? { caller_key_sha256: summary.caller_key_sha256 } : {}),
288
+ created_at: at,
289
+ updated_at: at,
290
+ };
291
+ try {
292
+ if (!store.claim(record)) {
293
+ throw new LocalError("The generated MPP payment attempt id already exists.", "reserving MPP payment attempt", { code: "MPP_ATTEMPT_ID_COLLISION" });
294
+ }
295
+ }
296
+ catch (cause) {
297
+ throw new PaymentBuyerError({
298
+ code: "PAYMENT_SETTLEMENT_FAILED",
299
+ message: "The MPP payment was not sent because its attempt could not be recorded.",
300
+ fundsMoved: false,
301
+ details: { protocol: "mpp", payment_attempt_id: attemptId },
302
+ nextActions: [{ type: "retry", why: "Nothing was sent; retry once the local config directory is writable." }],
303
+ safeToRetry: true,
304
+ cause,
305
+ });
306
+ }
307
+ return record;
308
+ }
309
+ function safeRead(store, attemptId) {
310
+ try {
311
+ return store.read(attemptId);
312
+ }
313
+ catch {
314
+ return null;
315
+ }
316
+ }
317
+ /** Before dispatch the write must land: an unrecorded signed request is never sent. */
318
+ function write(store, record, now, state, mutation, extra = {}) {
319
+ Object.assign(record, extra, { state, mutation_state: mutation, updated_at: now() });
320
+ try {
321
+ store.write({ ...record });
322
+ }
323
+ catch (cause) {
324
+ throw new PaymentBuyerError({
325
+ code: "PAYMENT_SETTLEMENT_FAILED",
326
+ message: "The MPP payment was not sent because its attempt could not be recorded.",
327
+ fundsMoved: false,
328
+ details: { protocol: "mpp", payment_attempt_id: record.payment_attempt_id },
329
+ nextActions: [{ type: "retry", why: "Nothing was sent; retry once the local config directory is writable." }],
330
+ safeToRetry: true,
331
+ cause,
332
+ });
333
+ }
334
+ }
335
+ function writeBestEffort(store, record, now, state, mutation, extra = {}) {
336
+ try {
337
+ write(store, record, now, state, mutation, extra);
338
+ }
339
+ catch {
340
+ // The outcome is already decided; the journal is a best-effort record of it.
341
+ }
342
+ }
343
+ /** Test seam: a stable fingerprint for callers without the paid-fetch one. */
344
+ export async function simpleMppFingerprint(url, init, maxUsdMicros, requireReceipt) {
345
+ const request = new Request(url, init);
346
+ const body = await request.clone().arrayBuffer();
347
+ return createHash("sha256")
348
+ .update(JSON.stringify([request.method, request.url, request.headers.get("idempotency-key"), maxUsdMicros, requireReceipt]))
349
+ .update(Buffer.from(body))
350
+ .digest("hex");
351
+ }
352
+ //# sourceMappingURL=mpp-pay-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpp-pay-executor.js","sourceRoot":"","sources":["../../src/node/mpp-pay-executor.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,7 @@ import { Run402Error } from "../errors.js";
20
20
  import type { MppStack, X402Stack } from "./_paid-stack.js";
21
21
  import { PaymentBuyerError, type PayExecutor } from "../namespaces/pay.js";
22
22
  import { type PaymentAttemptStore } from "./payment-attempts.js";
23
+ import { type PaymentOffer, type PaymentRail } from "./payment-offers.js";
23
24
  import { type TempoChain } from "./tempo.js";
24
25
  type FetchFn = typeof globalThis.fetch;
25
26
  interface RpcClient {
@@ -273,7 +274,7 @@ interface X402OfferReceiptRuntime {
273
274
  * the identical request re-presents that proof; it never mints a replacement.
274
275
  */
275
276
  export declare function createX402BuyerFetch(client: X402BuyerClient, options: X402BuyerFetchOptions): PayExecutor;
276
- export declare function paymentNetworkUnsupportedError(challengeNetworkValues: string[], walletNetworkValues: string[], extra?: Record<string, unknown>): PaymentBuyerError;
277
+ export declare function paymentNetworkUnsupportedError(challengeNetworkValues: string[], walletNetworkValues: string[], extra?: Record<string, unknown>, offers?: readonly PaymentOffer[], configuredRail?: PaymentRail): PaymentBuyerError;
277
278
  /**
278
279
  * Request-scoped payment tracker around `@x402/fetch`.
279
280
  *
@@ -1 +1 @@
1
- {"version":3,"file":"paid-fetch.d.ts","sourceRoot":"","sources":["../../src/node/paid-fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paid-fetch.d.ts","sourceRoot":"","sources":["../../src/node/paid-fetch.ts"],"names":[],"mappings":"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"}
@@ -26,8 +26,10 @@ import { createLightningFetch, createLightningPayExecutor } from "./lightning-pa
26
26
  import { DEFAULT_PAYMENT_MAX_USD_MICROS, PaymentBuyerError, PaymentPolicyError, gatewayPaymentBuyerError, isTrustedRun402PaymentUrl, isTrustedRun402PendingResponse, payResponseMetadata, merchantReceiptRequiredError, paymentExceedsMaxError, readPaymentErrorEnvelope, responseSignalsReplay, paidStackUnavailableError, walletUnavailableError, } from "../namespaces/pay.js";
27
27
  import { attemptIdFromRequest, createFilePaymentAttemptStore, createPaymentAttemptId, hasPaymentAuthorization, requestSummary, withPaymentAttemptHeader, } from "./payment-attempts.js";
28
28
  import { sdkFetch } from "./http-dispatcher.js";
29
+ import { paymentOffers, switchRailFor } from "./payment-offers.js";
29
30
  import { resolveWalletAccount } from "./signers/index.js";
30
- import { PATH_USD, TEMPO_FEE_HEADROOM_USD_MICROS, tempoChainById } from "./tempo.js";
31
+ import { PATH_USD, TEMPO_CHAINS, TEMPO_FEE_HEADROOM_USD_MICROS, tempoChainById } from "./tempo.js";
32
+ import { createMppPayExecutor } from "./mpp-pay-executor.js";
31
33
  /**
32
34
  * A machine-readable x402 balance-preflight failure.
33
35
  *
@@ -550,11 +552,20 @@ export async function setupPaidFetch(options = {}) {
550
552
  // Pay the first offered Tempo chain this wallet can cover.
551
553
  orderChallenges: (candidates) => orderTempoCandidates(candidates, localWallet.address, readBalance),
552
554
  });
555
+ // `pay.fetch` on this rail: the same selection, with the spend guard
556
+ // applied to the chosen challenge before mppx signs it.
557
+ const pay = createMppPayExecutor({
558
+ prepare: (response, request) => mppx.preparePayment(response, { request }),
559
+ payer: localWallet.address,
560
+ baseFetch: sdkFetch,
561
+ fingerprint: paymentRequestFingerprint,
562
+ unsupported: (offers) => paymentNetworkUnsupportedError(offerNetworks(offers), TEMPO_CHAINS.map((chain) => chain.network), {}, offers, "mpp"),
563
+ });
553
564
  return withPayer(mppx.fetch, {
554
565
  source: resolvedWallet.source,
555
566
  rail: "mpp",
556
567
  payers: [{ address: localWallet.address }],
557
- });
568
+ }, undefined, pay);
558
569
  }
559
570
  // Default: x402 on Base + Base Sepolia. Each chain has its own independent
560
571
  // provider list; one degraded chain does not erase a confirmed balance on
@@ -823,7 +834,8 @@ export function createLazyPaidFetch(options = {}) {
823
834
  };
824
835
  }
825
836
  if (configured?.payer.rail === "mpp" || configured?.payer.rail === "lightning") {
826
- throw paymentNetworkUnsupportedError(challengeNetworks(response), configured.payer.payers.flatMap((payer) => payer.network ? [payer.network] : []), { configured_rail: configured.payer.rail });
837
+ const offers = paymentOffers(response);
838
+ throw paymentNetworkUnsupportedError(offerNetworks(offers), configured.payer.payers.flatMap((payer) => payer.network ? [payer.network] : []), {}, offers, configured.payer.rail);
827
839
  }
828
840
  if (missingPaidStackPackages !== null) {
829
841
  throw paidStackUnavailableError(missingPaidStackPackages, {
@@ -908,8 +920,13 @@ export function createX402BuyerFetch(client, options) {
908
920
  const firstResponse = await baseFetch(request);
909
921
  if (firstResponse.status !== 402)
910
922
  return firstResponse;
923
+ const offers = paymentOffers(firstResponse);
924
+ if (!firstResponse.headers.get("PAYMENT-REQUIRED") && offers.length > 0) {
925
+ // An MPP-only 402: name what it offers and the rail that pays it.
926
+ throw paymentNetworkUnsupportedError(offerNetworks(offers), [...options.supportedNetworks], {}, offers, "x402");
927
+ }
911
928
  const required = await decodePaymentRequired(firstResponse);
912
- const guarded = await guardPaymentRequired(required, options.supportedNetworks, call.maxUsdMicros, request.url, call.requireReceipt, options.offerReceipt, options.verifyAtSeconds?.() ?? Math.floor(Date.now() / 1000));
929
+ const guarded = await guardPaymentRequired(required, options.supportedNetworks, call.maxUsdMicros, request.url, call.requireReceipt, options.offerReceipt, options.verifyAtSeconds?.() ?? Math.floor(Date.now() / 1000), offers);
913
930
  let pending = creatingProofs.get(call.fingerprint);
914
931
  if (!pending) {
915
932
  pending = createProof(client, guarded)
@@ -1080,7 +1097,7 @@ async function createProof(client, guarded) {
1080
1097
  throw unwrapPolicyError(cause) ?? cause;
1081
1098
  }
1082
1099
  }
1083
- async function guardPaymentRequired(required, supportedNetworks, maxUsdMicros, requestUrl, requireReceipt, offerReceipt, verifyAtSeconds) {
1100
+ async function guardPaymentRequired(required, supportedNetworks, maxUsdMicros, requestUrl, requireReceipt, offerReceipt, verifyAtSeconds, offers = []) {
1084
1101
  let challengeUrl;
1085
1102
  try {
1086
1103
  challengeUrl = new URL(required.resource.url).toString();
@@ -1093,7 +1110,7 @@ async function guardPaymentRequired(required, supportedNetworks, maxUsdMicros, r
1093
1110
  }
1094
1111
  const supportedByNetwork = required.accepts.filter((accept) => accept.scheme === "exact" && supportedNetworks.includes(accept.network));
1095
1112
  if (supportedByNetwork.length === 0) {
1096
- throw paymentNetworkUnsupportedError([...new Set(required.accepts.map((accept) => accept.network))], [...supportedNetworks]);
1113
+ throw paymentNetworkUnsupportedError([...new Set([...required.accepts.map((accept) => accept.network), ...offerNetworks(offers)])], [...supportedNetworks], {}, offers, "x402");
1097
1114
  }
1098
1115
  const supported = supportedByNetwork.filter((accept) => accept.asset.toLowerCase() === supportedPaymentAsset(accept.network)?.toLowerCase());
1099
1116
  if (supported.length === 0) {
@@ -1371,6 +1388,8 @@ async function receiptFromResponse(response, proof, url, requireReceipt, runtime
1371
1388
  amountUsdMicros: amount,
1372
1389
  asset: accepted.asset,
1373
1390
  payer: settlementPayer,
1391
+ protocol: "x402",
1392
+ method: "exact",
1374
1393
  payTo: accepted.payTo,
1375
1394
  transaction: record.transaction,
1376
1395
  resourceUrl: url,
@@ -1504,17 +1523,29 @@ function isProvenNoSettlementFailure(failure) {
1504
1523
  return true;
1505
1524
  return failure.code === "TENANT_X402_PAYMENT_INVALID" && !isAlreadyUsedFailure(failure);
1506
1525
  }
1507
- export function paymentNetworkUnsupportedError(challengeNetworkValues, walletNetworkValues, extra = {}) {
1526
+ export function paymentNetworkUnsupportedError(challengeNetworkValues, walletNetworkValues, extra = {}, offers = [], configuredRail) {
1527
+ const switchTo = switchRailFor(offers, configuredRail);
1508
1528
  return new PaymentBuyerError({
1509
1529
  code: "PAYMENT_NETWORK_UNSUPPORTED",
1510
- message: "The x402 challenge does not offer an exact-scheme network and asset supported by this wallet.",
1530
+ message: switchTo
1531
+ ? `The 402 offers no payment this wallet's ${configuredRail ?? "configured"} rail can make; the ${switchTo} rail can pay it.`
1532
+ : "The x402 challenge does not offer an exact-scheme network and asset supported by this wallet.",
1511
1533
  fundsMoved: false,
1512
1534
  details: {
1513
1535
  challenge_networks: challengeNetworkValues,
1514
1536
  wallet_networks: walletNetworkValues,
1537
+ ...(offers.length > 0 ? { offers } : {}),
1538
+ ...(configuredRail ? { configured_rail: configuredRail } : {}),
1515
1539
  ...extra,
1516
1540
  },
1517
1541
  nextActions: [
1542
+ ...(switchTo
1543
+ ? [{
1544
+ type: "run_command",
1545
+ command: `run402 init ${switchTo} --switch-rail`,
1546
+ why: `Switch this wallet to the ${switchTo} rail, which pays the seller's first offer, then retry.`,
1547
+ }]
1548
+ : []),
1518
1549
  {
1519
1550
  type: "edit_request",
1520
1551
  why: "Use a priced endpoint on one of the wallet networks, or configure a signer for a challenge network.",
@@ -1549,17 +1580,12 @@ function settlementError(message, fundsMoved, details = {}, cause, retryable = f
1549
1580
  ],
1550
1581
  });
1551
1582
  }
1583
+ /** Every network a 402 offers, x402 entries and MPP challenges alike. */
1552
1584
  function challengeNetworks(response) {
1553
- const header = response.headers.get("PAYMENT-REQUIRED");
1554
- if (!header)
1555
- return [];
1556
- try {
1557
- const decoded = decodeBase64Json(header);
1558
- return [...new Set((decoded.accepts ?? []).flatMap((accept) => typeof accept.network === "string" ? [accept.network] : []))];
1559
- }
1560
- catch {
1561
- return [];
1562
- }
1585
+ return offerNetworks(paymentOffers(response));
1586
+ }
1587
+ function offerNetworks(offers) {
1588
+ return [...new Set(offers.flatMap((offer) => offer.network ? [offer.network] : []))];
1563
1589
  }
1564
1590
  async function paymentRequestFingerprint(url, init, maxUsdMicros, requireReceipt) {
1565
1591
  let request;