@keelcodes/settlement 0.1.0

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 (47) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +316 -0
  3. package/dist/a2a.d.ts +107 -0
  4. package/dist/a2a.d.ts.map +1 -0
  5. package/dist/a2a.js +254 -0
  6. package/dist/a2a.js.map +1 -0
  7. package/dist/erc8183.d.ts +108 -0
  8. package/dist/erc8183.d.ts.map +1 -0
  9. package/dist/erc8183.js +206 -0
  10. package/dist/erc8183.js.map +1 -0
  11. package/dist/index.d.ts +21 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +11 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/ledger.d.ts +37 -0
  16. package/dist/ledger.d.ts.map +1 -0
  17. package/dist/ledger.js +114 -0
  18. package/dist/ledger.js.map +1 -0
  19. package/dist/mpp.d.ts +78 -0
  20. package/dist/mpp.d.ts.map +1 -0
  21. package/dist/mpp.js +129 -0
  22. package/dist/mpp.js.map +1 -0
  23. package/dist/rails.d.ts +132 -0
  24. package/dist/rails.d.ts.map +1 -0
  25. package/dist/rails.js +147 -0
  26. package/dist/rails.js.map +1 -0
  27. package/dist/receipts.d.ts +25 -0
  28. package/dist/receipts.d.ts.map +1 -0
  29. package/dist/receipts.js +44 -0
  30. package/dist/receipts.js.map +1 -0
  31. package/dist/types.d.ts +100 -0
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/types.js +19 -0
  34. package/dist/types.js.map +1 -0
  35. package/dist/webhooks.d.ts +106 -0
  36. package/dist/webhooks.d.ts.map +1 -0
  37. package/dist/webhooks.js +162 -0
  38. package/dist/webhooks.js.map +1 -0
  39. package/dist/wire.d.ts +31 -0
  40. package/dist/wire.d.ts.map +1 -0
  41. package/dist/wire.js +224 -0
  42. package/dist/wire.js.map +1 -0
  43. package/dist/x402.d.ts +93 -0
  44. package/dist/x402.d.ts.map +1 -0
  45. package/dist/x402.js +196 -0
  46. package/dist/x402.js.map +1 -0
  47. package/package.json +52 -0
