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
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ // Unit tests for the onboard command's wallet-name derivation. The
3
+ // helper is the load-bearing piece that fixes the "second agent reuses
4
+ // the first agent's OWS wallet" bug — the test exists to keep that
5
+ // behaviour locked in across future edits.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const vitest_1 = require("vitest");
8
+ const onboard_1 = require("./onboard");
9
+ (0, vitest_1.describe)('deriveDefaultWalletName', () => {
10
+ const claimA = 'c402_a1b2c3d4e5f607080910111213141516171819202122232425262728293031';
11
+ const claimB = 'c402_ff00112233445566778899aabbccddeeff00112233445566778899aabbccdd';
12
+ (0, vitest_1.it)('produces a name prefixed with cspr402-', () => {
13
+ (0, vitest_1.expect)((0, onboard_1._deriveDefaultWalletName)(claimA, 'research-bot')).toMatch(/^cspr402-/);
14
+ });
15
+ (0, vitest_1.it)('includes a slugified version of the label', () => {
16
+ (0, vitest_1.expect)((0, onboard_1._deriveDefaultWalletName)(claimA, 'Research Bot v2!')).toContain('research-bot-v2');
17
+ });
18
+ (0, vitest_1.it)('falls back to "agent" when the label is null', () => {
19
+ (0, vitest_1.expect)((0, onboard_1._deriveDefaultWalletName)(claimA, null)).toContain('agent');
20
+ });
21
+ (0, vitest_1.it)('falls back to "agent" when the label is empty', () => {
22
+ (0, vitest_1.expect)((0, onboard_1._deriveDefaultWalletName)(claimA, '')).toContain('agent');
23
+ });
24
+ (0, vitest_1.it)('produces different names for different claims — even with the same label', () => {
25
+ const a = (0, onboard_1._deriveDefaultWalletName)(claimA, 'research-bot');
26
+ const b = (0, onboard_1._deriveDefaultWalletName)(claimB, 'research-bot');
27
+ (0, vitest_1.expect)(a).not.toBe(b);
28
+ });
29
+ (0, vitest_1.it)('is deterministic — same inputs always yield the same name', () => {
30
+ (0, vitest_1.expect)((0, onboard_1._deriveDefaultWalletName)(claimA, 'research-bot')).toBe((0, onboard_1._deriveDefaultWalletName)(claimA, 'research-bot'));
31
+ });
32
+ (0, vitest_1.it)('accepts a claim without the c402_ prefix', () => {
33
+ const raw = (0, onboard_1._deriveDefaultWalletName)(claimA, 'x');
34
+ const noPrefix = (0, onboard_1._deriveDefaultWalletName)(claimA.replace(/^c402_/, ''), 'x');
35
+ (0, vitest_1.expect)(raw).toBe(noPrefix);
36
+ });
37
+ (0, vitest_1.it)('caps the label slug so a long label does not blow out the path', () => {
38
+ const long = 'a'.repeat(200);
39
+ const name = (0, onboard_1._deriveDefaultWalletName)(claimA, long);
40
+ // cspr402- + slug (<=24) + - + 8-hex = ~42 chars max
41
+ (0, vitest_1.expect)(name.length).toBeLessThanOrEqual(48);
42
+ });
43
+ (0, vitest_1.it)('never contains characters unsafe for a filesystem vault path', () => {
44
+ const name = (0, onboard_1._deriveDefaultWalletName)(claimA, '../../evil/$(whoami)');
45
+ (0, vitest_1.expect)(name).toMatch(/^cspr402-[a-z0-9-]+$/);
46
+ });
47
+ });
48
+ //# sourceMappingURL=onboard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.test.js","sourceRoot":"","sources":["../../src/commands/onboard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function purchaseCommand(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=purchase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/commands/purchase.ts"],"names":[],"mappings":"AAgKA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDrE"}
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.purchaseCommand = purchaseCommand;
4
+ const client_1 = require("../client");
5
+ const config_1 = require("../config");
6
+ const CASPER_PUBLIC_KEY_RE = /^(01[0-9a-f]{64}|02[0-9a-f]{66})$/i;
7
+ const ORDER_ID_RE = /^[a-zA-Z0-9_-]{1,64}$/;
8
+ function parseArgs(argv) {
9
+ const out = {};
10
+ const takeAsset = (value) => {
11
+ if (!value)
12
+ return;
13
+ if (value === 'cspr_casper' || value === 'mock_usdc_cep18')
14
+ out.asset = value;
15
+ else
16
+ out.assetInvalid = value;
17
+ };
18
+ for (let i = 0; i < argv.length; i++) {
19
+ const arg = argv[i];
20
+ if (!arg)
21
+ continue;
22
+ if (arg === '-h' || arg === '--help')
23
+ out.help = true;
24
+ else if (arg === '-a' || arg === '--amount')
25
+ out.amount = argv[++i];
26
+ else if (arg.startsWith('--amount='))
27
+ out.amount = arg.slice('--amount='.length);
28
+ else if (arg === '--asset')
29
+ takeAsset(argv[++i]);
30
+ else if (arg.startsWith('--asset='))
31
+ takeAsset(arg.slice('--asset='.length));
32
+ else if (arg === '--payer-public-key' || arg === '--public-key')
33
+ out.payerPublicKey = argv[++i];
34
+ else if (arg.startsWith('--payer-public-key='))
35
+ out.payerPublicKey = arg.slice('--payer-public-key='.length);
36
+ else if (arg.startsWith('--public-key='))
37
+ out.payerPublicKey = arg.slice('--public-key='.length);
38
+ else if (arg === '--sender-public-key')
39
+ out.senderPublicKey = argv[++i];
40
+ else if (arg.startsWith('--sender-public-key='))
41
+ out.senderPublicKey = arg.slice('--sender-public-key='.length);
42
+ else if (arg === '--order' || arg === '--order-id')
43
+ out.orderId = argv[++i];
44
+ else if (arg.startsWith('--order='))
45
+ out.orderId = arg.slice('--order='.length);
46
+ else if (arg.startsWith('--order-id='))
47
+ out.orderId = arg.slice('--order-id='.length);
48
+ else if (arg === '--verify')
49
+ out.verifyDeployHash = argv[++i];
50
+ else if (arg.startsWith('--verify='))
51
+ out.verifyDeployHash = arg.slice('--verify='.length);
52
+ }
53
+ return out;
54
+ }
55
+ function usage() {
56
+ process.stderr.write(`Usage:
57
+ cspr402 purchase --amount <USD> [--payer-public-key <hex>]
58
+ cspr402 purchase --amount <USD> --asset mock_usdc_cep18 --payer-public-key <hex>
59
+ cspr402 purchase --order <order-id> --verify <deploy-hash> [--sender-public-key <hex>]
60
+
61
+ Creates a CSPR402 order and prints Casper testnet payment instructions. The CLI
62
+ does not store private key material or sign transfers. Pay from Casper Wallet,
63
+ CSPR.click, casper-client, or your own agent runtime, then verify the deploy hash.
64
+
65
+ Options:
66
+ -a, --amount <USD> Mock virtual card value, for example 25.00
67
+ --asset <asset> cspr_casper (default) or mock_usdc_cep18
68
+ --payer-public-key <hex> Casper testnet public key to bind the order
69
+ --order <order-id> Existing order to verify
70
+ --verify <deploy-hash> Casper deploy hash to verify
71
+ --sender-public-key <hex> Sender public key for verify; defaults to payer/config key
72
+ -h, --help Show this message
73
+
74
+ Examples:
75
+ cspr402 purchase --amount 10 --payer-public-key 01...
76
+ cspr402 purchase --order ord_123 --verify <64-char-deploy-hash>
77
+ `);
78
+ }
79
+ function normalizeCasperPublicKey(value, label) {
80
+ if (!value)
81
+ return undefined;
82
+ const normalized = value.trim().toLowerCase();
83
+ if (!CASPER_PUBLIC_KEY_RE.test(normalized)) {
84
+ throw new Error(`${label} must be a Casper public key hex string.`);
85
+ }
86
+ return normalized;
87
+ }
88
+ function validateAmount(amount) {
89
+ if (!amount)
90
+ throw new Error('--amount <USD> is required.');
91
+ if (!/^\d+(\.\d{1,2})?$/.test(amount)) {
92
+ throw new Error('--amount must be a decimal string with up to 2 decimal places.');
93
+ }
94
+ const cents = Math.round(Number(amount) * 100);
95
+ if (!Number.isFinite(cents) || cents < 1)
96
+ throw new Error('--amount must be at least 0.01.');
97
+ if (cents > 1_000_000)
98
+ throw new Error('--amount cannot exceed 10000.00.');
99
+ return amount;
100
+ }
101
+ function validateOrderId(orderId) {
102
+ if (!orderId || !ORDER_ID_RE.test(orderId)) {
103
+ throw new Error('--order must be a valid CSPR402 order id.');
104
+ }
105
+ return orderId;
106
+ }
107
+ function validateDeployHash(deployHash) {
108
+ const normalized = (deployHash || '').trim().toLowerCase();
109
+ if (!/^[0-9a-f]{64}$/.test(normalized)) {
110
+ throw new Error('--verify must be a 64-character Casper deploy hash.');
111
+ }
112
+ return normalized;
113
+ }
114
+ function configuredPayer(args) {
115
+ const config = (0, config_1.loadCards402Config)();
116
+ return normalizeCasperPublicKey(args.payerPublicKey ||
117
+ args.senderPublicKey ||
118
+ process.env.CSPR402_CASPER_PUBLIC_KEY ||
119
+ config?.casper_public_key, 'payer public key');
120
+ }
121
+ function printPayment(payment) {
122
+ process.stdout.write('\nPayment instruction\n');
123
+ process.stdout.write('-------------------\n');
124
+ if (payment.type === 'casper_cspr_transfer') {
125
+ process.stdout.write(`Rail: Casper testnet CSPR\n`);
126
+ process.stdout.write(`Chain: ${payment.chain_name}\n`);
127
+ process.stdout.write(`Recipient: ${payment.recipient}\n`);
128
+ if (payment.sender_public_key)
129
+ process.stdout.write(`Sender: ${payment.sender_public_key}\n`);
130
+ process.stdout.write(`Amount: ${payment.amount_cspr} CSPR\n`);
131
+ process.stdout.write(`Motes: ${payment.amount_motes}\n`);
132
+ process.stdout.write(`transfer_id: ${payment.transfer_id}\n`);
133
+ process.stdout.write(`Expires: ${payment.expires_at}\n`);
134
+ return;
135
+ }
136
+ if (payment.type === 'casper_cep18_transfer') {
137
+ process.stdout.write(`Rail: mockUSDC CEP-18\n`);
138
+ process.stdout.write(`Chain: ${payment.chain_name}\n`);
139
+ process.stdout.write(`Package: ${payment.contract_package_hash}\n`);
140
+ if (payment.contract_hash)
141
+ process.stdout.write(`Contract: ${payment.contract_hash}\n`);
142
+ process.stdout.write(`Sender: ${payment.sender_public_key}\n`);
143
+ process.stdout.write(`Recipient: ${payment.recipient_public_key}\n`);
144
+ process.stdout.write(`Amount: ${payment.amount} mockUSDC\n`);
145
+ process.stdout.write(`Base units: ${payment.amount_base_units}\n`);
146
+ process.stdout.write(`Expires: ${payment.expires_at}\n`);
147
+ return;
148
+ }
149
+ process.stdout.write(`Unsupported legacy payment instruction: ${payment.type}\n`);
150
+ }
151
+ function printOrder(order) {
152
+ process.stdout.write(`Order: ${order.order_id}\n`);
153
+ process.stdout.write(`Status: ${order.status}\n`);
154
+ printPayment(order.payment);
155
+ process.stdout.write('\nAfter payment finalizes, verify with:\n');
156
+ process.stdout.write(` cspr402 purchase --order ${order.order_id} --verify <deploy-hash>\n`);
157
+ }
158
+ async function purchaseCommand(argv) {
159
+ const args = parseArgs(argv);
160
+ if (args.help) {
161
+ usage();
162
+ return 0;
163
+ }
164
+ try {
165
+ if (args.assetInvalid)
166
+ throw new Error(`--asset must be cspr_casper or mock_usdc_cep18.`);
167
+ const client = new client_1.CSPR402Client();
168
+ if (args.verifyDeployHash || args.orderId) {
169
+ const orderId = validateOrderId(args.orderId);
170
+ const deployHash = validateDeployHash(args.verifyDeployHash);
171
+ const senderPublicKey = normalizeCasperPublicKey(args.senderPublicKey ||
172
+ args.payerPublicKey ||
173
+ process.env.CSPR402_CASPER_PUBLIC_KEY ||
174
+ (0, config_1.loadCards402Config)()?.casper_public_key, 'sender public key');
175
+ const verified = await client.verifyCasperPayment(orderId, deployHash, {
176
+ ...(senderPublicKey ? { senderPublicKey } : {}),
177
+ });
178
+ process.stdout.write(`Payment verified for ${verified.order.order_id}\n`);
179
+ process.stdout.write(`Status: ${verified.order.status} (phase: ${verified.order.phase})\n`);
180
+ process.stdout.write(`Receipt: ${verified.receipt.type}\n`);
181
+ process.stdout.write(`Deploy: ${verified.receipt.deploy_hash}\n`);
182
+ if (verified.order.card) {
183
+ process.stdout.write(`Mock card: ${verified.order.card.brand || 'Mock Virtual Card'}\n`);
184
+ }
185
+ return 0;
186
+ }
187
+ const amount = validateAmount(args.amount);
188
+ const paymentAsset = args.asset || 'cspr_casper';
189
+ const payerPublicKey = configuredPayer(args);
190
+ if (paymentAsset === 'mock_usdc_cep18' && !payerPublicKey) {
191
+ throw new Error('mock_usdc_cep18 requires --payer-public-key so the order is bound to the sender.');
192
+ }
193
+ const order = await client.createOrder({
194
+ amount_usdc: amount,
195
+ payment_asset: paymentAsset,
196
+ ...(payerPublicKey ? { payer_public_key: payerPublicKey } : {}),
197
+ });
198
+ printOrder(order);
199
+ return 0;
200
+ }
201
+ catch (err) {
202
+ process.stderr.write(`error: ${err instanceof Error ? err.message : String(err)}\n`);
203
+ return 1;
204
+ }
205
+ }
206
+ //# sourceMappingURL=purchase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purchase.js","sourceRoot":"","sources":["../../src/commands/purchase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function walletCommand(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"AAiIA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkEnE"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.walletCommand = walletCommand;
4
+ const config_1 = require("../config");
5
+ const CASPER_PUBLIC_KEY_RE = /^(01[0-9a-f]{64}|02[0-9a-f]{66})$/i;
6
+ const DEFAULT_RPC_URL = 'https://node.testnet.casper.network/rpc';
7
+ const MOTES_PER_CSPR = 1000000000n;
8
+ function usage() {
9
+ process.stderr.write(`Usage: cspr402 wallet <subcommand> [--public-key <hex>] [--rpc-url <url>]
10
+
11
+ Subcommands:
12
+ address Print the configured Casper public key
13
+ key-path Print the configured local key-file path, if one was saved
14
+ balance Query Casper testnet CSPR balance for the configured public key
15
+ info Print configured wallet context
16
+ -h, --help Show this message
17
+
18
+ The wallet command is read-only. It never reads or stores private key material;
19
+ the optional key path is only a local pointer saved by onboarding.
20
+ `);
21
+ }
22
+ function parseFlag(rest, name) {
23
+ for (let i = 0; i < rest.length; i++) {
24
+ const arg = rest[i];
25
+ if (!arg)
26
+ continue;
27
+ if (arg === name)
28
+ return rest[i + 1];
29
+ if (arg.startsWith(`${name}=`))
30
+ return arg.slice(name.length + 1);
31
+ }
32
+ return undefined;
33
+ }
34
+ function normalizePublicKey(value) {
35
+ if (!value)
36
+ return undefined;
37
+ const normalized = value.trim().toLowerCase();
38
+ if (!CASPER_PUBLIC_KEY_RE.test(normalized)) {
39
+ throw new Error('Casper public key must be 01 + 32 bytes or 02 + 33 bytes in hex.');
40
+ }
41
+ return normalized;
42
+ }
43
+ function resolvePublicKey(rest) {
44
+ const config = (0, config_1.loadCards402Config)();
45
+ const publicKey = normalizePublicKey(parseFlag(rest, '--public-key') ||
46
+ process.env.CSPR402_CASPER_PUBLIC_KEY ||
47
+ config?.casper_public_key);
48
+ if (!publicKey) {
49
+ throw new Error("No Casper public key configured. Re-run 'cspr402 onboard --claim <code> --casper-public-key <hex>' or pass --public-key.");
50
+ }
51
+ return publicKey;
52
+ }
53
+ function resolveRpcUrl(rest) {
54
+ return (parseFlag(rest, '--rpc-url') ||
55
+ process.env.CSPR402_CASPER_NODE_RPC_URL ||
56
+ process.env.CASPER_NODE_RPC_URL ||
57
+ DEFAULT_RPC_URL);
58
+ }
59
+ async function rpcCall(rpcUrl, method, params) {
60
+ const res = await fetch(rpcUrl, {
61
+ method: 'POST',
62
+ headers: { 'Content-Type': 'application/json' },
63
+ body: JSON.stringify({ id: 1, jsonrpc: '2.0', method, params }),
64
+ });
65
+ const body = (await res.json().catch(() => ({})));
66
+ if (!res.ok || body.error) {
67
+ const msg = body.error?.message ||
68
+ (typeof body.error?.data === 'string' ? body.error.data : undefined) ||
69
+ `Casper RPC HTTP ${res.status}`;
70
+ throw new Error(msg);
71
+ }
72
+ return body.result;
73
+ }
74
+ function unwrapValue(result) {
75
+ const obj = result;
76
+ if (obj && typeof obj === 'object' && obj.value && typeof obj.value === 'object') {
77
+ return obj.value;
78
+ }
79
+ return obj || {};
80
+ }
81
+ function formatCSPR(motesRaw) {
82
+ const motes = BigInt(motesRaw);
83
+ const whole = motes / MOTES_PER_CSPR;
84
+ const frac = String(motes % MOTES_PER_CSPR).padStart(9, '0');
85
+ return `${whole}.${frac}`;
86
+ }
87
+ async function fetchBalance(publicKey, rpcUrl) {
88
+ const accountInfo = unwrapValue(await rpcCall(rpcUrl, 'state_get_account_info', [
89
+ { name: 'account_identifier', value: publicKey },
90
+ ]));
91
+ const account = accountInfo.account;
92
+ const accountHash = typeof account?.account_hash === 'string' ? account.account_hash : undefined;
93
+ if (!accountHash) {
94
+ throw new Error('Account was not found on Casper testnet. Fund it with testnet CSPR first.');
95
+ }
96
+ const balanceResult = unwrapValue(await rpcCall(rpcUrl, 'query_balance', [
97
+ {
98
+ name: 'purse_identifier',
99
+ value: { main_purse_under_account_hash: accountHash },
100
+ },
101
+ ]));
102
+ const balance = balanceResult.balance;
103
+ if (typeof balance !== 'string' || !/^\d+$/.test(balance)) {
104
+ throw new Error('Casper RPC did not return a parseable balance.');
105
+ }
106
+ return { accountHash, motes: balance };
107
+ }
108
+ async function walletCommand(argv) {
109
+ const [sub, ...rest] = argv;
110
+ if (!sub || sub === '-h' || sub === '--help' || sub === 'help') {
111
+ usage();
112
+ return sub ? 0 : 2;
113
+ }
114
+ try {
115
+ const config = (0, config_1.loadCards402Config)();
116
+ if (sub === 'address') {
117
+ process.stdout.write(`${resolvePublicKey(rest)}\n`);
118
+ return 0;
119
+ }
120
+ if (sub === 'key-path') {
121
+ const keyPath = parseFlag(rest, '--key-path') ||
122
+ process.env.CSPR402_CASPER_KEY_PATH ||
123
+ config?.casper_key_path;
124
+ if (!keyPath) {
125
+ process.stderr.write('No Casper key-file path configured.\n');
126
+ return 1;
127
+ }
128
+ process.stdout.write(`${keyPath}\n`);
129
+ return 0;
130
+ }
131
+ if (sub === 'info') {
132
+ const publicKey = normalizePublicKey(parseFlag(rest, '--public-key') ||
133
+ process.env.CSPR402_CASPER_PUBLIC_KEY ||
134
+ config?.casper_public_key);
135
+ process.stdout.write(`config: ${process.env.CSPR402_CONFIG_DIR || '~/.cspr402'}/config.json\n`);
136
+ process.stdout.write(`api_url: ${config?.api_url || process.env.CSPR402_BASE_URL || 'not configured'}\n`);
137
+ process.stdout.write(`public_key: ${publicKey || 'not configured'}\n`);
138
+ process.stdout.write(`key_path: ${config?.casper_key_path || process.env.CSPR402_CASPER_KEY_PATH || 'not configured'}\n`);
139
+ process.stdout.write(`rpc_url: ${resolveRpcUrl(rest)}\n`);
140
+ return 0;
141
+ }
142
+ if (sub === 'balance') {
143
+ const publicKey = resolvePublicKey(rest);
144
+ const rpcUrl = resolveRpcUrl(rest);
145
+ const balance = await fetchBalance(publicKey, rpcUrl);
146
+ process.stdout.write(`address: ${publicKey}\n`);
147
+ process.stdout.write(`account_hash: ${balance.accountHash}\n`);
148
+ process.stdout.write(`motes: ${balance.motes}\n`);
149
+ process.stdout.write(`cspr: ${formatCSPR(balance.motes)}\n`);
150
+ return 0;
151
+ }
152
+ process.stderr.write(`error: unknown wallet subcommand '${sub}'\n`);
153
+ usage();
154
+ return 2;
155
+ }
156
+ catch (err) {
157
+ process.stderr.write(`error: ${err instanceof Error ? err.message : String(err)}\n`);
158
+ return 1;
159
+ }
160
+ }
161
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ export interface Cards402Config {
2
+ api_key: string;
3
+ api_url: string;
4
+ webhook_secret?: string | null;
5
+ wallet_name?: string;
6
+ vault_path?: string;
7
+ casper_public_key?: string;
8
+ casper_key_path?: string;
9
+ /**
10
+ * Adversarial audit F12: the NAME of the environment variable that
11
+ * holds the OWS wallet passphrase, NOT the passphrase value itself.
12
+ * Subsequent CLI commands read this field, look up
13
+ * `process.env[passphrase_env]` at call time, and pass the value to
14
+ * the OWS layer. We never persist the passphrase value to disk —
15
+ * a config dump alone gives an attacker the api key but not the
16
+ * keys to the wallet vault.
17
+ */
18
+ passphrase_env?: string;
19
+ created_at: string;
20
+ }
21
+ export declare function loadCards402Config(configPath?: string): Cards402Config | null;
22
+ /**
23
+ * Validate a base URL for safety before storing it in the config or
24
+ * using it for API calls. Rejects everything that isn't HTTPS unless
25
+ * the explicit CARDS402_ALLOW_INSECURE_BASE_URL escape hatch is set,
26
+ * which only exists so local dev against http://localhost:4000 still
27
+ * works. Returns the parsed URL.string() on success, throws on reject.
28
+ *
29
+ * Called from:
30
+ * - onboard, when persisting the api_url returned by the claim
31
+ * endpoint (defends against a MITM or compromised backend that
32
+ * injects http:// or a foreign origin into the response)
33
+ * - resolveCredentials, when an env-var override is used for
34
+ * baseUrl (defends against a user being tricked into setting
35
+ * CARDS402_BASE_URL to an attacker target)
36
+ */
37
+ export declare function assertSafeBaseUrl(url: string, opts?: {
38
+ context?: string;
39
+ }): string;
40
+ /**
41
+ * Write the config file atomically with 0600 permissions so only the
42
+ * owner can read it. Creates the parent directory on demand.
43
+ *
44
+ * Atomicity: write to `<path>.tmp-<pid>-<rand>` first, fsync, then
45
+ * rename over the target. A mid-write crash (power loss, OOM, Ctrl-C
46
+ * between write and flush) leaves the old file intact instead of a
47
+ * truncated new one that loadCards402Config would explode on.
48
+ *
49
+ * Permission hardening: the `mode` option on writeFileSync only
50
+ * applies when the file is being CREATED, so a stale 0644 file from
51
+ * an earlier buggy version would retain its wide permissions forever.
52
+ * We fsync+rename so the temp path is always freshly created with
53
+ * 0600, then the rename replaces the target atomically.
54
+ */
55
+ export declare function saveCards402Config(config: Cards402Config, configPath?: string): {
56
+ path: string;
57
+ };
58
+ /**
59
+ * Resolve an api key + base URL at SDK call time, in priority order:
60
+ * 1. Explicit `apiKey` / `baseUrl` passed to the call
61
+ * 2. CSPR402_API_KEY / CSPR402_BASE_URL env vars
62
+ * 3. ~/.cspr402/config.json
63
+ *
64
+ * The two fields resolve independently — passing `apiKey` to a call
65
+ * that needs its `baseUrl` to come from config.json used to silently
66
+ * drop the config lookup because the early-return on `opts.apiKey`
67
+ * was only consulting env vars for baseUrl. Now both fields walk the
68
+ * full priority chain and only stop once each is filled.
69
+ */
70
+ export declare function resolveCredentials(opts?: {
71
+ apiKey?: string;
72
+ baseUrl?: string;
73
+ }): {
74
+ apiKey: string | undefined;
75
+ baseUrl: string | undefined;
76
+ };
77
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkCD,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA8E7E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAkCtF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAgEhG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL;IAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CA8B7D"}