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.
Files changed (106) hide show
  1. package/README.md +10 -10
  2. package/dist/app/format.d.ts +3 -1
  3. package/dist/app/format.js +11 -5
  4. package/dist/app/format.js.map +1 -1
  5. package/dist/app/history.d.ts +48 -0
  6. package/dist/app/history.js +115 -0
  7. package/dist/app/history.js.map +1 -0
  8. package/dist/app/index.d.ts +7 -3
  9. package/dist/app/index.js +3 -1
  10. package/dist/app/index.js.map +1 -1
  11. package/dist/app/menu.d.ts +1 -0
  12. package/dist/app/menu.js +22 -7
  13. package/dist/app/menu.js.map +1 -1
  14. package/dist/app/output.d.ts +3 -1
  15. package/dist/app/output.js +30 -4
  16. package/dist/app/output.js.map +1 -1
  17. package/dist/app/session.d.ts +20 -0
  18. package/dist/app/swap.d.ts +5 -0
  19. package/dist/app/swap.js +274 -0
  20. package/dist/app/swap.js.map +1 -0
  21. package/dist/app/ui.d.ts +13 -0
  22. package/dist/app/ui.js.map +1 -1
  23. package/dist/browser-core.d.ts +5 -1
  24. package/dist/browser-core.js +4 -1
  25. package/dist/browser-core.js.map +1 -1
  26. package/dist/config.d.ts +11 -0
  27. package/dist/config.js +12 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/hodl-file.d.ts +31 -0
  30. package/dist/hodl-file.js +78 -0
  31. package/dist/hodl-file.js.map +1 -0
  32. package/dist/network/abis/erc20.d.ts +35 -13
  33. package/dist/network/abis/erc20.js +6 -26
  34. package/dist/network/abis/erc20.js.map +1 -1
  35. package/dist/network/arb.d.ts +5 -0
  36. package/dist/network/arb.js +5 -0
  37. package/dist/network/arb.js.map +1 -1
  38. package/dist/network/avax.d.ts +6 -0
  39. package/dist/network/avax.js +6 -0
  40. package/dist/network/avax.js.map +1 -1
  41. package/dist/network/bsc.d.ts +6 -0
  42. package/dist/network/bsc.js +6 -0
  43. package/dist/network/bsc.js.map +1 -1
  44. package/dist/network/eth.d.ts +6 -0
  45. package/dist/network/eth.js +6 -0
  46. package/dist/network/eth.js.map +1 -1
  47. package/dist/network/ftm.d.ts +6 -0
  48. package/dist/network/ftm.js +6 -0
  49. package/dist/network/ftm.js.map +1 -1
  50. package/dist/network/lib/BitcoinNetwork.d.ts +3 -1
  51. package/dist/network/lib/BitcoinNetwork.js +58 -13
  52. package/dist/network/lib/BitcoinNetwork.js.map +1 -1
  53. package/dist/network/lib/Web3Network.d.ts +10 -4
  54. package/dist/network/lib/Web3Network.js +141 -73
  55. package/dist/network/lib/Web3Network.js.map +1 -1
  56. package/dist/network/op.d.ts +5 -0
  57. package/dist/network/op.js +5 -0
  58. package/dist/network/op.js.map +1 -1
  59. package/dist/network/pol.d.ts +6 -0
  60. package/dist/network/pol.js +6 -0
  61. package/dist/network/pol.js.map +1 -1
  62. package/dist/network/types.d.ts +35 -0
  63. package/dist/network-registry.d.ts +6 -1
  64. package/dist/network-registry.js +28 -0
  65. package/dist/network-registry.js.map +1 -1
  66. package/dist/node-session.d.ts +3 -1
  67. package/dist/node-session.js +26 -77
  68. package/dist/node-session.js.map +1 -1
  69. package/dist/persist.d.ts +10 -9
  70. package/dist/persist.js +56 -101
  71. package/dist/persist.js.map +1 -1
  72. package/dist/request.d.ts +7 -0
  73. package/dist/request.js +26 -0
  74. package/dist/request.js.map +1 -0
  75. package/dist/swap/bitcoin.d.ts +1 -1
  76. package/dist/swap/bitcoin.js +7 -6
  77. package/dist/swap/bitcoin.js.map +1 -1
  78. package/dist/swap/chain.js +25 -40
  79. package/dist/swap/chain.js.map +1 -1
  80. package/dist/swap/config.d.ts +12 -0
  81. package/dist/swap/config.js +6 -0
  82. package/dist/swap/config.js.map +1 -1
  83. package/dist/swap/http.d.ts +2 -1
  84. package/dist/swap/http.js +8 -4
  85. package/dist/swap/http.js.map +1 -1
  86. package/dist/swap/providers.d.ts +15 -0
  87. package/dist/swap/providers.js +187 -1
  88. package/dist/swap/providers.js.map +1 -1
  89. package/dist/swap/routes.d.ts +28 -0
  90. package/dist/swap/routes.js +5 -3
  91. package/dist/swap/routes.js.map +1 -1
  92. package/dist/swap/service.d.ts +2 -1
  93. package/dist/swap/service.js +16 -5
  94. package/dist/swap/service.js.map +1 -1
  95. package/dist/swap/types.d.ts +3 -1
  96. package/dist/swap/types.js.map +1 -1
  97. package/dist/transfer-service.js +1 -2
  98. package/dist/transfer-service.js.map +1 -1
  99. package/dist/ui-inquirer.d.ts +8 -1
  100. package/dist/ui-inquirer.js +45 -10
  101. package/dist/ui-inquirer.js.map +1 -1
  102. package/dist/wallet-store.d.ts +2 -1
  103. package/package.json +13 -14
  104. package/dist/swap/ui.d.ts +0 -3
  105. package/dist/swap/ui.js +0 -257
  106. package/dist/swap/ui.js.map +0 -1
