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.
- package/LICENSE +21 -0
- package/README.md +173 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +108 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +207 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +400 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/onboard.d.ts +4 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +192 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/onboard.test.d.ts +2 -0
- package/dist/commands/onboard.test.d.ts.map +1 -0
- package/dist/commands/onboard.test.js +48 -0
- package/dist/commands/onboard.test.js.map +1 -0
- package/dist/commands/purchase.d.ts +2 -0
- package/dist/commands/purchase.d.ts.map +1 -0
- package/dist/commands/purchase.js +206 -0
- package/dist/commands/purchase.js.map +1 -0
- package/dist/commands/wallet.d.ts +2 -0
- package/dist/commands/wallet.d.ts.map +1 -0
- package/dist/commands/wallet.js +161 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/config.d.ts +77 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +329 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +101 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +197 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +2 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +337 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mpp.d.ts +57 -0
- package/dist/mpp.d.ts.map +1 -0
- package/dist/mpp.js +165 -0
- package/dist/mpp.js.map +1 -0
- package/dist/ows.d.ts +190 -0
- package/dist/ows.d.ts.map +1 -0
- package/dist/ows.js +565 -0
- package/dist/ows.js.map +1 -0
- package/dist/soroban.d.ts +92 -0
- package/dist/soroban.d.ts.map +1 -0
- package/dist/soroban.js +313 -0
- package/dist/soroban.js.map +1 -0
- package/dist/stellar.d.ts +53 -0
- package/dist/stellar.d.ts.map +1 -0
- package/dist/stellar.js +180 -0
- package/dist/stellar.js.map +1 -0
- package/dist/version-check.d.ts +5 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +203 -0
- package/dist/version-check.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|