@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.
- package/dist/namespaces/deploy.d.ts.map +1 -1
- package/dist/namespaces/deploy.js +87 -31
- package/dist/namespaces/deploy.js.map +1 -1
- package/dist/namespaces/deploy.types.d.ts +4 -2
- package/dist/namespaces/deploy.types.d.ts.map +1 -1
- package/dist/namespaces/deploy.types.js +4 -0
- package/dist/namespaces/deploy.types.js.map +1 -1
- package/dist/namespaces/pay.d.ts +7 -0
- package/dist/namespaces/pay.d.ts.map +1 -1
- package/dist/namespaces/pay.js +5 -0
- package/dist/namespaces/pay.js.map +1 -1
- package/dist/namespaces/projects.d.ts +6 -2
- package/dist/namespaces/projects.d.ts.map +1 -1
- package/dist/namespaces/projects.js +46 -31
- package/dist/namespaces/projects.js.map +1 -1
- package/dist/namespaces/projects.types.d.ts +14 -8
- package/dist/namespaces/projects.types.d.ts.map +1 -1
- package/dist/node/_paid-stack.d.ts +8 -3
- package/dist/node/_paid-stack.d.ts.map +1 -1
- package/dist/node/_paid-stack.js.map +1 -1
- package/dist/node/lightning-paid-fetch.d.ts.map +1 -1
- package/dist/node/lightning-paid-fetch.js +2 -0
- package/dist/node/lightning-paid-fetch.js.map +1 -1
- package/dist/node/mpp-pay-executor.d.ts +40 -0
- package/dist/node/mpp-pay-executor.d.ts.map +1 -0
- package/dist/node/mpp-pay-executor.js +352 -0
- package/dist/node/mpp-pay-executor.js.map +1 -0
- package/dist/node/paid-fetch.d.ts +2 -1
- package/dist/node/paid-fetch.d.ts.map +1 -1
- package/dist/node/paid-fetch.js +44 -18
- package/dist/node/paid-fetch.js.map +1 -1
- package/dist/node/payment-attempts.d.ts +2 -2
- package/dist/node/payment-attempts.d.ts.map +1 -1
- package/dist/node/payment-attempts.js +2 -2
- package/dist/node/payment-attempts.js.map +1 -1
- package/dist/node/payment-offers.d.ts +35 -0
- package/dist/node/payment-offers.d.ts.map +1 -0
- package/dist/node/payment-offers.js +145 -0
- package/dist/node/payment-offers.js.map +1 -0
- package/dist/stale-project-key.d.ts +14 -0
- package/dist/stale-project-key.d.ts.map +1 -0
- package/dist/stale-project-key.js +88 -0
- package/dist/stale-project-key.js.map +1 -0
- package/dist/type-contract.d.ts.map +1 -1
- package/dist/type-contract.js.map +1 -1
- 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
|
|
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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAAc,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAGL,WAAW,EAEZ,MAAM,cAAc,CAAC;AAGtB,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAEL,iBAAiB,EAYjB,KAAK,WAAW,EAMjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAQL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"paid-fetch.d.ts","sourceRoot":"","sources":["../../src/node/paid-fetch.ts"],"names":[],"mappings":"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"}
|
package/dist/node/paid-fetch.js
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
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
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
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;
|