hodl-wallet 2.1.0 → 2.3.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 (117) hide show
  1. package/README.md +11 -11
  2. package/dist/app/account.d.ts +7 -0
  3. package/dist/app/account.js +248 -0
  4. package/dist/app/account.js.map +1 -0
  5. package/dist/app/format.d.ts +5 -0
  6. package/dist/app/format.js +33 -0
  7. package/dist/app/format.js.map +1 -0
  8. package/dist/app/history.d.ts +48 -0
  9. package/dist/app/history.js +115 -0
  10. package/dist/app/history.js.map +1 -0
  11. package/dist/app/index.d.ts +12 -0
  12. package/dist/app/index.js +9 -0
  13. package/dist/app/index.js.map +1 -0
  14. package/dist/app/menu.d.ts +13 -0
  15. package/dist/app/menu.js +93 -0
  16. package/dist/app/menu.js.map +1 -0
  17. package/dist/app/output.d.ts +17 -0
  18. package/dist/app/output.js +107 -0
  19. package/dist/app/output.js.map +1 -0
  20. package/dist/app/session.d.ts +125 -0
  21. package/dist/app/session.js +2 -0
  22. package/dist/app/session.js.map +1 -0
  23. package/dist/app/swap.d.ts +5 -0
  24. package/dist/app/swap.js +274 -0
  25. package/dist/app/swap.js.map +1 -0
  26. package/dist/app/transfer.d.ts +3 -0
  27. package/dist/app/transfer.js +144 -0
  28. package/dist/app/transfer.js.map +1 -0
  29. package/dist/app/ui.d.ts +73 -0
  30. package/dist/app/ui.js +15 -0
  31. package/dist/app/ui.js.map +1 -0
  32. package/dist/browser-core.d.ts +7 -1
  33. package/dist/browser-core.js +6 -1
  34. package/dist/browser-core.js.map +1 -1
  35. package/dist/config.d.ts +11 -0
  36. package/dist/config.js +12 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/hodl-file.d.ts +31 -0
  39. package/dist/hodl-file.js +78 -0
  40. package/dist/hodl-file.js.map +1 -0
  41. package/dist/index.js +24 -1096
  42. package/dist/index.js.map +1 -1
  43. package/dist/network/abis/erc20.d.ts +35 -13
  44. package/dist/network/abis/erc20.js +6 -26
  45. package/dist/network/abis/erc20.js.map +1 -1
  46. package/dist/network/arb.d.ts +5 -0
  47. package/dist/network/arb.js +5 -0
  48. package/dist/network/arb.js.map +1 -1
  49. package/dist/network/avax.d.ts +6 -0
  50. package/dist/network/avax.js +6 -0
  51. package/dist/network/avax.js.map +1 -1
  52. package/dist/network/bsc.d.ts +6 -0
  53. package/dist/network/bsc.js +6 -0
  54. package/dist/network/bsc.js.map +1 -1
  55. package/dist/network/eth.d.ts +6 -0
  56. package/dist/network/eth.js +6 -0
  57. package/dist/network/eth.js.map +1 -1
  58. package/dist/network/ftm.d.ts +6 -0
  59. package/dist/network/ftm.js +6 -0
  60. package/dist/network/ftm.js.map +1 -1
  61. package/dist/network/lib/BitcoinNetwork.d.ts +3 -1
  62. package/dist/network/lib/BitcoinNetwork.js +58 -13
  63. package/dist/network/lib/BitcoinNetwork.js.map +1 -1
  64. package/dist/network/lib/Web3Network.d.ts +10 -4
  65. package/dist/network/lib/Web3Network.js +141 -73
  66. package/dist/network/lib/Web3Network.js.map +1 -1
  67. package/dist/network/op.d.ts +5 -0
  68. package/dist/network/op.js +5 -0
  69. package/dist/network/op.js.map +1 -1
  70. package/dist/network/pol.d.ts +6 -0
  71. package/dist/network/pol.js +6 -0
  72. package/dist/network/pol.js.map +1 -1
  73. package/dist/network/types.d.ts +35 -0
  74. package/dist/network-registry.d.ts +6 -1
  75. package/dist/network-registry.js +28 -0
  76. package/dist/network-registry.js.map +1 -1
  77. package/dist/node-session.d.ts +53 -0
  78. package/dist/node-session.js +359 -0
  79. package/dist/node-session.js.map +1 -0
  80. package/dist/persist.d.ts +14 -7
  81. package/dist/persist.js +83 -108
  82. package/dist/persist.js.map +1 -1
  83. package/dist/request.d.ts +7 -0
  84. package/dist/request.js +26 -0
  85. package/dist/request.js.map +1 -0
  86. package/dist/swap/bitcoin.d.ts +1 -1
  87. package/dist/swap/bitcoin.js +7 -6
  88. package/dist/swap/bitcoin.js.map +1 -1
  89. package/dist/swap/chain.js +25 -40
  90. package/dist/swap/chain.js.map +1 -1
  91. package/dist/swap/config.d.ts +12 -0
  92. package/dist/swap/config.js +6 -0
  93. package/dist/swap/config.js.map +1 -1
  94. package/dist/swap/http.d.ts +2 -1
  95. package/dist/swap/http.js +8 -4
  96. package/dist/swap/http.js.map +1 -1
  97. package/dist/swap/providers.d.ts +15 -0
  98. package/dist/swap/providers.js +187 -1
  99. package/dist/swap/providers.js.map +1 -1
  100. package/dist/swap/routes.d.ts +28 -0
  101. package/dist/swap/routes.js +5 -3
  102. package/dist/swap/routes.js.map +1 -1
  103. package/dist/swap/service.d.ts +2 -1
  104. package/dist/swap/service.js +16 -5
  105. package/dist/swap/service.js.map +1 -1
  106. package/dist/swap/types.d.ts +3 -1
  107. package/dist/swap/types.js.map +1 -1
  108. package/dist/transfer-service.js +1 -2
  109. package/dist/transfer-service.js.map +1 -1
  110. package/dist/ui-inquirer.d.ts +37 -0
  111. package/dist/ui-inquirer.js +97 -0
  112. package/dist/ui-inquirer.js.map +1 -0
  113. package/dist/wallet-store.d.ts +2 -1
  114. package/package.json +17 -14
  115. package/dist/swap/ui.d.ts +0 -3
  116. package/dist/swap/ui.js +0 -257
  117. package/dist/swap/ui.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"network-registry.js","sourceRoot":"","sources":["../network-registry.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,WAAW,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACjC,OAAO,GAAG,MAAM,kBAAkB,CAAC;AAGnC,MAAM,CAAC,MAAM,eAAe,GAA6B,MAAM,CAAC,MAAM,CAAC;IACnE,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,EAAE;IACF,GAAG;IACH,IAAI;IACJ,WAAW;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IACrD,OAAO,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,MAAM,OAAO,eAAe;IACP,IAAI,CAA6B;IAElD,YAAY,WAAqC,eAAe;QAC5D,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;IAED,IAAI;QACA,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,EAAU;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,cAAc,CAAC,MAA+B;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
1
+ {"version":3,"file":"network-registry.js","sourceRoot":"","sources":["../network-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { ProfileLock } from './profile-lock.js';
2
+ import type { AccountDetails, ContactsPort, HostAction, NewAccount, RecentTransfers, SentTransfer, SessionCapabilities, TransferPort, WalletSession } from './app/session.js';
3
+ import type { BaseNetworkContract, NetworkPlugin } from './network/types.js';
4
+ /** The encrypted profile in ~/.HODL as a wallet session. Prompts only through the Ui it is given. */
5
+ export declare class NodeSession implements WalletSession {
6
+ readonly capabilities: SessionCapabilities;
7
+ readonly transfers: TransferPort;
8
+ readonly contacts: ContactsPort;
9
+ private db;
10
+ private selectedNetwork;
11
+ private networkInstance;
12
+ private networkUsage;
13
+ private readonly databaseExisted;
14
+ private readonly profileLock;
15
+ private readonly hodlDir;
16
+ constructor(encryptionKey: string, profileLock: ProfileLock);
17
+ get plugin(): NetworkPlugin;
18
+ get network(): BaseNetworkContract;
19
+ connect(): Promise<void>;
20
+ hasStoredDatabase(): boolean;
21
+ start(): Promise<void>;
22
+ /** Most recently used first. */
23
+ networks(): NetworkPlugin[];
24
+ selectNetwork(selectedNetwork: NetworkPlugin): Promise<void>;
25
+ private setAccount;
26
+ private getAccount;
27
+ address(): Promise<string>;
28
+ private getMnemonic;
29
+ hasMnemonic(): Promise<boolean>;
30
+ hasAccount(): Promise<boolean>;
31
+ createAccount(kind: NewAccount): Promise<void>;
32
+ importMnemonic(mnemonic: string): Promise<void>;
33
+ importPrivateKey(privateKey: string): Promise<void>;
34
+ accountDetails(): Promise<AccountDetails | null>;
35
+ tokenBalances(): Promise<Array<[string, string]>>;
36
+ sentTransfers(): Promise<SentTransfer[]>;
37
+ /** Saved under `chainTransfers`, then the address and the network's storage name. */
38
+ recentTransfers(): Promise<RecentTransfers>;
39
+ importActions(): HostAction[];
40
+ exportActions(): HostAction[];
41
+ menuActions(): HostAction[];
42
+ close(): Promise<void>;
43
+ private get storageNetworkName();
44
+ private transferService;
45
+ private transferPort;
46
+ private contactsPort;
47
+ private contactName;
48
+ private addToTransactions;
49
+ private swapFunds;
50
+ private securePersistFile;
51
+ private exportHODLFile;
52
+ private importHODLFile;
53
+ }
@@ -0,0 +1,359 @@
1
+ import fs from 'fs';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import Persist from './persist.js';
5
+ import { walletConfig } from './config.js';
6
+ import { TransferService } from './transfer-service.js';
7
+ import { NetworkRegistry, byRecentUse, isNetworkUsageEntry, networkStorageName, recordNetworkUse } from './network-registry.js';
8
+ import { SwapService } from './swap/service.js';
9
+ import { routeForNetwork } from './swap/routes.js';
10
+ import { errorMessage } from './app/format.js';
11
+ import { showError } from './app/output.js';
12
+ import { swapMenu } from './app/swap.js';
13
+ import { isTransferSnapshot, recentTransferRows, recordedTransferKeys, rescanTransfers, sentTransfers } from './app/history.js';
14
+ async function askEncryptionKey(ui) {
15
+ return ui.password({ message: 'Password:' });
16
+ }
17
+ /** The encrypted profile in ~/.HODL as a wallet session. Prompts only through the Ui it is given. */
18
+ export class NodeSession {
19
+ capabilities = { replaceAccount: true, balanceHistory: true, switchNetworkFirst: false };
20
+ transfers;
21
+ contacts;
22
+ db;
23
+ selectedNetwork;
24
+ networkInstance;
25
+ networkUsage;
26
+ databaseExisted;
27
+ profileLock;
28
+ hodlDir;
29
+ constructor(encryptionKey, profileLock) {
30
+ const hodlDir = path.join(os.homedir(), '.HODL');
31
+ this.hodlDir = hodlDir;
32
+ if (!fs.existsSync(hodlDir)) {
33
+ fs.mkdirSync(hodlDir, { recursive: true, mode: 0o700 });
34
+ }
35
+ fs.chmodSync(hodlDir, 0o700);
36
+ this.databaseExisted = fs.existsSync(path.join(hodlDir, 'persist.json'));
37
+ this.profileLock = profileLock;
38
+ try {
39
+ this.db = new Persist({ path: hodlDir, encryptionKey });
40
+ }
41
+ catch (error) {
42
+ this.profileLock.release();
43
+ throw error;
44
+ }
45
+ this.networkInstance = null;
46
+ this.selectedNetwork = null;
47
+ this.networkUsage = {};
48
+ this.transfers = this.transferPort();
49
+ this.contacts = this.contactsPort();
50
+ }
51
+ get plugin() { return this.selectedNetwork; }
52
+ get network() { return this.networkInstance; }
53
+ async connect() {
54
+ await this.db.connect();
55
+ this.securePersistFile();
56
+ }
57
+ hasStoredDatabase() {
58
+ return this.databaseExisted;
59
+ }
60
+ async start() {
61
+ const rawNetworkUsage = await this.db.get('networkUsage') || {};
62
+ // Validate and clean networkUsage data
63
+ this.networkUsage = {};
64
+ for (const [networkName, usage] of Object.entries(rawNetworkUsage)) {
65
+ if (typeof usage === 'number') {
66
+ // Old format - convert to new format
67
+ this.networkUsage[networkName] = {
68
+ count: usage,
69
+ lastUsed: 0
70
+ };
71
+ }
72
+ else if (isNetworkUsageEntry(usage)) {
73
+ // Valid new format
74
+ this.networkUsage[networkName] = {
75
+ count: usage.count,
76
+ lastUsed: usage.lastUsed || 0
77
+ };
78
+ }
79
+ // Skip corrupted entries (they'll be recreated when needed)
80
+ }
81
+ const networkPlugins = this.networks();
82
+ if (networkPlugins.length === 0) {
83
+ throw new Error('No valid network plugins found.');
84
+ }
85
+ // The most recently used network
86
+ await this.selectNetwork(networkPlugins[0]);
87
+ }
88
+ /** Most recently used first. */
89
+ networks() {
90
+ return byRecentUse(new NetworkRegistry().list(), this.networkUsage);
91
+ }
92
+ async selectNetwork(selectedNetwork) {
93
+ recordNetworkUse(this.networkUsage, selectedNetwork);
94
+ await this.db.set('networkUsage', this.networkUsage);
95
+ this.selectedNetwork = selectedNetwork;
96
+ this.networkInstance = new selectedNetwork.NetworkClass(selectedNetwork);
97
+ this.networkInstance.name = selectedNetwork.name;
98
+ }
99
+ async setAccount(account) {
100
+ if (!account) {
101
+ return;
102
+ }
103
+ await this.db.set('account', this.network.constructor.name, account);
104
+ if (account.mnemonic) {
105
+ await this.db.set('mnemonic', account.mnemonic);
106
+ }
107
+ }
108
+ async getAccount() {
109
+ const account = await this.db.get('account', this.network.constructor.name);
110
+ return account ?? null;
111
+ }
112
+ async address() {
113
+ return this.db.get('account', this.network.constructor.name, 'address');
114
+ }
115
+ async getMnemonic() {
116
+ return await this.db.get('mnemonic') ?? null;
117
+ }
118
+ async hasMnemonic() {
119
+ return Boolean(await this.getMnemonic());
120
+ }
121
+ async hasAccount() {
122
+ return typeof await this.db.get('account', this.network.constructor.name, 'address') === 'string';
123
+ }
124
+ async createAccount(kind) {
125
+ if (kind === 'existing-mnemonic') {
126
+ await this.setAccount(await this.network.accountFromMnemonic((await this.getMnemonic())));
127
+ }
128
+ else if (kind === 'random') {
129
+ await this.setAccount(await this.network.createAccount());
130
+ }
131
+ else {
132
+ await this.setAccount(await this.network.createAccountFromMnemonic(kind));
133
+ }
134
+ }
135
+ async importMnemonic(mnemonic) {
136
+ const account = await this.network.accountFromMnemonic(mnemonic);
137
+ await this.setAccount(account);
138
+ Persist.clearSensitiveData(account);
139
+ }
140
+ async importPrivateKey(privateKey) {
141
+ await this.setAccount(await this.network.privateKeyToAccount(privateKey));
142
+ }
143
+ async accountDetails() {
144
+ const account = await this.getAccount();
145
+ if (!account)
146
+ return null;
147
+ const mnemonic = await this.getMnemonic();
148
+ const details = {
149
+ address: await this.address(),
150
+ privateKey: account.privateKey,
151
+ ...(mnemonic ? { mnemonic } : {})
152
+ };
153
+ Persist.clearSensitiveData(account);
154
+ return details;
155
+ }
156
+ async tokenBalances() {
157
+ return this.network.getTokenBalances(await this.address());
158
+ }
159
+ async sentTransfers() {
160
+ const address = await this.address();
161
+ const recorded = [];
162
+ for (const key of recordedTransferKeys(this.selectedNetwork)) {
163
+ recorded.push(...await this.db.values('transactions', address, key));
164
+ }
165
+ return sentTransfers(this.selectedNetwork, address, recorded, await this.transferService().list(), recipient => this.contactName(recipient));
166
+ }
167
+ /** Saved under `chainTransfers`, then the address and the network's storage name. */
168
+ async recentTransfers() {
169
+ const address = await this.address();
170
+ // Deepbase reads a missing key as null.
171
+ const saved = await this.db.get('chainTransfers', address, this.storageNetworkName) ?? undefined;
172
+ if (saved !== undefined && !isTransferSnapshot(saved))
173
+ throw new Error('Invalid saved transfers.');
174
+ const { snapshot, error } = await rescanTransfers(saved, cursor => this.network.recentTransfers(address, walletConfig.history.recentTransfers, cursor));
175
+ if (!error && snapshot)
176
+ await this.db.set('chainTransfers', address, this.storageNetworkName, snapshot);
177
+ const transfers = await recentTransferRows(this.selectedNetwork, snapshot?.transfers ?? [], contact => this.contactName(contact));
178
+ return { transfers, ...(error ? { error } : {}) };
179
+ }
180
+ importActions() {
181
+ return [{ name: 'Import HODL File', run: ui => this.importHODLFile(ui) }];
182
+ }
183
+ exportActions() {
184
+ return [{ name: 'Export HODL File', run: ui => this.exportHODLFile(ui) }];
185
+ }
186
+ menuActions() {
187
+ return routeForNetwork(this.selectedNetwork.id) ? [{ name: 'Swap', run: ui => this.swapFunds(ui) }] : [];
188
+ }
189
+ async close() {
190
+ try {
191
+ await this.db.dispose();
192
+ }
193
+ finally {
194
+ this.securePersistFile();
195
+ this.profileLock.release();
196
+ }
197
+ }
198
+ get storageNetworkName() { return networkStorageName(this.selectedNetwork); }
199
+ transferService() {
200
+ return new TransferService(this.db, this.selectedNetwork, this.network);
201
+ }
202
+ transferPort() {
203
+ return {
204
+ pending: async () => (await this.transferService().list())
205
+ .filter(transfer => !['confirmed', 'failed'].includes(transfer.status))
206
+ .map(transfer => ({
207
+ requestId: transfer.requestId, to: transfer.to, asset: transfer.asset,
208
+ amount: transfer.amount, status: transfer.status
209
+ })),
210
+ preview: async ({ to, asset }) => {
211
+ const preview = await this.transferService().send({ wallet: 'default', to, asset, amount: 'max', dryRun: true });
212
+ return { amount: preview.amount, fee: preview.fee };
213
+ },
214
+ send: (draft, requestId) => this.transferService().send({
215
+ wallet: 'default', to: draft.to, asset: draft.asset, amount: draft.amount, requestId, dryRun: false
216
+ }),
217
+ record: async (result, draft) => {
218
+ const balance = (await this.network.getAssetBalance(result.from, draft.asset)).amount;
219
+ await this.addToTransactions(draft.to, draft.asset, result.amount, result.transactionHash, balance);
220
+ return {
221
+ timestamp: new Date(), recipient: draft.to, contact: await this.contactName(draft.to),
222
+ token: draft.asset, amount: result.amount, balance,
223
+ url: this.selectedNetwork.explorer + result.transactionHash
224
+ };
225
+ }
226
+ };
227
+ }
228
+ contactsPort() {
229
+ return {
230
+ list: async () => {
231
+ const contacts = await this.db.entries('contact', this.storageNetworkName) || [];
232
+ return contacts.map(([address, data]) => ({ address, name: data.name }));
233
+ },
234
+ get: async (address) => (await this.db.get('contact', this.storageNetworkName, address))?.name,
235
+ set: async (address, name) => { await this.db.set('contact', this.storageNetworkName, address, 'name', name); },
236
+ delete: async (address) => { await this.db.del('contact', this.storageNetworkName, address); },
237
+ clear: async () => { await this.db.del('contact'); }
238
+ };
239
+ }
240
+ async contactName(address) {
241
+ return this.contacts.get(address);
242
+ }
243
+ async addToTransactions(recipient, token, amount, hash, balance) {
244
+ const transaction = {
245
+ timestamp: new Date().toISOString(),
246
+ recipient,
247
+ token,
248
+ amount,
249
+ hash,
250
+ balance
251
+ };
252
+ const address = await this.address();
253
+ const history = await this.db.values('transactions', address, this.selectedNetwork.nativeToken) || [];
254
+ if (!history.some(entry => entry.hash === hash)) {
255
+ await this.db.add('transactions', address, this.selectedNetwork.nativeToken, transaction);
256
+ }
257
+ }
258
+ async swapFunds(ui) {
259
+ const route = routeForNetwork(this.selectedNetwork.id);
260
+ if (!route)
261
+ throw new Error('No swap route for the selected network.');
262
+ await swapMenu(ui, new SwapService(this.db, { routeId: route.id }));
263
+ }
264
+ securePersistFile() {
265
+ const persistPath = path.join(this.hodlDir, 'persist.json');
266
+ if (fs.existsSync(persistPath)) {
267
+ fs.chmodSync(persistPath, 0o600);
268
+ }
269
+ }
270
+ async exportHODLFile(ui) {
271
+ const address = await this.address();
272
+ const defaultFileName = `${address.slice(-6).toUpperCase()}`;
273
+ let fileName = await ui.input({
274
+ message: 'Enter the name for the HODL file:',
275
+ default: defaultFileName
276
+ });
277
+ fileName += '.HODL';
278
+ const encryptionKey = await askEncryptionKey(ui);
279
+ if (!this.db.matchesPassword(encryptionKey)) {
280
+ showError(ui, 'Failed to export HODL file.', 'The password is incorrect.');
281
+ return;
282
+ }
283
+ const data = await this.db.get();
284
+ try {
285
+ const encryptedData = Persist.encrypt(data, encryptionKey);
286
+ fs.writeFileSync(fileName, encryptedData);
287
+ }
288
+ finally {
289
+ Persist.clearSensitiveData(data);
290
+ }
291
+ ui.table({ head: ['HODL File Exported'], tone: 'green', rows: [[`File saved as: ${fileName}`]] });
292
+ }
293
+ async importHODLFile(ui) {
294
+ // Scan current directory for .HODL files
295
+ const currentDir = process.cwd();
296
+ let hodlFiles = [];
297
+ try {
298
+ const files = fs.readdirSync(currentDir);
299
+ hodlFiles = files.filter(file => file.endsWith('.HODL'));
300
+ }
301
+ catch (error) {
302
+ console.error('Error reading directory:', errorMessage(error));
303
+ }
304
+ // Create file options array for autocomplete
305
+ const fileOptions = hodlFiles.map(file => ({
306
+ name: file,
307
+ value: path.join(currentDir, file)
308
+ }));
309
+ // Use autocomplete pattern similar to transferFunds
310
+ const filePath = await ui.autocomplete({
311
+ message: 'HODL file path:',
312
+ source: input => {
313
+ const filenameOptions = fileOptions
314
+ .filter(entry => entry.name.toLowerCase().includes(input.toLowerCase()) || entry.value.toLowerCase().includes(input.toLowerCase()))
315
+ .map(entry => ({
316
+ name: entry.name,
317
+ value: entry.value
318
+ }));
319
+ // Put path options first, then filename options, then manual input
320
+ return [{ name: input, value: input }, ...filenameOptions];
321
+ }
322
+ });
323
+ // If user leaves empty, skip the operation
324
+ if (!filePath || filePath.trim() === '') {
325
+ return false;
326
+ }
327
+ // Validate the file path
328
+ if (!filePath.endsWith('.HODL')) {
329
+ showError(ui, 'File must have .HODL extension');
330
+ return false;
331
+ }
332
+ if (!fs.existsSync(filePath)) {
333
+ showError(ui, 'File not found.');
334
+ return false;
335
+ }
336
+ const encryptedData = fs.readFileSync(filePath, 'utf8');
337
+ if (!Persist.isCurrentFormat(encryptedData)) {
338
+ showError(ui, 'Unsupported HODL file.', 'Files saved in the legacy format can no longer be imported.');
339
+ return false;
340
+ }
341
+ const encryptionKey = await askEncryptionKey(ui);
342
+ let importedData;
343
+ try {
344
+ importedData = Persist.decrypt(encryptedData, encryptionKey);
345
+ await this.db.set(importedData);
346
+ const account = await this.getAccount();
347
+ Persist.clearSensitiveData(account);
348
+ return Boolean(account);
349
+ }
350
+ catch (error) {
351
+ showError(ui, 'Failed to import HODL file.', 'The password is incorrect.');
352
+ return false;
353
+ }
354
+ finally {
355
+ Persist.clearSensitiveData(importedData);
356
+ }
357
+ }
358
+ }
359
+ //# sourceMappingURL=node-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-session.js","sourceRoot":"","sources":["../node-session.ts"],"names":[],"mappings":"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"}
package/dist/persist.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import Deepbase from 'deepbase';
2
+ import type { ConnectResult } from 'deepbase';
2
3
  import type { WalletStore } from './wallet-store.js';
3
4
  type PersistOptions = {
4
5
  path: string;
@@ -7,25 +8,31 @@ type PersistOptions = {
7
8
  type EncryptionKey = string | Buffer;
8
9
  declare class Persist extends Deepbase implements WalletStore {
9
10
  private readonly encryptionKey;
10
- private readonly memoryKey;
11
+ private readonly legacy;
11
12
  private disposed;
12
13
  private readonly storagePath;
13
14
  constructor(opts: PersistOptions);
15
+ /** Opens the profile, rejecting a wrong password, and rewrites one saved before the encrypted document format. */
16
+ connect(): Promise<ConnectResult>;
14
17
  flush(): Promise<void>;
18
+ /** Whether the password is the one this profile is encrypted with. */
19
+ matchesPassword(password: string): boolean;
15
20
  dispose(): Promise<void>;
16
21
  static clearSensitiveData(value: unknown): void;
22
+ /** A .HODL file in the current format, v3. */
17
23
  static encrypt(obj: unknown, encryptionKey: EncryptionKey): string;
24
+ private static isLegacyProfile;
25
+ /** Whether the text is a v2 or v3 .HODL file. */
26
+ static isCurrentFormat(encryptedData: string): boolean;
27
+ /** A v2 or v3 .HODL file. Profiles saved before v2 are read with decryptProfile. */
18
28
  static decrypt(encryptedData: string, encryptionKey: EncryptionKey): unknown;
29
+ private static fileKey;
30
+ /** A profile saved as a v2 or older string, before the encrypted document format. */
31
+ static decryptProfile(encryptedData: string, encryptionKey: EncryptionKey): unknown;
19
32
  static decryptLegacy(encryptedData: string, encryptionKey: EncryptionKey): unknown;
20
33
  static evpBytesToKey(password: Buffer, salt: Buffer, keyLen: number, ivLen: number): {
21
34
  key: Buffer;
22
35
  iv: Buffer;
23
36
  };
24
- private static transformSecrets;
25
- private static isSensitivePath;
26
- private static isRecord;
27
- private static isSealedSecret;
28
- private static sealSecret;
29
- private static unsealSecret;
30
37
  }
31
38
  export default Persist;