paytaca-cli 0.1.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.
Files changed (56) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +142 -0
  3. package/bin/paytaca.js +2 -0
  4. package/dist/commands/address.d.ts +10 -0
  5. package/dist/commands/address.d.ts.map +1 -0
  6. package/dist/commands/address.js +72 -0
  7. package/dist/commands/address.js.map +1 -0
  8. package/dist/commands/balance.d.ts +10 -0
  9. package/dist/commands/balance.d.ts.map +1 -0
  10. package/dist/commands/balance.js +70 -0
  11. package/dist/commands/balance.js.map +1 -0
  12. package/dist/commands/history.d.ts +10 -0
  13. package/dist/commands/history.d.ts.map +1 -0
  14. package/dist/commands/history.js +114 -0
  15. package/dist/commands/history.js.map +1 -0
  16. package/dist/commands/receive.d.ts +10 -0
  17. package/dist/commands/receive.d.ts.map +1 -0
  18. package/dist/commands/receive.js +54 -0
  19. package/dist/commands/receive.js.map +1 -0
  20. package/dist/commands/send.d.ts +18 -0
  21. package/dist/commands/send.d.ts.map +1 -0
  22. package/dist/commands/send.js +94 -0
  23. package/dist/commands/send.js.map +1 -0
  24. package/dist/commands/wallet.d.ts +11 -0
  25. package/dist/commands/wallet.d.ts.map +1 -0
  26. package/dist/commands/wallet.js +151 -0
  27. package/dist/commands/wallet.js.map +1 -0
  28. package/dist/index.d.ts +9 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +27 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/storage/keychain.d.ts +56 -0
  33. package/dist/storage/keychain.d.ts.map +1 -0
  34. package/dist/storage/keychain.js +92 -0
  35. package/dist/storage/keychain.js.map +1 -0
  36. package/dist/utils/crypto.d.ts +23 -0
  37. package/dist/utils/crypto.d.ts.map +1 -0
  38. package/dist/utils/crypto.js +68 -0
  39. package/dist/utils/crypto.js.map +1 -0
  40. package/dist/utils/network.d.ts +27 -0
  41. package/dist/utils/network.d.ts.map +1 -0
  42. package/dist/utils/network.js +45 -0
  43. package/dist/utils/network.js.map +1 -0
  44. package/dist/wallet/bch.d.ts +137 -0
  45. package/dist/wallet/bch.d.ts.map +1 -0
  46. package/dist/wallet/bch.js +197 -0
  47. package/dist/wallet/bch.js.map +1 -0
  48. package/dist/wallet/index.d.ts +72 -0
  49. package/dist/wallet/index.d.ts.map +1 -0
  50. package/dist/wallet/index.js +120 -0
  51. package/dist/wallet/index.js.map +1 -0
  52. package/dist/wallet/keys.d.ts +69 -0
  53. package/dist/wallet/keys.d.ts.map +1 -0
  54. package/dist/wallet/keys.js +125 -0
  55. package/dist/wallet/keys.js.map +1 -0
  56. package/package.json +56 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * CLI command: send <address> <amount>
