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.
@@ -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
- .argument('[index]', 'Address index (default: 0)', '0')
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((_index, opts) => {
56
+ .action(async (opts) => {
19
57
  const isChipnet = Boolean(opts.chipnet);
20
58
  const showQr = opts.qr !== false;
21
- const index = parseInt(_index, 10);
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 addressSet = bchWallet.getAddressSetAt(index);
36
- const address = addressSet.receiving;
37
- console.log(chalk.bold(`\n Receive BCH (${network})\n`));
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(address, { small: true }, (qr) => {
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;;;;;;GAMG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,MAAM,MAAM,iBAAiB,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE7D,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,uCAAuC,CAAC;SACpD,QAAQ,CAAC,SAAS,EAAE,4BAA4B,EAAE,GAAG,CAAC;SACtD,MAAM,CAAC,WAAW,EAAE,0CAA0C,CAAC;SAC/D,MAAM,CAAC,SAAS,EAAE,iCAAiC,CAAC;SACpD,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,KAAK,CAAA;QAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAClC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;QAEjD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAC9D,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,oEAAoE;QACpE,MAAM,IAAI,GAAG,YAAY,EAAE,CAAA;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,oFAAoF,CACrF,CACF,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,CAAC,GAAG,UAAU,EAAG,CAAA;QACvB,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QACzC,MAAM,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QACnD,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAA;QAEpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,OAAO,KAAK,CAAC,CAAC,CAAA;QAC1D,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAA;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAA;QAE/C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,EAAE,CAAA;YACb,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,EAAU,EAAE,EAAE;gBACvD,2DAA2D;gBAC3D,MAAM,QAAQ,GAAG,EAAE;qBAChB,KAAK,CAAC,IAAI,CAAC;qBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;qBAC3B,IAAI,CAAC,IAAI,CAAC,CAAA;gBACb,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACvB,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;AACN,CAAC"}
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, and BCH sending
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, and BCH sending
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.1.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;AAE9D,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;AAE/B,OAAO,CAAC,KAAK,EAAE,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"}