paytaca-cli 0.1.0 → 0.2.0
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 +28 -10
- package/dist/commands/address.d.ts +2 -0
- package/dist/commands/address.d.ts.map +1 -1
- package/dist/commands/address.js +19 -4
- package/dist/commands/address.js.map +1 -1
- package/dist/commands/balance.d.ts +2 -0
- package/dist/commands/balance.d.ts.map +1 -1
- package/dist/commands/balance.js +58 -12
- package/dist/commands/balance.js.map +1 -1
- package/dist/commands/history.d.ts +2 -0
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +40 -7
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/receive.d.ts +9 -1
- package/dist/commands/receive.d.ts.map +1 -1
- package/dist/commands/receive.js +117 -8
- package/dist/commands/receive.js.map +1 -1
- package/dist/commands/token.d.ts +16 -0
- package/dist/commands/token.d.ts.map +1 -0
- package/dist/commands/token.js +351 -0
- package/dist/commands/token.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/wallet/bch.d.ts +110 -3
- package/dist/wallet/bch.d.ts.map +1 -1
- package/dist/wallet/bch.js +214 -2
- package/dist/wallet/bch.js.map +1 -1
- package/dist/wallet/keys.d.ts +8 -0
- package/dist/wallet/keys.d.ts.map +1 -1
- package/dist/wallet/keys.js +10 -0
- package/dist/wallet/keys.js.map +1 -1
- package/package.json +2 -1
package/dist/commands/receive.js
CHANGED
|
@@ -1,29 +1,84 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CLI command: receive
|
|
3
3
|
*
|
|
4
|
-
* Displays a receiving address and its QR code for accepting BCH payments.
|
|
4
|
+
* Displays a receiving address and its QR code for accepting BCH or CashToken payments.
|
|
5
5
|
* The QR code encodes the address in CashAddr format, rendered directly
|
|
6
6
|
* in the terminal using Unicode block characters.
|
|
7
|
+
*
|
|
8
|
+
* Use --token to display a token-aware (z-prefix) address for receiving CashTokens.
|
|
9
|
+
* Optionally pass a category ID to generate a PayPro payment URI:
|
|
10
|
+
* --token <category> → bitcoincash:<z-address>?c=<category>
|
|
11
|
+
*
|
|
12
|
+
* Use --amount to embed a requested amount into the URI:
|
|
13
|
+
* BCH: bitcoincash:<address>?amount=<bch> (BIP21)
|
|
14
|
+
* Token: bitcoincash:<z-address>?c=<cat>&f=<base_units> (PayPro)
|
|
7
15
|
*/
|
|
8
16
|
import chalk from 'chalk';
|
|
9
17
|
import qrcode from 'qrcode-terminal';
|
|
10
18
|
import { loadWallet, loadMnemonic } from '../wallet/index.js';
|
|
19
|
+
/**
|
|
20
|
+
* Build a BIP21 payment URI for BCH.
|
|
21
|
+
* Format: bitcoincash:<address>?amount=<bch_amount>
|
|
22
|
+
*/
|
|
23
|
+
function buildBchPaymentUri(address, amount) {
|
|
24
|
+
const bare = address.replace(/^(bitcoincash|bchtest):/, '');
|
|
25
|
+
let uri = `bitcoincash:${bare}`;
|
|
26
|
+
if (amount !== undefined && amount > 0) {
|
|
27
|
+
uri += `?amount=${amount}`;
|
|
28
|
+
}
|
|
29
|
+
return uri;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build a PayPro payment URI for CashToken receiving.
|
|
33
|
+
*
|
|
34
|
+
* Format: bitcoincash:<z-address>?c=<category>[&f=<base_unit_amount>]
|
|
35
|
+
* This follows the convention used by paytaca-app (see receive.vue addressAmountFormat).
|
|
36
|
+
*
|
|
37
|
+
* The `f` parameter is the token amount in base units (scaled by 10^decimals).
|
|
38
|
+
*/
|
|
39
|
+
function buildTokenPaymentUri(address, category, baseUnitAmount) {
|
|
40
|
+
const bare = address.replace(/^(bitcoincash|bchtest):/, '');
|
|
41
|
+
let uri = `bitcoincash:${bare}?c=${category}`;
|
|
42
|
+
if (baseUnitAmount !== undefined && baseUnitAmount > 0) {
|
|
43
|
+
uri += `&f=${Math.round(baseUnitAmount)}`;
|
|
44
|
+
}
|
|
45
|
+
return uri;
|
|
46
|
+
}
|
|
11
47
|
export function registerReceiveCommand(program) {
|
|
12
48
|
program
|
|
13
49
|
.command('receive')
|
|
14
50
|
.description('Display receiving address and QR code')
|
|
15
|
-
.
|
|
51
|
+
.option('--index <n>', 'Address index (default: 0)', '0')
|
|
16
52
|
.option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
|
|
53
|
+
.option('--token [category]', 'Show token-aware (z-prefix) address; optionally specify a category ID for a PayPro URI')
|
|
54
|
+
.option('--amount <amount>', 'Request a specific amount (BCH for plain, token units when --token <category> is set)')
|
|
17
55
|
.option('--no-qr', 'Hide QR code, show address only')
|
|
18
|
-
.action((
|
|
56
|
+
.action(async (opts) => {
|
|
19
57
|
const isChipnet = Boolean(opts.chipnet);
|
|
20
58
|
const showQr = opts.qr !== false;
|
|
21
|
-
const
|
|
59
|
+
const tokenOpt = opts.token;
|
|
60
|
+
const isToken = Boolean(tokenOpt);
|
|
61
|
+
const category = typeof tokenOpt === 'string' ? tokenOpt : '';
|
|
62
|
+
const index = parseInt(opts.index, 10);
|
|
22
63
|
const network = isChipnet ? 'chipnet' : 'mainnet';
|
|
64
|
+
const rawAmount = opts.amount ? parseFloat(opts.amount) : undefined;
|
|
23
65
|
if (isNaN(index) || index < 0) {
|
|
24
66
|
console.log(chalk.red('\nError: Index must be a non-negative integer.\n'));
|
|
25
67
|
process.exit(1);
|
|
26
68
|
}
|
|
69
|
+
if (rawAmount !== undefined && (isNaN(rawAmount) || rawAmount <= 0)) {
|
|
70
|
+
console.log(chalk.red('\nError: Amount must be a positive number.\n'));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
if (category && !/^[a-fA-F0-9]{64}$/.test(category)) {
|
|
74
|
+
console.log(chalk.red('\nError: Token category must be a 64-character hex string.\n'));
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
if (rawAmount !== undefined && isToken && !category) {
|
|
78
|
+
console.log(chalk.red('\nError: --amount with --token requires a category ID.\n'));
|
|
79
|
+
console.log(chalk.dim(' Usage: paytaca receive --token <category> --amount <amount>\n'));
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
27
82
|
// ── Validate wallet ──────────────────────────────────────────────
|
|
28
83
|
const data = loadMnemonic();
|
|
29
84
|
if (!data) {
|
|
@@ -32,14 +87,68 @@ export function registerReceiveCommand(program) {
|
|
|
32
87
|
}
|
|
33
88
|
const w = loadWallet();
|
|
34
89
|
const bchWallet = w.forNetwork(isChipnet);
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
90
|
+
const address = isToken
|
|
91
|
+
? bchWallet.getTokenAddressSetAt(index).receiving
|
|
92
|
+
: bchWallet.getAddressSetAt(index).receiving;
|
|
93
|
+
// ── Resolve token metadata (if category specified) ─────────────
|
|
94
|
+
let tokenInfo = null;
|
|
95
|
+
let tokenName = '';
|
|
96
|
+
if (category) {
|
|
97
|
+
try {
|
|
98
|
+
tokenInfo = await bchWallet.getTokenInfo(category);
|
|
99
|
+
if (tokenInfo?.symbol) {
|
|
100
|
+
tokenName = tokenInfo.symbol;
|
|
101
|
+
}
|
|
102
|
+
else if (tokenInfo?.name && tokenInfo.name !== 'Unknown Token') {
|
|
103
|
+
tokenName = tokenInfo.name;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Token info unavailable — proceed without metadata
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ── Build payment URI ────────────────────────────────────────────
|
|
111
|
+
let paymentUri = '';
|
|
112
|
+
if (category) {
|
|
113
|
+
// PayPro: token amount scaled to base units via decimals
|
|
114
|
+
const decimals = tokenInfo?.decimals ?? 0;
|
|
115
|
+
const baseUnitAmount = rawAmount !== undefined
|
|
116
|
+
? rawAmount * 10 ** decimals
|
|
117
|
+
: undefined;
|
|
118
|
+
paymentUri = buildTokenPaymentUri(address, category, baseUnitAmount);
|
|
119
|
+
}
|
|
120
|
+
else if (rawAmount !== undefined) {
|
|
121
|
+
// BIP21: plain BCH amount
|
|
122
|
+
paymentUri = buildBchPaymentUri(address, rawAmount);
|
|
123
|
+
}
|
|
124
|
+
const qrContent = paymentUri || address;
|
|
125
|
+
// ── Output ───────────────────────────────────────────────────────
|
|
126
|
+
const label = category
|
|
127
|
+
? `Receive ${tokenName || 'CashTokens'}`
|
|
128
|
+
: isToken
|
|
129
|
+
? 'Receive CashTokens'
|
|
130
|
+
: 'Receive BCH';
|
|
131
|
+
console.log(chalk.bold(`\n ${label} (${network})\n`));
|
|
38
132
|
console.log(` Address: ${address}`);
|
|
39
133
|
console.log(chalk.dim(` Index: ${index}`));
|
|
134
|
+
if (isToken) {
|
|
135
|
+
console.log(chalk.dim(' Type: token-aware (z-prefix)'));
|
|
136
|
+
}
|
|
137
|
+
if (category) {
|
|
138
|
+
console.log(chalk.dim(` Category: ${category}`));
|
|
139
|
+
}
|
|
140
|
+
if (rawAmount !== undefined) {
|
|
141
|
+
const unit = category
|
|
142
|
+
? (tokenName || 'tokens')
|
|
143
|
+
: 'BCH';
|
|
144
|
+
console.log(` Amount: ${rawAmount} ${unit}`);
|
|
145
|
+
}
|
|
146
|
+
if (paymentUri) {
|
|
147
|
+
console.log(` URI: ${paymentUri}`);
|
|
148
|
+
}
|
|
40
149
|
if (showQr) {
|
|
41
150
|
console.log();
|
|
42
|
-
qrcode.generate(
|
|
151
|
+
qrcode.generate(qrContent, { small: true }, (qr) => {
|
|
43
152
|
// Indent QR code for alignment with the rest of the output
|
|
44
153
|
const indented = qr
|
|
45
154
|
.split('\n')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receive.js","sourceRoot":"","sources":["../../src/commands/receive.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"receive.js","sourceRoot":"","sources":["../../src/commands/receive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI commands: token list | info | send | send-nft
|
|
3
|
+
*
|
|
4
|
+
* CashTokens support for the Paytaca CLI.
|
|
5
|
+
*
|
|
6
|
+
* CashTokens are the native token protocol on Bitcoin Cash, supporting
|
|
7
|
+
* both fungible tokens (FTs) and non-fungible tokens (NFTs) at the
|
|
8
|
+
* consensus layer. Tokens are received at token-aware addresses
|
|
9
|
+
* (z-prefix CashAddr format).
|
|
10
|
+
*
|
|
11
|
+
* Token sends are delegated to watchtower-cash-js BCH.send() with
|
|
12
|
+
* the `token` parameter — identical to how paytaca-app handles it.
|
|
13
|
+
*/
|
|
14
|
+
import { Command } from 'commander';
|
|
15
|
+
export declare function registerTokenCommands(program: Command): void;
|
|
16
|
+
//# sourceMappingURL=token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqBnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8Y5D"}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI commands: token list | info | send | send-nft
|
|
3
|
+
*
|
|
4
|
+
* CashTokens support for the Paytaca CLI.
|
|
5
|
+
*
|
|
6
|
+
* CashTokens are the native token protocol on Bitcoin Cash, supporting
|
|
7
|
+
* both fungible tokens (FTs) and non-fungible tokens (NFTs) at the
|
|
8
|
+
* consensus layer. Tokens are received at token-aware addresses
|
|
9
|
+
* (z-prefix CashAddr format).
|
|
10
|
+
*
|
|
11
|
+
* Token sends are delegated to watchtower-cash-js BCH.send() with
|
|
12
|
+
* the `token` parameter — identical to how paytaca-app handles it.
|
|
13
|
+
*/
|
|
14
|
+
import chalk from 'chalk';
|
|
15
|
+
import { Address } from 'watchtower-cash-js';
|
|
16
|
+
import { loadWallet, loadMnemonic } from '../wallet/index.js';
|
|
17
|
+
/** Truncate a hex string for display */
|
|
18
|
+
function shortHex(hex, len = 8) {
|
|
19
|
+
if (hex.length <= len * 2 + 3)
|
|
20
|
+
return hex;
|
|
21
|
+
return hex.slice(0, len) + '...' + hex.slice(-len);
|
|
22
|
+
}
|
|
23
|
+
/** Format a token amount with decimals */
|
|
24
|
+
function formatTokenAmount(rawAmount, decimals) {
|
|
25
|
+
if (decimals === 0)
|
|
26
|
+
return rawAmount.toLocaleString('en-US');
|
|
27
|
+
const scaled = rawAmount / Math.pow(10, decimals);
|
|
28
|
+
return scaled.toLocaleString('en-US', {
|
|
29
|
+
minimumFractionDigits: 0,
|
|
30
|
+
maximumFractionDigits: decimals,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export function registerTokenCommands(program) {
|
|
34
|
+
const token = program
|
|
35
|
+
.command('token')
|
|
36
|
+
.description('CashToken operations (fungible tokens and NFTs)');
|
|
37
|
+
// ── token list ─────────────────────────────────────────────────────
|
|
38
|
+
token
|
|
39
|
+
.command('list')
|
|
40
|
+
.description('List fungible CashTokens in the wallet')
|
|
41
|
+
.option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
|
|
42
|
+
.action(async (opts) => {
|
|
43
|
+
const isChipnet = Boolean(opts.chipnet);
|
|
44
|
+
const network = isChipnet ? 'chipnet' : 'mainnet';
|
|
45
|
+
const data = loadMnemonic();
|
|
46
|
+
if (!data) {
|
|
47
|
+
console.log(chalk.red('\nNo wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.\n'));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const w = loadWallet();
|
|
51
|
+
const bchWallet = w.forNetwork(isChipnet);
|
|
52
|
+
console.log(chalk.bold(`\n CashTokens (${network})\n`));
|
|
53
|
+
try {
|
|
54
|
+
const tokens = await bchWallet.getFungibleTokens();
|
|
55
|
+
if (tokens.length === 0) {
|
|
56
|
+
console.log(chalk.dim(' No tokens found.\n'));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const t of tokens) {
|
|
60
|
+
const amount = formatTokenAmount(t.balance, t.decimals);
|
|
61
|
+
const symbol = t.symbol ? ` ${t.symbol}` : '';
|
|
62
|
+
const name = t.name !== 'Unknown Token' ? t.name : '';
|
|
63
|
+
console.log(` ${chalk.bold(amount + symbol)}`);
|
|
64
|
+
if (name) {
|
|
65
|
+
console.log(chalk.dim(` ${name}`));
|
|
66
|
+
}
|
|
67
|
+
console.log(chalk.dim(` ${t.category}`));
|
|
68
|
+
console.log();
|
|
69
|
+
}
|
|
70
|
+
console.log(chalk.dim(` ${tokens.length} token${tokens.length !== 1 ? 's' : ''} total`));
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
const status = err?.response?.status;
|
|
74
|
+
if (status === 404) {
|
|
75
|
+
console.log(chalk.yellow(' Wallet not yet registered with Watchtower on this network.'));
|
|
76
|
+
console.log(chalk.dim(' Run `paytaca wallet create` or `paytaca wallet import` to register.'));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(chalk.red(` Error fetching tokens: ${err.message || err}`));
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
console.log();
|
|
84
|
+
});
|
|
85
|
+
// ── token info ─────────────────────────────────────────────────────
|
|
86
|
+
token
|
|
87
|
+
.command('info')
|
|
88
|
+
.description('Show details for a specific CashToken')
|
|
89
|
+
.argument('<category>', 'Token category ID (64-character hex)')
|
|
90
|
+
.option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
|
|
91
|
+
.action(async (category, opts) => {
|
|
92
|
+
const isChipnet = Boolean(opts.chipnet);
|
|
93
|
+
const network = isChipnet ? 'chipnet' : 'mainnet';
|
|
94
|
+
// Validate category format
|
|
95
|
+
if (!/^[a-fA-F0-9]{64}$/.test(category)) {
|
|
96
|
+
console.log(chalk.red('\nError: Category must be a 64-character hex string.\n'));
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
const data = loadMnemonic();
|
|
100
|
+
if (!data) {
|
|
101
|
+
console.log(chalk.red('\nNo wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.\n'));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
const w = loadWallet();
|
|
105
|
+
const bchWallet = w.forNetwork(isChipnet);
|
|
106
|
+
console.log(chalk.bold(`\n Token Info (${network})\n`));
|
|
107
|
+
try {
|
|
108
|
+
const tokenInfo = await bchWallet.getTokenInfo(category);
|
|
109
|
+
if (!tokenInfo) {
|
|
110
|
+
console.log(chalk.yellow(' Token not found.\n'));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
console.log(` Name: ${tokenInfo.name}`);
|
|
114
|
+
if (tokenInfo.symbol) {
|
|
115
|
+
console.log(` Symbol: ${tokenInfo.symbol}`);
|
|
116
|
+
}
|
|
117
|
+
console.log(` Decimals: ${tokenInfo.decimals}`);
|
|
118
|
+
console.log(` Category: ${tokenInfo.category}`);
|
|
119
|
+
// Fetch wallet-specific balance
|
|
120
|
+
try {
|
|
121
|
+
const balResult = await bchWallet.getTokenBalance(category);
|
|
122
|
+
const amount = formatTokenAmount(balResult.balance, tokenInfo.decimals);
|
|
123
|
+
const symbol = tokenInfo.symbol ? ` ${tokenInfo.symbol}` : '';
|
|
124
|
+
console.log(` Balance: ${amount}${symbol}`);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Balance may not be available if wallet doesn't hold this token
|
|
128
|
+
console.log(chalk.dim(' Balance: 0'));
|
|
129
|
+
}
|
|
130
|
+
// Show NFTs for this category
|
|
131
|
+
try {
|
|
132
|
+
const nfts = await bchWallet.getNftUtxos(category);
|
|
133
|
+
if (nfts.length > 0) {
|
|
134
|
+
console.log(`\n ${chalk.bold('NFTs')} (${nfts.length})\n`);
|
|
135
|
+
for (const nft of nfts) {
|
|
136
|
+
const cap = nft.capability === 'none' ? '' : ` [${nft.capability}]`;
|
|
137
|
+
const commitment = nft.commitment ? shortHex(nft.commitment) : '(empty)';
|
|
138
|
+
console.log(` ${chalk.cyan(commitment)}${cap}`);
|
|
139
|
+
console.log(chalk.dim(` ${nft.txid}:${nft.vout}`));
|
|
140
|
+
console.log();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// NFT fetch may fail; non-critical
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
console.log(chalk.red(` Error: ${err.message || err}`));
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
console.log();
|
|
153
|
+
});
|
|
154
|
+
// ── token send ─────────────────────────────────────────────────────
|
|
155
|
+
token
|
|
156
|
+
.command('send')
|
|
157
|
+
.description('Send fungible CashTokens to an address')
|
|
158
|
+
.argument('<address>', 'Recipient address (token-aware z-prefix recommended)')
|
|
159
|
+
.argument('<amount>', 'Token amount to send (in base units, before decimal scaling)')
|
|
160
|
+
.requiredOption('--token <id>', 'Token category ID (64-character hex)')
|
|
161
|
+
.option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
|
|
162
|
+
.action(async (address, amountStr, opts) => {
|
|
163
|
+
const isChipnet = Boolean(opts.chipnet);
|
|
164
|
+
const category = opts.token;
|
|
165
|
+
const network = isChipnet ? 'chipnet' : 'mainnet';
|
|
166
|
+
// Validate wallet
|
|
167
|
+
const data = loadMnemonic();
|
|
168
|
+
if (!data) {
|
|
169
|
+
console.log(chalk.red('\nNo wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.\n'));
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
// Validate category
|
|
173
|
+
if (!/^[a-fA-F0-9]{64}$/.test(category)) {
|
|
174
|
+
console.log(chalk.red('\nError: Category must be a 64-character hex string.\n'));
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
// Parse amount as bigint
|
|
178
|
+
let tokenAmount;
|
|
179
|
+
try {
|
|
180
|
+
tokenAmount = BigInt(amountStr);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
console.log(chalk.red('\nError: Amount must be a valid integer.\n'));
|
|
184
|
+
process.exit(1);
|
|
185
|
+
return; // unreachable, but helps TS narrowing
|
|
186
|
+
}
|
|
187
|
+
if (tokenAmount <= 0n) {
|
|
188
|
+
console.log(chalk.red('\nError: Amount must be positive.\n'));
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
// Validate recipient address
|
|
192
|
+
const addressValidator = new Address(address);
|
|
193
|
+
if (!addressValidator.isValidBCHAddress(isChipnet) &&
|
|
194
|
+
!addressValidator.isP2SH?.() &&
|
|
195
|
+
!addressValidator.isTokenAddress?.()) {
|
|
196
|
+
console.log(chalk.red('\nError: Invalid BCH address.\n'));
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
// Warn if not a token address
|
|
200
|
+
if (!addressValidator.isTokenAddress?.()) {
|
|
201
|
+
console.log(chalk.yellow('\n Warning: Address is not a token-aware (z-prefix) address.'));
|
|
202
|
+
console.log(chalk.yellow(' Tokens should be sent to token-aware addresses to avoid loss.\n'));
|
|
203
|
+
}
|
|
204
|
+
const w = loadWallet();
|
|
205
|
+
const bchWallet = w.forNetwork(isChipnet);
|
|
206
|
+
// Token change goes to our token address
|
|
207
|
+
const tokenChangeAddress = bchWallet.getTokenAddressSetAt(0).change;
|
|
208
|
+
// Fetch token info for display
|
|
209
|
+
let tokenLabel = shortHex(category);
|
|
210
|
+
try {
|
|
211
|
+
const info = await bchWallet.getTokenInfo(category);
|
|
212
|
+
if (info?.symbol)
|
|
213
|
+
tokenLabel = info.symbol;
|
|
214
|
+
else if (info?.name && info.name !== 'Unknown Token')
|
|
215
|
+
tokenLabel = info.name;
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Non-critical; use category hex
|
|
219
|
+
}
|
|
220
|
+
console.log(`\n Sending ${chalk.bold(amountStr + ' ' + tokenLabel)} on ${chalk.cyan(network)}`);
|
|
221
|
+
console.log(chalk.dim(` Category: ${category}`));
|
|
222
|
+
console.log(chalk.dim(` To: ${address}`));
|
|
223
|
+
console.log(chalk.dim(` Change: ${tokenChangeAddress}`));
|
|
224
|
+
console.log();
|
|
225
|
+
try {
|
|
226
|
+
const result = await bchWallet.sendToken(category, tokenAmount, address, tokenChangeAddress);
|
|
227
|
+
if (result.success) {
|
|
228
|
+
console.log(chalk.green(' Transaction sent successfully!\n'));
|
|
229
|
+
if (result.txid) {
|
|
230
|
+
console.log(` txid: ${result.txid}`);
|
|
231
|
+
const explorer = isChipnet
|
|
232
|
+
? 'https://chipnet.chaingraph.cash/tx/'
|
|
233
|
+
: 'https://bchexplorer.info/tx/';
|
|
234
|
+
console.log(chalk.dim(` ${explorer}${result.txid}`));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
console.log(chalk.red(` Transaction failed: ${result.error || 'Unknown error'}`));
|
|
239
|
+
if (result.lackingSats) {
|
|
240
|
+
console.log(chalk.yellow(` Insufficient BCH for transaction fees. Short by ${result.lackingSats} satoshis.`));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
console.log(chalk.red(`\n Error: ${err.message || err}\n`));
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
console.log();
|
|
249
|
+
});
|
|
250
|
+
// ── token send-nft ─────────────────────────────────────────────────
|
|
251
|
+
token
|
|
252
|
+
.command('send-nft')
|
|
253
|
+
.description('Send a non-fungible CashToken (NFT) to an address')
|
|
254
|
+
.argument('<address>', 'Recipient address')
|
|
255
|
+
.requiredOption('--token <id>', 'Token category ID (64-character hex)')
|
|
256
|
+
.requiredOption('--commitment <hex>', 'NFT commitment (hex string, use "" for empty)')
|
|
257
|
+
.option('--capability <type>', 'NFT capability: none, minting, or mutable (default: none)', 'none')
|
|
258
|
+
.option('--txid <txid>', 'UTXO txid containing the NFT (auto-detected if omitted)')
|
|
259
|
+
.option('--vout <n>', 'UTXO output index (auto-detected if omitted)')
|
|
260
|
+
.option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
|
|
261
|
+
.action(async (address, opts) => {
|
|
262
|
+
const isChipnet = Boolean(opts.chipnet);
|
|
263
|
+
const category = opts.token;
|
|
264
|
+
const commitment = opts.commitment;
|
|
265
|
+
const capability = opts.capability || 'none';
|
|
266
|
+
const network = isChipnet ? 'chipnet' : 'mainnet';
|
|
267
|
+
// Validate wallet
|
|
268
|
+
const data = loadMnemonic();
|
|
269
|
+
if (!data) {
|
|
270
|
+
console.log(chalk.red('\nNo wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.\n'));
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
// Validate category
|
|
274
|
+
if (!/^[a-fA-F0-9]{64}$/.test(category)) {
|
|
275
|
+
console.log(chalk.red('\nError: Category must be a 64-character hex string.\n'));
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
// Validate capability
|
|
279
|
+
if (!['none', 'minting', 'mutable'].includes(capability)) {
|
|
280
|
+
console.log(chalk.red('\nError: Capability must be "none", "minting", or "mutable".\n'));
|
|
281
|
+
process.exit(1);
|
|
282
|
+
}
|
|
283
|
+
// Validate address
|
|
284
|
+
const addressValidator = new Address(address);
|
|
285
|
+
if (!addressValidator.isValidBCHAddress(isChipnet) &&
|
|
286
|
+
!addressValidator.isP2SH?.() &&
|
|
287
|
+
!addressValidator.isTokenAddress?.()) {
|
|
288
|
+
console.log(chalk.red('\nError: Invalid BCH address.\n'));
|
|
289
|
+
process.exit(1);
|
|
290
|
+
}
|
|
291
|
+
const w = loadWallet();
|
|
292
|
+
const bchWallet = w.forNetwork(isChipnet);
|
|
293
|
+
// Resolve UTXO — either from flags or auto-detect
|
|
294
|
+
let txid = opts.txid || '';
|
|
295
|
+
let vout = opts.vout !== undefined ? parseInt(opts.vout, 10) : -1;
|
|
296
|
+
if (!txid || vout < 0) {
|
|
297
|
+
// Auto-detect: find the NFT UTXO matching category + commitment + capability
|
|
298
|
+
console.log(chalk.dim('\n Searching for NFT UTXO...'));
|
|
299
|
+
try {
|
|
300
|
+
const nfts = await bchWallet.getNftUtxos(category);
|
|
301
|
+
const match = nfts.find((n) => n.commitment === commitment && n.capability === capability);
|
|
302
|
+
if (!match) {
|
|
303
|
+
console.log(chalk.red(`\n Error: No NFT found matching category ${shortHex(category)} ` +
|
|
304
|
+
`with commitment "${commitment}" and capability "${capability}".\n`));
|
|
305
|
+
console.log(chalk.dim(' Use `paytaca token info <category>` to list available NFTs.\n'));
|
|
306
|
+
process.exit(1);
|
|
307
|
+
}
|
|
308
|
+
txid = match.txid;
|
|
309
|
+
vout = match.vout;
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
console.log(chalk.red(`\n Error searching for NFTs: ${err.message || err}\n`));
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Change address for leftover BCH
|
|
317
|
+
const changeAddress = bchWallet.getTokenAddressSetAt(0).change;
|
|
318
|
+
console.log(`\n Sending NFT on ${chalk.cyan(network)}`);
|
|
319
|
+
console.log(chalk.dim(` Category: ${category}`));
|
|
320
|
+
console.log(chalk.dim(` Commitment: ${commitment || '(empty)'}`));
|
|
321
|
+
console.log(chalk.dim(` Capability: ${capability}`));
|
|
322
|
+
console.log(chalk.dim(` UTXO: ${shortHex(txid)}:${vout}`));
|
|
323
|
+
console.log(chalk.dim(` To: ${address}`));
|
|
324
|
+
console.log();
|
|
325
|
+
try {
|
|
326
|
+
const result = await bchWallet.sendNft(category, commitment, capability, txid, vout, address, changeAddress);
|
|
327
|
+
if (result.success) {
|
|
328
|
+
console.log(chalk.green(' Transaction sent successfully!\n'));
|
|
329
|
+
if (result.txid) {
|
|
330
|
+
console.log(` txid: ${result.txid}`);
|
|
331
|
+
const explorer = isChipnet
|
|
332
|
+
? 'https://chipnet.chaingraph.cash/tx/'
|
|
333
|
+
: 'https://bchexplorer.info/tx/';
|
|
334
|
+
console.log(chalk.dim(` ${explorer}${result.txid}`));
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
console.log(chalk.red(` Transaction failed: ${result.error || 'Unknown error'}`));
|
|
339
|
+
if (result.lackingSats) {
|
|
340
|
+
console.log(chalk.yellow(` Insufficient BCH for transaction fees. Short by ${result.lackingSats} satoshis.`));
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
console.log(chalk.red(`\n Error: ${err.message || err}\n`));
|
|
346
|
+
process.exit(1);
|
|
347
|
+
}
|
|
348
|
+
console.log();
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Paytaca CLI — Entry point
|
|
3
3
|
*
|
|
4
4
|
* A command-line interface for the Paytaca Bitcoin Cash wallet.
|
|
5
|
-
* Provides wallet management, address derivation,
|
|
6
|
-
* with the same core logic as the Paytaca mobile app.
|
|
5
|
+
* Provides wallet management, address derivation, BCH sending,
|
|
6
|
+
* and CashTokens support with the same core logic as the Paytaca mobile app.
|
|
7
7
|
*/
|
|
8
8
|
export {};
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Paytaca CLI — Entry point
|
|
3
3
|
*
|
|
4
4
|
* A command-line interface for the Paytaca Bitcoin Cash wallet.
|
|
5
|
-
* Provides wallet management, address derivation,
|
|
6
|
-
* with the same core logic as the Paytaca mobile app.
|
|
5
|
+
* Provides wallet management, address derivation, BCH sending,
|
|
6
|
+
* and CashTokens support with the same core logic as the Paytaca mobile app.
|
|
7
7
|
*/
|
|
8
8
|
import { Command } from 'commander';
|
|
9
9
|
import { registerWalletCommands } from './commands/wallet.js';
|
|
@@ -12,16 +12,18 @@ import { registerSendCommand } from './commands/send.js';
|
|
|
12
12
|
import { registerBalanceCommand } from './commands/balance.js';
|
|
13
13
|
import { registerReceiveCommand } from './commands/receive.js';
|
|
14
14
|
import { registerHistoryCommand } from './commands/history.js';
|
|
15
|
+
import { registerTokenCommands } from './commands/token.js';
|
|
15
16
|
const program = new Command();
|
|
16
17
|
program
|
|
17
18
|
.name('paytaca')
|
|
18
19
|
.description('Paytaca — Bitcoin Cash wallet CLI')
|
|
19
|
-
.version('0.
|
|
20
|
+
.version('0.2.0');
|
|
20
21
|
registerWalletCommands(program);
|
|
21
22
|
registerAddressCommands(program);
|
|
22
23
|
registerSendCommand(program);
|
|
23
24
|
registerBalanceCommand(program);
|
|
24
25
|
registerReceiveCommand(program);
|
|
25
26
|
registerHistoryCommand(program);
|
|
27
|
+
registerTokenCommands(program);
|
|
26
28
|
program.parse();
|
|
27
29
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAE3D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAE9B,OAAO,CAAC,KAAK,EAAE,CAAA"}
|