package/dist/wire.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ /** Encodes UTF-8 text as base64 (standard, padded) or base64url (unpadded). */
2
+ export declare function base64Encode(input: string, options?: {
3
+ urlSafe?: boolean;
4
+ }): string;
5
+ /** Decodes base64 or base64url (padding optional) back to UTF-8 text. */
6
+ export declare function base64Decode(input: string): string;
7
+ /** Encodes a value as base64(url) JSON — how both protocols carry a payload. */
8
+ export declare function encodeJsonPayload(value: unknown, options?: {
9
+ urlSafe?: boolean;
10
+ }): string;
11
+ /** Decodes base64(url) JSON, reporting a `malformed-payload` error on bad input. */
12
+ export declare function decodeJsonPayload<T>(input: string): T;
13
+ export interface AuthHeader {
14
+ scheme: string;
15
+ params: Record<string, string>;
16
+ }
17
+ /**
18
+ * Reads just the auth scheme. Useful for rejecting a foreign scheme before
19
+ * parsing params — `Bearer abc` is not an auth-param header at all, and the
20
+ * error worth reporting is "wrong scheme", not "malformed parameters".
21
+ */
22
+ export declare function authScheme(headerValue: string): string;
23
+ /**
24
+ * Parses an HTTP auth header (`Scheme a="1", b=2`) as defined by RFC 9110
25
+ * §11.2. Handles quoted-string values containing commas and escapes — which is
26
+ * exactly what a base64 payload in a challenge param looks like.
27
+ */
28
+ export declare function parseAuthHeader(headerValue: string): AuthHeader;
29
+ /** Serialises an auth header, quoting and escaping every value. */
30
+ export declare function formatAuthHeader(header: AuthHeader): string;
31
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../src/wire.ts"],"names":[],"mappings":"AAuFA,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAgBvF;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBlD;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAE7F;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,CAOrD;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAKD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAkE/D;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAO3D"}
package/dist/wire.js ADDED
@@ -0,0 +1,224 @@
1
+ import { SettlementError } from './types.js';
2
+ /**
3
+ * Base64 / base64url and UTF-8 codecs, plus the HTTP auth-param grammar both
4
+ * payment protocols lean on.
5
+ *
6
+ * Written against plain ES2022 rather than `Buffer`/`atob` on purpose: the
7
+ * settlement core carries no runtime dependency and must run in Node, browsers
8
+ * and edge workers alike.
9
+ */
10
+ const STD_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
11
+ const URL_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
12
+ const DECODE_TABLE = (() => {
13
+ const table = new Map();
14
+ for (let index = 0; index < 64; index += 1) {
15
+ table.set(STD_ALPHABET.charAt(index), index);
16
+ table.set(URL_ALPHABET.charAt(index), index);
17
+ }
18
+ return table;
19
+ })();
20
+ function utf8Encode(input) {
21
+ const bytes = [];
22
+ for (const char of input) {
23
+ const codePoint = char.codePointAt(0) ?? 0;
24
+ if (codePoint < 0x80) {
25
+ bytes.push(codePoint);
26
+ }
27
+ else if (codePoint < 0x800) {
28
+ bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f));
29
+ }
30
+ else if (codePoint < 0x10000) {
31
+ bytes.push(0xe0 | (codePoint >> 12), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));
32
+ }
33
+ else {
34
+ bytes.push(0xf0 | (codePoint >> 18), 0x80 | ((codePoint >> 12) & 0x3f), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));
35
+ }
36
+ }
37
+ return bytes;
38
+ }
39
+ function utf8Decode(bytes) {
40
+ let out = '';
41
+ let index = 0;
42
+ while (index < bytes.length) {
43
+ const lead = bytes[index];
44
+ let codePoint;
45
+ let width;
46
+ if (lead < 0x80) {
47
+ codePoint = lead;
48
+ width = 1;
49
+ }
50
+ else if ((lead & 0xe0) === 0xc0) {
51
+ codePoint = lead & 0x1f;
52
+ width = 2;
53
+ }
54
+ else if ((lead & 0xf0) === 0xe0) {
55
+ codePoint = lead & 0x0f;
56
+ width = 3;
57
+ }
58
+ else if ((lead & 0xf8) === 0xf0) {
59
+ codePoint = lead & 0x07;
60
+ width = 4;
61
+ }
62
+ else {
63
+ throw new SettlementError('malformed-payload', `invalid UTF-8 lead byte 0x${lead.toString(16)}`);
64
+ }
65
+ if (index + width > bytes.length) {
66
+ throw new SettlementError('malformed-payload', 'truncated UTF-8 sequence');
67
+ }
68
+ for (let offset = 1; offset < width; offset += 1) {
69
+ const continuation = bytes[index + offset];
70
+ if ((continuation & 0xc0) !== 0x80) {
71
+ throw new SettlementError('malformed-payload', 'invalid UTF-8 continuation byte');
72
+ }
73
+ codePoint = (codePoint << 6) | (continuation & 0x3f);
74
+ }
75
+ out += String.fromCodePoint(codePoint);
76
+ index += width;
77
+ }
78
+ return out;
79
+ }
80
+ /** Encodes UTF-8 text as base64 (standard, padded) or base64url (unpadded). */
81
+ export function base64Encode(input, options = {}) {
82
+ const urlSafe = options.urlSafe ?? false;
83
+ const alphabet = urlSafe ? URL_ALPHABET : STD_ALPHABET;
84
+ const bytes = utf8Encode(input);
85
+ let out = '';
86
+ for (let index = 0; index < bytes.length; index += 3) {
87
+ const b0 = bytes[index];
88
+ const b1 = bytes[index + 1];
89
+ const b2 = bytes[index + 2];
90
+ out += alphabet.charAt(b0 >> 2);
91
+ out += alphabet.charAt(((b0 & 0x03) << 4) | ((b1 ?? 0) >> 4));
92
+ out += b1 === undefined ? (urlSafe ? '' : '=') : alphabet.charAt(((b1 & 0x0f) << 2) | ((b2 ?? 0) >> 6));
93
+ out += b2 === undefined ? (urlSafe ? '' : '=') : alphabet.charAt(b2 & 0x3f);
94
+ }
95
+ return out;
96
+ }
97
+ /** Decodes base64 or base64url (padding optional) back to UTF-8 text. */
98
+ export function base64Decode(input) {
99
+ const cleaned = input.replace(/\s+/g, '').replace(/=+$/, '');
100
+ const bytes = [];
101
+ let buffer = 0;
102
+ let bits = 0;
103
+ for (const char of cleaned) {
104
+ const value = DECODE_TABLE.get(char);
105
+ if (value === undefined) {
106
+ throw new SettlementError('malformed-payload', `invalid base64 character ${JSON.stringify(char)}`);
107
+ }
108
+ buffer = (buffer << 6) | value;
109
+ bits += 6;
110
+ if (bits >= 8) {
111
+ bits -= 8;
112
+ bytes.push((buffer >> bits) & 0xff);
113
+ }
114
+ }
115
+ return utf8Decode(bytes);
116
+ }
117
+ /** Encodes a value as base64(url) JSON — how both protocols carry a payload. */
118
+ export function encodeJsonPayload(value, options = {}) {
119
+ return base64Encode(JSON.stringify(value), options);
120
+ }
121
+ /** Decodes base64(url) JSON, reporting a `malformed-payload` error on bad input. */
122
+ export function decodeJsonPayload(input) {
123
+ const text = base64Decode(input);
124
+ try {
125
+ return JSON.parse(text);
126
+ }
127
+ catch {
128
+ throw new SettlementError('malformed-payload', `payload is not valid JSON: ${text.slice(0, 120)}`);
129
+ }
130
+ }
131
+ const WHITESPACE = /\s/;
132
+ const SEPARATOR = /[\s,]/;
133
+ /**
134
+ * Reads just the auth scheme. Useful for rejecting a foreign scheme before
135
+ * parsing params — `Bearer abc` is not an auth-param header at all, and the
136
+ * error worth reporting is "wrong scheme", not "malformed parameters".
137
+ */
138
+ export function authScheme(headerValue) {
139
+ return /^([^\s]+)/.exec(headerValue.trim())?.[1] ?? '';
140
+ }
141
+ /**
142
+ * Parses an HTTP auth header (`Scheme a="1", b=2`) as defined by RFC 9110
143
+ * §11.2. Handles quoted-string values containing commas and escapes — which is
144
+ * exactly what a base64 payload in a challenge param looks like.
145
+ */
146
+ export function parseAuthHeader(headerValue) {
147
+ const trimmed = headerValue.trim();
148
+ if (trimmed === '') {
149
+ throw new SettlementError('malformed-payload', 'empty auth header');
150
+ }
151
+ let index = 0;
152
+ while (index < trimmed.length && !WHITESPACE.test(trimmed.charAt(index)))
153
+ index += 1;
154
+ const scheme = trimmed.slice(0, index);
155
+ const params = {};
156
+ while (index < trimmed.length) {
157
+ while (index < trimmed.length && (SEPARATOR.test(trimmed.charAt(index))))
158
+ index += 1;
159
+ if (index >= trimmed.length)
160
+ break;
161
+ const nameStart = index;
162
+ while (index < trimmed.length && trimmed.charAt(index) !== '=' && !SEPARATOR.test(trimmed.charAt(index))) {
163
+ index += 1;
164
+ }
165
+ const name = trimmed.slice(nameStart, index);
166
+ if (name === '') {
167
+ throw new SettlementError('malformed-payload', `empty auth-param name in ${JSON.stringify(headerValue)}`);
168
+ }
169
+ while (index < trimmed.length && WHITESPACE.test(trimmed.charAt(index)))
170
+ index += 1;
171
+ if (trimmed.charAt(index) !== '=') {
172
+ throw new SettlementError('malformed-payload', `auth-param ${name} has no value`);
173
+ }
174
+ index += 1;
175
+ while (index < trimmed.length && WHITESPACE.test(trimmed.charAt(index)))
176
+ index += 1;
177
+ if (trimmed.charAt(index) === '"') {
178
+ index += 1;
179
+ let value = '';
180
+ let closed = false;
181
+ while (index < trimmed.length) {
182
+ const char = trimmed.charAt(index);
183
+ if (char === '\\') {
184
+ const escaped = trimmed.charAt(index + 1);
185
+ if (escaped === '') {
186
+ throw new SettlementError('malformed-payload', 'dangling escape in quoted auth-param');
187
+ }
188
+ value += escaped;
189
+ index += 2;
190
+ continue;
191
+ }
192
+ if (char === '"') {
193
+ closed = true;
194
+ index += 1;
195
+ break;
196
+ }
197
+ value += char;
198
+ index += 1;
199
+ }
200
+ if (!closed) {
201
+ throw new SettlementError('malformed-payload', `unterminated quoted value for auth-param ${name}`);
202
+ }
203
+ params[name] = value;
204
+ }
205
+ else {
206
+ const valueStart = index;
207
+ while (index < trimmed.length && !SEPARATOR.test(trimmed.charAt(index)))
208
+ index += 1;
209
+ params[name] = trimmed.slice(valueStart, index);
210
+ }
211
+ }
212
+ return { scheme, params };
213
+ }
214
+ /** Serialises an auth header, quoting and escaping every value. */
215
+ export function formatAuthHeader(header) {
216
+ const entries = Object.entries(header.params);
217
+ if (entries.length === 0)
218
+ return header.scheme;
219
+ const rendered = entries
220
+ .map(([name, value]) => `${name}="${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`)
221
+ .join(', ');
222
+ return `${header.scheme} ${rendered}`;
223
+ }
224
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../src/wire.ts"],"names":[],"mappings":"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"}
package/dist/x402.d.ts ADDED
@@ -0,0 +1,93 @@
1
+ import { type Caip2, type PaymentIntent } from './types.js';
2
+ /**
3
+ * x402 v2 (https://docs.x402.org) — the HTTP 402 payment flow.
4
+ *
5
+ * Keel models the part of x402 the *core* spec fixes: the three headers, the
6
+ * `PaymentRequired` requirements object, requirement selection, and the
7
+ * anti-tamper check against a {@link PaymentIntent}. The scheme-specific
8
+ * `PaymentPayload` a client puts in `PAYMENT-SIGNATURE` (EIP-3009 authorization,
9
+ * permit, …) is opaque here and produced by the caller's scheme module — this
10
+ * package does not invent it.
11
+ */
12
+ export declare const X402_VERSION = 2;
13
+ /** HTTP header names used by x402 v2 (HTTP header lookup is case-insensitive). */
14
+ export declare const X402_HEADERS: {
15
+ /** Server → client: base64 `PaymentRequired`. */
16
+ readonly required: "PAYMENT-REQUIRED";
17
+ /** Client → server: base64 `PaymentPayload` (scheme-specific). */
18
+ readonly signature: "PAYMENT-SIGNATURE";
19
+ /** Server → client: base64 `SettlementResponse`. */
20
+ readonly response: "PAYMENT-RESPONSE";
21
+ };
22
+ export interface X402Resource {
23
+ url: string;
24
+ description?: string;
25
+ mimeType?: string;
26
+ }
27
+ export interface X402Requirements {
28
+ /** e.g. `exact`. */
29
+ scheme: string;
30
+ network: Caip2;
31
+ /** Atomic units, as a decimal string. */
32
+ amount: string;
33
+ asset: string;
34
+ payTo: string;
35
+ maxTimeoutSeconds: number;
36
+ extra?: Record<string, unknown>;
37
+ }
38
+ export interface X402PaymentRequired {
39
+ x402Version: number;
40
+ error?: string;
41
+ resource: X402Resource;
42
+ accepts: X402Requirements[];
43
+ extensions?: Record<string, unknown>;
44
+ }
45
+ export interface X402SettlementResponse {
46
+ success: boolean;
47
+ transaction?: string;
48
+ network?: string;
49
+ payer?: string;
50
+ errorReason?: string;
51
+ extensions?: Record<string, unknown>;
52
+ }
53
+ /** Parses a `PAYMENT-REQUIRED` header value. */
54
+ export declare function parsePaymentRequired(headerValue: string): X402PaymentRequired;
55
+ /** Serialises a `PaymentRequired` object for the `PAYMENT-REQUIRED` header. */
56
+ export declare function formatPaymentRequired(value: X402PaymentRequired): string;
57
+ /** Parses a `PAYMENT-RESPONSE` header value. */
58
+ export declare function parseSettlementResponse(headerValue: string): X402SettlementResponse;
59
+ /** Serialises a settlement response for the `PAYMENT-RESPONSE` header. */
60
+ export declare function formatSettlementResponse(value: X402SettlementResponse): string;
61
+ /** Wraps a scheme-specific payment payload for the `PAYMENT-SIGNATURE` header. */
62
+ export declare function encodePaymentSignature(payload: unknown): string;
63
+ /** Unwraps a `PAYMENT-SIGNATURE` header value into the scheme payload. */
64
+ export declare function parsePaymentSignature(headerValue: string): unknown;
65
+ export interface RequirementFilter {
66
+ scheme?: string;
67
+ network?: string;
68
+ asset?: string;
69
+ payTo?: string;
70
+ /** Reject anything more expensive than this (atomic units). */
71
+ maxAmount?: bigint;
72
+ }
73
+ /**
74
+ * Picks the cheapest requirement the client can satisfy. Throws rather than
75
+ * returning a "best effort" pick: silently paying a requirement you did not
76
+ * choose is how an agent overpays.
77
+ */
78
+ export declare function selectRequirement(accepts: readonly X402Requirements[], filter?: RequirementFilter): X402Requirements;
79
+ /**
80
+ * The anti-tamper gate: a server may return whatever `payTo`/`amount` it likes,
81
+ * so what it asks for is only safe to act on once it matches the intent.
82
+ */
83
+ export declare function verifyRequirement(requirement: X402Requirements, intent: PaymentIntent): void;
84
+ export interface IntentFromRequirementArgs {
85
+ id: string;
86
+ payer: string;
87
+ reference?: string;
88
+ /** Anchors `expiresAt` from `maxTimeoutSeconds`. */
89
+ now?: Date;
90
+ }
91
+ /** Builds the client-side intent from the requirement the client agreed to. */
92
+ export declare function intentFromRequirement(requirement: X402Requirements, args: IntentFromRequirementArgs): PaymentIntent;
93
+ //# sourceMappingURL=x402.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402.d.ts","sourceRoot":"","sources":["../src/x402.ts"],"names":[],"mappings":"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"}
package/dist/x402.js ADDED
@@ -0,0 +1,196 @@
1
+ import { SettlementError, assertCaip2 } from './types.js';
2
+ import { decodeJsonPayload, encodeJsonPayload } from './wire.js';
3
+ /**
4
+ * x402 v2 (https://docs.x402.org) — the HTTP 402 payment flow.
5
+ *
6
+ * Keel models the part of x402 the *core* spec fixes: the three headers, the
7
+ * `PaymentRequired` requirements object, requirement selection, and the
8
+ * anti-tamper check against a {@link PaymentIntent}. The scheme-specific
9
+ * `PaymentPayload` a client puts in `PAYMENT-SIGNATURE` (EIP-3009 authorization,
10
+ * permit, …) is opaque here and produced by the caller's scheme module — this
11
+ * package does not invent it.
12
+ */
13
+ export const X402_VERSION = 2;
14
+ /** HTTP header names used by x402 v2 (HTTP header lookup is case-insensitive). */
15
+ export const X402_HEADERS = {
16
+ /** Server → client: base64 `PaymentRequired`. */
17
+ required: 'PAYMENT-REQUIRED',
18
+ /** Client → server: base64 `PaymentPayload` (scheme-specific). */
19
+ signature: 'PAYMENT-SIGNATURE',
20
+ /** Server → client: base64 `SettlementResponse`. */
21
+ response: 'PAYMENT-RESPONSE',
22
+ };
23
+ function requireString(value, field) {
24
+ if (typeof value !== 'string' || value === '') {
25
+ throw new SettlementError('missing-field', `${field} must be a non-empty string`);
26
+ }
27
+ return value;
28
+ }
29
+ function assertRequirement(value, index) {
30
+ if (typeof value !== 'object' || value === null) {
31
+ throw new SettlementError('malformed-payload', `accepts[${index}] is not an object`);
32
+ }
33
+ const raw = value;
34
+ const maxTimeoutSeconds = raw['maxTimeoutSeconds'];
35
+ if (typeof maxTimeoutSeconds !== 'number' || !Number.isFinite(maxTimeoutSeconds)) {
36
+ throw new SettlementError('missing-field', `accepts[${index}].maxTimeoutSeconds must be a number`);
37
+ }
38
+ const amount = requireString(raw['amount'], `accepts[${index}].amount`);
39
+ if (!/^\d+$/.test(amount)) {
40
+ throw new SettlementError('malformed-payload', `accepts[${index}].amount must be atomic units, got ${amount}`);
41
+ }
42
+ const requirement = {
43
+ scheme: requireString(raw['scheme'], `accepts[${index}].scheme`),
44
+ network: assertCaip2(raw['network'], `accepts[${index}].network`),
45
+ amount,
46
+ asset: requireString(raw['asset'], `accepts[${index}].asset`),
47
+ payTo: requireString(raw['payTo'], `accepts[${index}].payTo`),
48
+ maxTimeoutSeconds,
49
+ };
50
+ const extra = raw['extra'];
51
+ if (extra !== undefined) {
52
+ if (typeof extra !== 'object' || extra === null) {
53
+ throw new SettlementError('malformed-payload', `accepts[${index}].extra must be an object`);
54
+ }
55
+ requirement.extra = extra;
56
+ }
57
+ return requirement;
58
+ }
59
+ /** Parses a `PAYMENT-REQUIRED` header value. */
60
+ export function parsePaymentRequired(headerValue) {
61
+ const raw = decodeJsonPayload(headerValue);
62
+ if (raw['x402Version'] !== X402_VERSION) {
63
+ throw new SettlementError('unsupported-version', `expected x402Version ${X402_VERSION}, got ${JSON.stringify(raw['x402Version'])}`);
64
+ }
65
+ const resource = raw['resource'];
66
+ if (typeof resource !== 'object' || resource === null) {
67
+ throw new SettlementError('missing-field', 'resource is required');
68
+ }
69
+ const resourceUrl = requireString(resource['url'], 'resource.url');
70
+ const accepts = raw['accepts'];
71
+ if (!Array.isArray(accepts) || accepts.length === 0) {
72
+ throw new SettlementError('missing-field', 'accepts must be a non-empty array');
73
+ }
74
+ const parsed = {
75
+ x402Version: X402_VERSION,
76
+ resource: { url: resourceUrl },
77
+ accepts: accepts.map((entry, index) => assertRequirement(entry, index)),
78
+ };
79
+ const rawResource = resource;
80
+ if (typeof rawResource['description'] === 'string')
81
+ parsed.resource.description = rawResource['description'];
82
+ if (typeof rawResource['mimeType'] === 'string')
83
+ parsed.resource.mimeType = rawResource['mimeType'];
84
+ if (typeof raw['error'] === 'string')
85
+ parsed.error = raw['error'];
86
+ if (typeof raw['extensions'] === 'object' && raw['extensions'] !== null) {
87
+ parsed.extensions = raw['extensions'];
88
+ }
89
+ return parsed;
90
+ }
91
+ /** Serialises a `PaymentRequired` object for the `PAYMENT-REQUIRED` header. */
92
+ export function formatPaymentRequired(value) {
93
+ return encodeJsonPayload(value);
94
+ }
95
+ /** Parses a `PAYMENT-RESPONSE` header value. */
96
+ export function parseSettlementResponse(headerValue) {
97
+ const raw = decodeJsonPayload(headerValue);
98
+ if (typeof raw['success'] !== 'boolean') {
99
+ throw new SettlementError('missing-field', 'SettlementResponse.success must be a boolean');
100
+ }
101
+ const response = { success: raw['success'] };
102
+ for (const field of ['transaction', 'network', 'payer', 'errorReason']) {
103
+ const fieldValue = raw[field];
104
+ if (fieldValue !== undefined) {
105
+ if (typeof fieldValue !== 'string') {
106
+ throw new SettlementError('malformed-payload', `SettlementResponse.${field} must be a string`);
107
+ }
108
+ response[field] = fieldValue;
109
+ }
110
+ }
111
+ if (typeof raw['extensions'] === 'object' && raw['extensions'] !== null) {
112
+ response.extensions = raw['extensions'];
113
+ }
114
+ return response;
115
+ }
116
+ /** Serialises a settlement response for the `PAYMENT-RESPONSE` header. */
117
+ export function formatSettlementResponse(value) {
118
+ return encodeJsonPayload(value);
119
+ }
120
+ /** Wraps a scheme-specific payment payload for the `PAYMENT-SIGNATURE` header. */
121
+ export function encodePaymentSignature(payload) {
122
+ return encodeJsonPayload(payload);
123
+ }
124
+ /** Unwraps a `PAYMENT-SIGNATURE` header value into the scheme payload. */
125
+ export function parsePaymentSignature(headerValue) {
126
+ return decodeJsonPayload(headerValue);
127
+ }
128
+ function matches(requirement, filter) {
129
+ if (filter.scheme !== undefined && requirement.scheme !== filter.scheme)
130
+ return false;
131
+ if (filter.network !== undefined && requirement.network !== filter.network)
132
+ return false;
133
+ if (filter.asset !== undefined &&
134
+ requirement.asset.toLowerCase() !== filter.asset.toLowerCase()) {
135
+ return false;
136
+ }
137
+ if (filter.payTo !== undefined && requirement.payTo.toLowerCase() !== filter.payTo.toLowerCase()) {
138
+ return false;
139
+ }
140
+ if (filter.maxAmount !== undefined && BigInt(requirement.amount) > filter.maxAmount)
141
+ return false;
142
+ return true;
143
+ }
144
+ /**
145
+ * Picks the cheapest requirement the client can satisfy. Throws rather than
146
+ * returning a "best effort" pick: silently paying a requirement you did not
147
+ * choose is how an agent overpays.
148
+ */
149
+ export function selectRequirement(accepts, filter = {}) {
150
+ const eligible = accepts.filter((requirement) => matches(requirement, filter));
151
+ if (eligible.length === 0) {
152
+ throw new SettlementError('no-acceptable-requirement', `no offered requirement satisfies ${JSON.stringify(filter, (_key, value) => typeof value === 'bigint' ? value.toString() : value)}`);
153
+ }
154
+ return eligible.reduce((cheapest, candidate) => BigInt(candidate.amount) < BigInt(cheapest.amount) ? candidate : cheapest);
155
+ }
156
+ /**
157
+ * The anti-tamper gate: a server may return whatever `payTo`/`amount` it likes,
158
+ * so what it asks for is only safe to act on once it matches the intent.
159
+ */
160
+ export function verifyRequirement(requirement, intent) {
161
+ const mismatches = [];
162
+ if (requirement.network !== intent.network) {
163
+ mismatches.push(`network ${requirement.network} != ${intent.network}`);
164
+ }
165
+ if (requirement.asset.toLowerCase() !== intent.asset.toLowerCase()) {
166
+ mismatches.push(`asset ${requirement.asset} != ${intent.asset}`);
167
+ }
168
+ if (requirement.payTo.toLowerCase() !== intent.payee.toLowerCase()) {
169
+ mismatches.push(`payTo ${requirement.payTo} != ${intent.payee}`);
170
+ }
171
+ if (BigInt(requirement.amount) !== intent.amount) {
172
+ mismatches.push(`amount ${requirement.amount} != ${intent.amount.toString()}`);
173
+ }
174
+ if (mismatches.length > 0) {
175
+ throw new SettlementError('requirement-mismatch', `offered requirement does not match intent ${intent.id}: ${mismatches.join('; ')}`);
176
+ }
177
+ }
178
+ /** Builds the client-side intent from the requirement the client agreed to. */
179
+ export function intentFromRequirement(requirement, args) {
180
+ const intent = {
181
+ id: args.id,
182
+ protocol: 'x402',
183
+ network: requirement.network,
184
+ asset: requirement.asset,
185
+ amount: BigInt(requirement.amount),
186
+ payer: args.payer,
187
+ payee: requirement.payTo,
188
+ };
189
+ if (args.reference !== undefined)
190
+ intent.reference = args.reference;
191
+ if (args.now !== undefined) {
192
+ intent.expiresAt = new Date(args.now.getTime() + requirement.maxTimeoutSeconds * 1000).toISOString();
193
+ }
194
+ return intent;
195
+ }
196
+ //# sourceMappingURL=x402.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402.js","sourceRoot":"","sources":["../src/x402.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@keelcodes/settlement",
3
+ "version": "0.1.0",
4
+ "description": "Settlement core for agent payments: x402 v2 and MPP (HTTP Payment auth scheme) codecs, receipts and a reconciliation ledger. No billing.",
5
+ "license": "Apache-2.0",
6
+ "homepage": "https://keel.codes",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/keelcodes/keel.git",
10
+ "directory": "packages/settlement"
11
+ },
12
+ "type": "module",
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md"
24
+ ],
25
+ "sideEffects": false,
26
+ "devDependencies": {
27
+ "viem": "^2.21.0",
28
+ "vitest": "^2.1.4"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "engines": {
34
+ "node": ">=20"
35
+ },
36
+ "keywords": [
37
+ "x402",
38
+ "mpp",
39
+ "machine-payments",
40
+ "http-402",
41
+ "settlement",
42
+ "agent",
43
+ "payments",
44
+ "receipts"
45
+ ],
46
+ "scripts": {
47
+ "build": "tsc -p tsconfig.json",
48
+ "typecheck": "tsc -p tsconfig.json --noEmit",
49
+ "test": "vitest run",
50
+ "clean": "rm -rf dist"
51
+ }
52
+ }