3
+ *
4
+ * Sends BCH from the wallet to an external address.
5
+ *
6
+ * The transaction flow is identical to paytaca-app:
7
+ * 1. Load mnemonic + walletHash from keychain
8
+ * 2. Create BchWallet with watchtower-cash-js
9
+ * 3. Call watchtower.BCH.send() which handles:
10
+ * - UTXO fetching from Watchtower API
11
+ * - Transaction building with libauth
12
+ * - Signing with HD-derived private keys
13
+ * - Broadcasting to the BCH network
14
+ * 4. Return txid
15
+ */
16
+ import chalk from 'chalk';
17
+ import { Address } from 'watchtower-cash-js';
18
+ import { loadWallet, loadMnemonic } from '../wallet/index.js';
19
+ export function registerSendCommand(program) {
20
+ program
21
+ .command('send')
22
+ .description('Send BCH to an address')
23
+ .argument('<address>', 'Recipient BCH address (CashAddr format)')
24
+ .argument('<amount>', 'Amount to send')
25
+ .option('--unit <unit>', 'Amount unit: bch or sats (default: bch)', 'bch')
26
+ .option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
27
+ .action(async (address, amountStr, opts) => {
28
+ const isChipnet = Boolean(opts.chipnet);
29
+ const unit = opts.unit;
30
+ const network = isChipnet ? 'chipnet' : 'mainnet';
31
+ // ── Validate wallet ──────────────────────────────────────────────
32
+ const data = loadMnemonic();
33
+ if (!data) {
34
+ console.log(chalk.red('\nNo wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.\n'));
35
+ process.exit(1);
36
+ }
37
+ // ── Parse amount ─────────────────────────────────────────────────
38
+ let amountBch = parseFloat(amountStr);
39
+ if (isNaN(amountBch) || amountBch <= 0) {
40
+ console.log(chalk.red('\nError: Amount must be a positive number.\n'));
41
+ process.exit(1);
42
+ }
43
+ if (unit === 'sats') {
44
+ amountBch = amountBch / 1e8;
45
+ }
46
+ else if (unit !== 'bch') {
47
+ console.log(chalk.red('\nError: Unit must be "bch" or "sats".\n'));
48
+ process.exit(1);
49
+ }
50
+ // ── Validate recipient address ───────────────────────────────────
51
+ const addressValidator = new Address(address);
52
+ if (!addressValidator.isValidBCHAddress(isChipnet) &&
53
+ !addressValidator.isP2SH?.() &&
54
+ !addressValidator.isTokenAddress?.()) {
55
+ console.log(chalk.red('\nError: Invalid BCH address.\n'));
56
+ process.exit(1);
57
+ }
58
+ // ── Build and send ───────────────────────────────────────────────
59
+ const w = loadWallet();
60
+ const bchWallet = w.forNetwork(isChipnet);
61
+ // Use the first receiving address as change address (same as paytaca-app default)
62
+ const changeAddressSet = bchWallet.getAddressSetAt(0);
63
+ const changeAddress = changeAddressSet.change;
64
+ console.log(`\n Sending ${chalk.bold(amountBch + ' BCH')} on ${chalk.cyan(network)}`);
65
+ console.log(chalk.dim(` To: ${address}`));
66
+ console.log(chalk.dim(` Change: ${changeAddress}`));
67
+ console.log();
68
+ try {
69
+ const result = await bchWallet.sendBch(amountBch, address, changeAddress);
70
+ if (result.success) {
71
+ console.log(chalk.green(' Transaction sent successfully!\n'));
72
+ if (result.txid) {
73
+ console.log(` txid: ${result.txid}`);
74
+ const explorer = isChipnet
75
+ ? 'https://chipnet.chaingraph.cash/tx/'
76
+ : 'https://bchexplorer.info/tx/';
77
+ console.log(chalk.dim(` ${explorer}${result.txid}`));
78
+ }
79
+ }
80
+ else {
81
+ console.log(chalk.red(` Transaction failed: ${result.error || 'Unknown error'}`));
82
+ if (result.lackingSats) {
83
+ console.log(chalk.yellow(` Insufficient balance. Short by ${result.lackingSats} satoshis.`));
84
+ }
85
+ }
86
+ }
87
+ catch (err) {
88
+ console.log(chalk.red(`\n Error: ${err.message || err}\n`));
89
+ process.exit(1);
90
+ }
91
+ console.log();
92
+ });
93
+ }
94
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * CLI commands: wallet create | import | info
3
+ *
4
+ * Implements the wallet lifecycle:
5
+ * - create: Generate new seed phrase, store in keychain, subscribe with Watchtower
6
+ * - import: Accept existing seed phrase, validate, store, subscribe
7
+ * - info: Display wallet hash, balance, and receiving address
8
+ */
9
+ import { Command } from 'commander';
10
+ export declare function registerWalletCommands(program: Command): void;
11
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +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;AAUnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoL7D"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * CLI commands: wallet create | import | info
3
+ *
4
+ * Implements the wallet lifecycle:
5
+ * - create: Generate new seed phrase, store in keychain, subscribe with Watchtower
6
+ * - import: Accept existing seed phrase, validate, store, subscribe
7
+ * - info: Display wallet hash, balance, and receiving address
8
+ */
9
+ import chalk from 'chalk';
10
+ import * as readline from 'readline';
11
+ import { generateMnemonic, importMnemonic, loadWallet, loadMnemonic, } from '../wallet/index.js';
12
+ export function registerWalletCommands(program) {
13
+ const wallet = program
14
+ .command('wallet')
15
+ .description('Manage wallet (create, import, info, export)');
16
+ // ── wallet create ──────────────────────────────────────────────────────
17
+ wallet
18
+ .command('create')
19
+ .description('Generate a new wallet with a 12-word seed phrase')
20
+ .option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
21
+ .action(async (opts) => {
22
+ const isChipnet = Boolean(opts.chipnet);
23
+ const network = isChipnet ? 'chipnet' : 'mainnet';
24
+ console.log(`\nCreating new wallet on ${chalk.cyan(network)}...\n`);
25
+ const { mnemonic, walletHash } = generateMnemonic();
26
+ // Display the mnemonic with a strong warning
27
+ console.log(chalk.yellow.bold('⚠ IMPORTANT: Write down your seed phrase and store it safely.'));
28
+ console.log(chalk.yellow(' Anyone with this phrase can access your funds.'));
29
+ console.log(chalk.yellow(' This is the only time it will be displayed.\n'));
30
+ console.log(chalk.white.bold(' Seed phrase:\n'));
31
+ const words = mnemonic.split(' ');
32
+ words.forEach((word, i) => {
33
+ console.log(chalk.white(` ${String(i + 1).padStart(2, ' ')}. ${word}`));
34
+ });
35
+ console.log();
36
+ console.log(chalk.dim(` Wallet hash: ${walletHash}`));
37
+ // Subscribe initial addresses with Watchtower
38
+ try {
39
+ const w = loadWallet();
40
+ if (w) {
41
+ const bchWallet = w.forNetwork(isChipnet);
42
+ const addressSet = bchWallet.getAddressSetAt(0);
43
+ console.log(chalk.dim(` Network: ${network}`));
44
+ console.log(chalk.dim(` Address: ${addressSet.receiving}`));
45
+ // Subscribe to Watchtower for monitoring
46
+ await bchWallet.getNewAddressSet(0).catch(() => {
47
+ // Non-critical: Watchtower subscription can fail silently
48
+ });
49
+ }
50
+ }
51
+ catch {
52
+ // Non-critical
53
+ }
54
+ console.log(chalk.green('\n Wallet created and stored in OS keychain.\n'));
55
+ });
56
+ // ── wallet import ──────────────────────────────────────────────────────
57
+ wallet
58
+ .command('import')
59
+ .description('Import an existing wallet from a seed phrase')
60
+ .option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
61
+ .action(async (opts) => {
62
+ const isChipnet = Boolean(opts.chipnet);
63
+ const network = isChipnet ? 'chipnet' : 'mainnet';
64
+ // Prompt for mnemonic
65
+ const rl = readline.createInterface({
66
+ input: process.stdin,
67
+ output: process.stdout,
68
+ });
69
+ const mnemonic = await new Promise((resolve) => {
70
+ rl.question('\nEnter your 12-word seed phrase: ', (answer) => {
71
+ rl.close();
72
+ resolve(answer);
73
+ });
74
+ });
75
+ if (!mnemonic.trim()) {
76
+ console.log(chalk.red('\nError: No seed phrase provided.\n'));
77
+ process.exit(1);
78
+ }
79
+ try {
80
+ const { walletHash } = importMnemonic(mnemonic);
81
+ console.log(chalk.green(`\nWallet imported successfully on ${network}.\n`));
82
+ console.log(chalk.dim(` Wallet hash: ${walletHash}`));
83
+ // Derive and show address
84
+ const w = loadWallet();
85
+ if (w) {
86
+ const bchWallet = w.forNetwork(isChipnet);
87
+ const addressSet = bchWallet.getAddressSetAt(0);
88
+ console.log(chalk.dim(` Address: ${addressSet.receiving}`));
89
+ // Subscribe initial addresses with Watchtower
90
+ await bchWallet.scanAddresses({ startIndex: 0, count: 10 }).catch(() => { });
91
+ }
92
+ console.log(chalk.dim(`\n Stored in OS keychain.\n`));
93
+ }
94
+ catch (err) {
95
+ console.log(chalk.red(`\nError: ${err.message}\n`));
96
+ process.exit(1);
97
+ }
98
+ });
99
+ // ── wallet info ────────────────────────────────────────────────────────
100
+ wallet
101
+ .command('info')
102
+ .description('Display wallet info: hash, balance, and receiving address')
103
+ .option('--chipnet', 'Use chipnet (testnet) instead of mainnet')
104
+ .action(async (opts) => {
105
+ const isChipnet = Boolean(opts.chipnet);
106
+ const network = isChipnet ? 'chipnet' : 'mainnet';
107
+ const data = loadMnemonic();
108
+ if (!data) {
109
+ console.log(chalk.red('\nNo wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.\n'));
110
+ process.exit(1);
111
+ }
112
+ const w = loadWallet();
113
+ const bchWallet = w.forNetwork(isChipnet);
114
+ console.log(chalk.bold(`\n Wallet Info (${network})\n`));
115
+ console.log(chalk.dim(` Wallet hash: ${data.walletHash}`));
116
+ // Derive receiving address at index 0
117
+ const addressSet = bchWallet.getAddressSetAt(0);
118
+ console.log(` Address: ${addressSet.receiving}`);
119
+ // Fetch balance
120
+ try {
121
+ const balance = await bchWallet.getBalance();
122
+ console.log(` Balance: ${balance.balance} BCH`);
123
+ if (balance.spendable !== balance.balance) {
124
+ console.log(chalk.dim(` Spendable: ${balance.spendable} BCH`));
125
+ }
126
+ }
127
+ catch {
128
+ console.log(chalk.yellow(' Balance: (unable to fetch)'));
129
+ }
130
+ console.log();
131
+ });
132
+ // ── wallet export ───────────────────────────────────────────────────
133
+ wallet
134
+ .command('export')
135
+ .description('Display the stored seed phrase')
136
+ .action(() => {
137
+ const data = loadMnemonic();
138
+ if (!data) {
139
+ console.log(chalk.red('\nNo wallet found. Run `paytaca wallet create` or `paytaca wallet import` first.\n'));
140
+ process.exit(1);
141
+ }
142
+ console.log(chalk.yellow.bold('\n WARNING: Do not share your seed phrase with anyone.'));
143
+ console.log(chalk.yellow(' Anyone with this phrase can access your funds.\n'));
144
+ const words = data.mnemonic.split(' ');
145
+ words.forEach((word, i) => {
146
+ console.log(chalk.white(` ${String(i + 1).padStart(2, ' ')}. ${word}`));
147
+ });
148
+ console.log();
149
+ });
150
+ }
151
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Paytaca CLI — Entry point
3
+ *
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.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Paytaca CLI — Entry point
3
+ *
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.
7
+ */
8
+ import { Command } from 'commander';
9
+ import { registerWalletCommands } from './commands/wallet.js';
10
+ import { registerAddressCommands } from './commands/address.js';
11
+ import { registerSendCommand } from './commands/send.js';
12
+ import { registerBalanceCommand } from './commands/balance.js';
13
+ import { registerReceiveCommand } from './commands/receive.js';
14
+ import { registerHistoryCommand } from './commands/history.js';
15
+ const program = new Command();
16
+ program
17
+ .name('paytaca')
18
+ .description('Paytaca — Bitcoin Cash wallet CLI')
19
+ .version('0.1.0');
20
+ registerWalletCommands(program);
21
+ registerAddressCommands(program);
22
+ registerSendCommand(program);
23
+ registerBalanceCommand(program);
24
+ registerReceiveCommand(program);
25
+ registerHistoryCommand(program);
26
+ program.parse();
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Secure storage layer using OS keychain.
3
+ *
4
+ * Replaces `capacitor-secure-storage-plugin` (SecureStoragePlugin) from
5
+ * paytaca-app. The underlying store is the platform's native credential
6
+ * manager (macOS Keychain, GNOME Keyring / Secret Service on Linux,
7
+ * Windows Credential Manager) accessed via @napi-rs/keyring.
8
+ *
9
+ * Key naming convention is identical to paytaca-app so the mental model
10
+ * carries over:
11
+ * - Mnemonic: mn_{walletHash}
12
+ * - Active wallet: active_wallet
13
+ *
14
+ * Adapted from: paytaca-app/src/wallet/index.js (SecureStoragePlugin calls)
15
+ */
16
+ /**
17
+ * Store a value in the OS keychain.
18
+ */
19
+ export declare function setSecret(key: string, value: string): void;
20
+ /**
21
+ * Retrieve a value from the OS keychain.
22
+ * Returns null if the key does not exist.
23
+ */
24
+ export declare function getSecret(key: string): string | null;
25
+ /**
26
+ * Delete a value from the OS keychain.
27
+ */
28
+ export declare function deleteSecret(key: string): void;
29
+ /**
30
+ * Store a mnemonic keyed by wallet hash.
31
+ * Equivalent to paytaca-app's storeMnemonicByHash().
32
+ */
33
+ export declare function storeMnemonic(mnemonic: string, walletHash: string): void;
34
+ /**
35
+ * Retrieve a mnemonic by wallet hash.
36
+ * Equivalent to paytaca-app's getMnemonicByHash().
37
+ */
38
+ export declare function getMnemonic(walletHash: string): string | null;
39
+ /**
40
+ * Delete a mnemonic by wallet hash.
41
+ * Equivalent to paytaca-app's deleteMnemonicByHash().
42
+ */
43
+ export declare function deleteMnemonic(walletHash: string): void;
44
+ /**
45
+ * Set the active wallet hash.
46
+ */
47
+ export declare function setActiveWallet(walletHash: string): void;
48
+ /**
49
+ * Get the active wallet hash, or null if none is set.
50
+ */
51
+ export declare function getActiveWallet(): string | null;
52
+ /**
53
+ * Clear the active wallet selection.
54
+ */
55
+ export declare function clearActiveWallet(): void;
56
+ //# sourceMappingURL=keychain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../src/storage/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG1D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAO9C;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAExE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Secure storage layer using OS keychain.
3
+ *
4
+ * Replaces `capacitor-secure-storage-plugin` (SecureStoragePlugin) from
5
+ * paytaca-app. The underlying store is the platform's native credential
6
+ * manager (macOS Keychain, GNOME Keyring / Secret Service on Linux,
7
+ * Windows Credential Manager) accessed via @napi-rs/keyring.
8
+ *
9
+ * Key naming convention is identical to paytaca-app so the mental model
10
+ * carries over:
11
+ * - Mnemonic: mn_{walletHash}
12
+ * - Active wallet: active_wallet
13
+ *
14
+ * Adapted from: paytaca-app/src/wallet/index.js (SecureStoragePlugin calls)
15
+ */
16
+ import { Entry } from '@napi-rs/keyring';
17
+ const SERVICE = 'paytaca-cli';
18
+ /**
19
+ * Store a value in the OS keychain.
20
+ */
21
+ export function setSecret(key, value) {
22
+ const entry = new Entry(SERVICE, key);
23
+ entry.setPassword(value);
24
+ }
25
+ /**
26
+ * Retrieve a value from the OS keychain.
27
+ * Returns null if the key does not exist.
28
+ */
29
+ export function getSecret(key) {
30
+ const entry = new Entry(SERVICE, key);
31
+ try {
32
+ return entry.getPassword();
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ /**
39
+ * Delete a value from the OS keychain.
40
+ */
41
+ export function deleteSecret(key) {
42
+ const entry = new Entry(SERVICE, key);
43
+ try {
44
+ entry.deletePassword();
45
+ }
46
+ catch {
47
+ // Key might not exist — ignore
48
+ }
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Wallet-specific helpers (mirror paytaca-app's SecureStoragePlugin usage)
52
+ // ---------------------------------------------------------------------------
53
+ /**
54
+ * Store a mnemonic keyed by wallet hash.
55
+ * Equivalent to paytaca-app's storeMnemonicByHash().
56
+ */
57
+ export function storeMnemonic(mnemonic, walletHash) {
58
+ setSecret(`mn_${walletHash}`, mnemonic);
59
+ }
60
+ /**
61
+ * Retrieve a mnemonic by wallet hash.
62
+ * Equivalent to paytaca-app's getMnemonicByHash().
63
+ */
64
+ export function getMnemonic(walletHash) {
65
+ return getSecret(`mn_${walletHash}`);
66
+ }
67
+ /**
68
+ * Delete a mnemonic by wallet hash.
69
+ * Equivalent to paytaca-app's deleteMnemonicByHash().
70
+ */
71
+ export function deleteMnemonic(walletHash) {
72
+ deleteSecret(`mn_${walletHash}`);
73
+ }
74
+ /**
75
+ * Set the active wallet hash.
76
+ */
77
+ export function setActiveWallet(walletHash) {
78
+ setSecret('active_wallet', walletHash);
79
+ }
80
+ /**
81
+ * Get the active wallet hash, or null if none is set.
82
+ */
83
+ export function getActiveWallet() {
84
+ return getSecret('active_wallet');
85
+ }
86
+ /**
87
+ * Clear the active wallet selection.
88
+ */
89
+ export function clearActiveWallet() {
90
+ deleteSecret('active_wallet');
91
+ }
92
+ //# sourceMappingURL=keychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/storage/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAExC,MAAM,OAAO,GAAG,aAAa,CAAA;AAE7B;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa;IAClD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IACrC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IACrC,IAAI,CAAC;QACH,OAAO,KAAK,CAAC,WAAW,EAAE,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IACrC,IAAI,CAAC;QACH,KAAK,CAAC,cAAc,EAAE,CAAA;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,UAAkB;IAChE,SAAS,CAAC,MAAM,UAAU,EAAE,EAAE,QAAQ,CAAC,CAAA;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,SAAS,CAAC,MAAM,UAAU,EAAE,CAAC,CAAA;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,YAAY,CAAC,MAAM,UAAU,EAAE,CAAC,CAAA;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,SAAS,CAAC,eAAe,CAAC,CAAA;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,YAAY,CAAC,eAAe,CAAC,CAAA;AAC/B,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Cryptographic utility functions for address derivation.
3
+ *
4
+ * Adapted from: paytaca-app/src/utils/crypto.js
5
+ *
6
+ * Provides the pubkey → CashAddress pipeline used by LibauthHDWallet:
7
+ * pubkey → SHA256 → RIPEMD160 (pkhash) → legacy address → CashAddress
8
+ */
9
+ export declare function sha256(data?: string, encoding?: BufferEncoding): string;
10
+ export declare function pubkeyToPkHash(pubkey?: string): string;
11
+ export declare function pkHashToLegacyAddress(pkhash?: string): string;
12
+ export declare function pkhashToCashAddress(pkhash: string, chipnet?: boolean): string;
13
+ /**
14
+ * Convert a compressed public key (hex) to a CashAddress.
15
+ * This is the core function used by LibauthHDWallet.getAddressAt().
16
+ */
17
+ export declare function pubkeyToAddress(pubkey: string, chipnet?: boolean): string;
18
+ /**
19
+ * Convert a regular CashAddress to a token-aware CashAddress (p2pkhWithTokens).
20
+ * e.g. bitcoincash:q... → bitcoincash:z...
21
+ */
22
+ export declare function toTokenAddress(address?: string): string;
23
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,wBAAgB,MAAM,CAAC,IAAI,GAAE,MAAW,EAAE,QAAQ,GAAE,cAAuB,GAAG,MAAM,CAInF;AAED,wBAAgB,cAAc,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAE1D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAajE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,MAAM,CAMpF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,MAAM,CAGhF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,MAAW,GAAG,MAAM,CAgB3D"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Cryptographic utility functions for address derivation.
3
+ *
4
+ * Adapted from: paytaca-app/src/utils/crypto.js
5
+ *
6
+ * Provides the pubkey → CashAddress pipeline used by LibauthHDWallet:
7
+ * pubkey → SHA256 → RIPEMD160 (pkhash) → legacy address → CashAddress
8
+ */
9
+ import crypto from 'crypto';
10
+ import { binToBase58, CashAddressType, decodeBase58Address, decodeCashAddress, encodeCashAddress, ripemd160, binToHex, hexToBin, } from '@bitauth/libauth';
11
+ export function sha256(data = '', encoding = 'utf8') {
12
+ const _sha256 = crypto.createHash('sha256');
13
+ _sha256.update(Buffer.from(data, encoding));
14
+ return _sha256.digest().toString('hex');
15
+ }
16
+ export function pubkeyToPkHash(pubkey = '') {
17
+ return binToHex(ripemd160.hash(hexToBin(sha256(pubkey, 'hex'))));
18
+ }
19
+ export function pkHashToLegacyAddress(pkhash = '') {
20
+ const pkHashBin = Buffer.from(pkhash, 'hex');
21
+ const versionByte = Buffer.from([0x00]);
22
+ const data = Buffer.concat([versionByte, pkHashBin]);
23
+ const hash1 = sha256(data.toString('hex'), 'hex');
24
+ const hash = sha256(hash1, 'hex');
25
+ const checksum = Buffer.from(hash, 'hex').slice(0, 4);
26
+ const dataWithChecksum = Buffer.concat([data, checksum]);
27
+ const legacyAddress = binToBase58(dataWithChecksum);
28
+ return legacyAddress;
29
+ }
30
+ export function pkhashToCashAddress(pkhash, chipnet = false) {
31
+ const legacyAddress = pkHashToLegacyAddress(pkhash);
32
+ const decodedLegacyAddress = decodeBase58Address(legacyAddress);
33
+ if (typeof decodedLegacyAddress === 'string')
34
+ throw new Error(decodedLegacyAddress);
35
+ const prefix = chipnet ? 'bchtest' : 'bitcoincash';
36
+ return encodeCashAddress(prefix, 'p2pkh', decodedLegacyAddress.payload);
37
+ }
38
+ /**
39
+ * Convert a compressed public key (hex) to a CashAddress.
40
+ * This is the core function used by LibauthHDWallet.getAddressAt().
41
+ */
42
+ export function pubkeyToAddress(pubkey, chipnet = false) {
43
+ const pkhash = pubkeyToPkHash(pubkey);
44
+ return pkhashToCashAddress(pkhash, chipnet);
45
+ }
46
+ /**
47
+ * Convert a regular CashAddress to a token-aware CashAddress (p2pkhWithTokens).
48
+ * e.g. bitcoincash:q... → bitcoincash:z...
49
+ */
50
+ export function toTokenAddress(address = '') {
51
+ const decodedAddress = decodeCashAddress(address);
52
+ if (typeof decodedAddress === 'string')
53
+ throw new Error(decodedAddress);
54
+ const addrType = decodedAddress.type;
55
+ const payload = decodedAddress.payload;
56
+ switch (addrType) {
57
+ case CashAddressType.p2pkhWithTokens:
58
+ case CashAddressType.p2shWithTokens:
59
+ return address;
60
+ case CashAddressType.p2pkh:
61
+ return encodeCashAddress(decodedAddress.prefix, CashAddressType.p2pkhWithTokens, payload);
62
+ case CashAddressType.p2sh:
63
+ return encodeCashAddress(decodedAddress.prefix, CashAddressType.p2shWithTokens, payload);
64
+ default:
65
+ return address;
66
+ }
67
+ }
68
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Network configuration and address conversion helpers.
3
+ *
4
+ * Adapted from: paytaca-app/src/wallet/chipnet.js
5
+ *
6
+ * Stripped of Vuex store dependency — uses explicit `isChipnet` parameter.
7
+ */
8
+ /** BCH derivation path (BIP44 coin type 145) */
9
+ export declare const BCH_DERIVATION_PATH = "m/44'/145'/0'";
10
+ /** Watchtower project IDs (from environment or defaults) */
11
+ export declare const projectId: {
12
+ mainnet: string;
13
+ chipnet: string;
14
+ };
15
+ export declare function getWatchtowerApiUrl(isChipnet: boolean): string;
16
+ export declare function getWatchtowerWebsocketUrl(isChipnet: boolean): string;
17
+ /**
18
+ * Convert a CashAddress between mainnet/testnet and regular/token types.
19
+ *
20
+ * Adapted from paytaca-app/src/wallet/chipnet.js convertCashAddress().
21
+ */
22
+ export declare function convertCashAddress(address: string, toTestNet?: boolean, toTokenAddress?: boolean): string;
23
+ /**
24
+ * Get the CashAddress prefix for the given network.
25
+ */
26
+ export declare function getAddressPrefix(isChipnet: boolean): string;
27
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/utils/network.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,gDAAgD;AAChD,eAAO,MAAM,mBAAmB,kBAAkB,CAAA;AAElD,4DAA4D;AAC5D,eAAO,MAAM,SAAS;;;CAGrB,CAAA;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAG9D;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAGpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,OAAc,EACzB,cAAc,GAAE,OAAc,GAC7B,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAE3D"}