@@ -1,9 +1,24 @@
1
+ import readline from 'node:readline';
1
2
  import inquirer from 'inquirer';
2
- import inquirerAutocomplete from 'inquirer-autocomplete-prompt';
3
3
  import Table from 'cli-table3';
4
4
  import ora from 'ora';
5
- inquirer.registerPrompt('autocomplete', inquirerAutocomplete);
5
+ import { isPromptAborted } from './app/ui.js';
6
6
  const AnyTable = Table;
7
+ /**
8
+ * Ctrl+C ends the CLI through its SIGINT handler and leaves the prompt unsettled, as inquirer did
9
+ * before it reported aborts as errors, so no caller can mistake the exit for a failed step.
10
+ */
11
+ export async function exitOnAbort(pending) {
12
+ try {
13
+ return await pending;
14
+ }
15
+ catch (error) {
16
+ if (!isPromptAborted(error))
17
+ throw error;
18
+ process.kill(process.pid, 'SIGINT');
19
+ return new Promise(() => undefined);
20
+ }
21
+ }
7
22
  /** The terminal renderer of the shared flows. */
8
23
  export class InquirerUi {
9
24
  banner(art) {
@@ -26,28 +41,28 @@ export class InquirerUi {
26
41
  console.log(table.toString());
27
42
  }
28
43
  async select(question) {
29
- const { answer } = await inquirer.prompt({ type: 'list', name: 'answer', ...question });
44
+ const { answer } = await exitOnAbort(inquirer.prompt({ type: 'select', name: 'answer', ...question }));
30
45
  return answer;
31
46
  }
32
47
  async input(question) {
33
- const { answer } = await inquirer.prompt({ type: 'input', name: 'answer', ...question });
48
+ const { answer } = await exitOnAbort(inquirer.prompt({ type: 'input', name: 'answer', ...question }));
34
49
  return answer;
35
50
  }
36
51
  async password(question) {
37
- const { answer } = await inquirer.prompt({ type: 'password', name: 'answer', mask: '*', ...question });
52
+ const { answer } = await exitOnAbort(inquirer.prompt({ type: 'password', name: 'answer', mask: '*', toggleMask: false, ...question }));
38
53
  return answer;
39
54
  }
40
55
  async confirm(question) {
41
- const { answer } = await inquirer.prompt({ type: 'confirm', name: 'answer', ...question });
56
+ const { answer } = await exitOnAbort(inquirer.prompt({ type: 'confirm', name: 'answer', ...question }));
42
57
  return answer;
43
58
  }
44
59
  async autocomplete(question) {
45
- const { answer } = await inquirer.prompt({
46
- type: 'autocomplete',
60
+ const { answer } = await exitOnAbort(inquirer.prompt({
61
+ type: 'search',
47
62
  name: 'answer',
48
63
  message: question.message,
49
- source: (_answers, input) => question.source(input || '')
50
- });
64
+ source: (input) => question.source(input || '')
65
+ }));
51
66
  return answer;
52
67
  }
53
68
  spinner(text) {
@@ -58,5 +73,25 @@ export class InquirerUi {
58
73
  stop: () => { spinner.stop(); }
59
74
  };
60
75
  }
76
+ /** Ctrl+C ends the CLI as it does at a prompt; readline would otherwise just close and leave the screen. */
77
+ watch(text) {
78
+ const spinner = ora({ text, spinner: 'dots', discardStdin: false }).start();
79
+ const input = readline.createInterface({ input: process.stdin, output: process.stdout });
80
+ const left = new Promise(resolve => {
81
+ const leave = () => { spinner.stop(); resolve(); };
82
+ input.once('line', leave);
83
+ input.once('close', leave);
84
+ });
85
+ input.once('SIGINT', () => {
86
+ spinner.stop();
87
+ process.kill(process.pid, 'SIGINT');
88
+ });
89
+ return {
90
+ update: message => { spinner.start(message); },
91
+ pause: () => { spinner.stop(); },
92
+ stop: () => { spinner.stop(); input.close(); },
93
+ left
94
+ };
95
+ }
61
96
  }
62
97
  //# sourceMappingURL=ui-inquirer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui-inquirer.js","sourceRoot":"","sources":["../ui-inquirer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui-inquirer.js","sourceRoot":"","sources":["../ui-inquirer.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /** Callers hold an exclusive wallet lock for the entire operation.
2
2
  * Reads return detached values; clearing secrets must not mutate stored data.
3
- * set stages a write; flush resolves only once every preceding write is durable.
3
+ * set stages a write of plain JSON: no undefined, bigint or functions.
4
+ * flush resolves only once every preceding write is durable.
4
5
  * A rejected flush must prevent broadcast.
5
6
  */
6
7
  export interface WalletStore {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hodl-wallet",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "🧊 HODL Wallet - Fast CLI crypto wallet!",
5
5
  "author": "Martin Clasen",
6
6
  "repository": {
@@ -37,6 +37,9 @@
37
37
  "bin": {
38
38
  "hodl": "dist/index.js"
39
39
  },
40
+ "engines": {
41
+ "node": ">=20.19.0"
42
+ },
40
43
  "keywords": [
41
44
  "hodl",
42
45
  "wallet",
@@ -69,21 +72,17 @@
69
72
  "clasen"
70
73
  ],
71
74
  "dependencies": {
72
- "bip32": "^4.0.0",
73
- "bip39": "3.1.0",
74
- "bitcoinjs-lib": "6.1.7",
75
+ "@bitcoinerlab/secp256k1": "1.2.0",
76
+ "@scure/bip32": "2.4.0",
77
+ "@scure/bip39": "2.4.0",
78
+ "bip32": "5.0.1",
79
+ "bitcoinjs-lib": "7.0.4",
75
80
  "cli-table3": "0.6.5",
76
- "deepbase": "3.8.2",
77
- "ecpair": "2.1.0",
78
- "external-editor": "3.1.0",
79
- "hdkey": "^0.6.0",
80
- "inquirer": "9.3.7",
81
- "inquirer-autocomplete-prompt": "3.0.1",
82
- "inquirer-fuzzy-path": "2.3.0",
81
+ "deepbase": "3.12.0",
82
+ "ecpair": "3.0.2",
83
+ "inquirer": "14.2.3",
83
84
  "ora": "8.1.1",
84
- "tiny-secp256k1": "2.2.3",
85
- "tmp": "0.2.7",
86
- "web3": "4.16.0"
85
+ "viem": "2.57.7"
87
86
  },
88
87
  "devDependencies": {
89
88
  "@types/node": "^24.12.4",
package/dist/swap/ui.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import { SwapService } from './service.js';
2
- export declare function startSwapMenu(service: SwapService): Promise<void>;
3
- export declare function trackSwapsMenu(service: SwapService): Promise<void>;
package/dist/swap/ui.js DELETED
@@ -1,257 +0,0 @@
1
- import crypto from 'node:crypto';
2
- import readline from 'node:readline';
3
- import { setTimeout as delay } from 'node:timers/promises';
4
- import inquirer from 'inquirer';
5
- import Table from 'cli-table3';
6
- import ora from 'ora';
7
- import { formatUnits, normalizeDecimal, parseDecimalToUnits } from '../amounts.js';
8
- import { swapConfig } from './config.js';
9
- import { terminalSwapStates } from './types.js';
10
- const labels = {
11
- quoted: 'Quote ready', preparing: 'Preparing deposit', approval_pending: 'Waiting for token approval',
12
- deposit_pending: 'Deposit sent · waiting for confirmation', deposit_confirmed: 'Deposit recognized',
13
- swapping: 'Exchanging assets', payout_pending: 'Preparing payout', btc_pending: 'BTC sent · waiting for inclusion',
14
- btc_confirming: 'BTC received · confirming', output_pending: 'Payout sent · waiting for inclusion',
15
- output_confirming: 'Payout received · confirming', completed: 'Completed', partial_pending: 'Payout and refund · awaiting confirmation',
16
- partial_completed: 'Partially exchanged · payout received and remainder returned', refund_pending: 'Refund pending',
17
- refunded: 'Swap refunded', failed: 'Not completed · deposit not transferred', needs_attention: 'Needs attention'
18
- };
19
- const providerNames = { chainflip: 'Chainflip', thorchain: 'THORChain' };
20
- async function withSpinner(text, work) {
21
- const spinner = ora({ text, spinner: 'dots' }).start();
22
- try {
23
- return await work();
24
- }
25
- finally {
26
- spinner.stop();
27
- }
28
- }
29
- export async function startSwapMenu(service) {
30
- try {
31
- const { source, destination } = service.route;
32
- const { route } = await inquirer.prompt({
33
- type: 'list', name: 'route', message: 'Swap:',
34
- choices: [
35
- { name: `${source.label} → ${destination.label}`, value: 'new' },
36
- { name: 'Track Swaps', value: 'track' },
37
- { name: 'Go Back', value: 'back' }
38
- ]
39
- });
40
- if (route === 'back')
41
- return;
42
- if (route === 'track') {
43
- await trackSwapsMenu(service);
44
- return;
45
- }
46
- const existing = (await withSpinner('Checking existing swaps…', () => service.list())).find(swap => !terminalSwapStates.includes(swap.state));
47
- if (existing) {
48
- console.log(`An unfinished swap already exists: ${existing.requestId}. Open Track Swaps to check its status.`);
49
- return;
50
- }
51
- const available = await withSpinner('Checking available balance…', () => service.availableBalance());
52
- if (available <= 0n) {
53
- console.log(`No ${source.label} available to swap.`);
54
- return;
55
- }
56
- const balance = formatUnits(available, source.decimals);
57
- const { amount } = await inquirer.prompt({
58
- type: 'input', name: 'amount', message: `${source.label} to exchange (max, empty to cancel):`,
59
- validate(value) {
60
- if (!value.trim() || value.trim().toLowerCase() === 'max')
61
- return true;
62
- try {
63
- return parseDecimalToUnits(normalizeDecimal(value.trim()), source.decimals) <= available
64
- || `Insufficient ${source.label}. Available: ${balance}.`;
65
- }
66
- catch (error) {
67
- return error.message;
68
- }
69
- }
70
- });
71
- if (!amount.trim())
72
- return;
73
- const ownAddress = await withSpinner(`Loading ${destination.label} account…`, () => service.destination());
74
- const addresses = ownAddress ? [{ name: 'My account', address: ownAddress }] : [];
75
- if (!ownAddress)
76
- console.log(`No ${destination.label} account is configured in this profile. Create or import an account on that network, then return to Swap; or enter an external address.`);
77
- const { destination: to } = await inquirer.prompt({
78
- type: 'autocomplete', name: 'destination', message: `Receive ${destination.label} at:`,
79
- source: (_answers, input = '') => {
80
- const search = (input || '').trim();
81
- const matches = addresses.filter(entry => entry.name.toLowerCase().includes(search.toLowerCase()) || entry.address.toLowerCase().includes(search.toLowerCase())).map(entry => ({ name: `${entry.name} (${entry.address})`, value: entry.address }));
82
- if (search && !matches.some(entry => entry.value === search))
83
- matches.push({ name: search, value: search });
84
- return [
85
- ...(!ownAddress && !search ? [{ name: 'My account', value: '', disabled: `${destination.label} account not configured` }] : []),
86
- ...matches, { name: 'Go Back', value: '' }
87
- ];
88
- }
89
- });
90
- if (!to)
91
- return;
92
- const maximum = amount.trim().toLowerCase() === 'max';
93
- let comparison = await withSpinner('Comparing Chainflip and THORChain, including network fees…', () => service.quote(maximum ? balance : amount.trim(), to));
94
- if (maximum && source.asset === 'BTC' && comparison.quotes.length) {
95
- const reserve = comparison.quotes.reduce((largest, quote) => {
96
- const fee = parseDecimalToUnits(quote.funding.budget, source.decimals);
97
- return fee > largest ? fee : largest;
98
- }, 0n) + BigInt(swapConfig.bitcoin.changeDustSats);
99
- if (available <= reserve) {
100
- console.log('Insufficient BTC for the network fee and required change.');
101
- return;
102
- }
103
- const maximumAmount = formatUnits(available - reserve, source.decimals);
104
- console.log(`Max: ${maximumAmount} BTC · reserving ${formatUnits(reserve, source.decimals)} BTC for network fees and required change.`);
105
- comparison = await withSpinner('Updating quotes for max amount…', () => service.quote(maximumAmount, to));
106
- }
107
- for (const unavailable of comparison.unavailable)
108
- console.log(`${unavailable.provider}: ${unavailable.reason}`);
109
- comparison.quotes = comparison.quotes.filter(quote => {
110
- if (quote.sufficientAsset && quote.sufficientFee)
111
- return true;
112
- console.log(`${providerNames[quote.provider]}: insufficient ${!quote.sufficientAsset ? source.label : quote.funding.asset + ' for the deposit and network fee budget'}.`);
113
- return false;
114
- });
115
- if (!comparison.quotes.length) {
116
- console.log('No executable quote available. No funds were sent.');
117
- return;
118
- }
119
- comparison.recommendedQuoteId = comparison.quotes[0].quoteId;
120
- const { quoteId } = await inquirer.prompt({
121
- type: 'list', name: 'quoteId', message: 'Choose a quote:',
122
- choices: [
123
- ...comparison.quotes.map(quote => ({
124
- name: `${providerNames[quote.provider]} · ≈ ${quote.destination.estimated} ${quote.destination.asset} · ≈ ${quote.estimatedTotalCost.percent}% cost${quote.quoteId === comparison.recommendedQuoteId ? ' · best after gas' : ''}`,
125
- value: quote.quoteId
126
- })), { name: 'Cancel', value: 'cancel' }
127
- ]
128
- });
129
- if (quoteId === 'cancel')
130
- return;
131
- const quote = comparison.quotes.find(item => item.quoteId === quoteId);
132
- console.log(`\n ${quote.source.amount} ${quote.source.asset} → ≈ ${quote.destination.estimated} ${quote.destination.asset}`);
133
- console.log(` ${source.label} → ${destination.label} · ${providerNames[quote.provider]} · ${quote.execution}\n`);
134
- const table = new Table({
135
- wordWrap: true,
136
- colWidths: [11, Math.max(40, Math.min(70, (process.stdout.columns || 80) - 14))],
137
- chars: { 'top-left': '╭', 'top-right': '╮', 'bottom-left': '╰', 'bottom-right': '╯' },
138
- style: { 'padding-left': 1, 'padding-right': 1, compact: true }
139
- });
140
- table.push({ From: quote.from }, { To: quote.to }, { Minimum: `${quote.destination.minimum} ${quote.destination.asset} · full swap · ${quote.slippagePercent}% tolerance` }, { Cost: `≈ ${quote.estimatedTotalCost.percent}% (USD ${Number(quote.estimatedTotalCost.usd).toFixed(2)}) · incl. price impact + gas` }, { 'Network fee': `Up to ${quote.funding.budget} ${quote.funding.asset} extra on ${quote.source.network.toUpperCase()}` }, { Time: `${quote.estimatedSeconds === null ? '' : `≈ ${Math.ceil(quote.estimatedSeconds / 60)} min + `}${quote.destination.confirmations} ${quote.destination.asset} confirmations to complete` }, { Refund: `${source.label} → sender above, minus fees` }, { Expires: new Date(quote.expiresAt).toISOString().replace('T', ' ').replace(/\.\d{3}Z$/, ' UTC') });
141
- console.log(table.toString());
142
- console.log(`\n Provider fees already deducted from estimated ${destination.asset}. Source network fee is extra.`);
143
- if (quote.refund.partialResultPossible)
144
- console.log(` Partial fill possible: ${destination.asset} received + remaining ${source.asset} refunded minus fees.\n The minimum above applies only to a full swap.`);
145
- console.log(` Once exchanged, delayed ${destination.asset} cannot auto-refund to ${source.asset}.\n`);
146
- const { confirmed } = await inquirer.prompt({
147
- type: 'confirm', name: 'confirmed', default: false, message: 'Accept destination, cost and minimum, and swap?'
148
- });
149
- if (!confirmed)
150
- return;
151
- const operation = await withSpinner('Preparing and submitting swap…', () => service.execute(quoteId, crypto.randomUUID()));
152
- showSwap(operation);
153
- if (!terminalSwapStates.includes(operation.state))
154
- await followSwap(service, operation, true);
155
- }
156
- catch (error) {
157
- console.error(error instanceof Error ? error.message : 'Swap could not be started.');
158
- }
159
- }
160
- export async function trackSwapsMenu(service) {
161
- try {
162
- const refreshed = new Set();
163
- const swaps = await withSpinner('Updating swap statuses…', async () => {
164
- const entries = await service.list();
165
- for (let i = 0; i < entries.length; i++) {
166
- if (!terminalSwapStates.includes(entries[i].state)) {
167
- entries[i] = await service.status(entries[i].requestId);
168
- refreshed.add(entries[i].requestId);
169
- }
170
- }
171
- return entries;
172
- });
173
- if (!swaps.length) {
174
- console.log('No swaps recorded.');
175
- return;
176
- }
177
- const { requestId } = await inquirer.prompt({
178
- type: 'list', name: 'requestId', message: 'Select a swap:',
179
- choices: [
180
- ...swaps.map(swap => ({ name: `${swap.createdAt} · ${swap.quote.source.amount} ${swap.quote.source.asset} (${swap.quote.source.network}) → ${swap.quote.destination.asset} (${swap.quote.destination.network}) · ${labels[swap.state]}${swap.updateError ? ' · Status update unavailable' : ''} · ${swap.requestId}`, value: swap.requestId })),
181
- { name: 'Go back', value: 'back' }
182
- ]
183
- });
184
- if (requestId === 'back')
185
- return;
186
- const current = refreshed.has(requestId) ? swaps.find(swap => swap.requestId === requestId) :
187
- await withSpinner('Checking swap status…', () => service.status(requestId));
188
- showSwap(current, current.state !== swaps.find(swap => swap.requestId === requestId).state);
189
- if (terminalSwapStates.includes(current.state))
190
- return;
191
- await followSwap(service, current, false);
192
- }
193
- catch (error) {
194
- console.error(error instanceof Error ? error.message : 'Could not update swaps.');
195
- }
196
- }
197
- async function followSwap(service, initial, resume) {
198
- console.log('Updating automatically. Press Enter to return to the menu. Leaving this screen does not cancel funds already sent.');
199
- const controller = new AbortController();
200
- const spinner = ora({ text: 'Updating swap…', spinner: 'dots', discardStdin: false }).start();
201
- controller.signal.addEventListener('abort', () => spinner.stop(), { once: true });
202
- const input = readline.createInterface({ input: process.stdin, output: process.stdout });
203
- input.once('line', () => controller.abort());
204
- input.once('close', () => controller.abort());
205
- let previous = swapDisplayKey(initial);
206
- try {
207
- while (!controller.signal.aborted) {
208
- const operation = await (resume ? service.resume(initial.requestId) : service.status(initial.requestId));
209
- if (controller.signal.aborted)
210
- return;
211
- const signature = swapDisplayKey(operation);
212
- if (signature !== previous) {
213
- spinner.stop();
214
- showSwap(operation);
215
- previous = signature;
216
- }
217
- if (terminalSwapStates.includes(operation.state) || operation.state === 'needs_attention')
218
- return;
219
- spinner.start(`${labels[operation.state]}${operation.message ? ` · ${operation.message}` : ''} · Enter to return`);
220
- try {
221
- await delay(swapConfig.pollIntervalMs, undefined, { signal: controller.signal });
222
- }
223
- catch {
224
- if (!controller.signal.aborted)
225
- throw new Error('Progress timer failed.');
226
- }
227
- }
228
- }
229
- finally {
230
- spinner.stop();
231
- input.close();
232
- }
233
- }
234
- function swapDisplayKey(operation) {
235
- return JSON.stringify([operation.state, operation.confirmations, operation.updateError, operation.transactions, operation.delayed, operation.message, operation.payout, operation.refund, operation.refundConfirmations]);
236
- }
237
- function showSwap(swap, showHeading = true) {
238
- if (showHeading)
239
- console.log(`\nSwap ${swap.requestId}: ${labels[swap.state]} · ${swap.quote.source.asset} (${swap.quote.source.network}) → ${swap.quote.destination.asset} (${swap.quote.destination.network})`);
240
- if (swap.payout)
241
- console.log(`${swap.quote.destination.asset} confirmations: ${swap.confirmations}/${swap.requiredConfirmations}`);
242
- for (const transaction of swap.transactions)
243
- console.log(`${transaction.kind}: ${transaction.explorer}`);
244
- if (swap.payout)
245
- console.log(`${swap.quote.destination.asset} payout: ${swap.payout.amount} ${swap.quote.destination.asset} · ${swap.payout.explorer}`);
246
- if (swap.refund) {
247
- console.log(`${swap.quote.source.asset} refund: ${swap.refund.amount} ${swap.quote.source.asset} · ${swap.refund.explorer}`);
248
- console.log(`${swap.quote.source.network.toUpperCase()} refund confirmations: ${swap.refundConfirmations}/${swap.requiredRefundConfirmations}`);
249
- }
250
- if (swap.message)
251
- console.log(swap.message);
252
- if (swap.updateError)
253
- console.log(`Could not update or continue: ${swap.updateError} Last successful check: ${swap.lastCheckedAt || 'none'}.`);
254
- if (swap.delayed)
255
- console.log('This swap is taking longer than expected. Keep its ID and transaction links; do not send another deposit.');
256
- }
257
- //# sourceMappingURL=ui.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../swap/ui.ts"],"names":[],"mappings":"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"}