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,45 @@
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
+ import { CashAddressNetworkPrefix, CashAddressType, encodeCashAddress, decodeCashAddress, } from '@bitauth/libauth';
9
+ /** BCH derivation path (BIP44 coin type 145) */
10
+ export const BCH_DERIVATION_PATH = "m/44'/145'/0'";
11
+ /** Watchtower project IDs (from environment or defaults) */
12
+ export const projectId = {
13
+ mainnet: process.env.WATCHTOWER_PROJECT_ID || '',
14
+ chipnet: process.env.WATCHTOWER_CHIP_PROJECT_ID || '',
15
+ };
16
+ export function getWatchtowerApiUrl(isChipnet) {
17
+ if (isChipnet)
18
+ return 'https://chipnet.watchtower.cash/api';
19
+ return 'https://watchtower.cash/api';
20
+ }
21
+ export function getWatchtowerWebsocketUrl(isChipnet) {
22
+ if (isChipnet)
23
+ return 'wss://chipnet.watchtower.cash/ws';
24
+ return 'wss://watchtower.cash/ws';
25
+ }
26
+ /**
27
+ * Convert a CashAddress between mainnet/testnet and regular/token types.
28
+ *
29
+ * Adapted from paytaca-app/src/wallet/chipnet.js convertCashAddress().
30
+ */
31
+ export function convertCashAddress(address, toTestNet = true, toTokenAddress = true) {
32
+ const decodedAddress = decodeCashAddress(address);
33
+ if (typeof decodedAddress === 'string')
34
+ throw new Error(decodedAddress);
35
+ const prefix = toTestNet ? CashAddressNetworkPrefix.testnet : CashAddressNetworkPrefix.mainnet;
36
+ const addressType = toTokenAddress ? CashAddressType.p2pkhWithTokens : CashAddressType.p2pkh;
37
+ return encodeCashAddress(prefix, addressType, decodedAddress.payload);
38
+ }
39
+ /**
40
+ * Get the CashAddress prefix for the given network.
41
+ */
42
+ export function getAddressPrefix(isChipnet) {
43
+ return isChipnet ? 'bchtest' : 'bitcoincash';
44
+ }
45
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/utils/network.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,kBAAkB,CAAA;AAEzB,gDAAgD;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAA;AAElD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;IAChD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE;CACtD,CAAA;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAkB;IACpD,IAAI,SAAS;QAAE,OAAO,qCAAqC,CAAA;IAC3D,OAAO,6BAA6B,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAAkB;IAC1D,IAAI,SAAS;QAAE,OAAO,kCAAkC,CAAA;IACxD,OAAO,0BAA0B,CAAA;AACnC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,YAAqB,IAAI,EACzB,iBAA0B,IAAI;IAE9B,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IACjD,IAAI,OAAO,cAAc,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA;IACvE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAA;IAC9F,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAA;IAC5F,OAAO,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAkB;IACjD,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAA;AAC9C,CAAC"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * BCH wallet operations: balance, address derivation, sending.
3
+ *
4
+ * Adapted from: paytaca-app/src/wallet/bch.js (BchWallet class)
5
+ *
6
+ * Key differences from paytaca-app:
7
+ * - Uses LibauthHDWallet for address derivation instead of @psf/bch-js
8
+ * - Transaction building/signing/broadcasting delegated to watchtower-cash-js
9
+ * (identical to paytaca-app)
10
+ * - Stripped: SLP, POS, fiat tracking, WalletConnect
11
+ */
12
+ import Watchtower from 'watchtower-cash-js';
13
+ export interface Recipient {
14
+ address: string;
15
+ amount: number;
16
+ tokenAmount?: number;
17
+ }
18
+ export interface SendResult {
19
+ success: boolean;
20
+ txid?: string;
21
+ transaction?: string;
22
+ error?: string;
23
+ lackingSats?: bigint;
24
+ }
25
+ export declare class BchWallet {
26
+ isChipnet: boolean;
27
+ mnemonic: string;
28
+ derivationPath: string;
29
+ watchtower: InstanceType<typeof Watchtower>;
30
+ projectId: string;
31
+ walletHash: string;
32
+ baseUrl: string;
33
+ private hdWallet;
34
+ constructor(projectId: string, mnemonic: string, path: string, isChipnet?: boolean);
35
+ /**
36
+ * Derive receiving and change addresses at a given index.
37
+ * Adapted from paytaca-app BchWallet.getAddressSetAt()
38
+ */
39
+ getAddressSetAt(index: number): {
40
+ receiving: string;
41
+ change: string;
42
+ };
43
+ /**
44
+ * Subscribe a new address set with Watchtower for monitoring.
45
+ * Adapted from paytaca-app BchWallet.getNewAddressSet()
46
+ */
47
+ getNewAddressSet(index: number): Promise<{
48
+ addresses: {
49
+ receiving: string;
50
+ change: string;
51
+ };
52
+ } | null>;
53
+ /**
54
+ * Get the last used address index from Watchtower.
55
+ */
56
+ getLastAddressIndex(opts?: {
57
+ with_tx?: boolean;
58
+ exclude_pos?: boolean;
59
+ }): Promise<number | undefined>;
60
+ /**
61
+ * Get wallet balance from Watchtower.
62
+ * Adapted from paytaca-app BchWallet.getBalance()
63
+ */
64
+ getBalance(): Promise<{
65
+ valid: boolean;
66
+ wallet: string;
67
+ spendable: number;
68
+ balance: number;
69
+ }>;
70
+ /**
71
+ * Get transaction history from Watchtower.
72
+ * Adapted from paytaca-app BchWallet.getTransactions()
73
+ */
74
+ getHistory(opts?: {
75
+ page?: number;
76
+ recordType?: string;
77
+ }): Promise<{
78
+ history: {
79
+ record_type: 'outgoing' | 'incoming';
80
+ txid: string;
81
+ amount: number;
82
+ tx_fee: number;
83
+ senders: any[][];
84
+ recipients: any[][];
85
+ date_created: string;
86
+ tx_timestamp: string;
87
+ usd_price: number;
88
+ market_prices: Record<string, number>;
89
+ attributes: any;
90
+ }[];
91
+ page: string;
92
+ num_pages: number;
93
+ has_next: boolean;
94
+ }>;
95
+ /**
96
+ * Send BCH to one or more recipients.
97
+ *
98
+ * Adapted from paytaca-app BchWallet.sendBch() and _sendBch().
99
+ * The actual transaction building, signing, and broadcasting is handled
100
+ * entirely by watchtower-cash-js BCH.send() — identical to paytaca-app.
101
+ *
102
+ * @param amount - Amount in BCH (e.g. 0.001)
103
+ * @param address - Recipient CashAddress
104
+ * @param changeAddress - Change address (optional, derived if not provided)
105
+ * @param recipients - Array of recipients for multi-send (overrides amount/address)
106
+ */
107
+ sendBch(amount: number, address: string, changeAddress?: string, recipients?: Recipient[]): Promise<SendResult>;
108
+ /**
109
+ * Internal send implementation.
110
+ * Passes data to watchtower-cash-js BCH.send() which handles:
111
+ * 1. UTXO fetching from Watchtower API
112
+ * 2. Transaction building with libauth
113
+ * 3. Signing with derived private keys
114
+ * 4. Broadcasting to the network
115
+ *
116
+ * The data format is identical to what paytaca-app passes.
117
+ */
118
+ private _sendBch;
119
+ /**
120
+ * Trigger a UTXO scan on the Watchtower backend.
121
+ */
122
+ scanUtxos(opts?: {
123
+ background?: boolean;
124
+ }): Promise<any>;
125
+ /**
126
+ * Bulk-subscribe a range of addresses to Watchtower.
127
+ * Adapted from paytaca-app BchWallet.scanAddresses()
128
+ */
129
+ scanAddresses(opts: {
130
+ startIndex: number;
131
+ count: number;
132
+ }): Promise<{
133
+ success: boolean;
134
+ error: string;
135
+ }>;
136
+ }
137
+ //# sourceMappingURL=bch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bch.d.ts","sourceRoot":"","sources":["../../src/wallet/bch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * BCH wallet operations: balance, address derivation, sending.
3
+ *
4
+ * Adapted from: paytaca-app/src/wallet/bch.js (BchWallet class)
5
+ *
6
+ * Key differences from paytaca-app:
7
+ * - Uses LibauthHDWallet for address derivation instead of @psf/bch-js
8
+ * - Transaction building/signing/broadcasting delegated to watchtower-cash-js
9
+ * (identical to paytaca-app)
10
+ * - Stripped: SLP, POS, fiat tracking, WalletConnect
11
+ */
12
+ import Watchtower from 'watchtower-cash-js';
13
+ import { LibauthHDWallet } from './keys.js';
14
+ import { getWatchtowerApiUrl } from '../utils/network.js';
15
+ export class BchWallet {
16
+ isChipnet;
17
+ mnemonic;
18
+ derivationPath;
19
+ watchtower;
20
+ projectId;
21
+ walletHash;
22
+ baseUrl;
23
+ hdWallet;
24
+ constructor(projectId, mnemonic, path, isChipnet = false) {
25
+ this.isChipnet = isChipnet;
26
+ this.mnemonic = mnemonic;
27
+ this.derivationPath = path;
28
+ this.watchtower = new Watchtower(isChipnet);
29
+ this.projectId = projectId;
30
+ this.baseUrl = getWatchtowerApiUrl(isChipnet);
31
+ // Use LibauthHDWallet for address derivation (replaces @psf/bch-js HDNode)
32
+ this.hdWallet = new LibauthHDWallet(mnemonic, path, isChipnet ? 'chipnet' : 'mainnet');
33
+ this.walletHash = this.hdWallet.walletHash;
34
+ }
35
+ /**
36
+ * Derive receiving and change addresses at a given index.
37
+ * Adapted from paytaca-app BchWallet.getAddressSetAt()
38
+ */
39
+ getAddressSetAt(index) {
40
+ return this.hdWallet.getAddressSetAt(index);
41
+ }
42
+ /**
43
+ * Subscribe a new address set with Watchtower for monitoring.
44
+ * Adapted from paytaca-app BchWallet.getNewAddressSet()
45
+ */
46
+ async getNewAddressSet(index) {
47
+ const addresses = this.getAddressSetAt(index);
48
+ const data = {
49
+ address: undefined,
50
+ addresses: { receiving: addresses.receiving, change: addresses.change },
51
+ projectId: this.projectId,
52
+ walletHash: this.walletHash,
53
+ walletIndex: undefined,
54
+ addressIndex: index,
55
+ webhookUrl: undefined,
56
+ chatIdentity: undefined,
57
+ };
58
+ const result = await this.watchtower.subscribe(data);
59
+ if (result.success) {
60
+ return { addresses };
61
+ }
62
+ return null;
63
+ }
64
+ /**
65
+ * Get the last used address index from Watchtower.
66
+ */
67
+ async getLastAddressIndex(opts) {
68
+ const _params = {
69
+ with_tx: opts?.with_tx || false,
70
+ exclude_pos: opts?.exclude_pos || false,
71
+ };
72
+ const apiResponse = await this.watchtower.BCH._api.get(`last-address-index/wallet/${this.walletHash}/`, { params: _params });
73
+ if (Number.isInteger(apiResponse?.data?.address?.address_index)) {
74
+ return apiResponse.data.address.address_index;
75
+ }
76
+ return undefined;
77
+ }
78
+ /**
79
+ * Get wallet balance from Watchtower.
80
+ * Adapted from paytaca-app BchWallet.getBalance()
81
+ */
82
+ async getBalance() {
83
+ const walletHash = this.walletHash;
84
+ return this.watchtower.Wallet.getBalance({ walletHash });
85
+ }
86
+ /**
87
+ * Get transaction history from Watchtower.
88
+ * Adapted from paytaca-app BchWallet.getTransactions()
89
+ */
90
+ async getHistory(opts) {
91
+ const walletHash = this.walletHash;
92
+ return this.watchtower.Wallet.getHistory({
93
+ walletHash,
94
+ tokenId: '',
95
+ page: opts?.page ?? 1,
96
+ recordType: opts?.recordType ?? 'all',
97
+ txSearchReference: '',
98
+ });
99
+ }
100
+ /**
101
+ * Send BCH to one or more recipients.
102
+ *
103
+ * Adapted from paytaca-app BchWallet.sendBch() and _sendBch().
104
+ * The actual transaction building, signing, and broadcasting is handled
105
+ * entirely by watchtower-cash-js BCH.send() — identical to paytaca-app.
106
+ *
107
+ * @param amount - Amount in BCH (e.g. 0.001)
108
+ * @param address - Recipient CashAddress
109
+ * @param changeAddress - Change address (optional, derived if not provided)
110
+ * @param recipients - Array of recipients for multi-send (overrides amount/address)
111
+ */
112
+ async sendBch(amount, address, changeAddress, recipients = []) {
113
+ const finalRecipients = [];
114
+ if (recipients.length > 0) {
115
+ finalRecipients.push(...recipients);
116
+ }
117
+ else {
118
+ finalRecipients.push({ address, amount });
119
+ }
120
+ return this._sendBch(changeAddress, finalRecipients);
121
+ }
122
+ /**
123
+ * Internal send implementation.
124
+ * Passes data to watchtower-cash-js BCH.send() which handles:
125
+ * 1. UTXO fetching from Watchtower API
126
+ * 2. Transaction building with libauth
127
+ * 3. Signing with derived private keys
128
+ * 4. Broadcasting to the network
129
+ *
130
+ * The data format is identical to what paytaca-app passes.
131
+ */
132
+ async _sendBch(changeAddress, recipients, broadcast = true) {
133
+ const data = {
134
+ sender: {
135
+ walletHash: this.walletHash,
136
+ mnemonic: this.mnemonic,
137
+ derivationPath: this.derivationPath,
138
+ },
139
+ recipients,
140
+ changeAddress,
141
+ wallet: {
142
+ mnemonic: this.mnemonic,
143
+ derivationPath: this.derivationPath,
144
+ },
145
+ broadcast,
146
+ };
147
+ const result = await this.watchtower.BCH.send(data);
148
+ return result;
149
+ }
150
+ /**
151
+ * Trigger a UTXO scan on the Watchtower backend.
152
+ */
153
+ async scanUtxos(opts) {
154
+ const queryParams = {};
155
+ if (opts?.background)
156
+ queryParams.background = true;
157
+ return this.watchtower.BCH._api.get(`utxo/wallet/${this.walletHash}/scan/`, { params: queryParams });
158
+ }
159
+ /**
160
+ * Bulk-subscribe a range of addresses to Watchtower.
161
+ * Adapted from paytaca-app BchWallet.scanAddresses()
162
+ */
163
+ async scanAddresses(opts) {
164
+ const response = {
165
+ success: false,
166
+ error: '',
167
+ };
168
+ if (!Number.isSafeInteger(opts?.startIndex)) {
169
+ response.error = 'Invalid start index';
170
+ return response;
171
+ }
172
+ if (!Number.isSafeInteger(opts?.count)) {
173
+ response.error = 'Invalid count';
174
+ return response;
175
+ }
176
+ const endIndex = opts.startIndex + opts.count;
177
+ const addressSets = [];
178
+ for (let i = opts.startIndex; i < endIndex; i++) {
179
+ const addresses = this.getAddressSetAt(i);
180
+ addressSets.push({ address_index: i, addresses });
181
+ }
182
+ const data = {
183
+ address_sets: addressSets,
184
+ wallet_hash: this.walletHash,
185
+ project_id: this.projectId,
186
+ };
187
+ try {
188
+ await this.watchtower.BCH._api.post('wallet/address-scan/', data);
189
+ response.success = true;
190
+ }
191
+ catch (error) {
192
+ response.error = error?.message || 'Address scan failed';
193
+ }
194
+ return response;
195
+ }
196
+ }
197
+ //# sourceMappingURL=bch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bch.js","sourceRoot":"","sources":["../../src/wallet/bch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,UAAU,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAgBzD,MAAM,OAAO,SAAS;IACpB,SAAS,CAAS;IAClB,QAAQ,CAAQ;IAChB,cAAc,CAAQ;IACtB,UAAU,CAAiC;IAC3C,SAAS,CAAQ;IACjB,UAAU,CAAQ;IAClB,OAAO,CAAQ;IAEP,QAAQ,CAAiB;IAEjC,YACE,SAAiB,EACjB,QAAgB,EAChB,IAAY,EACZ,YAAqB,KAAK;QAE1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAA;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAA;QAE7C,2EAA2E;QAC3E,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CACjC,QAAQ,EACR,IAAI,EACJ,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAClC,CAAA;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAA;IAC5C,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,KAAa;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAa;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,IAAI,GAAG;YACX,OAAO,EAAE,SAAgB;YACzB,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE;YACvE,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,SAAgB;YAC7B,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,SAAgB;YAC5B,YAAY,EAAE,SAAgB;SAC/B,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACpD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,SAAS,EAAE,CAAA;QACtB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,IAGzB;QACC,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK;YAC/B,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,KAAK;SACxC,CAAA;QACD,MAAM,WAAW,GAAG,MAAO,IAAI,CAAC,UAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAC7D,6BAA6B,IAAI,CAAC,UAAU,GAAG,EAC/C,EAAE,MAAM,EAAE,OAAO,EAAE,CACpB,CAAA;QACD,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;YAChE,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAA;QAC/C,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QAMd,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,IAGhB;QAkBC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;YACvC,UAAU;YACV,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;YACrB,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,KAAK;YACrC,iBAAiB,EAAE,EAAE;SACtB,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,OAAO,CACX,MAAc,EACd,OAAe,EACf,aAAsB,EACtB,aAA0B,EAAE;QAE5B,MAAM,eAAe,GAAgB,EAAE,CAAA;QACvC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,eAAe,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;QACrC,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3C,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC,CAAA;IACtD,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,QAAQ,CACpB,aAAiC,EACjC,UAAuB,EACvB,YAAqB,IAAI;QAEzB,MAAM,IAAI,GAAG;YACX,MAAM,EAAE;gBACN,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,cAAc,EAAE,IAAI,CAAC,cAAc;aACpC;YACD,UAAU;YACV,aAAa;YACb,MAAM,EAAE;gBACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,cAAc,EAAE,IAAI,CAAC,cAAc;aACpC;YACD,SAAS;SACV,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnD,OAAO,MAAoB,CAAA;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,IAA+B;QAC7C,MAAM,WAAW,GAA4B,EAAE,CAAA;QAC/C,IAAI,IAAI,EAAE,UAAU;YAAE,WAAW,CAAC,UAAU,GAAG,IAAI,CAAA;QACnD,OAAQ,IAAI,CAAC,UAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAC1C,eAAe,IAAI,CAAC,UAAU,QAAQ,EACtC,EAAE,MAAM,EAAE,WAAW,EAAE,CACxB,CAAA;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,IAA2C;QAC7D,MAAM,QAAQ,GAAwC;YACpD,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE;SACV,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,KAAK,GAAG,qBAAqB,CAAA;YACtC,OAAO,QAAQ,CAAA;QACjB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YACvC,QAAQ,CAAC,KAAK,GAAG,eAAe,CAAA;YAChC,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAA;QAC7C,MAAM,WAAW,GAAG,EAAE,CAAA;QACtB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACzC,WAAW,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;QACnD,CAAC;QAED,MAAM,IAAI,GAAG;YACX,YAAY,EAAE,WAAW;YACzB,WAAW,EAAE,IAAI,CAAC,UAAU;YAC5B,UAAU,EAAE,IAAI,CAAC,SAAS;SAC3B,CAAA;QAED,IAAI,CAAC;YACH,MAAO,IAAI,CAAC,UAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAC1C,sBAAsB,EACtB,IAAI,CACL,CAAA;YACD,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAA;QACzB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,QAAQ,CAAC,KAAK,GAAG,KAAK,EAAE,OAAO,IAAI,qBAAqB,CAAA;QAC1D,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Wallet management: mnemonic generation, storage, wallet loading.
3
+ *
4
+ * Adapted from: paytaca-app/src/wallet/index.js
5
+ *
6
+ * Key differences:
7
+ * - Uses @napi-rs/keyring (OS keychain) instead of Capacitor SecureStoragePlugin
8
+ * - Uses bip39 directly for mnemonic generation instead of @psf/bch-js
9
+ * - No SLP wallet
10
+ * - No migration logic (fresh CLI, no legacy key schemes)
11
+ * - computeWalletHash() is identical to paytaca-app
12
+ */
13
+ import { BchWallet } from './bch.js';
14
+ /**
15
+ * Compute wallet hash from mnemonic and derivation path.
16
+ * walletHash = sha256(sha256(mnemonic) + sha256(derivationPath))
17
+ *
18
+ * Identical to paytaca-app's computeWalletHash() in src/wallet/index.js
19
+ * and BchWallet.getWalletHash() in src/wallet/bch.js
20
+ */
21
+ export declare function computeWalletHash(mnemonic: string, derivationPath?: string): string;
22
+ /**
23
+ * Generate a new 12-word BIP39 mnemonic, store it in the OS keychain,
24
+ * and set it as the active wallet.
25
+ *
26
+ * Adapted from paytaca-app generateMnemonic() — stripped of
27
+ * Capacitor SecureStoragePlugin and old key-scheme migration.
28
+ */
29
+ export declare function generateMnemonic(): {
30
+ mnemonic: string;
31
+ walletHash: string;
32
+ };
33
+ /**
34
+ * Import an existing mnemonic, validate it, store in keychain,
35
+ * and set as active wallet.
36
+ */
37
+ export declare function importMnemonic(mnemonic: string): {
38
+ mnemonic: string;
39
+ walletHash: string;
40
+ };
41
+ /**
42
+ * Load the active wallet's mnemonic from keychain.
43
+ * Returns null if no active wallet is set or mnemonic is missing.
44
+ */
45
+ export declare function loadMnemonic(): {
46
+ mnemonic: string;
47
+ walletHash: string;
48
+ } | null;
49
+ /**
50
+ * High-level wallet class that provides access to BCH sub-wallets.
51
+ *
52
+ * Adapted from paytaca-app's Wallet class in src/wallet/index.js.
53
+ * Stripped of SLP — only BCH mainnet and chipnet.
54
+ */
55
+ export declare class Wallet {
56
+ mnemonic: string;
57
+ private _BCH;
58
+ private _BCH_CHIP;
59
+ constructor(mnemonic: string);
60
+ /** Main BCH wallet (mainnet) */
61
+ get BCH(): BchWallet;
62
+ /** Chipnet BCH wallet (testnet) */
63
+ get BCH_CHIP(): BchWallet;
64
+ /** Get the appropriate sub-wallet for the given network */
65
+ forNetwork(isChipnet: boolean): BchWallet;
66
+ }
67
+ /**
68
+ * Load a Wallet instance from the keychain.
69
+ * Returns null if no active wallet exists.
70
+ */
71
+ export declare function loadWallet(): Wallet | null;
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wallet/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGpC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,cAAc,GAAE,MAA4B,GAC3C,MAAM,CAWR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAQ3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG;IAChD,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB,CAWA;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,IAAI,CAQP;AAED;;;;;GAKG;AACH,qBAAa,MAAM;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,SAAS,CAAyB;gBAE9B,QAAQ,EAAE,MAAM;IAI5B,gCAAgC;IAChC,IAAI,GAAG,IAAI,SAAS,CAUnB;IAED,mCAAmC;IACnC,IAAI,QAAQ,IAAI,SAAS,CAUxB;IAED,2DAA2D;IAC3D,UAAU,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS;CAG1C;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAI1C"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Wallet management: mnemonic generation, storage, wallet loading.
3
+ *
4
+ * Adapted from: paytaca-app/src/wallet/index.js
5
+ *
6
+ * Key differences:
7
+ * - Uses @napi-rs/keyring (OS keychain) instead of Capacitor SecureStoragePlugin
8
+ * - Uses bip39 directly for mnemonic generation instead of @psf/bch-js
9
+ * - No SLP wallet
10
+ * - No migration logic (fresh CLI, no legacy key schemes)
11
+ * - computeWalletHash() is identical to paytaca-app
12
+ */
13
+ import { generateMnemonic as bip39Generate, validateMnemonic } from 'bip39';
14
+ import sha256 from 'js-sha256';
15
+ import { storeMnemonic as keychainStoreMnemonic, getMnemonic as keychainGetMnemonic, setActiveWallet, getActiveWallet, } from '../storage/keychain.js';
16
+ import { BchWallet } from './bch.js';
17
+ import { BCH_DERIVATION_PATH, projectId } from '../utils/network.js';
18
+ /**
19
+ * Compute wallet hash from mnemonic and derivation path.
20
+ * walletHash = sha256(sha256(mnemonic) + sha256(derivationPath))
21
+ *
22
+ * Identical to paytaca-app's computeWalletHash() in src/wallet/index.js
23
+ * and BchWallet.getWalletHash() in src/wallet/bch.js
24
+ */
25
+ export function computeWalletHash(mnemonic, derivationPath = BCH_DERIVATION_PATH) {
26
+ if (typeof mnemonic !== 'string' || mnemonic.length === 0) {
27
+ throw new TypeError('mnemonic must be a non-empty string');
28
+ }
29
+ if (typeof derivationPath !== 'string' || derivationPath.length === 0) {
30
+ throw new TypeError('derivationPath must be a non-empty string');
31
+ }
32
+ const mnemonicHash = sha256.sha256(mnemonic);
33
+ const derivationPathHash = sha256.sha256(derivationPath);
34
+ const walletHash = sha256.sha256(mnemonicHash + derivationPathHash);
35
+ return walletHash;
36
+ }
37
+ /**
38
+ * Generate a new 12-word BIP39 mnemonic, store it in the OS keychain,
39
+ * and set it as the active wallet.
40
+ *
41
+ * Adapted from paytaca-app generateMnemonic() — stripped of
42
+ * Capacitor SecureStoragePlugin and old key-scheme migration.
43
+ */
44
+ export function generateMnemonic() {
45
+ const mnemonic = bip39Generate(128); // 128 bits = 12 words
46
+ const walletHash = computeWalletHash(mnemonic);
47
+ keychainStoreMnemonic(mnemonic, walletHash);
48
+ setActiveWallet(walletHash);
49
+ return { mnemonic, walletHash };
50
+ }
51
+ /**
52
+ * Import an existing mnemonic, validate it, store in keychain,
53
+ * and set as active wallet.
54
+ */
55
+ export function importMnemonic(mnemonic) {
56
+ const trimmed = mnemonic.trim().toLowerCase();
57
+ if (!validateMnemonic(trimmed)) {
58
+ throw new Error('Invalid BIP39 mnemonic phrase');
59
+ }
60
+ const walletHash = computeWalletHash(trimmed);
61
+ keychainStoreMnemonic(trimmed, walletHash);
62
+ setActiveWallet(walletHash);
63
+ return { mnemonic: trimmed, walletHash };
64
+ }
65
+ /**
66
+ * Load the active wallet's mnemonic from keychain.
67
+ * Returns null if no active wallet is set or mnemonic is missing.
68
+ */
69
+ export function loadMnemonic() {
70
+ const walletHash = getActiveWallet();
71
+ if (!walletHash)
72
+ return null;
73
+ const mnemonic = keychainGetMnemonic(walletHash);
74
+ if (!mnemonic)
75
+ return null;
76
+ return { mnemonic, walletHash };
77
+ }
78
+ /**
79
+ * High-level wallet class that provides access to BCH sub-wallets.
80
+ *
81
+ * Adapted from paytaca-app's Wallet class in src/wallet/index.js.
82
+ * Stripped of SLP — only BCH mainnet and chipnet.
83
+ */
84
+ export class Wallet {
85
+ mnemonic;
86
+ _BCH = null;
87
+ _BCH_CHIP = null;
88
+ constructor(mnemonic) {
89
+ this.mnemonic = mnemonic;
90
+ }
91
+ /** Main BCH wallet (mainnet) */
92
+ get BCH() {
93
+ if (!this._BCH) {
94
+ this._BCH = new BchWallet(projectId.mainnet, this.mnemonic, BCH_DERIVATION_PATH, false);
95
+ }
96
+ return this._BCH;
97
+ }
98
+ /** Chipnet BCH wallet (testnet) */
99
+ get BCH_CHIP() {
100
+ if (!this._BCH_CHIP) {
101
+ this._BCH_CHIP = new BchWallet(projectId.chipnet, this.mnemonic, BCH_DERIVATION_PATH, true);
102
+ }
103
+ return this._BCH_CHIP;
104
+ }
105
+ /** Get the appropriate sub-wallet for the given network */
106
+ forNetwork(isChipnet) {
107
+ return isChipnet ? this.BCH_CHIP : this.BCH;
108
+ }
109
+ }
110
+ /**
111
+ * Load a Wallet instance from the keychain.
112
+ * Returns null if no active wallet exists.
113
+ */
114
+ export function loadWallet() {
115
+ const data = loadMnemonic();
116
+ if (!data)
117
+ return null;
118
+ return new Wallet(data.mnemonic);
119
+ }
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wallet/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * HD key derivation for Bitcoin Cash using libauth.
3
+ *
4
+ * Adapted from: paytaca-app/src/wallet/bch-libauth.js (LibauthHDWallet class)
5
+ *
6
+ * This is the modern derivation implementation that uses @bitauth/libauth
7
+ * and bip39 directly, without @psf/bch-js.
8
+ *
9
+ * Derivation path: m/44'/145'/0' (BIP44, coin type 145 = BCH)
10
+ * - Receiving addresses: m/44'/145'/0'/0/{index}
11
+ * - Change addresses: m/44'/145'/0'/1/{index}
12
+ */
13
+ import { type HdPrivateNodeValid } from '@bitauth/libauth';
14
+ export declare class LibauthHDWallet {
15
+ mnemonic: string;
16
+ derivationPath: string;
17
+ network: 'mainnet' | 'chipnet';
18
+ walletHash: string;
19
+ /**
20
+ * @param mnemonic - BIP39 mnemonic phrase
21
+ * @param derivationPath - HD derivation path (default: m/44'/145'/0')
22
+ * @param network - 'mainnet' or 'chipnet'
23
+ */
24
+ constructor(mnemonic?: string, derivationPath?: string, network?: 'mainnet' | 'chipnet');
25
+ get isChipnet(): boolean;
26
+ set isChipnet(value: boolean);
27
+ /**
28
+ * Compute wallet hash: sha256(sha256(mnemonic) + sha256(derivationPath))
29
+ * Identical to paytaca-app's computeWalletHash() and BchWallet.getWalletHash()
30
+ */
31
+ getWalletHash(): string;
32
+ /**
33
+ * Derive the main HD node at the derivation path.
34
+ * mnemonic → seed → master node → derive(path)
35
+ */
36
+ getMainNode(): HdPrivateNodeValid;
37
+ /**
38
+ * Derive an HD node at a relative sub-path from the main node.
39
+ * @param path - Relative path like '0/0' for receiving index 0
40
+ */
41
+ getNodeAt(path?: string): HdPrivateNodeValid;
42
+ /**
43
+ * Get the WIF-encoded private key at a sub-path.
44
+ */
45
+ getPrivateKeyWifAt(path?: string): string;
46
+ /**
47
+ * Get the compressed public key (hex) at a sub-path.
48
+ */
49
+ getPubkeyAt(path?: string): string;
50
+ /**
51
+ * Derive a CashAddress at a sub-path.
52
+ *
53
+ * @param opts.path - Sub-path like '0/0' (receiving) or '1/0' (change)
54
+ * @param opts.token - If true, return token-aware address (z-prefix)
55
+ */
56
+ getAddressAt(opts?: {
57
+ path?: string;
58
+ token?: boolean;
59
+ }): string;
60
+ /**
61
+ * Derive receiving and change addresses at a given index.
62
+ * Convenience method matching BchWallet.getAddressSetAt() from paytaca-app.
63
+ */
64
+ getAddressSetAt(index: number): {
65
+ receiving: string;
66
+ change: string;
67
+ };
68
+ }
69
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/wallet/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAOL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAA;AAIzB,qBAAa,eAAe;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,SAAS,GAAG,SAAS,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAElB;;;;OAIG;gBAED,QAAQ,GAAE,MAAW,EACrB,cAAc,GAAE,MAA4B,EAC5C,OAAO,GAAE,SAAS,GAAG,SAAqB;IAQ5C,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,EAE3B;IAED;;;OAGG;IACH,aAAa,IAAI,MAAM;IASvB;;;OAGG;IACH,WAAW,IAAI,kBAAkB;IAcjC;;;OAGG;IACH,SAAS,CAAC,IAAI,GAAE,MAAW,GAAG,kBAAkB;IAYhD;;OAEG;IACH,kBAAkB,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAK7C;;OAEG;IACH,WAAW,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAMtC;;;;;OAKG;IACH,YAAY,CAAC,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,MAAM;IAOnE;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAMtE"}