hodl-wallet 2.2.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.
- package/README.md +10 -10
- package/dist/app/format.d.ts +3 -1
- package/dist/app/format.js +11 -5
- package/dist/app/format.js.map +1 -1
- package/dist/app/history.d.ts +48 -0
- package/dist/app/history.js +115 -0
- package/dist/app/history.js.map +1 -0
- package/dist/app/index.d.ts +7 -3
- package/dist/app/index.js +3 -1
- package/dist/app/index.js.map +1 -1
- package/dist/app/menu.d.ts +1 -0
- package/dist/app/menu.js +22 -7
- package/dist/app/menu.js.map +1 -1
- package/dist/app/output.d.ts +3 -1
- package/dist/app/output.js +30 -4
- package/dist/app/output.js.map +1 -1
- package/dist/app/session.d.ts +20 -0
- package/dist/app/swap.d.ts +5 -0
- package/dist/app/swap.js +274 -0
- package/dist/app/swap.js.map +1 -0
- package/dist/app/ui.d.ts +13 -0
- package/dist/app/ui.js.map +1 -1
- package/dist/browser-core.d.ts +5 -1
- package/dist/browser-core.js +4 -1
- package/dist/browser-core.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -0
- package/dist/hodl-file.d.ts +31 -0
- package/dist/hodl-file.js +78 -0
- package/dist/hodl-file.js.map +1 -0
- package/dist/network/abis/erc20.d.ts +35 -13
- package/dist/network/abis/erc20.js +6 -26
- package/dist/network/abis/erc20.js.map +1 -1
- package/dist/network/arb.d.ts +5 -0
- package/dist/network/arb.js +5 -0
- package/dist/network/arb.js.map +1 -1
- package/dist/network/avax.d.ts +6 -0
- package/dist/network/avax.js +6 -0
- package/dist/network/avax.js.map +1 -1
- package/dist/network/bsc.d.ts +6 -0
- package/dist/network/bsc.js +6 -0
- package/dist/network/bsc.js.map +1 -1
- package/dist/network/eth.d.ts +6 -0
- package/dist/network/eth.js +6 -0
- package/dist/network/eth.js.map +1 -1
- package/dist/network/ftm.d.ts +6 -0
- package/dist/network/ftm.js +6 -0
- package/dist/network/ftm.js.map +1 -1
- package/dist/network/lib/BitcoinNetwork.d.ts +3 -1
- package/dist/network/lib/BitcoinNetwork.js +58 -13
- package/dist/network/lib/BitcoinNetwork.js.map +1 -1
- package/dist/network/lib/Web3Network.d.ts +10 -4
- package/dist/network/lib/Web3Network.js +141 -73
- package/dist/network/lib/Web3Network.js.map +1 -1
- package/dist/network/op.d.ts +5 -0
- package/dist/network/op.js +5 -0
- package/dist/network/op.js.map +1 -1
- package/dist/network/pol.d.ts +6 -0
- package/dist/network/pol.js +6 -0
- package/dist/network/pol.js.map +1 -1
- package/dist/network/types.d.ts +35 -0
- package/dist/network-registry.d.ts +6 -1
- package/dist/network-registry.js +28 -0
- package/dist/network-registry.js.map +1 -1
- package/dist/node-session.d.ts +3 -1
- package/dist/node-session.js +26 -77
- package/dist/node-session.js.map +1 -1
- package/dist/persist.d.ts +10 -9
- package/dist/persist.js +56 -101
- package/dist/persist.js.map +1 -1
- package/dist/request.d.ts +7 -0
- package/dist/request.js +26 -0
- package/dist/request.js.map +1 -0
- package/dist/swap/bitcoin.d.ts +1 -1
- package/dist/swap/bitcoin.js +7 -6
- package/dist/swap/bitcoin.js.map +1 -1
- package/dist/swap/chain.js +25 -40
- package/dist/swap/chain.js.map +1 -1
- package/dist/swap/config.d.ts +12 -0
- package/dist/swap/config.js +6 -0
- package/dist/swap/config.js.map +1 -1
- package/dist/swap/http.d.ts +2 -1
- package/dist/swap/http.js +8 -4
- package/dist/swap/http.js.map +1 -1
- package/dist/swap/providers.d.ts +15 -0
- package/dist/swap/providers.js +187 -1
- package/dist/swap/providers.js.map +1 -1
- package/dist/swap/routes.d.ts +28 -0
- package/dist/swap/routes.js +5 -3
- package/dist/swap/routes.js.map +1 -1
- package/dist/swap/service.d.ts +2 -1
- package/dist/swap/service.js +16 -5
- package/dist/swap/service.js.map +1 -1
- package/dist/swap/types.d.ts +3 -1
- package/dist/swap/types.js.map +1 -1
- package/dist/transfer-service.js +1 -2
- package/dist/transfer-service.js.map +1 -1
- package/dist/ui-inquirer.d.ts +8 -1
- package/dist/ui-inquirer.js +45 -10
- package/dist/ui-inquirer.js.map +1 -1
- package/dist/wallet-store.d.ts +2 -1
- package/package.json +13 -14
- package/dist/swap/ui.d.ts +0 -3
- package/dist/swap/ui.js +0 -257
- package/dist/swap/ui.js.map +0 -1
package/README.md
CHANGED
|
@@ -125,10 +125,11 @@ transaction. The destination account is offered by default; you can also type
|
|
|
125
125
|
an external address for the destination network. Importing only an EVM private
|
|
126
126
|
key does not create a Bitcoin account.
|
|
127
127
|
|
|
128
|
-
HODL compares single-execution Chainflip with automatic THORChain
|
|
129
|
-
which divides the exchange into smaller swaps to reduce price impact. Unavailable,
|
|
128
|
+
HODL compares single-execution Chainflip and NEAR Intents with automatic THORChain
|
|
129
|
+
streaming, which divides the exchange into smaller swaps to reduce price impact. Unavailable,
|
|
130
130
|
paused, or unsupported routes are shown separately. DCA, boosts and HODL affiliate
|
|
131
|
-
commissions are not enabled.
|
|
131
|
+
commissions are not enabled. NEAR Intents charges its own 0.2% platform fee, shown
|
|
132
|
+
with the quote and included in the comparison; quotes with any higher fee are rejected. Streaming and its estimated duration are shown
|
|
132
133
|
before confirmation. The best available quote is ranked by estimated destination value after accounting for the separate source-network fee: BNB for BSC, or BTC for Bitcoin.
|
|
133
134
|
Total cost includes fees and price impact against a recent CoinGecko reference;
|
|
134
135
|
it is an estimate, not a guaranteed execution price. There is no fixed cost cap:
|
|
@@ -155,7 +156,7 @@ budget. `--watch` emits JSONL progress envelopes followed by the final result.
|
|
|
155
156
|
Without `--watch`, execution returns after publishing the next funding step;
|
|
156
157
|
use `resume --yes` to continue after an approval confirms. `status` only observes
|
|
157
158
|
and never submits a transaction. Only one unfinished swap per profile is
|
|
158
|
-
allowed, and it blocks other HODL
|
|
159
|
+
allowed, and it blocks other HODL transfers on the network it spends from until resolved.
|
|
159
160
|
|
|
160
161
|
The minimum destination amount for a full swap limits deterioration from the accepted quote to 0.5%.
|
|
161
162
|
This is separate from total fees. Source approvals grant only the required
|
|
@@ -213,21 +214,20 @@ We're as transparent as your ex's excuses. Our code is open-source, and we encou
|
|
|
213
214
|
We've carefully selected trusted and well-maintained dependencies for this project. Our goal is to balance functionality with security. Here's a brief overview of our main dependencies:
|
|
214
215
|
|
|
215
216
|
- Common
|
|
216
|
-
- **inquirer
|
|
217
|
-
- **inquirer-fuzzy-path**: For fuzzy searching and selecting file paths during HODL file import.
|
|
217
|
+
- **inquirer**: For interactive command-line interfaces.
|
|
218
218
|
- **cli-table3**: For creating formatted CLI tables.
|
|
219
219
|
- **ora**: For displaying progress bars.
|
|
220
220
|
- **deepbase**: For persistent storage.
|
|
221
221
|
- **node:crypto**: Native encryption for JSON storage.
|
|
222
|
-
-
|
|
222
|
+
- **@scure/bip39**: For generating and handling mnemonic phrases.
|
|
223
223
|
- Web3
|
|
224
|
-
- **
|
|
225
|
-
-
|
|
224
|
+
- **viem**: For EVM RPC, contract encoding and transaction signing.
|
|
225
|
+
- **@scure/bip32**: For handling hierarchical deterministic (HD) keys.
|
|
226
226
|
- Bitcoin
|
|
227
227
|
- **bitcoinjs-lib**: For Bitcoin-specific operations.
|
|
228
228
|
- **bip32**: For handling hierarchical deterministic (HD) keys.
|
|
229
229
|
- **ecpair**: For elliptic curve pairings.
|
|
230
|
-
-
|
|
230
|
+
- **@bitcoinerlab/secp256k1**: For elliptic curve secp256k1 operations.
|
|
231
231
|
|
|
232
232
|
⚠️ **Important Notice**: HODL Wallet is a personal project created with the best intentions. While we strive for security, it may contain security flaws or vulnerabilities. Use at your own risk and always exercise caution with your crypto assets.
|
|
233
233
|
|
package/dist/app/format.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { errorMessage } from '../request.js';
|
|
2
2
|
export declare function formatAmount(num: number | string): string;
|
|
3
|
+
/** USDT shows cents; other tokens use the shared amount format. */
|
|
4
|
+
export declare function formatTokenAmount(token: string, amount: number | string): string;
|
|
3
5
|
export declare function formatDate(date: string | number | Date): string;
|
package/dist/app/format.js
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
|
-
export
|
|
2
|
-
return error instanceof Error ? error.message : String(error);
|
|
3
|
-
}
|
|
1
|
+
export { errorMessage } from '../request.js';
|
|
4
2
|
export function formatAmount(num) {
|
|
3
|
+
return amountWithDecimals(num, 3);
|
|
4
|
+
}
|
|
5
|
+
/** USDT shows cents; other tokens use the shared amount format. */
|
|
6
|
+
export function formatTokenAmount(token, amount) {
|
|
7
|
+
return amountWithDecimals(amount, token === 'USDT' ? 2 : 3);
|
|
8
|
+
}
|
|
9
|
+
function amountWithDecimals(num, maxDecimals) {
|
|
5
10
|
num = parseFloat(num.toString());
|
|
6
11
|
// Integers get .00
|
|
7
12
|
if (num === Math.floor(num)) {
|
|
8
13
|
return num.toString() + '.00';
|
|
9
14
|
}
|
|
10
|
-
// Decimals: at most
|
|
11
|
-
|
|
15
|
+
// Decimals: at most `maxDecimals` places, or as many as the first two significant digits need,
|
|
16
|
+
// so a nonzero amount never shows as zero; trailing zeros removed, at least 2 kept
|
|
17
|
+
let formatted = num.toFixed(Math.max(maxDecimals, 1 - Math.floor(Math.log10(Math.abs(num)))));
|
|
12
18
|
while (formatted.endsWith('0') && formatted.split('.')[1].length > 2) {
|
|
13
19
|
formatted = formatted.slice(0, -1);
|
|
14
20
|
}
|
package/dist/app/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../app/format.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../app/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,UAAU,YAAY,CAAC,GAAoB;IAC7C,OAAO,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,MAAuB;IACpE,OAAO,kBAAkB,CAAC,MAAM,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAoB,EAAE,WAAmB;IACjE,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEjC,mBAAmB;IACnB,IAAI,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,+FAA+F;IAC/F,mFAAmF;IACnF,IAAI,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9F,OAAO,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnE,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAA4B;IACnD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;QAC1C,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,KAAK;KAChB,CAAC,CAAC,OAAO,CAAC,2BAA2B,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ChainTransfer, NetworkPlugin, TransferScan } from '../network/types.js';
|
|
2
|
+
import type { TransferResult } from '../transfer-service.js';
|
|
3
|
+
import type { TransferRow, SentTransfer } from './session.js';
|
|
4
|
+
/** A sent transfer recorded under `transactions`, then the sender's address, a history key and an id. */
|
|
5
|
+
export type RecordedTransfer = {
|
|
6
|
+
timestamp: string;
|
|
7
|
+
recipient: string;
|
|
8
|
+
token: string;
|
|
9
|
+
amount: string | number;
|
|
10
|
+
hash: string;
|
|
11
|
+
balance?: string | number;
|
|
12
|
+
status?: string;
|
|
13
|
+
};
|
|
14
|
+
/** A transfer from the durable journal (`sendRequest`). */
|
|
15
|
+
export type JournalTransfer = TransferResult & {
|
|
16
|
+
createdAt: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function isRecordedTransfer(value: unknown): value is RecordedTransfer;
|
|
19
|
+
/** The history keys holding a network's recorded transfers: its native token, plus the symbol older versions used for Optimism and Arbitrum. */
|
|
20
|
+
export declare function recordedTransferKeys(plugin: NetworkPlugin): string[];
|
|
21
|
+
/** Transfers sent from `address`, oldest first: the recorded ones and the journal's, whose status wins for the same hash. */
|
|
22
|
+
export declare function sentTransfers(plugin: NetworkPlugin, address: string, recorded: RecordedTransfer[], journal: JournalTransfer[], contactName: (address: string) => Promise<string | undefined>): Promise<SentTransfer[]>;
|
|
23
|
+
/** What a host saves of one address's transfers on a network: what scans found, and where the next scan starts. */
|
|
24
|
+
export type TransferSnapshot = {
|
|
25
|
+
cursor?: string;
|
|
26
|
+
transfers: ChainTransfer[];
|
|
27
|
+
};
|
|
28
|
+
export declare function isTransferSnapshot(value: unknown): value is TransferSnapshot;
|
|
29
|
+
/** The snapshot with a scan added. Unconfirmed transfers stay only while scans still report them; the newest are kept. */
|
|
30
|
+
export declare function mergeTransferScan(saved: TransferSnapshot | undefined, scan: TransferScan): TransferSnapshot;
|
|
31
|
+
/** Scans from where the saved snapshot left off. A failed scan leaves the snapshot as saved and says why. */
|
|
32
|
+
export declare function rescanTransfers(saved: TransferSnapshot | undefined, scan: (cursor: string | undefined) => Promise<TransferScan>): Promise<{
|
|
33
|
+
snapshot: TransferSnapshot | undefined;
|
|
34
|
+
error?: string;
|
|
35
|
+
}>;
|
|
36
|
+
/** Recent transfers as listed by the network, newest first, with the other party's contact name. */
|
|
37
|
+
export declare function recentTransferRows(plugin: NetworkPlugin, transfers: ChainTransfer[], contactName: (address: string) => Promise<string | undefined>): Promise<TransferRow[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Sent transfers and the network's recent ones as one list, oldest first and unconfirmed last.
|
|
40
|
+
* A sent transfer stands for the network's outgoing rows of the same transaction. The network's
|
|
41
|
+
* transfers worth nothing (anyone can move zero on another's behalf) and incoming ones from an
|
|
42
|
+
* address imitating one paid or known (`known`: the wallet's own and its contacts) are left out as
|
|
43
|
+
* likely address poisoning and only counted.
|
|
44
|
+
*/
|
|
45
|
+
export declare function transferRows(sent: SentTransfer[], recent: TransferRow[], known: string[]): {
|
|
46
|
+
rows: TransferRow[];
|
|
47
|
+
hidden: number;
|
|
48
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { walletConfig } from '../config.js';
|
|
2
|
+
import { errorMessage } from './format.js';
|
|
3
|
+
import { isPromptAborted } from './ui.js';
|
|
4
|
+
function isRecord(value) {
|
|
5
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
export function isRecordedTransfer(value) {
|
|
8
|
+
return isRecord(value) && ['timestamp', 'recipient', 'token', 'hash'].every(field => typeof value[field] === 'string') &&
|
|
9
|
+
['string', 'number'].includes(typeof value.amount) &&
|
|
10
|
+
(value.balance === undefined || ['string', 'number'].includes(typeof value.balance)) &&
|
|
11
|
+
(value.status === undefined || typeof value.status === 'string');
|
|
12
|
+
}
|
|
13
|
+
/** The history keys holding a network's recorded transfers: its native token, plus the symbol older versions used for Optimism and Arbitrum. */
|
|
14
|
+
export function recordedTransferKeys(plugin) {
|
|
15
|
+
const legacy = { op: 'OP', arb: 'ARB' }[plugin.id];
|
|
16
|
+
return legacy ? [plugin.nativeToken, legacy] : [plugin.nativeToken];
|
|
17
|
+
}
|
|
18
|
+
/** Transfers sent from `address`, oldest first: the recorded ones and the journal's, whose status wins for the same hash. */
|
|
19
|
+
export async function sentTransfers(plugin, address, recorded, journal, contactName) {
|
|
20
|
+
const history = recorded.map(transfer => ({ ...transfer }));
|
|
21
|
+
for (const transfer of journal.filter(item => item.from === address)) {
|
|
22
|
+
const existing = history.find(item => item.hash === transfer.transactionHash);
|
|
23
|
+
if (existing)
|
|
24
|
+
existing.status = transfer.status;
|
|
25
|
+
else
|
|
26
|
+
history.push({
|
|
27
|
+
timestamp: transfer.createdAt, recipient: transfer.to, token: transfer.asset,
|
|
28
|
+
amount: transfer.amount, hash: transfer.transactionHash, status: transfer.status
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
history.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
32
|
+
return Promise.all(history.map(async (tx) => ({
|
|
33
|
+
timestamp: tx.timestamp, recipient: tx.recipient, contact: await contactName(tx.recipient),
|
|
34
|
+
token: tx.token, amount: tx.amount, balance: tx.balance, status: tx.status,
|
|
35
|
+
url: plugin.explorer + tx.hash
|
|
36
|
+
})));
|
|
37
|
+
}
|
|
38
|
+
function isChainTransfer(value) {
|
|
39
|
+
return isRecord(value) && ['id', 'hash', 'counterparty', 'asset', 'amount'].every(field => typeof value[field] === 'string') &&
|
|
40
|
+
['in', 'out'].includes(value.direction) && ['pending', 'confirmed'].includes(value.state) &&
|
|
41
|
+
(value.timestamp === undefined || typeof value.timestamp === 'string');
|
|
42
|
+
}
|
|
43
|
+
export function isTransferSnapshot(value) {
|
|
44
|
+
return isRecord(value) && (value.cursor === undefined || typeof value.cursor === 'string') &&
|
|
45
|
+
Array.isArray(value.transfers) && value.transfers.every(isChainTransfer);
|
|
46
|
+
}
|
|
47
|
+
const newestFirst = (a, b) => (b.timestamp ?? '\uffff').localeCompare(a.timestamp ?? '\uffff');
|
|
48
|
+
/** The snapshot with a scan added. Unconfirmed transfers stay only while scans still report them; the newest are kept. */
|
|
49
|
+
export function mergeTransferScan(saved, scan) {
|
|
50
|
+
const transfers = new Map((saved?.transfers ?? []).filter(tx => tx.state === 'confirmed').map(tx => [tx.id, tx]));
|
|
51
|
+
for (const tx of scan.transfers)
|
|
52
|
+
transfers.set(tx.id, tx);
|
|
53
|
+
const cursor = scan.cursor ?? saved?.cursor;
|
|
54
|
+
return {
|
|
55
|
+
...(cursor !== undefined ? { cursor } : {}),
|
|
56
|
+
transfers: [...transfers.values()].sort(newestFirst).slice(0, walletConfig.history.keptTransfers)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Scans from where the saved snapshot left off. A failed scan leaves the snapshot as saved and says why. */
|
|
60
|
+
export async function rescanTransfers(saved, scan) {
|
|
61
|
+
try {
|
|
62
|
+
return { snapshot: mergeTransferScan(saved, await scan(saved?.cursor)) };
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (isPromptAborted(error))
|
|
66
|
+
throw error;
|
|
67
|
+
return { snapshot: saved, error: errorMessage(error) };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** Recent transfers as listed by the network, newest first, with the other party's contact name. */
|
|
71
|
+
export function recentTransferRows(plugin, transfers, contactName) {
|
|
72
|
+
return Promise.all(transfers.map(async (tx) => ({
|
|
73
|
+
...(tx.timestamp ? { timestamp: tx.timestamp } : {}),
|
|
74
|
+
direction: tx.direction === 'in' ? 'In' : 'Out',
|
|
75
|
+
counterparty: tx.counterparty, contact: await contactName(tx.counterparty),
|
|
76
|
+
token: tx.asset, amount: tx.amount, status: tx.state,
|
|
77
|
+
url: plugin.explorer + tx.hash
|
|
78
|
+
})));
|
|
79
|
+
}
|
|
80
|
+
/** The part of an address after its format prefix, which an imitation copies. */
|
|
81
|
+
function addressBody(address) {
|
|
82
|
+
return address.toLowerCase().replace(/^(0x|bc1.|tb1.|[123mn])/, '');
|
|
83
|
+
}
|
|
84
|
+
/** Whether the address starts or ends like a known one without being it, as address poisoning does. */
|
|
85
|
+
function imitates(address, known) {
|
|
86
|
+
const chars = walletConfig.history.lookAlikeChars;
|
|
87
|
+
const body = addressBody(address);
|
|
88
|
+
return known.map(addressBody).some(other => other !== body &&
|
|
89
|
+
(other.slice(0, chars) === body.slice(0, chars) || other.slice(-chars) === body.slice(-chars)));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Sent transfers and the network's recent ones as one list, oldest first and unconfirmed last.
|
|
93
|
+
* A sent transfer stands for the network's outgoing rows of the same transaction. The network's
|
|
94
|
+
* transfers worth nothing (anyone can move zero on another's behalf) and incoming ones from an
|
|
95
|
+
* address imitating one paid or known (`known`: the wallet's own and its contacts) are left out as
|
|
96
|
+
* likely address poisoning and only counted.
|
|
97
|
+
*/
|
|
98
|
+
export function transferRows(sent, recent, known) {
|
|
99
|
+
const sentUrls = new Set(sent.map(tx => tx.url));
|
|
100
|
+
const valued = recent.filter(tx => Number(tx.amount) > 0);
|
|
101
|
+
const outgoing = valued.filter(tx => tx.direction === 'Out');
|
|
102
|
+
const paid = [...known, ...sent.map(tx => tx.recipient), ...outgoing.map(tx => tx.counterparty)];
|
|
103
|
+
const incoming = valued.filter(tx => tx.direction === 'In' && !imitates(tx.counterparty, paid));
|
|
104
|
+
const rows = [
|
|
105
|
+
...sent.map(({ recipient, ...tx }) => ({ ...tx, direction: 'Out', counterparty: recipient })),
|
|
106
|
+
...outgoing.filter(tx => !sentUrls.has(tx.url)),
|
|
107
|
+
...incoming
|
|
108
|
+
];
|
|
109
|
+
const time = (row) => row.timestamp === undefined ? Infinity : new Date(row.timestamp).getTime();
|
|
110
|
+
return {
|
|
111
|
+
rows: rows.sort((a, b) => time(a) === time(b) ? 0 : time(a) < time(b) ? -1 : 1),
|
|
112
|
+
hidden: recent.length - outgoing.length - incoming.length
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../app/history.ts"],"names":[],"mappings":"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"}
|
package/dist/app/index.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
export { PromptAborted, isPromptAborted } from './ui.js';
|
|
2
|
-
export type { Cell, Choice, Spinner, TableSpec, Tone, Ui, Validation } from './ui.js';
|
|
3
|
-
export type { AccountDetails, Contact, ContactsPort, HostAction, NewAccount, PendingTransfer, SentTransfer, SessionCapabilities, TransferDraft, TransferPort, WalletSession } from './session.js';
|
|
2
|
+
export type { Cell, Choice, Spinner, TableSpec, Tone, Ui, Validation, Watch } from './ui.js';
|
|
3
|
+
export type { AccountDetails, Contact, ContactsPort, HostAction, NewAccount, PendingTransfer, RecentTransfers, TransferRow, SentTransfer, SessionCapabilities, TransferDraft, TransferPort, WalletSession } from './session.js';
|
|
4
4
|
export { WELCOME_ART, farewell, showAddress, showError, welcome } from './output.js';
|
|
5
|
-
export { errorMessage, formatAmount, formatDate } from './format.js';
|
|
5
|
+
export { errorMessage, formatAmount, formatDate, formatTokenAmount } from './format.js';
|
|
6
6
|
export { AccountNotInitialized, initialize, mainMenu, runWallet, showBalance, showTransactions } from './menu.js';
|
|
7
7
|
export { loadAccount, showAccountDetails, switchNetwork } from './account.js';
|
|
8
8
|
export { transferFunds } from './transfer.js';
|
|
9
|
+
export { swapMenu } from './swap.js';
|
|
10
|
+
export type { SwapPort } from './swap.js';
|
|
11
|
+
export { isRecordedTransfer, isTransferSnapshot, mergeTransferScan, recentTransferRows, recordedTransferKeys, rescanTransfers, sentTransfers, transferRows } from './history.js';
|
|
12
|
+
export type { JournalTransfer, RecordedTransfer, TransferSnapshot } from './history.js';
|
package/dist/app/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { PromptAborted, isPromptAborted } from './ui.js';
|
|
2
2
|
export { WELCOME_ART, farewell, showAddress, showError, welcome } from './output.js';
|
|
3
|
-
export { errorMessage, formatAmount, formatDate } from './format.js';
|
|
3
|
+
export { errorMessage, formatAmount, formatDate, formatTokenAmount } from './format.js';
|
|
4
4
|
export { AccountNotInitialized, initialize, mainMenu, runWallet, showBalance, showTransactions } from './menu.js';
|
|
5
5
|
export { loadAccount, showAccountDetails, switchNetwork } from './account.js';
|
|
6
6
|
export { transferFunds } from './transfer.js';
|
|
7
|
+
export { swapMenu } from './swap.js';
|
|
8
|
+
export { isRecordedTransfer, isTransferSnapshot, mergeTransferScan, recentTransferRows, recordedTransferKeys, rescanTransfers, sentTransfers, transferRows } from './history.js';
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
package/dist/app/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAMzD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAMzD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClH,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/app/menu.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare class AccountNotInitialized extends Error {
|
|
|
5
5
|
constructor();
|
|
6
6
|
}
|
|
7
7
|
export declare function showBalance(ui: Ui, session: WalletSession): Promise<void>;
|
|
8
|
+
/** Sent transfers together with the network's ones in and out. Saved ones still show when the network cannot be read. */
|
|
8
9
|
export declare function showTransactions(ui: Ui, session: WalletSession): Promise<void>;
|
|
9
10
|
export declare function mainMenu(ui: Ui, session: WalletSession): Promise<void>;
|
|
10
11
|
export declare function initialize(ui: Ui, session: WalletSession): Promise<void>;
|
package/dist/app/menu.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { loadAccount } from './account.js';
|
|
2
|
-
import { errorMessage,
|
|
3
|
-
import {
|
|
2
|
+
import { errorMessage, formatTokenAmount } from './format.js';
|
|
3
|
+
import { transferRows } from './history.js';
|
|
4
|
+
import { showAddress, showError, transfersTable } from './output.js';
|
|
4
5
|
import { transferFunds } from './transfer.js';
|
|
5
6
|
/** No account exists after the account menu closed. Hosts that can show the menu again may do so quietly. */
|
|
6
7
|
export class AccountNotInitialized extends Error {
|
|
@@ -19,13 +20,27 @@ export async function showBalance(ui, session) {
|
|
|
19
20
|
head: ['Token', 'Balance'],
|
|
20
21
|
tone: 'blue',
|
|
21
22
|
colWidths: [21, 22],
|
|
22
|
-
rows: balances.map(([token, balance]) => [token,
|
|
23
|
-
token === 'USDT' ? Number(balance).toFixed(2) : formatAmount(balance)])
|
|
23
|
+
rows: balances.map(([token, balance]) => [token, formatTokenAmount(token, balance)])
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
+
/** Sent transfers together with the network's ones in and out. Saved ones still show when the network cannot be read. */
|
|
26
27
|
export async function showTransactions(ui, session) {
|
|
27
|
-
const
|
|
28
|
-
|
|
28
|
+
const spinner = ui.spinner('Checking transfers...');
|
|
29
|
+
let sent, recent;
|
|
30
|
+
try {
|
|
31
|
+
sent = await session.sentTransfers();
|
|
32
|
+
recent = session.network.recentTransfers ? await session.recentTransfers() : { transfers: [] };
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
spinner.stop();
|
|
36
|
+
}
|
|
37
|
+
if (recent.error)
|
|
38
|
+
ui.print(`Could not check recent transfers: ${recent.error}`);
|
|
39
|
+
const known = [await session.address(), ...(await session.contacts?.list() ?? []).map(contact => contact.address)];
|
|
40
|
+
const { rows, hidden } = transferRows(sent, recent.transfers, known);
|
|
41
|
+
if (hidden)
|
|
42
|
+
ui.print(`Hidden ${hidden} ${hidden === 1 ? 'transfer' : 'transfers'} that look like address poisoning.`);
|
|
43
|
+
ui.table(transfersTable(session, rows));
|
|
29
44
|
}
|
|
30
45
|
export async function mainMenu(ui, session) {
|
|
31
46
|
for (;;) {
|
|
@@ -34,7 +49,7 @@ export async function mainMenu(ui, session) {
|
|
|
34
49
|
choices: [
|
|
35
50
|
{ name: 'Transfer Funds', value: 'transferFunds' },
|
|
36
51
|
{ name: 'Show Balance', value: 'balance' },
|
|
37
|
-
{ name: 'Show
|
|
52
|
+
{ name: 'Show Transfers', value: 'showTransactions' },
|
|
38
53
|
{ name: 'Account Settings', value: 'account' },
|
|
39
54
|
...session.menuActions().map(item => ({ name: item.name, value: item })),
|
|
40
55
|
{ name: 'Exit', value: 'exit' }
|
package/dist/app/menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../app/menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../app/menu.ts"],"names":[],"mappings":"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"}
|
package/dist/app/output.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SentTransfer, WalletSession } from './session.js';
|
|
1
|
+
import type { TransferRow, SentTransfer, WalletSession } from './session.js';
|
|
2
2
|
import type { TableSpec, Tone, Ui } from './ui.js';
|
|
3
3
|
export declare const WELCOME_ART = " \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2588 \u2588\u2003\u2588\u2580\u2588\u2003\u2588\u2580\u2584\u2003\u2588 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2588\u2580\u2588\u2003\u2588\u2584\u2588\u2003\u2588\u2584\u2580\u2003\u2588\u2584\u2584 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\n \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 WALLET \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591";
|
|
4
4
|
export declare function welcome(ui: Ui): void;
|
|
@@ -13,3 +13,5 @@ export declare function sentTransfersTable(session: Pick<WalletSession, 'capabil
|
|
|
13
13
|
tone: Tone;
|
|
14
14
|
empty?: string;
|
|
15
15
|
}): TableSpec;
|
|
16
|
+
/** Transfers in and out laid out as sent transfers, incoming amounts marked with +, one row each followed by its explorer link. */
|
|
17
|
+
export declare function transfersTable(session: Pick<WalletSession, 'capabilities' | 'contacts'>, transfers: TransferRow[]): TableSpec;
|
package/dist/app/output.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { errorMessage,
|
|
1
|
+
import { errorMessage, formatDate, formatTokenAmount } from './format.js';
|
|
2
2
|
export const WELCOME_ART = ` ░░░░░░░░░░░░░░ █ █\u2003█▀█\u2003█▀▄\u2003█ ░░░░░░░░░░░░░░
|
|
3
3
|
░░░░░░░░░░░░░░ █▀█\u2003█▄█\u2003█▄▀\u2003█▄▄ ░░░░░░░░░░░░░░
|
|
4
4
|
░░░░░░░░░░░░░░ ──────── WALLET ░░░░░░░░░░░░░░`;
|
|
@@ -50,7 +50,7 @@ export function showTransactionError(ui, error) {
|
|
|
50
50
|
const reason = typeof error === 'object' && error !== null && 'reason' in error
|
|
51
51
|
? String(error.reason)
|
|
52
52
|
: null;
|
|
53
|
-
const message =
|
|
53
|
+
const message = errorMessage(error);
|
|
54
54
|
const data = reason ? reason.replace(/(\w+):/g, "\n$1:").trim() : null;
|
|
55
55
|
showError(ui, message, data);
|
|
56
56
|
}
|
|
@@ -70,12 +70,38 @@ export function sentTransfersTable(session, transfers, options) {
|
|
|
70
70
|
rows.push([
|
|
71
71
|
formatDate(tx.timestamp), tx.recipient,
|
|
72
72
|
...(withContact ? [tx.contact ?? '-'] : []),
|
|
73
|
-
tx.token,
|
|
74
|
-
...(withBalance ? [tx.balance !== undefined ?
|
|
73
|
+
tx.token, formatTokenAmount(tx.token, tx.amount),
|
|
74
|
+
...(withBalance ? [tx.balance !== undefined ? formatTokenAmount(tx.token, tx.balance) : '-'] : []),
|
|
75
75
|
...(options.status ? [tx.status || '-'] : [])
|
|
76
76
|
]);
|
|
77
77
|
rows.push([{ colSpan: head.length, content: tx.url }]);
|
|
78
78
|
}
|
|
79
79
|
return { head, rows, tone: options.tone };
|
|
80
80
|
}
|
|
81
|
+
/** A transfer's state as one character: done, failed, still on its way, or not known after broadcasting. */
|
|
82
|
+
function statusIcon(status) {
|
|
83
|
+
if (status === undefined || status === '')
|
|
84
|
+
return '-';
|
|
85
|
+
return { confirmed: '✔', failed: '✖', broadcast_unknown: '?' }[status] ?? '…';
|
|
86
|
+
}
|
|
87
|
+
/** Transfers in and out laid out as sent transfers, incoming amounts marked with +, one row each followed by its explorer link. */
|
|
88
|
+
export function transfersTable(session, transfers) {
|
|
89
|
+
const withContact = Boolean(session.contacts);
|
|
90
|
+
const withBalance = session.capabilities.balanceHistory;
|
|
91
|
+
const head = ['Date', 'Address', ...(withContact ? ['Contact'] : []), 'Token', 'Amount', ...(withBalance ? ['Balance'] : []), 'S'];
|
|
92
|
+
const rows = [];
|
|
93
|
+
if (transfers.length === 0)
|
|
94
|
+
rows.push([{ colSpan: head.length, content: 'No transaction history available.' }]);
|
|
95
|
+
for (const tx of transfers) {
|
|
96
|
+
rows.push([
|
|
97
|
+
tx.timestamp !== undefined ? formatDate(tx.timestamp) : '-', tx.counterparty,
|
|
98
|
+
...(withContact ? [tx.contact ?? '-'] : []),
|
|
99
|
+
tx.token, (tx.direction === 'In' ? '+' : '') + formatTokenAmount(tx.token, tx.amount),
|
|
100
|
+
...(withBalance ? [tx.balance !== undefined ? formatTokenAmount(tx.token, tx.balance) : '-'] : []),
|
|
101
|
+
statusIcon(tx.status)
|
|
102
|
+
]);
|
|
103
|
+
rows.push([{ colSpan: head.length, content: tx.url }]);
|
|
104
|
+
}
|
|
105
|
+
return { head, rows, tone: 'blue' };
|
|
106
|
+
}
|
|
81
107
|
//# sourceMappingURL=output.js.map
|
package/dist/app/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../app/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../app/output.ts"],"names":[],"mappings":"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"}
|
package/dist/app/session.d.ts
CHANGED
|
@@ -20,6 +20,24 @@ export interface SentTransfer {
|
|
|
20
20
|
status?: string;
|
|
21
21
|
url: string;
|
|
22
22
|
}
|
|
23
|
+
export interface TransferRow {
|
|
24
|
+
/** Absent while unconfirmed. */
|
|
25
|
+
timestamp?: string | number | Date;
|
|
26
|
+
direction: 'In' | 'Out';
|
|
27
|
+
/** The sender of an incoming transfer, the recipient of an outgoing one. */
|
|
28
|
+
counterparty: string;
|
|
29
|
+
contact?: string;
|
|
30
|
+
token: string;
|
|
31
|
+
amount: string | number;
|
|
32
|
+
balance?: string | number;
|
|
33
|
+
status?: string;
|
|
34
|
+
url: string;
|
|
35
|
+
}
|
|
36
|
+
/** A failed scan leaves the transfers as saved and says why in `error`. */
|
|
37
|
+
export interface RecentTransfers {
|
|
38
|
+
transfers: TransferRow[];
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
23
41
|
export interface TransferDraft {
|
|
24
42
|
to: string;
|
|
25
43
|
asset: string;
|
|
@@ -99,6 +117,8 @@ export interface WalletSession {
|
|
|
99
117
|
accountDetails(): Promise<AccountDetails | null>;
|
|
100
118
|
tokenBalances(): Promise<Array<[string, string]>>;
|
|
101
119
|
sentTransfers(): Promise<SentTransfer[]>;
|
|
120
|
+
/** The network's transfers in and out saved so far, after adding what a scan finds. Only called when the selected network lists them. */
|
|
121
|
+
recentTransfers(): Promise<RecentTransfers>;
|
|
102
122
|
importActions(): HostAction[];
|
|
103
123
|
exportActions(): HostAction[];
|
|
104
124
|
menuActions(): HostAction[];
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SwapService } from '../swap/service.js';
|
|
2
|
+
import type { Ui } from './ui.js';
|
|
3
|
+
/** What the swap flows need from a swap service. */
|
|
4
|
+
export type SwapPort = Pick<SwapService, 'route' | 'list' | 'status' | 'resume' | 'availableBalance' | 'destination' | 'quote' | 'execute'>;
|
|
5
|
+
export declare function swapMenu(ui: Ui, service: SwapPort): Promise<void>;
|