@atlasauth/pca-ap2 0.3.0 → 0.4.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/README.md +36 -60
- package/dist/chain.d.ts +217 -0
- package/dist/chain.js +366 -0
- package/dist/chain.js.map +1 -0
- package/dist/constraints.d.ts +61 -0
- package/dist/constraints.js +271 -0
- package/dist/constraints.js.map +1 -0
- package/dist/index.d.ts +14 -324
- package/dist/index.js +28 -354
- package/dist/index.js.map +1 -1
- package/dist/mandates.d.ts +140 -0
- package/dist/mandates.js +279 -0
- package/dist/mandates.js.map +1 -0
- package/dist/pca.d.ts +147 -0
- package/dist/pca.js +313 -0
- package/dist/pca.js.map +1 -0
- package/dist/sdjwt.d.ts +129 -0
- package/dist/sdjwt.js +394 -0
- package/dist/sdjwt.js.map +1 -0
- package/dist/settlement.d.ts +47 -0
- package/dist/settlement.js +91 -0
- package/dist/settlement.js.map +1 -0
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,359 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
*
|
|
16
|
-
* This is a near-isomorphism of PCA's attenuating capability chain: the Root Intent Grant bounds the
|
|
17
|
-
* authority; each narrowing step may only RESTRICT it, never amplify it. PCA's trust-budget + risk
|
|
18
|
-
* policy (`@atlasauth/pca-payments`) decide WHETHER a charge is autonomous (tier 1) or needs a human
|
|
19
|
-
* co-sign (tier 3); AP2 carries that decision on the wire; the settlement rail moves the money.
|
|
20
|
-
*
|
|
21
|
-
* This is a BRIDGE, not a replacement:
|
|
22
|
-
* - PCA = the authority / budget layer (who may spend, how much, until when, before a human co-sign).
|
|
23
|
-
* - AP2 = the payment-mandate wire (the Intent→Cart→Payment VDC chain other parties verify).
|
|
24
|
-
* - x402 / Stripe SPT = the settlement rails that actually move value, fed by PCA's governance.
|
|
25
|
-
* Compose them; do not fold one into another.
|
|
26
|
-
*
|
|
27
|
-
* ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
28
|
-
* HONEST CAVEAT — VERIFY BEFORE PRODUCTION WIRE USE
|
|
29
|
-
* ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
30
|
-
* AP2 is a moving target and its mandate field-level signing roles differ between secondary sources
|
|
31
|
-
* (e.g. whether a cart is co-signed by both merchant and user, and whether the step is called "Cart"
|
|
32
|
-
* or "Checkout"). The spec also layers over UCP (ucp.dev) whose dated releases move the payment token
|
|
33
|
-
* between `payment_data.token` and `payment.instruments[*].credential.token`. This module models the
|
|
34
|
-
* v0.2 Intent/Cart/Payment chain to the best public understanding; it MUST be validated against the
|
|
35
|
-
* AP2 repository `schemas/` (and the official spec at ap2-protocol.org) before any production wire use.
|
|
36
|
-
* That validation has now been run (see conformance.test.ts): the output does NOT conform to the current
|
|
37
|
-
* official SD-JWT mandate schemas, so treat this as a PCA rendition of the concepts, not the AP2 wire format.
|
|
38
|
-
* PCA-native terms that AP2 has no field for are carried in a namespaced `x_pca` extension so the chain
|
|
39
|
-
* can round-trip back to PCA terms; those fields are non-standard by construction.
|
|
40
|
-
*/
|
|
41
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.stripeSptSettlement = exports.x402Settlement = exports.AP2_CONTEXT = exports.AP2_VERSION = void 0;
|
|
43
|
-
exports.signMandate = signMandate;
|
|
44
|
-
exports.verifyMandate = verifyMandate;
|
|
45
|
-
exports.mandateHash = mandateHash;
|
|
46
|
-
exports.toAP2IntentMandate = toAP2IntentMandate;
|
|
47
|
-
exports.toAP2CartMandate = toAP2CartMandate;
|
|
48
|
-
exports.toAP2PaymentMandate = toAP2PaymentMandate;
|
|
49
|
-
exports.fromAP2Mandate = fromAP2Mandate;
|
|
50
|
-
exports.verifyAP2Chain = verifyAP2Chain;
|
|
51
|
-
exports.chainMandates = chainMandates;
|
|
52
|
-
const pca_1 = require("@atlasauth/pca");
|
|
53
|
-
// ===================================================================================================
|
|
54
|
-
// AP2 version pin
|
|
55
|
-
// ===================================================================================================
|
|
56
|
-
/** The AP2 shape this module models. See the HONEST CAVEAT above. */
|
|
57
|
-
exports.AP2_VERSION = '0.2';
|
|
58
|
-
/**
|
|
59
|
-
* Illustrative JSON-LD contexts for the VDC envelope. The second entry is a placeholder for the AP2
|
|
60
|
-
* context URL — replace with the canonical context from the AP2 repo before production.
|
|
61
|
-
*/
|
|
62
|
-
exports.AP2_CONTEXT = [
|
|
63
|
-
'https://www.w3.org/2018/credentials/v1',
|
|
64
|
-
'https://ap2-protocol.org/context/v0.2',
|
|
65
|
-
];
|
|
66
|
-
// ===================================================================================================
|
|
67
|
-
// Signing / verification / hashing
|
|
68
|
-
// ===================================================================================================
|
|
69
|
-
/** Strip `proof` for canonical signing/verification (the signature covers everything else). */
|
|
70
|
-
function proofless(vdc) {
|
|
71
|
-
const { proof: _proof, ...rest } = vdc;
|
|
72
|
-
void _proof;
|
|
73
|
-
return rest;
|
|
74
|
-
}
|
|
75
|
-
/** Sign a VDC with the issuer's Ed25519 secret key, returning a copy carrying the `proof`. */
|
|
76
|
-
function signMandate(vdc, secretKey) {
|
|
77
|
-
const sig = (0, pca_1.sign)(secretKey, (0, pca_1.canonicalBytes)(proofless(vdc)));
|
|
78
|
-
const proof = {
|
|
79
|
-
type: 'Ed25519Signature2020',
|
|
80
|
-
created: vdc.issuanceDate,
|
|
81
|
-
verificationMethod: vdc.issuer,
|
|
82
|
-
proofPurpose: 'assertionMethod',
|
|
83
|
-
signatureValue: (0, pca_1.encodeSig)(sig),
|
|
84
|
-
};
|
|
85
|
-
return { ...vdc, proof };
|
|
86
|
-
}
|
|
87
|
-
/** Verify a VDC's detached signature. Returns false when unsigned or the signature does not verify. */
|
|
88
|
-
function verifyMandate(vdc) {
|
|
89
|
-
if (!vdc.proof)
|
|
90
|
-
return false;
|
|
91
|
-
// The proof must verify under the credential's own declared issuer (no key substitution).
|
|
92
|
-
if (vdc.proof.verificationMethod !== vdc.issuer)
|
|
93
|
-
return false;
|
|
94
|
-
return (0, pca_1.verifyB64u)(vdc.issuer, (0, pca_1.canonicalBytes)(proofless(vdc)), vdc.proof.signatureValue);
|
|
95
|
-
}
|
|
96
|
-
/** Stable content hash of a VDC (used to bind one mandate to the next). */
|
|
97
|
-
function mandateHash(vdc) {
|
|
98
|
-
return (0, pca_1.hashCanonical)(vdc);
|
|
99
|
-
}
|
|
100
|
-
// ===================================================================================================
|
|
101
|
-
// PCA → AP2 mapping (the narrowing chain)
|
|
102
|
-
// ===================================================================================================
|
|
103
|
-
const round2 = (n) => Math.round((n + Number.EPSILON) * 100) / 100;
|
|
104
|
-
/** Normalize the two accepted inputs to `MandateTerms` (+ the goal commitment when a full mandate). */
|
|
105
|
-
function termsOf(mandate) {
|
|
106
|
-
if ('terms' in mandate)
|
|
107
|
-
return { terms: mandate.terms, goalCommit: mandate.goalCommit };
|
|
108
|
-
return { terms: mandate };
|
|
109
|
-
}
|
|
110
|
-
function describeTerms(terms) {
|
|
111
|
-
const where = terms.merchants.length ? ` at [${terms.merchants.join(', ')}]` : '';
|
|
112
|
-
return (`Purchase up to ${terms.perTransactionCap} ${terms.currency} per transaction` +
|
|
113
|
-
` (autonomous up to ${terms.autoApproveThreshold}, cumulative ${terms.cumulativeCap})${where}`);
|
|
114
|
-
}
|
|
115
|
-
/** Map a PCA payment mandate (or raw terms) to an AP2 Intent Mandate VDC. */
|
|
116
|
-
function toAP2IntentMandate(mandate, opts) {
|
|
117
|
-
const { terms, goalCommit } = termsOf(mandate);
|
|
118
|
-
const now = Number.isFinite(opts.now) ? opts.now : Date.now();
|
|
119
|
-
const x_pca = {
|
|
120
|
-
auto_approve_threshold: terms.autoApproveThreshold,
|
|
121
|
-
cumulative_cap: terms.cumulativeCap,
|
|
122
|
-
per_transaction_cap: terms.perTransactionCap,
|
|
123
|
-
period_start: terms.periodStart,
|
|
124
|
-
...(terms.periodEnd !== undefined ? { period_end: terms.periodEnd } : {}),
|
|
125
|
-
...(terms.maxTransactionsPerPeriod !== undefined
|
|
126
|
-
? { max_transactions_per_period: terms.maxTransactionsPerPeriod }
|
|
127
|
-
: {}),
|
|
128
|
-
...(goalCommit !== undefined ? { goal_commit: goalCommit } : {}),
|
|
129
|
-
};
|
|
130
|
-
const contents = {
|
|
131
|
-
natural_language_description: opts.naturalLanguageDescription ?? describeTerms(terms),
|
|
132
|
-
merchants: terms.merchants.length ? [...terms.merchants] : null,
|
|
133
|
-
skus: opts.skus ?? null,
|
|
134
|
-
...(terms.categories.length ? { categories: [...terms.categories] } : {}),
|
|
135
|
-
max_amount: { currency: terms.currency, value: terms.perTransactionCap },
|
|
136
|
-
required_refundability: true,
|
|
137
|
-
user_cart_confirmation_required: opts.userCartConfirmationRequired ?? terms.autoApproveThreshold < terms.perTransactionCap,
|
|
138
|
-
...(terms.periodEnd !== undefined ? { intent_expiry: new Date(terms.periodEnd).toISOString() } : {}),
|
|
139
|
-
x_pca,
|
|
140
|
-
};
|
|
141
|
-
const vdc = {
|
|
142
|
-
'@context': exports.AP2_CONTEXT,
|
|
143
|
-
type: ['VerifiableCredential', 'IntentMandate'],
|
|
144
|
-
issuer: opts.issuerPublic,
|
|
145
|
-
issuanceDate: new Date(now).toISOString(),
|
|
146
|
-
...(terms.periodEnd !== undefined ? { expirationDate: new Date(terms.periodEnd).toISOString() } : {}),
|
|
147
|
-
credentialSubject: contents,
|
|
148
|
-
};
|
|
149
|
-
return opts.issuerSecret ? signMandate(vdc, opts.issuerSecret) : vdc;
|
|
150
|
-
}
|
|
151
|
-
/** Narrow an Intent Mandate into a concrete AP2 Cart Mandate VDC (items + committed total). */
|
|
152
|
-
function toAP2CartMandate(intent, cart, opts) {
|
|
153
|
-
const currency = cart.currency ?? intent.credentialSubject.max_amount.currency;
|
|
154
|
-
const total = round2(cart.items.reduce((sum, it) => sum + it.quantity * it.unit_price.value, 0));
|
|
155
|
-
const id = cart.id ?? `cart_${(0, pca_1.hashCanonical)({ merchant: cart.merchant, items: cart.items }).slice(0, 16)}`;
|
|
156
|
-
const contents = {
|
|
157
|
-
id,
|
|
158
|
-
merchant: cart.merchant,
|
|
159
|
-
items: cart.items.map((it) => ({ ...it, unit_price: { ...it.unit_price } })),
|
|
160
|
-
total: { currency, value: total },
|
|
161
|
-
intent_reference: mandateHash(intent),
|
|
162
|
-
...(cart.expiry !== undefined ? { cart_expiry: new Date(cart.expiry).toISOString() } : {}),
|
|
163
|
-
};
|
|
164
|
-
const vdc = {
|
|
165
|
-
'@context': exports.AP2_CONTEXT,
|
|
166
|
-
type: ['VerifiableCredential', 'CartMandate'],
|
|
167
|
-
issuer: opts.issuerPublic,
|
|
168
|
-
issuanceDate: new Date(Number.isFinite(cart.now) ? cart.now : Date.now()).toISOString(),
|
|
169
|
-
...(cart.expiry !== undefined ? { expirationDate: new Date(cart.expiry).toISOString() } : {}),
|
|
170
|
-
credentialSubject: contents,
|
|
171
|
-
};
|
|
172
|
-
return opts.issuerSecret ? signMandate(vdc, opts.issuerSecret) : vdc;
|
|
173
|
-
}
|
|
174
|
-
/** Narrow a Cart Mandate into an AP2 Payment Mandate VDC (the payment authorization + modality). */
|
|
175
|
-
function toAP2PaymentMandate(cart, opts) {
|
|
176
|
-
const amount = opts.amount ?? { ...cart.credentialSubject.total };
|
|
177
|
-
const humanPresent = opts.humanPresent ?? (opts.pcaTier !== undefined ? opts.pcaTier >= 3 : false);
|
|
178
|
-
const contents = {
|
|
179
|
-
cart_hash: mandateHash(cart),
|
|
180
|
-
...(opts.intent ? { intent_hash: mandateHash(opts.intent) } : {}),
|
|
181
|
-
amount,
|
|
182
|
-
payment_method: { ...opts.paymentMethod },
|
|
183
|
-
human_present: humanPresent,
|
|
184
|
-
...(cart.credentialSubject.merchant ? { merchant: cart.credentialSubject.merchant } : {}),
|
|
185
|
-
};
|
|
186
|
-
const vdc = {
|
|
187
|
-
'@context': exports.AP2_CONTEXT,
|
|
188
|
-
type: ['VerifiableCredential', 'PaymentMandate'],
|
|
189
|
-
issuer: opts.issuerPublic,
|
|
190
|
-
issuanceDate: new Date(Number.isFinite(opts.now) ? opts.now : Date.now()).toISOString(),
|
|
191
|
-
credentialSubject: contents,
|
|
192
|
-
};
|
|
193
|
-
return opts.issuerSecret ? signMandate(vdc, opts.issuerSecret) : vdc;
|
|
194
|
-
}
|
|
195
|
-
/** Parse an AP2 mandate VDC back toward PCA terms (lossless for an Intent minted with `x_pca`). */
|
|
196
|
-
function fromAP2Mandate(vdc) {
|
|
197
|
-
const kind = vdc.type[1];
|
|
198
|
-
if (kind === 'IntentMandate') {
|
|
199
|
-
const cs = vdc.credentialSubject;
|
|
200
|
-
const x = cs.x_pca;
|
|
201
|
-
return {
|
|
202
|
-
type: 'IntentMandate',
|
|
203
|
-
...(cs.merchants ? { merchants: [...cs.merchants] } : {}),
|
|
204
|
-
...(cs.categories ? { categories: [...cs.categories] } : {}),
|
|
205
|
-
currency: cs.max_amount.currency,
|
|
206
|
-
perTransactionCap: x?.per_transaction_cap ?? cs.max_amount.value,
|
|
207
|
-
...(x ? { autoApproveThreshold: x.auto_approve_threshold, cumulativeCap: x.cumulative_cap } : {}),
|
|
208
|
-
...(x?.period_start !== undefined ? { periodStart: x.period_start } : {}),
|
|
209
|
-
...(x?.period_end !== undefined ? { periodEnd: x.period_end } : {}),
|
|
210
|
-
...(x?.max_transactions_per_period !== undefined
|
|
211
|
-
? { maxTransactionsPerPeriod: x.max_transactions_per_period }
|
|
212
|
-
: {}),
|
|
213
|
-
...(x?.goal_commit !== undefined ? { goalCommit: x.goal_commit } : {}),
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
if (kind === 'CartMandate') {
|
|
217
|
-
const cs = vdc.credentialSubject;
|
|
218
|
-
return { type: 'CartMandate', merchant: cs.merchant, amount: cs.total.value, currency: cs.total.currency };
|
|
219
|
-
}
|
|
220
|
-
const cs = vdc.credentialSubject;
|
|
221
|
-
return {
|
|
222
|
-
type: 'PaymentMandate',
|
|
223
|
-
amount: cs.amount.value,
|
|
224
|
-
currency: cs.amount.currency,
|
|
225
|
-
humanPresent: cs.human_present,
|
|
226
|
-
...(cs.merchant ? { merchant: cs.merchant } : {}),
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Verify an AP2 Intent→Cart→Payment chain: each VDC's signature, the hash bindings (cart→intent,
|
|
231
|
-
* payment→cart), and that every step only RESTRICTS the one above (never amplifies). This mirrors
|
|
232
|
-
* PCA's attenuation check: a child capability may narrow authority but never widen it.
|
|
233
|
-
*/
|
|
234
|
-
function verifyAP2Chain(intent, cart, payment) {
|
|
235
|
-
const reasons = [];
|
|
236
|
-
// 1. Signatures (each mandate must be signed and verify under its own issuer).
|
|
237
|
-
if (!verifyMandate(intent))
|
|
238
|
-
reasons.push('intent signature invalid or missing');
|
|
239
|
-
if (!verifyMandate(cart))
|
|
240
|
-
reasons.push('cart signature invalid or missing');
|
|
241
|
-
if (!verifyMandate(payment))
|
|
242
|
-
reasons.push('payment signature invalid or missing');
|
|
243
|
-
const i = intent.credentialSubject;
|
|
244
|
-
const c = cart.credentialSubject;
|
|
245
|
-
const p = payment.credentialSubject;
|
|
246
|
-
// 2. Hash bindings (cart → intent, payment → cart).
|
|
247
|
-
if (c.intent_reference !== mandateHash(intent))
|
|
248
|
-
reasons.push('cart does not reference this intent');
|
|
249
|
-
if (p.cart_hash !== mandateHash(cart))
|
|
250
|
-
reasons.push('payment does not reference this cart');
|
|
251
|
-
if (p.intent_hash !== undefined && p.intent_hash !== mandateHash(intent)) {
|
|
252
|
-
reasons.push('payment intent_hash does not match this intent');
|
|
253
|
-
}
|
|
254
|
-
// 3. Currency consistency (no implicit FX across the chain).
|
|
255
|
-
if (c.total.currency !== i.max_amount.currency)
|
|
256
|
-
reasons.push('cart currency differs from intent');
|
|
257
|
-
if (p.amount.currency !== c.total.currency)
|
|
258
|
-
reasons.push('payment currency differs from cart');
|
|
259
|
-
// 4. Non-amplifying narrowing of AMOUNT (the core attenuation check).
|
|
260
|
-
if (c.total.value > i.max_amount.value) {
|
|
261
|
-
reasons.push(`cart total ${c.total.value} exceeds intent cap ${i.max_amount.value} (amplifying)`);
|
|
262
|
-
}
|
|
263
|
-
if (p.amount.value > c.total.value) {
|
|
264
|
-
reasons.push(`payment amount ${p.amount.value} exceeds cart total ${c.total.value} (amplifying)`);
|
|
265
|
-
}
|
|
266
|
-
// 5. Merchant allowlist narrowing (null intent.merchants ⇒ any merchant permitted).
|
|
267
|
-
if (i.merchants !== null && !i.merchants.includes(c.merchant)) {
|
|
268
|
-
reasons.push(`cart merchant '${c.merchant}' not in intent allowlist`);
|
|
269
|
-
}
|
|
270
|
-
return { ok: reasons.length === 0, reasons };
|
|
271
|
-
}
|
|
272
|
-
/** Assemble the signed Intent→Cart→Payment chain and attach its non-amplifying-narrowing verifier. */
|
|
273
|
-
function chainMandates(intent, cart, payment) {
|
|
274
|
-
return { intent, cart, payment, verify: () => verifyAP2Chain(intent, cart, payment) };
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Convert a decimal amount to an integer string of atomic units (`10 ** decimals` per unit). Throws on
|
|
278
|
-
* anything that is not a finite, non-negative amount that fits exactly in a safe integer.
|
|
279
|
-
*/
|
|
280
|
-
function toAtomicUnits(value, decimals) {
|
|
281
|
-
if (!Number.isInteger(decimals) || decimals < 0 || decimals > 18) {
|
|
282
|
-
throw new RangeError(`x402: decimals must be an integer in 0..18, got ${String(decimals)}`);
|
|
283
|
-
}
|
|
284
|
-
const atomic = Math.round(value * 10 ** decimals);
|
|
285
|
-
if (!Number.isFinite(value) || value < 0 || !Number.isSafeInteger(atomic)) {
|
|
286
|
-
throw new RangeError(`x402: amount ${String(value)} cannot be expressed in atomic units with ${decimals} decimals`);
|
|
287
|
-
}
|
|
288
|
-
return String(atomic);
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Coinbase x402 adapter: models the HTTP 402 `Payment Required` challenge (the server's `accepts`
|
|
292
|
-
* payment requirements) plus the `X-PAYMENT` request header carrying the base64 payment payload the
|
|
293
|
-
* client re-sends. Structural only — the real rail settles on-chain. (Field names follow the public
|
|
294
|
-
* x402 shape and should be checked against the x402 spec before production.)
|
|
295
|
-
*/
|
|
296
|
-
exports.x402Settlement = {
|
|
297
|
-
rail: 'x402',
|
|
298
|
-
settle(payment, ctx) {
|
|
299
|
-
const cs = payment.credentialSubject;
|
|
300
|
-
const network = ctx?.network ?? 'base-sepolia';
|
|
301
|
-
const requirement = {
|
|
302
|
-
scheme: 'exact',
|
|
303
|
-
network,
|
|
304
|
-
// x402 v1: `maxAmountRequired` is a string in ATOMIC token units, not a decimal amount.
|
|
305
|
-
maxAmountRequired: toAtomicUnits(cs.amount.value, ctx?.decimals ?? 6),
|
|
306
|
-
resource: ctx?.resourceUrl ?? '',
|
|
307
|
-
description: `AP2 payment mandate ${cs.cart_hash}`,
|
|
308
|
-
payTo: ctx?.payTo ?? cs.merchant ?? '',
|
|
309
|
-
asset: ctx?.asset ?? cs.amount.currency,
|
|
310
|
-
mimeType: 'application/json',
|
|
311
|
-
maxTimeoutSeconds: ctx?.maxTimeoutSeconds ?? 60,
|
|
312
|
-
};
|
|
313
|
-
// x402 carries `X-PAYMENT` as STANDARD base64 (with padding) of the JSON PaymentPayload. This
|
|
314
|
-
// envelope is a placeholder: a real client replaces `payload` with its signed authorization.
|
|
315
|
-
const xPayment = Buffer.from(JSON.stringify({
|
|
316
|
-
x402Version: 1,
|
|
317
|
-
scheme: 'exact',
|
|
318
|
-
network,
|
|
319
|
-
payload: { cartHash: cs.cart_hash, humanPresent: cs.human_present, amount: cs.amount.value },
|
|
320
|
-
}), 'utf8').toString('base64');
|
|
321
|
-
return {
|
|
322
|
-
rail: 'x402',
|
|
323
|
-
amount: cs.amount,
|
|
324
|
-
...(cs.merchant ? { merchant: cs.merchant } : {}),
|
|
325
|
-
payload: {
|
|
326
|
-
httpStatus: 402,
|
|
327
|
-
x402Version: 1,
|
|
328
|
-
error: 'X-PAYMENT header is required',
|
|
329
|
-
accepts: [requirement],
|
|
330
|
-
header: { 'X-PAYMENT': xPayment },
|
|
331
|
-
},
|
|
332
|
-
};
|
|
333
|
-
},
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
334
15
|
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.AP2_COMMIT = void 0;
|
|
335
18
|
/**
|
|
336
|
-
*
|
|
337
|
-
*
|
|
338
|
-
*
|
|
339
|
-
*
|
|
19
|
+
* @atlasauth/pca-ap2: AP2 (Agent Payments Protocol) mandates as real SD-JWT credentials, bound to a PCA grant.
|
|
20
|
+
*
|
|
21
|
+
* PCA governs: it decides who may spend, how much, until when, and when a human must co-sign. AP2 is
|
|
22
|
+
* the mandate wire other parties verify. Settlement rails (x402, Stripe Shared Payment Tokens) move
|
|
23
|
+
* the value, fed by PCA's decision.
|
|
340
24
|
*/
|
|
341
|
-
exports
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
payload: {
|
|
350
|
-
shared_payment_token: cs.payment_method.token ?? '',
|
|
351
|
-
amount: Math.round(cs.amount.value * 100),
|
|
352
|
-
currency: cs.amount.currency.toLowerCase(),
|
|
353
|
-
human_present: cs.human_present,
|
|
354
|
-
...(ctx?.payTo ? { on_behalf_of: ctx.payTo } : {}),
|
|
355
|
-
},
|
|
356
|
-
};
|
|
357
|
-
},
|
|
358
|
-
};
|
|
25
|
+
__exportStar(require("./sdjwt"), exports);
|
|
26
|
+
__exportStar(require("./mandates"), exports);
|
|
27
|
+
__exportStar(require("./constraints"), exports);
|
|
28
|
+
__exportStar(require("./chain"), exports);
|
|
29
|
+
__exportStar(require("./pca"), exports);
|
|
30
|
+
__exportStar(require("./settlement"), exports);
|
|
31
|
+
/** The AP2 repository commit whose schemas and documentation this package is checked against. */
|
|
32
|
+
exports.AP2_COMMIT = 'e1ea56db72a6385bce3e5c1112b3a56ce60acb43';
|
|
359
33
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;;;;GAMG;AACH,0CAAwB;AACxB,6CAA2B;AAC3B,gDAA8B;AAC9B,0CAAwB;AACxB,wCAAsB;AACtB,+CAA6B;AAE7B,iGAAiG;AACpF,QAAA,UAAU,GAAG,0CAA0C,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AP2 mandate claim shapes (Intent/Cart/Payment, closed and open) and their validators.
|
|
3
|
+
*
|
|
4
|
+
* The shapes follow the official AP2 JSON Schemas (`checkout_mandate`, `open_checkout_mandate`,
|
|
5
|
+
* `payment_mandate`, `open_payment_mandate` and `types/*`). The validators are hand-written, check at
|
|
6
|
+
* least what those schemas check (the test-suite runs both against the same documents) and are
|
|
7
|
+
* stricter in places where a lax reading would be unsafe (non-negative safe-integer amounts,
|
|
8
|
+
* well-formed JWKs).
|
|
9
|
+
*/
|
|
10
|
+
import { type Json, type JsonObject, type P256Jwk } from './sdjwt';
|
|
11
|
+
export declare const VCT_CHECKOUT = "mandate.checkout.1";
|
|
12
|
+
export declare const VCT_CHECKOUT_OPEN = "mandate.checkout.open.1";
|
|
13
|
+
export declare const VCT_PAYMENT = "mandate.payment.1";
|
|
14
|
+
export declare const VCT_PAYMENT_OPEN = "mandate.payment.open.1";
|
|
15
|
+
/** Namespaced claim carrying PCA's own proof inside a mandate object (see `pca.ts`). */
|
|
16
|
+
export declare const PCA_CLAIM = "x_pca";
|
|
17
|
+
/** ISO 4217 minor-unit exponent for `currency` (2 for any code not in the 0/3/4-digit tables). */
|
|
18
|
+
export declare function currencyExponent(currency: string): number;
|
|
19
|
+
/**
|
|
20
|
+
* Convert a major-unit amount (e.g. `120.5` USD) to integer minor units (`12050`). Throws unless the
|
|
21
|
+
* amount is exactly representable with the currency's exponent: float drift (`0.1 + 0.2`) is refused
|
|
22
|
+
* rather than rounded away.
|
|
23
|
+
*/
|
|
24
|
+
export declare function toMinorUnits(major: number, currency: string): number;
|
|
25
|
+
/** Integer minor units to the major-unit number PCA budgets use (exact for any safe integer). */
|
|
26
|
+
export declare function fromMinorUnits(minor: number, currency: string): number;
|
|
27
|
+
export interface Merchant {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
website?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface Amount {
|
|
33
|
+
/** Integer minor units per ISO 4217 (27999 = USD 279.99). */
|
|
34
|
+
amount: number;
|
|
35
|
+
currency: string;
|
|
36
|
+
}
|
|
37
|
+
export interface PaymentInstrument {
|
|
38
|
+
id: string;
|
|
39
|
+
type: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface Pisp {
|
|
43
|
+
legal_name: string;
|
|
44
|
+
brand_name: string;
|
|
45
|
+
domain_name: string;
|
|
46
|
+
}
|
|
47
|
+
export interface CheckoutItem {
|
|
48
|
+
id: string;
|
|
49
|
+
title: string;
|
|
50
|
+
}
|
|
51
|
+
export type Frequency = 'ON_DEMAND' | 'DAILY' | 'WEEKLY' | 'BIWEEKLY' | 'MONTHLY' | 'QUARTERLY' | 'ANNUALLY';
|
|
52
|
+
export declare const FREQUENCIES: readonly Frequency[];
|
|
53
|
+
export type PaymentConstraint = {
|
|
54
|
+
type: 'payment.agent_recurrence';
|
|
55
|
+
frequency: Frequency;
|
|
56
|
+
max_occurrences?: number;
|
|
57
|
+
} | {
|
|
58
|
+
type: 'payment.allowed_payees';
|
|
59
|
+
allowed: Merchant[];
|
|
60
|
+
} | {
|
|
61
|
+
type: 'payment.allowed_payment_instruments';
|
|
62
|
+
allowed: PaymentInstrument[];
|
|
63
|
+
} | {
|
|
64
|
+
type: 'payment.allowed_pisps';
|
|
65
|
+
allowed: Pisp[];
|
|
66
|
+
} | {
|
|
67
|
+
type: 'payment.amount_range';
|
|
68
|
+
currency: string;
|
|
69
|
+
max: number;
|
|
70
|
+
min?: number;
|
|
71
|
+
} | {
|
|
72
|
+
type: 'payment.budget';
|
|
73
|
+
currency: string;
|
|
74
|
+
max: number;
|
|
75
|
+
} | {
|
|
76
|
+
type: 'payment.execution_date';
|
|
77
|
+
not_before?: string;
|
|
78
|
+
not_after?: string;
|
|
79
|
+
} | {
|
|
80
|
+
type: 'payment.reference';
|
|
81
|
+
conditional_transaction_id: string;
|
|
82
|
+
};
|
|
83
|
+
export interface LineItemRequirement {
|
|
84
|
+
id: string;
|
|
85
|
+
acceptable_items: CheckoutItem[];
|
|
86
|
+
quantity: number;
|
|
87
|
+
}
|
|
88
|
+
export type CheckoutConstraint = {
|
|
89
|
+
type: 'checkout.allowed_merchants';
|
|
90
|
+
allowed: Merchant[];
|
|
91
|
+
} | {
|
|
92
|
+
type: 'checkout.line_items';
|
|
93
|
+
items: LineItemRequirement[];
|
|
94
|
+
};
|
|
95
|
+
interface Common {
|
|
96
|
+
iat?: number;
|
|
97
|
+
exp?: number;
|
|
98
|
+
[PCA_CLAIM]?: JsonObject;
|
|
99
|
+
}
|
|
100
|
+
export interface OpenPaymentMandateClaims extends Common {
|
|
101
|
+
vct: typeof VCT_PAYMENT_OPEN;
|
|
102
|
+
constraints: PaymentConstraint[];
|
|
103
|
+
cnf: {
|
|
104
|
+
jwk: P256Jwk;
|
|
105
|
+
};
|
|
106
|
+
payee?: Merchant;
|
|
107
|
+
payment_amount?: Amount;
|
|
108
|
+
payment_instrument?: PaymentInstrument;
|
|
109
|
+
pisp?: Pisp;
|
|
110
|
+
execution_date?: string;
|
|
111
|
+
risk_data?: JsonObject;
|
|
112
|
+
}
|
|
113
|
+
export interface PaymentMandateClaims extends Common {
|
|
114
|
+
vct: typeof VCT_PAYMENT;
|
|
115
|
+
transaction_id: string;
|
|
116
|
+
payee: Merchant;
|
|
117
|
+
payment_amount: Amount;
|
|
118
|
+
payment_instrument: PaymentInstrument;
|
|
119
|
+
pisp?: Pisp;
|
|
120
|
+
execution_date?: string;
|
|
121
|
+
risk_data?: JsonObject;
|
|
122
|
+
}
|
|
123
|
+
export interface OpenCheckoutMandateClaims extends Common {
|
|
124
|
+
vct: typeof VCT_CHECKOUT_OPEN;
|
|
125
|
+
constraints: CheckoutConstraint[];
|
|
126
|
+
cnf: {
|
|
127
|
+
jwk: P256Jwk;
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export interface CheckoutMandateClaims extends Common {
|
|
131
|
+
vct: typeof VCT_CHECKOUT;
|
|
132
|
+
checkout_jwt: string;
|
|
133
|
+
checkout_hash: string;
|
|
134
|
+
}
|
|
135
|
+
export declare function openPaymentMandateProblems(v: unknown): string[];
|
|
136
|
+
export declare function paymentMandateProblems(v: unknown): string[];
|
|
137
|
+
export declare function openCheckoutMandateProblems(v: unknown): string[];
|
|
138
|
+
export declare function checkoutMandateProblems(v: unknown): string[];
|
|
139
|
+
export declare function assertValid<T>(v: unknown, problems: (v: unknown) => string[], what: string): T;
|
|
140
|
+
export type { Json };
|