cspr402 0.4.7

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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +108 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client.d.ts +207 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +400 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/commands/onboard.d.ts +4 -0
  12. package/dist/commands/onboard.d.ts.map +1 -0
  13. package/dist/commands/onboard.js +192 -0
  14. package/dist/commands/onboard.js.map +1 -0
  15. package/dist/commands/onboard.test.d.ts +2 -0
  16. package/dist/commands/onboard.test.d.ts.map +1 -0
  17. package/dist/commands/onboard.test.js +48 -0
  18. package/dist/commands/onboard.test.js.map +1 -0
  19. package/dist/commands/purchase.d.ts +2 -0
  20. package/dist/commands/purchase.d.ts.map +1 -0
  21. package/dist/commands/purchase.js +206 -0
  22. package/dist/commands/purchase.js.map +1 -0
  23. package/dist/commands/wallet.d.ts +2 -0
  24. package/dist/commands/wallet.d.ts.map +1 -0
  25. package/dist/commands/wallet.js +161 -0
  26. package/dist/commands/wallet.js.map +1 -0
  27. package/dist/config.d.ts +77 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +329 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/errors.d.ts +101 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +197 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/index.d.ts +6 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +22 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/mcp.d.ts +2 -0
  40. package/dist/mcp.d.ts.map +1 -0
  41. package/dist/mcp.js +337 -0
  42. package/dist/mcp.js.map +1 -0
  43. package/dist/mpp.d.ts +57 -0
  44. package/dist/mpp.d.ts.map +1 -0
  45. package/dist/mpp.js +165 -0
  46. package/dist/mpp.js.map +1 -0
  47. package/dist/ows.d.ts +190 -0
  48. package/dist/ows.d.ts.map +1 -0
  49. package/dist/ows.js +565 -0
  50. package/dist/ows.js.map +1 -0
  51. package/dist/soroban.d.ts +92 -0
  52. package/dist/soroban.d.ts.map +1 -0
  53. package/dist/soroban.js +313 -0
  54. package/dist/soroban.js.map +1 -0
  55. package/dist/stellar.d.ts +53 -0
  56. package/dist/stellar.d.ts.map +1 -0
  57. package/dist/stellar.js +180 -0
  58. package/dist/stellar.js.map +1 -0
  59. package/dist/version-check.d.ts +5 -0
  60. package/dist/version-check.d.ts.map +1 -0
  61. package/dist/version-check.js +203 -0
  62. package/dist/version-check.js.map +1 -0
  63. package/package.json +80 -0
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveCredentials = exports.saveCards402Config = exports.loadCards402Config = exports.ResumableError = exports.WaitTimeoutError = exports.OrderFailedError = exports.AuthError = exports.InvalidAmountError = exports.PriceUnavailableError = exports.ServiceUnavailableError = exports.RateLimitError = exports.SpendLimitError = exports.Cards402Error = exports.CSPR402Client = exports.Cards402Client = void 0;
4
+ var client_1 = require("./client");
5
+ Object.defineProperty(exports, "Cards402Client", { enumerable: true, get: function () { return client_1.Cards402Client; } });
6
+ Object.defineProperty(exports, "CSPR402Client", { enumerable: true, get: function () { return client_1.CSPR402Client; } });
7
+ var errors_1 = require("./errors");
8
+ Object.defineProperty(exports, "Cards402Error", { enumerable: true, get: function () { return errors_1.Cards402Error; } });
9
+ Object.defineProperty(exports, "SpendLimitError", { enumerable: true, get: function () { return errors_1.SpendLimitError; } });
10
+ Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return errors_1.RateLimitError; } });
11
+ Object.defineProperty(exports, "ServiceUnavailableError", { enumerable: true, get: function () { return errors_1.ServiceUnavailableError; } });
12
+ Object.defineProperty(exports, "PriceUnavailableError", { enumerable: true, get: function () { return errors_1.PriceUnavailableError; } });
13
+ Object.defineProperty(exports, "InvalidAmountError", { enumerable: true, get: function () { return errors_1.InvalidAmountError; } });
14
+ Object.defineProperty(exports, "AuthError", { enumerable: true, get: function () { return errors_1.AuthError; } });
15
+ Object.defineProperty(exports, "OrderFailedError", { enumerable: true, get: function () { return errors_1.OrderFailedError; } });
16
+ Object.defineProperty(exports, "WaitTimeoutError", { enumerable: true, get: function () { return errors_1.WaitTimeoutError; } });
17
+ Object.defineProperty(exports, "ResumableError", { enumerable: true, get: function () { return errors_1.ResumableError; } });
18
+ var config_1 = require("./config");
19
+ Object.defineProperty(exports, "loadCards402Config", { enumerable: true, get: function () { return config_1.loadCards402Config; } });
20
+ Object.defineProperty(exports, "saveCards402Config", { enumerable: true, get: function () { return config_1.saveCards402Config; } });
21
+ Object.defineProperty(exports, "resolveCredentials", { enumerable: true, get: function () { return config_1.resolveCredentials; } });
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAyD;AAAhD,wGAAA,cAAc,OAAA;AAAE,uGAAA,aAAa,OAAA;AAoBtC,mCAWkB;AAVhB,uGAAA,aAAa,OAAA;AACb,yGAAA,eAAe,OAAA;AACf,wGAAA,cAAc,OAAA;AACd,iHAAA,uBAAuB,OAAA;AACvB,+GAAA,qBAAqB,OAAA;AACrB,4GAAA,kBAAkB,OAAA;AAClB,mGAAA,SAAS,OAAA;AACT,0GAAA,gBAAgB,OAAA;AAChB,0GAAA,gBAAgB,OAAA;AAChB,wGAAA,cAAc,OAAA;AAGhB,mCAAsF;AAA7E,4GAAA,kBAAkB,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAAE,4GAAA,kBAAkB,OAAA"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function startMcpServer(): Promise<void>;
2
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AA6VA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAGpD"}
package/dist/mcp.js ADDED
@@ -0,0 +1,337 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startMcpServer = startMcpServer;
4
+ // MCP server entry. Exposed via `cspr402 mcp` and dispatched through ./cli.
5
+ // The server is intentionally Casper-native: it creates/verifies CSPR402
6
+ // orders, but it does not read wallet private keys or sign transactions.
7
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
8
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
9
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
10
+ const client_1 = require("./client");
11
+ const config_1 = require("./config");
12
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
13
+ const PKG_VERSION = require('../package.json').version;
14
+ const CASPER_PUBLIC_KEY_RE = /^(01[0-9a-f]{64}|02[0-9a-f]{66})$/i;
15
+ const DEPLOY_HASH_RE = /^[0-9a-fA-F]{64}$/;
16
+ const ORDER_ID_RE = /^[a-zA-Z0-9_-]{1,64}$/;
17
+ function normalizePublicKey(value, label = 'public key') {
18
+ if (value === undefined || value === null || value === '')
19
+ return undefined;
20
+ const normalized = String(value).trim().toLowerCase();
21
+ if (!CASPER_PUBLIC_KEY_RE.test(normalized)) {
22
+ throw new Error(`${label} must be a Casper public key hex string.`);
23
+ }
24
+ return normalized;
25
+ }
26
+ function parseAmount(value) {
27
+ const amount = String(value ?? '').trim();
28
+ if (!/^\d+(\.\d{1,2})?$/.test(amount)) {
29
+ throw new Error("amount_usdc must be a decimal string like '25.00'.");
30
+ }
31
+ const cents = Math.round(Number(amount) * 100);
32
+ if (!Number.isFinite(cents) || cents < 1)
33
+ throw new Error('amount_usdc must be at least 0.01.');
34
+ if (cents > 1_000_000)
35
+ throw new Error('amount_usdc cannot exceed 10000.00.');
36
+ return amount;
37
+ }
38
+ function parseOrderId(value) {
39
+ const orderId = String(value ?? '').trim();
40
+ if (!ORDER_ID_RE.test(orderId))
41
+ throw new Error('order_id is invalid.');
42
+ return orderId;
43
+ }
44
+ function parseDeployHash(value) {
45
+ const deployHash = String(value ?? '')
46
+ .trim()
47
+ .toLowerCase();
48
+ if (!DEPLOY_HASH_RE.test(deployHash))
49
+ throw new Error('deploy_hash must be a 64-character Casper deploy hash.');
50
+ return deployHash;
51
+ }
52
+ function configuredPublicKey() {
53
+ return normalizePublicKey(process.env.CSPR402_CASPER_PUBLIC_KEY || (0, config_1.loadCards402Config)()?.casper_public_key, 'configured Casper public key');
54
+ }
55
+ function client() {
56
+ return new client_1.CSPR402Client();
57
+ }
58
+ function safeMessage(err, fallback) {
59
+ return err instanceof Error ? err.message.slice(0, 240) : fallback;
60
+ }
61
+ function paymentText(payment) {
62
+ if (payment.type === 'casper_cspr_transfer') {
63
+ return [
64
+ 'Payment rail: Casper testnet CSPR',
65
+ `chain_name: ${payment.chain_name}`,
66
+ `recipient: ${payment.recipient}`,
67
+ payment.sender_public_key
68
+ ? `sender_public_key: ${payment.sender_public_key}`
69
+ : 'sender_public_key: not bound',
70
+ `amount_cspr: ${payment.amount_cspr}`,
71
+ `amount_motes: ${payment.amount_motes}`,
72
+ `transfer_id: ${payment.transfer_id}`,
73
+ `expires_at: ${payment.expires_at}`,
74
+ ];
75
+ }
76
+ if (payment.type === 'casper_cep18_transfer') {
77
+ return [
78
+ 'Payment rail: mockUSDC CEP-18',
79
+ `chain_name: ${payment.chain_name}`,
80
+ `contract_package_hash: ${payment.contract_package_hash}`,
81
+ payment.contract_hash
82
+ ? `contract_hash: ${payment.contract_hash}`
83
+ : 'contract_hash: not configured',
84
+ `sender_public_key: ${payment.sender_public_key}`,
85
+ `recipient_public_key: ${payment.recipient_public_key}`,
86
+ `amount: ${payment.amount} mockUSDC`,
87
+ `amount_base_units: ${payment.amount_base_units}`,
88
+ `expires_at: ${payment.expires_at}`,
89
+ ];
90
+ }
91
+ return [`Unsupported legacy payment instruction: ${payment.type}`];
92
+ }
93
+ function toolArgs(input) {
94
+ return (input && typeof input === 'object' ? input : {});
95
+ }
96
+ const server = new index_js_1.Server({ name: 'cspr402', version: PKG_VERSION }, { capabilities: { tools: {} } });
97
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
98
+ tools: [
99
+ {
100
+ name: 'purchase_vcc',
101
+ description: 'Create a CSPR402 mock virtual card order and return Casper testnet payment instructions. The agent must pay externally, then call verify_payment.',
102
+ inputSchema: {
103
+ type: 'object',
104
+ properties: {
105
+ amount_usdc: {
106
+ type: 'string',
107
+ pattern: '^\\d+(\\.\\d{1,2})?$',
108
+ description: "Mock card value in USD, for example '25.00'.",
109
+ },
110
+ payment_asset: {
111
+ type: 'string',
112
+ enum: ['cspr_casper', 'mock_usdc_cep18'],
113
+ description: 'Payment rail. Default is cspr_casper.',
114
+ },
115
+ payer_public_key: {
116
+ type: 'string',
117
+ description: 'Casper testnet public key to bind the order to a sender.',
118
+ },
119
+ },
120
+ required: ['amount_usdc'],
121
+ },
122
+ },
123
+ {
124
+ name: 'verify_payment',
125
+ description: 'Verify a finalized Casper testnet deploy hash for an existing CSPR402 order.',
126
+ inputSchema: {
127
+ type: 'object',
128
+ properties: {
129
+ order_id: { type: 'string', description: 'CSPR402 order id' },
130
+ deploy_hash: { type: 'string', description: '64-character Casper deploy hash' },
131
+ sender_public_key: { type: 'string', description: 'Casper sender public key' },
132
+ },
133
+ required: ['order_id', 'deploy_hash'],
134
+ },
135
+ },
136
+ {
137
+ name: 'check_order',
138
+ description: 'Check the status of a CSPR402 order.',
139
+ inputSchema: {
140
+ type: 'object',
141
+ properties: {
142
+ order_id: { type: 'string', description: 'CSPR402 order id' },
143
+ },
144
+ required: ['order_id'],
145
+ },
146
+ },
147
+ {
148
+ name: 'check_budget',
149
+ description: 'Check this agent API key spend summary and remaining budget.',
150
+ inputSchema: { type: 'object', properties: {}, required: [] },
151
+ },
152
+ {
153
+ name: 'setup_wallet',
154
+ description: 'Inspect the configured Casper public key/key path. This tool is read-only and never reads private key material.',
155
+ inputSchema: { type: 'object', properties: {}, required: [] },
156
+ },
157
+ ],
158
+ }));
159
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
160
+ const name = request.params.name;
161
+ const args = toolArgs(request.params.arguments);
162
+ if (name === 'setup_wallet') {
163
+ try {
164
+ const config = (0, config_1.loadCards402Config)();
165
+ const publicKey = configuredPublicKey();
166
+ return {
167
+ content: [
168
+ {
169
+ type: 'text',
170
+ text: [
171
+ 'CSPR402 wallet context',
172
+ '',
173
+ `Casper public key: ${publicKey || 'not configured'}`,
174
+ `Key-file path: ${config?.casper_key_path || process.env.CSPR402_CASPER_KEY_PATH || 'not configured'}`,
175
+ `API URL: ${config?.api_url || process.env.CSPR402_BASE_URL || 'not configured'}`,
176
+ '',
177
+ 'To finish setup, run:',
178
+ ' cspr402 onboard --claim <claim_code> --casper-public-key <hex>',
179
+ '',
180
+ 'This MCP server does not sign transfers. Pay through Casper Wallet/CSPR.click or your own signer, then call verify_payment.',
181
+ ].join('\n'),
182
+ },
183
+ ],
184
+ };
185
+ }
186
+ catch (err) {
187
+ return {
188
+ content: [
189
+ {
190
+ type: 'text',
191
+ text: `Error reading wallet context: ${safeMessage(err, 'setup failed')}`,
192
+ },
193
+ ],
194
+ isError: true,
195
+ };
196
+ }
197
+ }
198
+ if (name === 'purchase_vcc') {
199
+ try {
200
+ const amount_usdc = parseAmount(args.amount_usdc);
201
+ const payment_asset = args.payment_asset === 'mock_usdc_cep18' ? 'mock_usdc_cep18' : 'cspr_casper';
202
+ const payer_public_key = normalizePublicKey(args.payer_public_key, 'payer_public_key') || configuredPublicKey();
203
+ if (payment_asset === 'mock_usdc_cep18' && !payer_public_key) {
204
+ throw new Error('mock_usdc_cep18 requires payer_public_key.');
205
+ }
206
+ const order = await client().createOrder({
207
+ amount_usdc,
208
+ payment_asset,
209
+ ...(payer_public_key ? { payer_public_key } : {}),
210
+ });
211
+ return {
212
+ content: [
213
+ {
214
+ type: 'text',
215
+ text: [
216
+ `Order: ${order.order_id}`,
217
+ `Status: ${order.status}`,
218
+ '',
219
+ ...paymentText(order.payment),
220
+ '',
221
+ 'After the Casper transfer finalizes, call:',
222
+ `verify_payment { order_id: "${order.order_id}", deploy_hash: "<hash>" }`,
223
+ ].join('\n'),
224
+ },
225
+ ],
226
+ };
227
+ }
228
+ catch (err) {
229
+ return {
230
+ content: [
231
+ {
232
+ type: 'text',
233
+ text: `Error creating CSPR402 order: ${safeMessage(err, 'create failed')}`,
234
+ },
235
+ ],
236
+ isError: true,
237
+ };
238
+ }
239
+ }
240
+ if (name === 'verify_payment') {
241
+ try {
242
+ const orderId = parseOrderId(args.order_id);
243
+ const deployHash = parseDeployHash(args.deploy_hash);
244
+ const senderPublicKey = normalizePublicKey(args.sender_public_key, 'sender_public_key') || configuredPublicKey();
245
+ const verified = await client().verifyCasperPayment(orderId, deployHash, {
246
+ ...(senderPublicKey ? { senderPublicKey } : {}),
247
+ });
248
+ const lines = [
249
+ `Verified: ${verified.ok}`,
250
+ verified.note ? `Note: ${verified.note}` : null,
251
+ `Order: ${verified.order.order_id}`,
252
+ `Status: ${verified.order.status} (phase: ${verified.order.phase})`,
253
+ `Receipt: ${verified.receipt.type}`,
254
+ `Deploy: ${verified.receipt.deploy_hash}`,
255
+ verified.order.card
256
+ ? `Mock card: ${verified.order.card.brand || 'Mock Virtual Card'}`
257
+ : null,
258
+ ].filter(Boolean);
259
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
260
+ }
261
+ catch (err) {
262
+ return {
263
+ content: [
264
+ { type: 'text', text: `Error verifying payment: ${safeMessage(err, 'verify failed')}` },
265
+ ],
266
+ isError: true,
267
+ };
268
+ }
269
+ }
270
+ if (name === 'check_order') {
271
+ try {
272
+ const order = await client().getOrder(parseOrderId(args.order_id));
273
+ const lines = [
274
+ `Order: ${order.order_id}`,
275
+ `Status: ${order.status} (phase: ${order.phase})`,
276
+ `Amount: $${order.amount_usdc}`,
277
+ `Payment asset: ${order.payment_asset}`,
278
+ `Created: ${order.created_at}`,
279
+ `Updated: ${order.updated_at}`,
280
+ ];
281
+ if (order.receipt) {
282
+ lines.push(`Receipt: ${order.receipt.type}`);
283
+ lines.push(`Deploy: ${order.receipt.deploy_hash}`);
284
+ }
285
+ if (order.card)
286
+ lines.push(`Mock card: ${order.card.brand || 'Mock Virtual Card'}`);
287
+ if (order.error)
288
+ lines.push(`Error: ${order.error}`);
289
+ if (order.note)
290
+ lines.push(`Note: ${order.note}`);
291
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
292
+ }
293
+ catch (err) {
294
+ return {
295
+ content: [
296
+ { type: 'text', text: `Error checking order: ${safeMessage(err, 'check failed')}` },
297
+ ],
298
+ isError: true,
299
+ };
300
+ }
301
+ }
302
+ if (name === 'check_budget') {
303
+ try {
304
+ const usage = await client().getUsage();
305
+ const { budget, orders, label } = usage;
306
+ const lines = [
307
+ `Budget summary${label ? ` for "${label}"` : ''}`,
308
+ '',
309
+ `Spent: $${budget.spent_usdc}`,
310
+ budget.limit_usdc ? `Limit: $${budget.limit_usdc}` : 'Limit: unlimited',
311
+ budget.remaining_usdc !== null
312
+ ? `Remaining: $${budget.remaining_usdc}`
313
+ : 'Remaining: unlimited',
314
+ '',
315
+ `Orders: total ${orders.total}, delivered ${orders.delivered}, failed ${orders.failed}, in progress ${orders.in_progress}`,
316
+ ];
317
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
318
+ }
319
+ catch (err) {
320
+ return {
321
+ content: [
322
+ { type: 'text', text: `Error checking budget: ${safeMessage(err, 'budget failed')}` },
323
+ ],
324
+ isError: true,
325
+ };
326
+ }
327
+ }
328
+ return {
329
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
330
+ isError: true,
331
+ };
332
+ });
333
+ async function startMcpServer() {
334
+ const transport = new stdio_js_1.StdioServerTransport();
335
+ await server.connect(transport);
336
+ }
337
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
package/dist/mpp.d.ts ADDED
@@ -0,0 +1,57 @@
1
+ import type { CardDetails } from './client';
2
+ import { payViaContractOWS, type PayViaContractOwsDeps } from './ows';
3
+ export interface MppChargeOpts {
4
+ /**
5
+ * The full MPP resource URL. E.g. 'https://api.cards402.com/v1/cards/visa/10.00'.
6
+ * This is the standards-compliant mode — works against any MPP server.
7
+ */
8
+ url?: string;
9
+ /**
10
+ * Convenience: build the URL from the cards402 base URL + USD amount.
11
+ * Only one of `url` or `{baseUrl, amountUsdc}` is required.
12
+ */
13
+ baseUrl?: string;
14
+ amountUsdc?: string;
15
+ /** OWS wallet name to pay from. */
16
+ walletName: string;
17
+ passphrase?: string;
18
+ vaultPath?: string;
19
+ /** Force a specific asset. If unset, the first advertised method is used. */
20
+ paymentAsset?: 'usdc' | 'xlm';
21
+ /** Override the network passphrase (defaults to Stellar mainnet). */
22
+ networkPassphrase?: string;
23
+ /** Override the Soroban RPC URL. Defaults based on networkPassphrase. */
24
+ sorobanRpcUrl?: string;
25
+ /**
26
+ * Maximum seconds to poll the 202 receipt URL before giving up. The
27
+ * receipt polling kicks in only when the server returned 202 (card
28
+ * fulfillment took longer than the server's sync wait). Default: 120s.
29
+ */
30
+ pollTimeoutMs?: number;
31
+ /**
32
+ * Injectable deps for testing. Mirrors PayViaContractOwsDeps so tests
33
+ * don't need to touch real Soroban / wallet infrastructure.
34
+ */
35
+ _deps?: {
36
+ fetch?: typeof fetch;
37
+ payViaContractOWS?: typeof payViaContractOWS;
38
+ payViaContractOwsDeps?: PayViaContractOwsDeps;
39
+ sleep?: (ms: number) => Promise<void>;
40
+ };
41
+ }
42
+ export interface MppChargeResult {
43
+ /** The card details, once fulfillment completes. */
44
+ card: CardDetails;
45
+ /** Backend order id. Useful for cross-referencing with dashboards. */
46
+ orderId: string;
47
+ /** MPP challenge id that paid for this card. */
48
+ challengeId: string;
49
+ /** Stellar transaction hash that redeemed the challenge. */
50
+ txHash: string;
51
+ /** Receipt URL (may be useful for re-polling if the caller wants to persist it). */
52
+ receiptUrl?: string;
53
+ /** How the card was delivered — 'sync' on 200, 'async' on 202-then-poll. */
54
+ delivery: 'sync' | 'async';
55
+ }
56
+ export declare function mppCharge(opts: MppChargeOpts): Promise<MppChargeResult>;
57
+ //# sourceMappingURL=mpp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpp.d.ts","sourceRoot":"","sources":["../src/mpp.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAuB,WAAW,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,KAAK,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAE9B,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;QACrB,iBAAiB,CAAC,EAAE,OAAO,iBAAiB,CAAC;QAC7C,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;QAC9C,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACvC,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,IAAI,EAAE,WAAW,CAAC;IAClB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AA2BD,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CA6G7E"}
package/dist/mpp.js ADDED
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ // Machine Payments Protocol (MPP) client helper.
3
+ //
4
+ // Entry point for agents that want to transact via MPP rather than the
5
+ // legacy /v1/orders flow. Semantics mirror any spec-compliant MPP
6
+ // client: GET the resource, read the 402 challenge, pay via the
7
+ // declared method, retry with an Authorization: Payment credential,
8
+ // collect the resource from the 200 (or poll the 202 Location).
9
+ //
10
+ // For cards402 specifically, the challenge's Stellar method maps onto
11
+ // the SDK's existing payViaContractOWS helper — so the OWS wallet,
12
+ // fee-retry logic, and on-chain confirmation all come for free.
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.mppCharge = mppCharge;
15
+ const ows_1 = require("./ows");
16
+ const DEFAULT_POLL_TIMEOUT_MS = 120_000;
17
+ const POLL_INTERVAL_MS = 1_000;
18
+ async function mppCharge(opts) {
19
+ const url = resolveUrl(opts);
20
+ const fetchImpl = opts._deps?.fetch ?? fetch;
21
+ const sleep = opts._deps?.sleep ?? defaultSleep;
22
+ const payFn = opts._deps?.payViaContractOWS ?? ows_1.payViaContractOWS;
23
+ // ── Step 1: hit the resource, expect 402. ───────────────────────────
24
+ const challengeRes = await fetchImpl(url, { method: 'GET' });
25
+ if (challengeRes.status !== 402) {
26
+ throw new Error(`mppCharge: expected 402 challenge from ${url}, got ${challengeRes.status}. ` +
27
+ `Body: ${await safeText(challengeRes)}`);
28
+ }
29
+ const challenge = (await challengeRes.json());
30
+ if (challenge.protocol !== 'mpp/1.0') {
31
+ throw new Error(`mppCharge: unsupported MPP protocol ${challenge.protocol}`);
32
+ }
33
+ // ── Step 2: pick a method. ──────────────────────────────────────────
34
+ const method = pickMethod(challenge.methods, opts.paymentAsset);
35
+ if (!method) {
36
+ throw new Error(`mppCharge: no supported payment method in challenge`);
37
+ }
38
+ if (method.scheme !== 'stellar' || method.kind !== 'soroban_contract') {
39
+ throw new Error(`mppCharge: only soroban_contract stellar methods supported; got ${method.scheme}/${method.kind}`);
40
+ }
41
+ // ── Step 3: pay via the Soroban receiver contract. ──────────────────
42
+ //
43
+ // Translate the MPP method into the PaymentInstructions shape that
44
+ // payViaContractOWS already understands. Tiny adapter — keeps ows.ts
45
+ // independent of MPP wire details.
46
+ const paymentAsset = method.function === 'pay_xlm' ? 'xlm' : 'usdc';
47
+ const paymentInstructions = {
48
+ type: 'soroban_contract',
49
+ contract_id: method.contract_id,
50
+ order_id: method.memo_value ?? challenge.challenge_id,
51
+ usdc: {
52
+ amount: paymentAsset === 'usdc' ? method.amount : challenge.amount.value,
53
+ asset: paymentAsset === 'usdc' ? method.asset : '',
54
+ },
55
+ ...(paymentAsset === 'xlm' && { xlm: { amount: method.amount } }),
56
+ };
57
+ const txHash = await payFn({
58
+ walletName: opts.walletName,
59
+ payment: paymentInstructions,
60
+ paymentAsset,
61
+ passphrase: opts.passphrase,
62
+ vaultPath: opts.vaultPath,
63
+ networkPassphrase: opts.networkPassphrase,
64
+ sorobanRpcUrl: opts.sorobanRpcUrl,
65
+ }, opts._deps?.payViaContractOwsDeps ?? {});
66
+ // ── Step 4: retry the resource with Authorization: Payment. ─────────
67
+ const authHeader = `Payment scheme="stellar", challenge="${challenge.challenge_id}", tx_hash="${txHash}"`;
68
+ const retryRes = await fetchImpl(url, {
69
+ method: 'GET',
70
+ headers: { Authorization: authHeader },
71
+ });
72
+ if (retryRes.status === 200) {
73
+ const body = (await retryRes.json());
74
+ return {
75
+ card: body.card,
76
+ orderId: body.order_id,
77
+ challengeId: body.challenge_id,
78
+ txHash: body.tx_hash,
79
+ delivery: 'sync',
80
+ };
81
+ }
82
+ if (retryRes.status === 202) {
83
+ const body = (await retryRes.json());
84
+ const pollUrl = resolvePollUrl(url, body.poll_url);
85
+ const final = await pollReceipt({
86
+ url: pollUrl,
87
+ fetchImpl,
88
+ sleep,
89
+ timeoutMs: opts.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS,
90
+ });
91
+ return {
92
+ card: final.card,
93
+ orderId: body.order_id,
94
+ challengeId: challenge.challenge_id,
95
+ txHash,
96
+ receiptUrl: pollUrl,
97
+ delivery: 'async',
98
+ };
99
+ }
100
+ throw new Error(`mppCharge: unexpected retry status ${retryRes.status}. Body: ${await safeText(retryRes)}`);
101
+ }
102
+ async function pollReceipt({ url, fetchImpl, sleep, timeoutMs, }) {
103
+ const deadline = Date.now() + timeoutMs;
104
+ while (Date.now() < deadline) {
105
+ const res = await fetchImpl(url, { method: 'GET' });
106
+ if (res.status === 200) {
107
+ const body = (await res.json());
108
+ return { card: body.card };
109
+ }
110
+ if (res.status === 202) {
111
+ await sleep(POLL_INTERVAL_MS);
112
+ continue;
113
+ }
114
+ if (res.status === 502) {
115
+ const body = (await res.json().catch(() => ({})));
116
+ throw new Error(`mppCharge: fulfillment failed — ${body.message ?? 'unknown reason'}`);
117
+ }
118
+ throw new Error(`mppCharge: unexpected receipt status ${res.status}. Body: ${await safeText(res)}`);
119
+ }
120
+ throw new Error(`mppCharge: timed out polling receipt URL after ${timeoutMs}ms`);
121
+ }
122
+ function resolveUrl(opts) {
123
+ if (opts.url)
124
+ return opts.url;
125
+ if (!opts.baseUrl || !opts.amountUsdc) {
126
+ throw new Error('mppCharge: either `url`, or both `baseUrl` and `amountUsdc`, must be provided');
127
+ }
128
+ const base = opts.baseUrl.replace(/\/$/, '');
129
+ return `${base}/cards/visa/${opts.amountUsdc}`;
130
+ }
131
+ function pickMethod(methods, preferred) {
132
+ if (preferred === 'xlm') {
133
+ return methods.find((m) => m.function === 'pay_xlm') ?? null;
134
+ }
135
+ if (preferred === 'usdc') {
136
+ return methods.find((m) => m.function === 'pay_usdc') ?? null;
137
+ }
138
+ // No preference — prefer USDC (stable), fall back to XLM.
139
+ return (methods.find((m) => m.function === 'pay_usdc') ??
140
+ methods.find((m) => m.function === 'pay_xlm') ??
141
+ null);
142
+ }
143
+ function resolvePollUrl(originalUrl, pollUrl) {
144
+ if (/^https?:\/\//.test(pollUrl))
145
+ return pollUrl;
146
+ try {
147
+ return new URL(pollUrl, originalUrl).toString();
148
+ }
149
+ catch {
150
+ return pollUrl;
151
+ }
152
+ }
153
+ async function safeText(res) {
154
+ try {
155
+ const t = await res.text();
156
+ return t.slice(0, 500);
157
+ }
158
+ catch {
159
+ return '<unreadable>';
160
+ }
161
+ }
162
+ function defaultSleep(ms) {
163
+ return new Promise((resolve) => setTimeout(resolve, ms));
164
+ }
165
+ //# sourceMappingURL=mpp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpp.js","sourceRoot":"","sources":["../src/mpp.ts"],"names":[],"mappings":"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"}