@mcpaid/sdk 2.0.0 → 2.0.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.
@@ -0,0 +1,158 @@
1
+ /**
2
+ * MCPaid Edge Receipts Engine
3
+ * Cryptographic minting and verification of tamper-proof single-use payment receipts
4
+ * for downstream backend enforcement (e.g. database writes, webhooks, microservices).
5
+ */
6
+ import type { D1Database } from '../gateway/d1-store.js';
7
+ export interface EdgeReceiptPayload {
8
+ v: 1;
9
+ serverId: string;
10
+ toolName: string;
11
+ challengeNonce: string;
12
+ amountMicro: string;
13
+ recipient: string;
14
+ treasury: string;
15
+ feeBps: number;
16
+ chainId: number;
17
+ settledAt: number;
18
+ exp: number;
19
+ agentWallet?: string;
20
+ }
21
+ export interface EdgeReceipt extends EdgeReceiptPayload {
22
+ sig: string;
23
+ }
24
+ export interface MintEdgeReceiptParams {
25
+ serverId: string;
26
+ toolName: string;
27
+ amountMicro: bigint | string | number;
28
+ challengeNonce?: string;
29
+ recipient?: string;
30
+ treasury?: string;
31
+ feeBps?: number;
32
+ chainId?: number;
33
+ agentWallet?: string;
34
+ settledAt?: number;
35
+ ttlSeconds?: number;
36
+ }
37
+ export interface NonceClaimStore {
38
+ /**
39
+ * Atomically claims a challenge nonce.
40
+ * Returns true if successfully claimed (first time).
41
+ * Returns false if already claimed (replay attack detected).
42
+ */
43
+ claimNonce(nonce: string, meta: {
44
+ serverId: string;
45
+ toolName: string;
46
+ exp: number;
47
+ }): Promise<boolean>;
48
+ /**
49
+ * Checks if a nonce has already been claimed.
50
+ */
51
+ hasNonce(nonce: string): Promise<boolean>;
52
+ }
53
+ export interface VerifyReceiptEnv {
54
+ secret: string;
55
+ previousSecret?: string;
56
+ store?: NonceClaimStore;
57
+ }
58
+ export type VerifyReceiptInput = VerifyReceiptEnv | string;
59
+ export interface VerifyReceiptOptions {
60
+ receipt: string | null | undefined;
61
+ expectedTool?: string;
62
+ expectedServer?: string;
63
+ minAmountMicro?: bigint | string | number;
64
+ maxAgeSeconds?: number;
65
+ clockSkewSeconds?: number;
66
+ nowSec?: number;
67
+ }
68
+ /**
69
+ * Portable base64url encoding.
70
+ */
71
+ export declare function toBase64Url(input: string): string;
72
+ /**
73
+ * Portable base64url decoding.
74
+ */
75
+ export declare function fromBase64Url(input: string): string;
76
+ /**
77
+ * Derives a deterministic per-server receipt secret from a master secret using HKDF-SHA256.
78
+ * Limits the blast radius of any individual compromised server secret.
79
+ * Format: `mcpaid_sec_${64-char hex}`
80
+ */
81
+ export declare function deriveServerReceiptSecret(masterSecret: string, serverId: string, salt?: string): Promise<string>;
82
+ /**
83
+ * Mints an authenticated Edge Receipt for a settled tool call.
84
+ * Returns the receipt object and its base64url-encoded string representation.
85
+ */
86
+ export declare function mintEdgeReceipt(secret: string, params: MintEdgeReceiptParams): Promise<{
87
+ receipt: EdgeReceipt;
88
+ encoded: string;
89
+ }>;
90
+ /**
91
+ * Validates and verifies an Edge Receipt string against expected tool/server rules and replay claim store.
92
+ * Returns { valid: true, receipt } if valid, or { valid: false, error } on failure.
93
+ */
94
+ export declare function parseAndVerifyEdgeReceipt(envInput: VerifyReceiptInput, opts: VerifyReceiptOptions): Promise<{
95
+ valid: true;
96
+ receipt: EdgeReceipt;
97
+ } | {
98
+ valid: false;
99
+ error: string;
100
+ }>;
101
+ /**
102
+ * 5-line verification helper for downstream backends.
103
+ * Returns null if valid and nonce claimed, or an error string describing the failure.
104
+ *
105
+ * Usage:
106
+ * ```typescript
107
+ * const error = await verifyEdgeReceipt(env, {
108
+ * receipt: request.headers.get('X-MCPaid-Receipt'),
109
+ * expectedTool: 'contextwise_cloud_push',
110
+ * });
111
+ * if (error) return new Response(JSON.stringify({ error }), { status: 402 });
112
+ * ```
113
+ */
114
+ export declare function verifyEdgeReceipt(env: VerifyReceiptInput, opts: VerifyReceiptOptions): Promise<string | null>;
115
+ /**
116
+ * In-memory NonceClaimStore for local development, unit tests, and single-instance Node.js backends.
117
+ */
118
+ export declare class MemoryReceiptStore implements NonceClaimStore {
119
+ private claimed;
120
+ claimNonce(nonce: string, meta: {
121
+ serverId: string;
122
+ toolName: string;
123
+ exp: number;
124
+ }): Promise<boolean>;
125
+ hasNonce(nonce: string): Promise<boolean>;
126
+ pruneExpired(nowSec?: number): number;
127
+ clear(): void;
128
+ }
129
+ /**
130
+ * Cloudflare D1-backed NonceClaimStore for edge workers and serverless backends.
131
+ * Uses atomic SQLite INSERT ... ON CONFLICT to guarantee anti-replay under high concurrency.
132
+ */
133
+ export declare class D1ReceiptStore implements NonceClaimStore {
134
+ private db;
135
+ private tableName;
136
+ constructor(db: D1Database, tableName?: string);
137
+ claimNonce(nonce: string, meta: {
138
+ serverId: string;
139
+ toolName: string;
140
+ exp: number;
141
+ }): Promise<boolean>;
142
+ hasNonce(nonce: string): Promise<boolean>;
143
+ pruneExpired(nowSec?: number): Promise<number>;
144
+ }
145
+ /**
146
+ * Drop-in Express / Connect / Node.js HTTP middleware for validating Edge Receipts.
147
+ */
148
+ export declare function createReceiptMiddleware(options: {
149
+ secret: string;
150
+ previousSecret?: string;
151
+ expectedTool?: string;
152
+ expectedServer?: string;
153
+ minAmountMicro?: bigint | string | number;
154
+ maxAgeSeconds?: number;
155
+ store?: NonceClaimStore;
156
+ headerName?: string;
157
+ }): (req: any, res: any, next: (err?: any) => void) => Promise<any>;
158
+ //# sourceMappingURL=edge-receipts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-receipts.d.ts","sourceRoot":"","sources":["../../src/settlement/edge-receipts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,407 @@
1
+ /**
2
+ * MCPaid Edge Receipts Engine
3
+ * Cryptographic minting and verification of tamper-proof single-use payment receipts
4
+ * for downstream backend enforcement (e.g. database writes, webhooks, microservices).
5
+ */
6
+ import { canonicalJsonStringify } from '../utils/units.js';
7
+ /**
8
+ * Portable base64url encoding.
9
+ */
10
+ export function toBase64Url(input) {
11
+ if (typeof Buffer !== 'undefined') {
12
+ return Buffer.from(input, 'utf-8').toString('base64url');
13
+ }
14
+ const bytes = new TextEncoder().encode(input);
15
+ let bin = '';
16
+ for (let i = 0; i < bytes.length; i++) {
17
+ bin += String.fromCharCode(bytes[i]);
18
+ }
19
+ return btoa(bin).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
20
+ }
21
+ /**
22
+ * Portable base64url decoding.
23
+ */
24
+ export function fromBase64Url(input) {
25
+ if (typeof Buffer !== 'undefined') {
26
+ return Buffer.from(input, 'base64url').toString('utf-8');
27
+ }
28
+ let base64 = input.replace(/-/g, '+').replace(/_/g, '/');
29
+ while (base64.length % 4 !== 0) {
30
+ base64 += '=';
31
+ }
32
+ const bin = atob(base64);
33
+ const bytes = new Uint8Array(bin.length);
34
+ for (let i = 0; i < bin.length; i++) {
35
+ bytes[i] = bin.charCodeAt(i);
36
+ }
37
+ return new TextDecoder().decode(bytes);
38
+ }
39
+ /**
40
+ * Computes an HMAC-SHA256 hex signature using standard Web Crypto API.
41
+ */
42
+ async function computeHmacSha256(keyString, message) {
43
+ const enc = new TextEncoder();
44
+ const keyData = enc.encode(keyString);
45
+ const msgData = enc.encode(message);
46
+ const cryptoKey = await crypto.subtle.importKey('raw', keyData, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
47
+ const sigBuffer = await crypto.subtle.sign('HMAC', cryptoKey, msgData);
48
+ const bytes = new Uint8Array(sigBuffer);
49
+ let hex = '';
50
+ for (let i = 0; i < bytes.length; i++) {
51
+ hex += bytes[i].toString(16).padStart(2, '0');
52
+ }
53
+ return hex;
54
+ }
55
+ /**
56
+ * Constant-time cryptographic verification of HMAC-SHA256 signature using Web Crypto.
57
+ */
58
+ async function verifyHmacSha256(keyString, expectedSigHex, message) {
59
+ if (!expectedSigHex || expectedSigHex.length !== 64 || !/^[0-9a-fA-F]+$/.test(expectedSigHex)) {
60
+ return false;
61
+ }
62
+ const enc = new TextEncoder();
63
+ const keyData = enc.encode(keyString);
64
+ const msgData = enc.encode(message);
65
+ try {
66
+ const cryptoKey = await crypto.subtle.importKey('raw', keyData, { name: 'HMAC', hash: 'SHA-256' }, false, ['verify']);
67
+ const sigBytes = new Uint8Array(32);
68
+ for (let i = 0; i < 32; i++) {
69
+ sigBytes[i] = parseInt(expectedSigHex.slice(i * 2, i * 2 + 2), 16);
70
+ }
71
+ return await crypto.subtle.verify('HMAC', cryptoKey, sigBytes, msgData);
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ /**
78
+ * Derives a deterministic per-server receipt secret from a master secret using HKDF-SHA256.
79
+ * Limits the blast radius of any individual compromised server secret.
80
+ * Format: `mcpaid_sec_${64-char hex}`
81
+ */
82
+ export async function deriveServerReceiptSecret(masterSecret, serverId, salt) {
83
+ if (!masterSecret) {
84
+ throw new Error('Master secret is required for server receipt secret derivation');
85
+ }
86
+ if (!serverId) {
87
+ throw new Error('serverId is required for server receipt secret derivation');
88
+ }
89
+ if (!/^[a-zA-Z0-9_\-\.]{3,64}$/.test(serverId)) {
90
+ throw new Error('Invalid serverId: must be 3-64 alphanumeric, dash, period, or underscore characters');
91
+ }
92
+ const enc = new TextEncoder();
93
+ const masterKey = await crypto.subtle.importKey('raw', enc.encode(masterSecret), 'HKDF', false, ['deriveBits']);
94
+ const derivedBits = await crypto.subtle.deriveBits({
95
+ name: 'HKDF',
96
+ hash: 'SHA-256',
97
+ salt: salt ? enc.encode(salt) : new Uint8Array(0),
98
+ info: enc.encode(`mcpaid-edge-receipt-v1:${serverId}`),
99
+ }, masterKey, 256 // 32 bytes (256 bits)
100
+ );
101
+ const bytes = new Uint8Array(derivedBits);
102
+ let hex = '';
103
+ for (let i = 0; i < bytes.length; i++) {
104
+ hex += bytes[i].toString(16).padStart(2, '0');
105
+ }
106
+ return `mcpaid_sec_${hex}`;
107
+ }
108
+ /**
109
+ * Mints an authenticated Edge Receipt for a settled tool call.
110
+ * Returns the receipt object and its base64url-encoded string representation.
111
+ */
112
+ export async function mintEdgeReceipt(secret, params) {
113
+ if (!secret) {
114
+ throw new Error('Receipt secret is required to mint an Edge Receipt');
115
+ }
116
+ const settledAt = params.settledAt ?? Math.floor(Date.now() / 1000);
117
+ const ttl = params.ttlSeconds ?? 300; // 5 minutes
118
+ const exp = settledAt + ttl;
119
+ const challengeNonce = params.challengeNonce ?? (typeof crypto !== 'undefined' && crypto.randomUUID
120
+ ? `rcpt_${crypto.randomUUID().replace(/-/g, '')}`
121
+ : `rcpt_${Date.now().toString(36)}_${Math.random().toString(36).substring(2)}`);
122
+ const recipient = (params.recipient || '0x0000000000000000000000000000000000000000').toLowerCase();
123
+ const treasury = (params.treasury || '0x0000000000000000000000000000000000000000').toLowerCase();
124
+ const feeBps = params.feeBps ?? 300;
125
+ const chainId = params.chainId ?? 8453;
126
+ const payload = {
127
+ v: 1,
128
+ serverId: params.serverId,
129
+ toolName: params.toolName,
130
+ challengeNonce,
131
+ amountMicro: params.amountMicro.toString(),
132
+ recipient,
133
+ treasury,
134
+ feeBps,
135
+ chainId,
136
+ settledAt,
137
+ exp,
138
+ ...(params.agentWallet ? { agentWallet: params.agentWallet.toLowerCase() } : {}),
139
+ };
140
+ const canonical = canonicalJsonStringify(payload);
141
+ const sig = await computeHmacSha256(secret, canonical);
142
+ const receipt = {
143
+ ...payload,
144
+ sig,
145
+ };
146
+ const jsonStr = JSON.stringify(receipt);
147
+ const encoded = toBase64Url(jsonStr);
148
+ return { receipt, encoded };
149
+ }
150
+ /**
151
+ * Validates and verifies an Edge Receipt string against expected tool/server rules and replay claim store.
152
+ * Returns { valid: true, receipt } if valid, or { valid: false, error } on failure.
153
+ */
154
+ export async function parseAndVerifyEdgeReceipt(envInput, opts) {
155
+ const env = typeof envInput === 'string' ? { secret: envInput } : envInput;
156
+ if (!env.secret && !env.previousSecret) {
157
+ return { valid: false, error: 'Verification error: No verification secret configured' };
158
+ }
159
+ const raw = opts.receipt?.trim();
160
+ if (!raw) {
161
+ return { valid: false, error: 'Missing receipt: X-MCPaid-Receipt header not provided' };
162
+ }
163
+ let receipt;
164
+ try {
165
+ const jsonStr = fromBase64Url(raw);
166
+ receipt = JSON.parse(jsonStr);
167
+ }
168
+ catch (err) {
169
+ return { valid: false, error: `Malformed receipt format: ${err.message}` };
170
+ }
171
+ // Version check
172
+ if (receipt.v !== 1) {
173
+ return { valid: false, error: `Unsupported receipt version: ${receipt.v}` };
174
+ }
175
+ // Required field checks
176
+ if (!receipt.serverId ||
177
+ !receipt.toolName ||
178
+ !receipt.challengeNonce ||
179
+ !receipt.amountMicro ||
180
+ !receipt.sig ||
181
+ receipt.settledAt === undefined ||
182
+ receipt.exp === undefined) {
183
+ return { valid: false, error: 'Malformed receipt: missing required fields' };
184
+ }
185
+ const nowSec = opts.nowSec ?? Math.floor(Date.now() / 1000);
186
+ const skew = opts.clockSkewSeconds ?? 60;
187
+ // Expiry check (with clock skew allowance)
188
+ if (nowSec > receipt.exp + skew) {
189
+ return { valid: false, error: `Receipt expired at ${receipt.exp} (current time: ${nowSec})` };
190
+ }
191
+ // Max age check
192
+ const maxAge = opts.maxAgeSeconds ?? 300;
193
+ if (nowSec - receipt.settledAt > maxAge + skew) {
194
+ return { valid: false, error: `Receipt age exceeds maximum allowed age (${nowSec - receipt.settledAt}s > ${maxAge}s)` };
195
+ }
196
+ // Future timestamp check (prevent pre-dated receipts)
197
+ if (receipt.settledAt > nowSec + skew) {
198
+ return { valid: false, error: `Receipt settledAt is in the future (${receipt.settledAt} > ${nowSec})` };
199
+ }
200
+ // Server binding check
201
+ if (opts.expectedServer && receipt.serverId !== opts.expectedServer) {
202
+ return {
203
+ valid: false,
204
+ error: `Receipt server mismatch: expected "${opts.expectedServer}", got "${receipt.serverId}"`,
205
+ };
206
+ }
207
+ // Tool binding check
208
+ if (opts.expectedTool && receipt.toolName !== opts.expectedTool) {
209
+ return {
210
+ valid: false,
211
+ error: `Receipt tool mismatch: expected "${opts.expectedTool}", got "${receipt.toolName}"`,
212
+ };
213
+ }
214
+ // Minimum amount check
215
+ if (opts.minAmountMicro !== undefined) {
216
+ const required = BigInt(opts.minAmountMicro);
217
+ const actual = BigInt(receipt.amountMicro);
218
+ if (actual < required) {
219
+ return {
220
+ valid: false,
221
+ error: `Receipt underpaid: required ${required} micro-units, receipt contains ${actual}`,
222
+ };
223
+ }
224
+ }
225
+ // Recompute HMAC on canonical JSON without `sig`
226
+ const { sig, ...payload } = receipt;
227
+ const canonical = canonicalJsonStringify(payload);
228
+ let isSigValid = false;
229
+ if (env.secret) {
230
+ isSigValid = await verifyHmacSha256(env.secret, sig, canonical);
231
+ }
232
+ if (!isSigValid && env.previousSecret) {
233
+ isSigValid = await verifyHmacSha256(env.previousSecret, sig, canonical);
234
+ }
235
+ if (!isSigValid) {
236
+ return { valid: false, error: 'Cryptographic signature mismatch: receipt tampered or secret invalid' };
237
+ }
238
+ // Atomic replay defense via NonceClaimStore
239
+ if (env.store) {
240
+ const claimed = await env.store.claimNonce(receipt.challengeNonce, {
241
+ serverId: receipt.serverId,
242
+ toolName: receipt.toolName,
243
+ exp: receipt.exp,
244
+ });
245
+ if (!claimed) {
246
+ return {
247
+ valid: false,
248
+ error: `Receipt replay attack detected: challenge nonce "${receipt.challengeNonce}" has already been claimed`,
249
+ };
250
+ }
251
+ }
252
+ return { valid: true, receipt };
253
+ }
254
+ /**
255
+ * 5-line verification helper for downstream backends.
256
+ * Returns null if valid and nonce claimed, or an error string describing the failure.
257
+ *
258
+ * Usage:
259
+ * ```typescript
260
+ * const error = await verifyEdgeReceipt(env, {
261
+ * receipt: request.headers.get('X-MCPaid-Receipt'),
262
+ * expectedTool: 'contextwise_cloud_push',
263
+ * });
264
+ * if (error) return new Response(JSON.stringify({ error }), { status: 402 });
265
+ * ```
266
+ */
267
+ export async function verifyEdgeReceipt(env, opts) {
268
+ const result = await parseAndVerifyEdgeReceipt(env, opts);
269
+ return result.valid ? null : result.error;
270
+ }
271
+ /**
272
+ * In-memory NonceClaimStore for local development, unit tests, and single-instance Node.js backends.
273
+ */
274
+ export class MemoryReceiptStore {
275
+ claimed = new Map();
276
+ async claimNonce(nonce, meta) {
277
+ const key = nonce.toLowerCase().trim();
278
+ if (this.claimed.has(key)) {
279
+ return false; // Already claimed
280
+ }
281
+ // Auto-prune when memory store exceeds 1000 records
282
+ if (this.claimed.size > 1000) {
283
+ this.pruneExpired();
284
+ }
285
+ this.claimed.set(key, meta);
286
+ return true;
287
+ }
288
+ async hasNonce(nonce) {
289
+ return this.claimed.has(nonce.toLowerCase().trim());
290
+ }
291
+ pruneExpired(nowSec = Math.floor(Date.now() / 1000)) {
292
+ let count = 0;
293
+ for (const [k, v] of this.claimed.entries()) {
294
+ if (v.exp < nowSec) {
295
+ this.claimed.delete(k);
296
+ count++;
297
+ }
298
+ }
299
+ return count;
300
+ }
301
+ clear() {
302
+ this.claimed.clear();
303
+ }
304
+ }
305
+ /**
306
+ * Cloudflare D1-backed NonceClaimStore for edge workers and serverless backends.
307
+ * Uses atomic SQLite INSERT ... ON CONFLICT to guarantee anti-replay under high concurrency.
308
+ */
309
+ export class D1ReceiptStore {
310
+ db;
311
+ tableName;
312
+ constructor(db, tableName = 'mcpaid_receipt_nonces') {
313
+ this.db = db;
314
+ this.tableName = tableName;
315
+ }
316
+ async claimNonce(nonce, meta) {
317
+ const key = nonce.toLowerCase().trim();
318
+ try {
319
+ const stmt = this.db
320
+ .prepare(`INSERT INTO ${this.tableName} (nonce, server_id, tool_name, exp)
321
+ VALUES (?, ?, ?, ?)
322
+ ON CONFLICT(nonce) DO NOTHING`)
323
+ .bind(key, meta.serverId, meta.toolName, meta.exp);
324
+ const res = await stmt.run();
325
+ const changes = res.meta?.changes ?? res.meta?.rows_written;
326
+ if (changes !== undefined) {
327
+ return changes > 0;
328
+ }
329
+ return !(await this.hasNonce(key));
330
+ }
331
+ catch {
332
+ // In SQLite, unique constraint violation throws if ON CONFLICT DO NOTHING is not supported
333
+ return false;
334
+ }
335
+ }
336
+ async hasNonce(nonce) {
337
+ const key = nonce.toLowerCase().trim();
338
+ const row = await this.db
339
+ .prepare(`SELECT nonce FROM ${this.tableName} WHERE nonce = ?`)
340
+ .bind(key)
341
+ .first();
342
+ return Boolean(row);
343
+ }
344
+ async pruneExpired(nowSec = Math.floor(Date.now() / 1000)) {
345
+ const res = await this.db
346
+ .prepare(`DELETE FROM ${this.tableName} WHERE exp < ?`)
347
+ .bind(nowSec)
348
+ .run();
349
+ return res.meta?.changes ?? 0;
350
+ }
351
+ }
352
+ /**
353
+ * Drop-in Express / Connect / Node.js HTTP middleware for validating Edge Receipts.
354
+ */
355
+ export function createReceiptMiddleware(options) {
356
+ const header = options.headerName || 'x-mcpaid-receipt';
357
+ const prevSecret = options.previousSecret ||
358
+ (typeof process !== 'undefined' ? process.env?.MCPAID_PREVIOUS_RECEIPT_SECRET : undefined);
359
+ return async (req, res, next) => {
360
+ try {
361
+ let receiptHeader;
362
+ if (typeof req.get === 'function') {
363
+ receiptHeader = req.get(header);
364
+ }
365
+ if (!receiptHeader && req.headers && typeof req.headers === 'object') {
366
+ const target = header.toLowerCase();
367
+ for (const [k, v] of Object.entries(req.headers)) {
368
+ if (k.toLowerCase() === target) {
369
+ receiptHeader = Array.isArray(v) ? v[0] : v;
370
+ break;
371
+ }
372
+ }
373
+ }
374
+ // Dynamically resolve toolName from MCP JSON-RPC body if expectedTool is omitted
375
+ const dynamicTool = options.expectedTool ??
376
+ (req.body?.method === 'tools/call' ? req.body?.params?.name : undefined);
377
+ const result = await parseAndVerifyEdgeReceipt({
378
+ secret: options.secret,
379
+ previousSecret: prevSecret,
380
+ store: options.store,
381
+ }, {
382
+ receipt: receiptHeader,
383
+ expectedTool: dynamicTool,
384
+ expectedServer: options.expectedServer,
385
+ minAmountMicro: options.minAmountMicro,
386
+ maxAgeSeconds: options.maxAgeSeconds,
387
+ });
388
+ if (!result.valid) {
389
+ if (typeof res.status === 'function' && typeof res.json === 'function') {
390
+ return res.status(402).json({
391
+ error: 'payment_required',
392
+ message: result.error,
393
+ });
394
+ }
395
+ res.writeHead(402, { 'Content-Type': 'application/json' });
396
+ res.end(JSON.stringify({ error: 'payment_required', message: result.error }));
397
+ return;
398
+ }
399
+ req.mcpaidReceipt = result.receipt;
400
+ next();
401
+ }
402
+ catch (err) {
403
+ next(err);
404
+ }
405
+ };
406
+ }
407
+ //# sourceMappingURL=edge-receipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-receipts.js","sourceRoot":"","sources":["../../src/settlement/edge-receipts.ts"],"names":[],"mappings":"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"}
@@ -44,7 +44,7 @@ export function canonicalJsonStringify(val) {
44
44
  if (Array.isArray(val)) {
45
45
  return `[${val.map(canonicalJsonStringify).join(',')}]`;
46
46
  }
47
- const keys = Object.keys(val).sort();
47
+ const keys = Object.keys(val).filter((k) => val[k] !== undefined).sort();
48
48
  const pairs = keys.map((k) => `${JSON.stringify(k)}:${canonicalJsonStringify(val[k])}`);
49
49
  return `{${pairs.join(',')}}`;
50
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/utils/units.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/utils/units.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcpaid/sdk",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "MCPaid: Zero-friction MCP monetization and micropayment infrastructure with x402 and blockchain settlement",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",