paytaca-cli 0.5.2 → 0.6.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.
- package/README.md +10 -2
- package/dist/commands/balance.d.ts +4 -1
- package/dist/commands/balance.d.ts.map +1 -1
- package/dist/commands/balance.js +117 -27
- package/dist/commands/balance.js.map +1 -1
- package/dist/commands/receive.d.ts.map +1 -1
- package/dist/commands/receive.js +13 -0
- package/dist/commands/receive.js.map +1 -1
- package/dist/commands/wallet.d.ts +14 -0
- package/dist/commands/wallet.d.ts.map +1 -1
- package/dist/commands/wallet.js +241 -2
- package/dist/commands/wallet.js.map +1 -1
- package/dist/commands/wallet.test.d.ts +2 -0
- package/dist/commands/wallet.test.d.ts.map +1 -0
- package/dist/commands/wallet.test.js +68 -0
- package/dist/commands/wallet.test.js.map +1 -0
- package/package.json +2 -2
- package/skills/paytaca-wallet/SKILL.md +10 -1
package/README.md
CHANGED
|
@@ -36,19 +36,25 @@ paytaca wallet create # Generate a new 12-word seed phrase
|
|
|
36
36
|
paytaca wallet create --chipnet # Create on chipnet (testnet)
|
|
37
37
|
paytaca wallet import # Import an existing seed phrase
|
|
38
38
|
paytaca wallet info # Show wallet hash, address, and balance
|
|
39
|
-
paytaca wallet export # Display the stored seed phrase
|
|
39
|
+
paytaca wallet export # Display the stored seed phrase (interactive terminal + biometrics)
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
+
> `wallet export` requires an interactive terminal and prompts for biometric
|
|
43
|
+
> authentication (Touch ID, fingerprint, or Windows Hello) when available. It
|
|
44
|
+
> cannot be used from scripts, pipes, or other non-interactive processes.
|
|
45
|
+
|
|
42
46
|
### Balance
|
|
43
47
|
|
|
44
48
|
```bash
|
|
45
49
|
paytaca balance # Show BCH balance with USD conversion
|
|
46
50
|
paytaca balance --sats # Show in satoshis only
|
|
47
51
|
paytaca balance --token <category> # Show balance for a specific CashToken
|
|
52
|
+
paytaca balance --tokens # Show CashToken balances only (balance > 0)
|
|
53
|
+
paytaca balance --all # Show BCH and CashToken balances
|
|
48
54
|
paytaca balance --chipnet # Query chipnet balance
|
|
49
55
|
```
|
|
50
56
|
|
|
51
|
-
The default balance view shows the BCH (or token) amount plus its fiat value (e.g. `0.01218811 BCH` / `≈ 3.17 USD`). Fiat conversion is skipped when no price is available.
|
|
57
|
+
The default balance view shows the BCH (or token) amount plus its fiat value (e.g. `0.01218811 BCH` / `≈ 3.17 USD`). Fiat conversion is skipped when no price is available. `--tokens` and `--all` list only tokens with a positive balance.
|
|
52
58
|
|
|
53
59
|
### Receive
|
|
54
60
|
|
|
@@ -62,6 +68,8 @@ paytaca receive --token <category> # PayPro URI for a specific token
|
|
|
62
68
|
paytaca receive --token <category> --amount 100 # PayPro URI with token amount
|
|
63
69
|
```
|
|
64
70
|
|
|
71
|
+
The displayed address (and its token-aware variant) is automatically subscribed with Watchtower so incoming BCH and CashTokens are monitored, even for indices not covered by the initial wallet scan.
|
|
72
|
+
|
|
65
73
|
### Send
|
|
66
74
|
|
|
67
75
|
```bash
|
|
@@ -5,7 +5,10 @@
|
|
|
5
5
|
* Shows both BCH and satoshi denominations, plus spendable vs total
|
|
6
6
|
* when they differ (e.g. unconfirmed UTXOs).
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* (default) BCH balance only
|
|
9
|
+
* --token <category> balance for a specific CashToken
|
|
10
|
+
* --tokens CashToken balances only (positive balances)
|
|
11
|
+
* --all BCH and CashToken balances
|
|
9
12
|
*/
|
|
10
13
|
import { Command } from 'commander';
|
|
11
14
|
export declare function registerBalanceCommand(program: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmInC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoI7D"}
|
package/dist/commands/balance.js
CHANGED
|
@@ -5,11 +5,14 @@
|
|
|
5
5
|
* Shows both BCH and satoshi denominations, plus spendable vs total
|
|
6
6
|
* when they differ (e.g. unconfirmed UTXOs).
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* (default) BCH balance only
|
|
9
|
+
* --token <category> balance for a specific CashToken
|
|
10
|
+
* --tokens CashToken balances only (positive balances)
|
|
11
|
+
* --all BCH and CashToken balances
|
|
9
12
|
*/
|
|
10
13
|
import chalk from 'chalk';
|
|
11
14
|
import { loadWallet, loadMnemonic } from '../wallet/index.js';
|
|
12
|
-
import { getBchUsdPrice, formatUsd, getUsdPerToken, tokenAmountToUsd } from '../utils/prices.js';
|
|
15
|
+
import { getBchUsdPrice, formatUsd, fetchAssetPrices, getUsdPerToken, tokenAmountToUsd, } from '../utils/prices.js';
|
|
13
16
|
/** Convert BCH to satoshis (1 BCH = 100,000,000 sats) */
|
|
14
17
|
function bchToSats(bch) {
|
|
15
18
|
return Math.round(bch * 1e8);
|
|
@@ -18,22 +21,120 @@ function bchToSats(bch) {
|
|
|
18
21
|
function formatSats(sats) {
|
|
19
22
|
return sats.toLocaleString('en-US');
|
|
20
23
|
}
|
|
24
|
+
/** Format a token amount with decimals */
|
|
25
|
+
function formatTokenAmount(rawAmount, decimals) {
|
|
26
|
+
if (decimals === 0)
|
|
27
|
+
return rawAmount.toLocaleString('en-US');
|
|
28
|
+
const scaled = rawAmount / Math.pow(10, decimals);
|
|
29
|
+
return scaled.toLocaleString('en-US', {
|
|
30
|
+
minimumFractionDigits: 0,
|
|
31
|
+
maximumFractionDigits: decimals,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** Print the BCH balance (BCH + USD, or sats with --sats). */
|
|
35
|
+
async function showBchBalance(bchWallet, isChipnet, showSatsOnly) {
|
|
36
|
+
const result = await bchWallet.getBalance();
|
|
37
|
+
const balanceSats = bchToSats(result.balance);
|
|
38
|
+
const spendableSats = bchToSats(result.spendable);
|
|
39
|
+
if (showSatsOnly) {
|
|
40
|
+
console.log(` Balance: ${formatSats(balanceSats)} sats`);
|
|
41
|
+
if (result.spendable !== result.balance) {
|
|
42
|
+
console.log(chalk.dim(` Spendable: ${formatSats(spendableSats)} sats`));
|
|
43
|
+
}
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
let usdPerBch = null;
|
|
47
|
+
try {
|
|
48
|
+
usdPerBch = await getBchUsdPrice(isChipnet);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// USD price unavailable — show BCH only
|
|
52
|
+
}
|
|
53
|
+
console.log(` Balance: ${result.balance} BCH`);
|
|
54
|
+
if (usdPerBch !== null) {
|
|
55
|
+
console.log(chalk.dim(` ≈ ${formatUsd(result.balance * usdPerBch)}`));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Print CashToken balances, excluding tokens with a zero balance. */
|
|
59
|
+
async function showTokenBalances(bchWallet, isChipnet) {
|
|
60
|
+
const tokens = (await bchWallet.getFungibleTokens()).filter((t) => t.balance > 0);
|
|
61
|
+
if (tokens.length === 0) {
|
|
62
|
+
console.log(chalk.dim(' No CashTokens with a positive balance.\n'));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Fetch USD prices for all held tokens (batched by the util)
|
|
66
|
+
const prices = new Map();
|
|
67
|
+
try {
|
|
68
|
+
const priceData = await fetchAssetPrices(tokens.map((t) => `ct/${t.category}`), ['USD'], isChipnet);
|
|
69
|
+
for (const p of priceData) {
|
|
70
|
+
if (String(p.currency || '').toLowerCase() !== 'usd')
|
|
71
|
+
continue;
|
|
72
|
+
const catMatch = String(p.asset || '').match(/^ct\/([a-fA-F0-9]+)$/);
|
|
73
|
+
if (!catMatch)
|
|
74
|
+
continue;
|
|
75
|
+
const raw = parseFloat(p.price_value);
|
|
76
|
+
if (!isFinite(raw) || raw === 0)
|
|
77
|
+
continue;
|
|
78
|
+
prices.set(catMatch[1], 1 / raw);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Pricing unavailable — proceed without USD values
|
|
83
|
+
}
|
|
84
|
+
let totalUsd = 0;
|
|
85
|
+
let pricedCount = 0;
|
|
86
|
+
console.log(chalk.dim(' Tokens:'));
|
|
87
|
+
for (const t of tokens) {
|
|
88
|
+
const amount = formatTokenAmount(t.balance, t.decimals);
|
|
89
|
+
const symbol = t.symbol ? ` ${t.symbol}` : '';
|
|
90
|
+
const name = t.name !== 'Unknown Token' ? t.name : '';
|
|
91
|
+
const usdPerToken = prices.get(t.category);
|
|
92
|
+
console.log(` ${chalk.bold(amount + symbol)}`);
|
|
93
|
+
if (name) {
|
|
94
|
+
console.log(chalk.dim(` ${name}`));
|
|
95
|
+
}
|
|
96
|
+
console.log(chalk.dim(` ${t.category}`));
|
|
97
|
+
if (usdPerToken !== undefined) {
|
|
98
|
+
const usdValue = tokenAmountToUsd(t.balance, t.decimals, usdPerToken);
|
|
99
|
+
totalUsd += usdValue;
|
|
100
|
+
pricedCount += 1;
|
|
101
|
+
console.log(chalk.green(` ≈ ${formatUsd(usdValue)}`));
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
}
|
|
105
|
+
console.log(chalk.dim(` ${tokens.length} token${tokens.length !== 1 ? 's' : ''} with balance`));
|
|
106
|
+
if (pricedCount > 0) {
|
|
107
|
+
console.log(chalk.bold(` Total: ${formatUsd(totalUsd)}`));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
21
110
|
export function registerBalanceCommand(program) {
|
|
22
111
|
program
|
|
23
112
|
.command('balance')
|
|
24
113
|
.description('Display wallet balance')
|
|
25
114
|
.option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
|
|
26
115
|
.option('--token <id>', 'Show balance for a specific CashToken category (64-character hex)')
|
|
27
|
-
.option('--
|
|
116
|
+
.option('--tokens', 'Show CashToken balances only (excludes BCH)')
|
|
117
|
+
.option('--all', 'Show BCH and CashToken balances')
|
|
118
|
+
.option('--sats', 'Display BCH balance in satoshis only')
|
|
28
119
|
.action(async (opts) => {
|
|
29
120
|
const isChipnet = Boolean(opts.chipnet);
|
|
30
121
|
const showSatsOnly = Boolean(opts.sats);
|
|
122
|
+
const showTokens = Boolean(opts.tokens);
|
|
123
|
+
const showAll = Boolean(opts.all);
|
|
31
124
|
const network = isChipnet ? 'chipnet' : 'mainnet';
|
|
32
125
|
const tokenId = opts.token || '';
|
|
33
126
|
if (tokenId && !/^[a-fA-F0-9]{64}$/.test(tokenId)) {
|
|
34
127
|
console.log(chalk.red('\nError: Token must be a 64-character hex string.\n'));
|
|
35
128
|
process.exit(1);
|
|
36
129
|
}
|
|
130
|
+
if (showTokens && showAll) {
|
|
131
|
+
console.log(chalk.red('\nError: --tokens and --all cannot be used together.\n'));
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
if (tokenId && (showTokens || showAll)) {
|
|
135
|
+
console.log(chalk.red('\nError: --token cannot be combined with --tokens or --all.\n'));
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
37
138
|
// ── Validate wallet ──────────────────────────────────────────────
|
|
38
139
|
const data = loadMnemonic();
|
|
39
140
|
if (!data) {
|
|
@@ -44,7 +145,7 @@ export function registerBalanceCommand(program) {
|
|
|
44
145
|
const bchWallet = w.forNetwork(isChipnet);
|
|
45
146
|
try {
|
|
46
147
|
if (tokenId) {
|
|
47
|
-
// ──
|
|
148
|
+
// ── Specific token balance ──────────────────────────────────
|
|
48
149
|
let tokenName = '';
|
|
49
150
|
let tokenSymbol = '';
|
|
50
151
|
let decimals = 0;
|
|
@@ -85,31 +186,20 @@ export function registerBalanceCommand(program) {
|
|
|
85
186
|
console.log(chalk.dim(` ≈ ${formatUsd(usdValue)}`));
|
|
86
187
|
}
|
|
87
188
|
}
|
|
189
|
+
else if (showTokens || showAll) {
|
|
190
|
+
// ── Token balances, optionally with BCH ─────────────────────
|
|
191
|
+
const title = showAll ? 'Balances' : 'Token Balances';
|
|
192
|
+
console.log(chalk.bold(`\n ${title} (${network})\n`));
|
|
193
|
+
if (showAll) {
|
|
194
|
+
await showBchBalance(bchWallet, isChipnet, showSatsOnly);
|
|
195
|
+
console.log();
|
|
196
|
+
}
|
|
197
|
+
await showTokenBalances(bchWallet, isChipnet);
|
|
198
|
+
}
|
|
88
199
|
else {
|
|
89
|
-
// ── BCH balance
|
|
200
|
+
// ── BCH balance ─────────────────────────────────────────────
|
|
90
201
|
console.log(chalk.bold(`\n Balance (${network})\n`));
|
|
91
|
-
|
|
92
|
-
const balanceSats = bchToSats(result.balance);
|
|
93
|
-
const spendableSats = bchToSats(result.spendable);
|
|
94
|
-
if (showSatsOnly) {
|
|
95
|
-
console.log(` Balance: ${formatSats(balanceSats)} sats`);
|
|
96
|
-
if (result.spendable !== result.balance) {
|
|
97
|
-
console.log(chalk.dim(` Spendable: ${formatSats(spendableSats)} sats`));
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
let usdPerBch = null;
|
|
102
|
-
try {
|
|
103
|
-
usdPerBch = await getBchUsdPrice(isChipnet);
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
// USD price unavailable — show BCH only
|
|
107
|
-
}
|
|
108
|
-
console.log(` Balance: ${result.balance} BCH`);
|
|
109
|
-
if (usdPerBch !== null) {
|
|
110
|
-
console.log(chalk.dim(` ≈ ${formatUsd(result.balance * usdPerBch)}`));
|
|
111
|
-
}
|
|
112
|
-
}
|
|
202
|
+
await showBchBalance(bchWallet, isChipnet, showSatsOnly);
|
|
113
203
|
}
|
|
114
204
|
}
|
|
115
205
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receive.d.ts","sourceRoot":"","sources":["../../src/commands/receive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwCnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"receive.d.ts","sourceRoot":"","sources":["../../src/commands/receive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwCnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2J7D"}
|
package/dist/commands/receive.js
CHANGED
|
@@ -90,6 +90,16 @@ export function registerReceiveCommand(program) {
|
|
|
90
90
|
const address = isToken
|
|
91
91
|
? bchWallet.getTokenAddressSetAt(index).receiving
|
|
92
92
|
: bchWallet.getAddressSetAt(index).receiving;
|
|
93
|
+
// ── Subscribe the address with Watchtower ───────────────────────
|
|
94
|
+
// The backend derives the token-aware variant automatically, so this
|
|
95
|
+
// covers both BCH and CashToken payments to the displayed address.
|
|
96
|
+
let subscribed = false;
|
|
97
|
+
try {
|
|
98
|
+
subscribed = Boolean(await bchWallet.getNewAddressSet(index));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Non-critical: displaying the address should still succeed
|
|
102
|
+
}
|
|
93
103
|
// ── Resolve token metadata (if category specified) ─────────────
|
|
94
104
|
let tokenInfo = null;
|
|
95
105
|
let tokenName = '';
|
|
@@ -131,6 +141,9 @@ export function registerReceiveCommand(program) {
|
|
|
131
141
|
console.log(chalk.bold(`\n ${label} (${network})\n`));
|
|
132
142
|
console.log(` Address: ${address}`);
|
|
133
143
|
console.log(chalk.dim(` Index: ${index}`));
|
|
144
|
+
console.log(subscribed
|
|
145
|
+
? chalk.dim(' Watching: subscribed with Watchtower')
|
|
146
|
+
: chalk.yellow(' Watching: not subscribed (address may not be monitored)'));
|
|
134
147
|
if (isToken) {
|
|
135
148
|
console.log(chalk.dim(' Type: token-aware (z-prefix)'));
|
|
136
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receive.js","sourceRoot":"","sources":["../../src/commands/receive.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"receive.js","sourceRoot":"","sources":["../../src/commands/receive.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,4 +8,18 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { Command } from 'commander';
|
|
10
10
|
export declare function registerWalletCommands(program: Command): void;
|
|
11
|
+
export declare class NonInteractiveTerminalError extends Error {
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Refuse to reveal the seed phrase unless the command is attached to a real
|
|
15
|
+
* interactive terminal. This blocks piping, redirection, `echo ... | paytaca`,
|
|
16
|
+
* command substitution, and non-interactive agent execution. Throws (rather
|
|
17
|
+
* than exiting) so callers and tests can handle the refusal.
|
|
18
|
+
*/
|
|
19
|
+
export declare function assertInteractiveTerminal(stdinIsTTY: boolean | undefined, stdoutIsTTY: boolean | undefined): void;
|
|
20
|
+
export declare function generateChallenge(): string;
|
|
21
|
+
type BiometricResult = 'ok' | 'denied' | 'unavailable' | 'error';
|
|
22
|
+
export declare function isChallengeAnswerCorrect(challenge: string, answer: string | null): boolean;
|
|
23
|
+
export declare function classifyBiometricOutput(output: string): BiometricResult;
|
|
24
|
+
export {};
|
|
11
25
|
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4M7D;AAED,qBAAa,2BAA4B,SAAQ,KAAK;CAAG;AAEzD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,OAAO,GAAG,SAAS,EAC/B,WAAW,EAAE,OAAO,GAAG,SAAS,GAC/B,IAAI,CAON;AA6ED,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,KAAK,eAAe,GAAG,IAAI,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAA;AAMhE,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,OAAO,CAET;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAKvE"}
|
package/dist/commands/wallet.js
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import chalk from 'chalk';
|
|
10
10
|
import * as readline from 'readline';
|
|
11
|
+
import * as os from 'node:os';
|
|
12
|
+
import { randomInt } from 'node:crypto';
|
|
13
|
+
import { spawnSync } from 'node:child_process';
|
|
11
14
|
import { generateMnemonic, importMnemonic, loadWallet, loadMnemonic, } from '../wallet/index.js';
|
|
12
15
|
import { getBchUsdPrice, formatUsd } from '../utils/prices.js';
|
|
13
16
|
export function registerWalletCommands(program) {
|
|
@@ -141,13 +144,25 @@ export function registerWalletCommands(program) {
|
|
|
141
144
|
// ── wallet export ───────────────────────────────────────────────────
|
|
142
145
|
wallet
|
|
143
146
|
.command('export')
|
|
144
|
-
.description('Display the stored seed phrase')
|
|
145
|
-
.action(() => {
|
|
147
|
+
.description('Display the stored seed phrase (interactive terminal only)')
|
|
148
|
+
.action(async () => {
|
|
149
|
+
try {
|
|
150
|
+
assertInteractiveTerminal(process.stdin.isTTY, process.stdout.isTTY);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
console.log(chalk.red(`\n${err.message}\n`));
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
146
156
|
const data = loadMnemonic();
|
|
147
157
|
if (!data) {
|
|
148
158
|
console.log(chalk.red('\nNo wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.\n'));
|
|
149
159
|
process.exit(1);
|
|
150
160
|
}
|
|
161
|
+
const verified = await promptHumanVerification();
|
|
162
|
+
if (!verified) {
|
|
163
|
+
console.log(chalk.red('\n Verification failed. Seed phrase not shown.\n'));
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
151
166
|
console.log(chalk.yellow.bold('\n WARNING: Do not share your seed phrase with anyone.'));
|
|
152
167
|
console.log(chalk.yellow(' Anyone with this phrase can access your funds.\n'));
|
|
153
168
|
const words = data.mnemonic.split(' ');
|
|
@@ -157,4 +172,228 @@ export function registerWalletCommands(program) {
|
|
|
157
172
|
console.log();
|
|
158
173
|
});
|
|
159
174
|
}
|
|
175
|
+
export class NonInteractiveTerminalError extends Error {
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Refuse to reveal the seed phrase unless the command is attached to a real
|
|
179
|
+
* interactive terminal. This blocks piping, redirection, `echo ... | paytaca`,
|
|
180
|
+
* command substitution, and non-interactive agent execution. Throws (rather
|
|
181
|
+
* than exiting) so callers and tests can handle the refusal.
|
|
182
|
+
*/
|
|
183
|
+
export function assertInteractiveTerminal(stdinIsTTY, stdoutIsTTY) {
|
|
184
|
+
if (!stdinIsTTY || !stdoutIsTTY) {
|
|
185
|
+
throw new NonInteractiveTerminalError('Refusing to export seed phrase: this command must be run directly in an interactive terminal.\n' +
|
|
186
|
+
'It cannot be piped, redirected, or executed by a non-interactive process.');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Require a live human presence before revealing the seed phrase. Where the OS
|
|
191
|
+
* exposes biometric authentication (macOS Touch ID, Linux fprintd, Windows
|
|
192
|
+
* Hello), that prompt is used and cannot be driven or dismissed by an automated
|
|
193
|
+
* caller. Where biometrics are unavailable, fall back to typing a random
|
|
194
|
+
* one-time code, which non-interactive callers cannot answer.
|
|
195
|
+
*/
|
|
196
|
+
async function promptHumanVerification() {
|
|
197
|
+
const biometric = verifyBiometric();
|
|
198
|
+
if (biometric === 'ok') {
|
|
199
|
+
console.log(chalk.green('\n Identity confirmed via biometric authentication.\n'));
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
if (biometric === 'denied') {
|
|
203
|
+
console.log(chalk.red('\n Biometric authentication failed or was cancelled.\n'));
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
console.log(chalk.dim(' Biometric authentication not available — falling back to code entry.\n'));
|
|
207
|
+
return promptChallenge();
|
|
208
|
+
}
|
|
209
|
+
function verifyBiometric() {
|
|
210
|
+
switch (process.platform) {
|
|
211
|
+
case 'darwin':
|
|
212
|
+
return verifyTouchId();
|
|
213
|
+
case 'linux':
|
|
214
|
+
return verifyFprintd();
|
|
215
|
+
case 'win32':
|
|
216
|
+
return verifyWindowsHello();
|
|
217
|
+
default:
|
|
218
|
+
return 'unavailable';
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Random one-time code the operator must type back. Automated callers cannot
|
|
223
|
+
* read and answer this prompt, even when a pseudo-terminal is allocated.
|
|
224
|
+
*/
|
|
225
|
+
async function promptChallenge() {
|
|
226
|
+
const challenge = generateChallenge();
|
|
227
|
+
const timeoutMs = 120_000;
|
|
228
|
+
const rl = readline.createInterface({
|
|
229
|
+
input: process.stdin,
|
|
230
|
+
output: process.stdout,
|
|
231
|
+
});
|
|
232
|
+
console.log(chalk.yellow.bold('\n Human verification required before the seed phrase is revealed.'));
|
|
233
|
+
console.log(chalk.dim(' Type the code below exactly as shown to confirm you are at the terminal.\n'));
|
|
234
|
+
console.log(chalk.cyan.bold(` ${challenge}\n`));
|
|
235
|
+
const answer = await new Promise((resolve) => {
|
|
236
|
+
const timer = setTimeout(() => {
|
|
237
|
+
rl.close();
|
|
238
|
+
resolve(null);
|
|
239
|
+
}, timeoutMs);
|
|
240
|
+
rl.question(' Code: ', (input) => {
|
|
241
|
+
clearTimeout(timer);
|
|
242
|
+
rl.close();
|
|
243
|
+
resolve(input);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
return isChallengeAnswerCorrect(challenge, answer);
|
|
247
|
+
}
|
|
248
|
+
export function generateChallenge() {
|
|
249
|
+
const alphabet = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
|
|
250
|
+
const group = () => Array.from({ length: 4 }, () => alphabet[randomInt(alphabet.length)]).join('');
|
|
251
|
+
return `${group()}-${group()}`;
|
|
252
|
+
}
|
|
253
|
+
const BIO_OK = 'PAYTACA_BIO_OK';
|
|
254
|
+
const BIO_FAIL = 'PAYTACA_BIO_FAIL';
|
|
255
|
+
const BIO_UNAVAILABLE = 'PAYTACA_BIO_UNAVAILABLE';
|
|
256
|
+
export function isChallengeAnswerCorrect(challenge, answer) {
|
|
257
|
+
return answer !== null && answer.trim().toUpperCase() === challenge;
|
|
258
|
+
}
|
|
259
|
+
export function classifyBiometricOutput(output) {
|
|
260
|
+
if (output.includes(BIO_UNAVAILABLE))
|
|
261
|
+
return 'unavailable';
|
|
262
|
+
if (output.includes(BIO_FAIL))
|
|
263
|
+
return 'denied';
|
|
264
|
+
if (output.includes(BIO_OK))
|
|
265
|
+
return 'ok';
|
|
266
|
+
return 'error';
|
|
267
|
+
}
|
|
268
|
+
function commandExists(command) {
|
|
269
|
+
const res = spawnSync('sh', ['-c', `command -v ${command}`], { stdio: 'ignore' });
|
|
270
|
+
return res.status === 0;
|
|
271
|
+
}
|
|
272
|
+
// ── macOS: Touch ID via LocalAuthentication ────────────────────────────
|
|
273
|
+
/**
|
|
274
|
+
* JXA script executed by the system `osascript`: bridges to the macOS
|
|
275
|
+
* LocalAuthentication framework and blocks on the native Touch ID prompt.
|
|
276
|
+
* JXA `console.log` writes to stderr (captured below).
|
|
277
|
+
*/
|
|
278
|
+
const TOUCH_ID_JXA = `
|
|
279
|
+
ObjC.import('LocalAuthentication')
|
|
280
|
+
ObjC.import('Foundation')
|
|
281
|
+
|
|
282
|
+
const policy = $.LAPolicyDeviceOwnerAuthenticationWithBiometrics
|
|
283
|
+
const ctx = $.LAContext.alloc.init
|
|
284
|
+
const err = $()
|
|
285
|
+
|
|
286
|
+
if (!ctx.canEvaluatePolicyError(policy, err)) {
|
|
287
|
+
console.log('${BIO_UNAVAILABLE}')
|
|
288
|
+
} else {
|
|
289
|
+
let done = false
|
|
290
|
+
let ok = false
|
|
291
|
+
ctx.evaluatePolicyLocalizedReasonReply(
|
|
292
|
+
policy,
|
|
293
|
+
$('Confirm it is you to reveal your Paytaca seed phrase'),
|
|
294
|
+
(success) => {
|
|
295
|
+
ok = Boolean(success)
|
|
296
|
+
done = true
|
|
297
|
+
}
|
|
298
|
+
)
|
|
299
|
+
const deadline = Date.now() + 120000
|
|
300
|
+
while (!done && Date.now() < deadline) {
|
|
301
|
+
$.NSRunLoop.currentRunLoop.runModeBeforeDate(
|
|
302
|
+
$.NSDefaultRunLoopMode,
|
|
303
|
+
$.NSDate.dateWithTimeIntervalSinceNow(0.25)
|
|
304
|
+
)
|
|
305
|
+
}
|
|
306
|
+
console.log(done && ok ? '${BIO_OK}' : '${BIO_FAIL}')
|
|
307
|
+
}
|
|
308
|
+
`;
|
|
309
|
+
function verifyTouchId() {
|
|
310
|
+
const res = spawnSync('osascript', ['-l', 'JavaScript', '-e', TOUCH_ID_JXA], {
|
|
311
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
312
|
+
encoding: 'utf8',
|
|
313
|
+
timeout: 130_000,
|
|
314
|
+
});
|
|
315
|
+
return classifyBiometricOutput(`${res.stderr ?? ''}${res.stdout ?? ''}`);
|
|
316
|
+
}
|
|
317
|
+
// ── Linux: fingerprint verification via fprintd ────────────────────────
|
|
318
|
+
/**
|
|
319
|
+
* `fprintd-verify` reads the physical fingerprint reader over D-Bus and exits
|
|
320
|
+
* 0 only on a match, so an automated caller cannot satisfy it. Enrollment is
|
|
321
|
+
* confirmed first via `fprintd-list` so un-enrolled users fall back to the code
|
|
322
|
+
* challenge rather than being locked out.
|
|
323
|
+
*/
|
|
324
|
+
function verifyFprintd() {
|
|
325
|
+
if (!commandExists('fprintd-verify'))
|
|
326
|
+
return 'unavailable';
|
|
327
|
+
if (!commandExists('fprintd-list'))
|
|
328
|
+
return 'unavailable';
|
|
329
|
+
let user;
|
|
330
|
+
try {
|
|
331
|
+
user = os.userInfo().username;
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
return 'unavailable';
|
|
335
|
+
}
|
|
336
|
+
const enrolled = spawnSync('fprintd-list', [user], {
|
|
337
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
338
|
+
encoding: 'utf8',
|
|
339
|
+
timeout: 15_000,
|
|
340
|
+
});
|
|
341
|
+
if (enrolled.error)
|
|
342
|
+
return 'unavailable';
|
|
343
|
+
const listed = enrolled.stdout ?? '';
|
|
344
|
+
if (!listed.trim() || /no fingerprints enrolled/i.test(listed))
|
|
345
|
+
return 'unavailable';
|
|
346
|
+
const verify = spawnSync('fprintd-verify', [user], {
|
|
347
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
348
|
+
encoding: 'utf8',
|
|
349
|
+
timeout: 60_000,
|
|
350
|
+
});
|
|
351
|
+
if (verify.status === 0)
|
|
352
|
+
return 'ok';
|
|
353
|
+
return 'denied';
|
|
354
|
+
}
|
|
355
|
+
// ── Windows: Windows Hello via UserConsentVerifier ─────────────────────
|
|
356
|
+
/**
|
|
357
|
+
* Calls the WinRT UserConsentVerifier through Windows PowerShell, which shows
|
|
358
|
+
* the native Windows Hello prompt (face / fingerprint / PIN). The async WinRT
|
|
359
|
+
* operation is awaited via System.Runtime.WindowsRuntime.
|
|
360
|
+
*/
|
|
361
|
+
const WINDOWS_HELLO_PS = `
|
|
362
|
+
$ErrorActionPreference = 'Stop'
|
|
363
|
+
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
364
|
+
try {
|
|
365
|
+
Add-Type -AssemblyName System.Runtime.WindowsRuntime | Out-Null
|
|
366
|
+
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object {
|
|
367
|
+
$_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation\`1'
|
|
368
|
+
})[0]
|
|
369
|
+
function Await($op, $type) {
|
|
370
|
+
$m = $asTaskGeneric.MakeGenericMethod($type)
|
|
371
|
+
$t = $m.Invoke($null, @($op))
|
|
372
|
+
$t.Wait(-1) | Out-Null
|
|
373
|
+
$t.Result
|
|
374
|
+
}
|
|
375
|
+
$Ucv = [Windows.Security.Credentials.UI.UserConsentVerifier, Windows.Security.Credentials.UI, ContentType = WindowsRuntime]
|
|
376
|
+
$avail = Await ($Ucv::CheckAvailabilityAsync()) ([Windows.Security.Credentials.UI.UserConsentVerifierAvailability])
|
|
377
|
+
if ($avail -ne [Windows.Security.Credentials.UI.UserConsentVerifierAvailability]::Available) {
|
|
378
|
+
Write-Output '${BIO_UNAVAILABLE}'
|
|
379
|
+
} else {
|
|
380
|
+
$res = Await ($Ucv::RequestVerificationAsync('Confirm it is you to reveal your Paytaca seed phrase')) ([Windows.Security.Credentials.UI.UserConsentVerificationResult])
|
|
381
|
+
if ($res -eq [Windows.Security.Credentials.UI.UserConsentVerificationResult]::Verified) {
|
|
382
|
+
Write-Output '${BIO_OK}'
|
|
383
|
+
} else {
|
|
384
|
+
Write-Output '${BIO_FAIL}'
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
} catch {
|
|
388
|
+
Write-Output '${BIO_UNAVAILABLE}'
|
|
389
|
+
}
|
|
390
|
+
`;
|
|
391
|
+
function verifyWindowsHello() {
|
|
392
|
+
const res = spawnSync('powershell.exe', ['-NoProfile', '-Command', WINDOWS_HELLO_PS], {
|
|
393
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
394
|
+
encoding: 'utf8',
|
|
395
|
+
timeout: 130_000,
|
|
396
|
+
});
|
|
397
|
+
return classifyBiometricOutput(`${res.stdout ?? ''}${res.stderr ?? ''}`);
|
|
398
|
+
}
|
|
160
399
|
//# sourceMappingURL=wallet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.test.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { assertInteractiveTerminal, NonInteractiveTerminalError, classifyBiometricOutput, generateChallenge, isChallengeAnswerCorrect, } from './wallet.js';
|
|
3
|
+
describe('assertInteractiveTerminal', () => {
|
|
4
|
+
it('allows execution when both stdin and stdout are TTYs', () => {
|
|
5
|
+
expect(() => assertInteractiveTerminal(true, true)).not.toThrow();
|
|
6
|
+
});
|
|
7
|
+
it('refuses when stdin is not a TTY', () => {
|
|
8
|
+
expect(() => assertInteractiveTerminal(undefined, true)).toThrow(NonInteractiveTerminalError);
|
|
9
|
+
});
|
|
10
|
+
it('refuses when stdout is not a TTY', () => {
|
|
11
|
+
expect(() => assertInteractiveTerminal(true, undefined)).toThrow(NonInteractiveTerminalError);
|
|
12
|
+
});
|
|
13
|
+
it('refuses when neither stream is a TTY', () => {
|
|
14
|
+
expect(() => assertInteractiveTerminal(false, false)).toThrow(NonInteractiveTerminalError);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
describe('classifyBiometricOutput', () => {
|
|
18
|
+
it('maps the unavailable token', () => {
|
|
19
|
+
expect(classifyBiometricOutput('PAYTACA_BIO_UNAVAILABLE')).toBe('unavailable');
|
|
20
|
+
});
|
|
21
|
+
it('maps the success token', () => {
|
|
22
|
+
expect(classifyBiometricOutput('PAYTACA_BIO_OK')).toBe('ok');
|
|
23
|
+
});
|
|
24
|
+
it('maps the failure token', () => {
|
|
25
|
+
expect(classifyBiometricOutput('PAYTACA_BIO_FAIL')).toBe('denied');
|
|
26
|
+
});
|
|
27
|
+
it('treats unrecognized output as an error', () => {
|
|
28
|
+
expect(classifyBiometricOutput('')).toBe('error');
|
|
29
|
+
expect(classifyBiometricOutput('some unrelated output')).toBe('error');
|
|
30
|
+
});
|
|
31
|
+
it('lets a failure token win if both fail and ok appear', () => {
|
|
32
|
+
expect(classifyBiometricOutput('PAYTACA_BIO_FAIL\nPAYTACA_BIO_OK')).toBe('denied');
|
|
33
|
+
});
|
|
34
|
+
it('does not confuse the unavailable token with success', () => {
|
|
35
|
+
expect(classifyBiometricOutput('PAYTACA_BIO_UNAVAILABLE')).not.toBe('ok');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('generateChallenge', () => {
|
|
39
|
+
it('produces two 4-character groups from an unambiguous alphabet', () => {
|
|
40
|
+
for (let i = 0; i < 50; i++) {
|
|
41
|
+
const challenge = generateChallenge();
|
|
42
|
+
expect(challenge).toMatch(/^[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}$/);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
it('generates different codes across calls', () => {
|
|
46
|
+
const codes = new Set(Array.from({ length: 50 }, () => generateChallenge()));
|
|
47
|
+
expect(codes.size).toBeGreaterThan(1);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('isChallengeAnswerCorrect', () => {
|
|
51
|
+
const challenge = 'ABCD-2345';
|
|
52
|
+
it('accepts an exact match', () => {
|
|
53
|
+
expect(isChallengeAnswerCorrect(challenge, challenge)).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
it('is case-insensitive and trims surrounding whitespace', () => {
|
|
56
|
+
expect(isChallengeAnswerCorrect(challenge, ' abcd-2345 ')).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
it('rejects a wrong answer', () => {
|
|
59
|
+
expect(isChallengeAnswerCorrect(challenge, 'WXYZ-9876')).toBe(false);
|
|
60
|
+
});
|
|
61
|
+
it('rejects a missing answer (timeout)', () => {
|
|
62
|
+
expect(isChallengeAnswerCorrect(challenge, null)).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
it('rejects an empty answer', () => {
|
|
65
|
+
expect(isChallengeAnswerCorrect(challenge, '')).toBe(false);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=wallet.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.test.js","sourceRoot":"","sources":["../../src/commands/wallet.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paytaca-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Command-line interface for the Paytaca Bitcoin Cash wallet",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"js-sha256": "^0.9.0",
|
|
50
50
|
"nostr-tools": "^2.23.3",
|
|
51
51
|
"qrcode-terminal": "^0.12.0",
|
|
52
|
-
"watchtower-cash-js": "^0.2
|
|
52
|
+
"watchtower-cash-js": "^0.3.2"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@types/node": "^22.0.0",
|
|
@@ -18,7 +18,13 @@ paytaca balance
|
|
|
18
18
|
# Balance in satoshis
|
|
19
19
|
paytaca balance --sats
|
|
20
20
|
|
|
21
|
-
#
|
|
21
|
+
# CashToken balances only (positive balances)
|
|
22
|
+
paytaca balance --tokens
|
|
23
|
+
|
|
24
|
+
# BCH and CashToken balances
|
|
25
|
+
paytaca balance --all
|
|
26
|
+
|
|
27
|
+
# Balance for a specific token
|
|
22
28
|
paytaca balance --token <category>
|
|
23
29
|
|
|
24
30
|
# Testnet (chipnet)
|
|
@@ -67,6 +73,8 @@ paytaca receive --amount 0.5
|
|
|
67
73
|
paytaca receive --token <category> --amount 100
|
|
68
74
|
```
|
|
69
75
|
|
|
76
|
+
The displayed address (and its token-aware variant) is auto-subscribed with Watchtower, so incoming BCH and CashTokens are monitored even at indices beyond the initial wallet scan.
|
|
77
|
+
|
|
70
78
|
### Derive Addresses
|
|
71
79
|
|
|
72
80
|
```bash
|
|
@@ -144,6 +152,7 @@ paytaca receive
|
|
|
144
152
|
|
|
145
153
|
### Check token holdings
|
|
146
154
|
```bash
|
|
155
|
+
paytaca balance --tokens
|
|
147
156
|
paytaca token list
|
|
148
157
|
paytaca token info <category>
|
|
149
158
|
```
|