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
@@ -0,0 +1,274 @@
1
+ import { randomUUID } from '#environment';
2
+ import { formatUnits, normalizeDecimal, parseDecimalToUnits } from '../amounts.js';
3
+ import { swapConfig } from '../swap/config.js';
4
+ import { terminalSwapStates } from '../swap/types.js';
5
+ import { errorMessage } from './format.js';
6
+ import { isPromptAborted } from './ui.js';
7
+ const labels = {
8
+ quoted: 'Quote ready', preparing: 'Preparing deposit', approval_pending: 'Waiting for token approval',
9
+ deposit_pending: 'Deposit sent · waiting for confirmation', deposit_confirmed: 'Deposit recognized',
10
+ swapping: 'Exchanging assets', payout_pending: 'Preparing payout', btc_pending: 'BTC sent · waiting for inclusion',
11
+ btc_confirming: 'BTC received · confirming', output_pending: 'Payout sent · waiting for inclusion',
12
+ output_confirming: 'Payout received · confirming', completed: 'Completed', partial_pending: 'Payout and refund · awaiting confirmation',
13
+ partial_completed: 'Partially exchanged · payout received and remainder returned', refund_pending: 'Refund pending',
14
+ refunded: 'Swap refunded', failed: 'Not completed · deposit not transferred', needs_attention: 'Needs attention'
15
+ };
16
+ const providerNames = { chainflip: 'Chainflip', thorchain: 'THORChain', 'near-intents': 'NEAR Intents' };
17
+ async function withSpinner(ui, text, work) {
18
+ const spinner = ui.spinner(text);
19
+ try {
20
+ return await work();
21
+ }
22
+ finally {
23
+ spinner.stop();
24
+ }
25
+ }
26
+ /** Prompt aborts end the flow like any other prompt; anything else is reported and returns to the menu. */
27
+ function report(ui, error, fallback) {
28
+ if (isPromptAborted(error))
29
+ throw error;
30
+ ui.print(error instanceof Error ? errorMessage(error) : fallback);
31
+ }
32
+ export async function swapMenu(ui, service) {
33
+ const { source, destination } = service.route;
34
+ const route = await ui.select({
35
+ message: 'Swap:',
36
+ choices: [
37
+ { name: `${source.label} → ${destination.label}`, value: 'new' },
38
+ { name: 'Track Swaps', value: 'track' },
39
+ { name: 'Go Back', value: 'back', back: true }
40
+ ]
41
+ });
42
+ if (route === 'back')
43
+ return;
44
+ if (route === 'track')
45
+ await trackSwaps(ui, service);
46
+ else
47
+ await startSwap(ui, service);
48
+ }
49
+ async function startSwap(ui, service) {
50
+ const { source, destination } = service.route;
51
+ try {
52
+ const existing = (await withSpinner(ui, 'Checking existing swaps…', () => service.list())).find(swap => !terminalSwapStates.includes(swap.state));
53
+ if (existing) {
54
+ ui.print(`An unfinished swap already exists: ${existing.requestId}. Open Track Swaps to check its status.`);
55
+ return;
56
+ }
57
+ const available = await withSpinner(ui, 'Checking available balance…', () => service.availableBalance());
58
+ if (available <= 0n) {
59
+ ui.print(`No ${source.label} available to swap.`);
60
+ return;
61
+ }
62
+ const balance = formatUnits(available, source.decimals);
63
+ const amount = await ui.input({
64
+ message: `${source.label} to exchange (max, empty to cancel):`,
65
+ validate(value) {
66
+ if (!value.trim() || value.trim().toLowerCase() === 'max')
67
+ return true;
68
+ try {
69
+ return parseDecimalToUnits(normalizeDecimal(value.trim()), source.decimals) <= available
70
+ || `Insufficient ${source.label}. Available: ${balance}.`;
71
+ }
72
+ catch (error) {
73
+ return error.message;
74
+ }
75
+ }
76
+ });
77
+ if (!amount.trim())
78
+ return;
79
+ const ownAddress = await withSpinner(ui, `Loading ${destination.label} account…`, () => service.destination());
80
+ const addresses = ownAddress ? [{ name: 'My account', address: ownAddress }] : [];
81
+ if (!ownAddress)
82
+ ui.print(`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.`);
83
+ const to = await ui.autocomplete({
84
+ message: `Receive ${destination.label} at:`,
85
+ source: input => {
86
+ const search = input.trim();
87
+ 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 }));
88
+ if (search && !matches.some(entry => entry.value === search))
89
+ matches.push({ name: search, value: search });
90
+ return [
91
+ ...(!ownAddress && !search ? [{ name: 'My account', value: '', disabled: `${destination.label} account not configured` }] : []),
92
+ ...matches, { name: 'Go Back', value: '', back: true }
93
+ ];
94
+ }
95
+ });
96
+ if (!to)
97
+ return;
98
+ const maximum = amount.trim().toLowerCase() === 'max';
99
+ let comparison = await withSpinner(ui, 'Comparing Chainflip, THORChain and NEAR Intents, including network fees…', () => service.quote(maximum ? balance : amount.trim(), to));
100
+ if (maximum && source.asset === 'BTC' && comparison.quotes.length) {
101
+ const reserve = comparison.quotes.reduce((largest, quote) => {
102
+ const fee = parseDecimalToUnits(quote.funding.budget, source.decimals);
103
+ return fee > largest ? fee : largest;
104
+ }, 0n) + BigInt(swapConfig.bitcoin.changeDustSats);
105
+ if (available <= reserve) {
106
+ ui.print('Insufficient BTC for the network fee and required change.');
107
+ return;
108
+ }
109
+ const maximumAmount = formatUnits(available - reserve, source.decimals);
110
+ ui.print(`Max: ${maximumAmount} BTC · reserving ${formatUnits(reserve, source.decimals)} BTC for network fees and required change.`);
111
+ comparison = await withSpinner(ui, 'Updating quotes for max amount…', () => service.quote(maximumAmount, to));
112
+ }
113
+ for (const unavailable of comparison.unavailable)
114
+ ui.print(`${unavailable.provider}: ${unavailable.reason}`);
115
+ comparison.quotes = comparison.quotes.filter(quote => {
116
+ if (quote.sufficientAsset && quote.sufficientFee)
117
+ return true;
118
+ ui.print(`${providerNames[quote.provider]}: insufficient ${!quote.sufficientAsset ? source.label : quote.funding.asset + ' for the deposit and network fee budget'}.`);
119
+ return false;
120
+ });
121
+ if (!comparison.quotes.length) {
122
+ ui.print('No executable quote available. No funds were sent.');
123
+ return;
124
+ }
125
+ comparison.recommendedQuoteId = comparison.quotes[0].quoteId;
126
+ const quoteId = await ui.select({
127
+ message: 'Choose a quote:',
128
+ choices: [
129
+ ...comparison.quotes.map(quote => ({
130
+ name: `${providerNames[quote.provider]} · ≈ ${quote.destination.estimated} ${quote.destination.asset} · ≈ ${quote.estimatedTotalCost.percent}% cost${quote.quoteId === comparison.recommendedQuoteId ? ' · best after gas' : ''}`,
131
+ value: quote.quoteId
132
+ })), { name: 'Cancel', value: 'cancel', back: true }
133
+ ]
134
+ });
135
+ if (quoteId === 'cancel')
136
+ return;
137
+ const quote = comparison.quotes.find(item => item.quoteId === quoteId);
138
+ ui.table({
139
+ head: [{ colSpan: 2, content: `${quote.source.amount} ${quote.source.asset} → ≈ ${quote.destination.estimated} ${quote.destination.asset}` }],
140
+ tone: 'blue',
141
+ rows: [
142
+ ['Route', `${source.label} → ${destination.label} · ${providerNames[quote.provider]} · ${quote.execution}`],
143
+ ['From', quote.from], ['To', quote.to],
144
+ ['Minimum', `${quote.destination.minimum} ${quote.destination.asset} · full swap · ${quote.slippagePercent}% tolerance`],
145
+ ['Cost', `≈ ${quote.estimatedTotalCost.percent}% (USD ${Number(quote.estimatedTotalCost.usd).toFixed(2)}) · incl. price impact + gas`],
146
+ ['Network fee', `Up to ${quote.funding.budget} ${quote.funding.asset} extra on ${quote.source.network.toUpperCase()}`],
147
+ ['Time', `${quote.estimatedSeconds === null ? '' : `≈ ${Math.ceil(quote.estimatedSeconds / 60)} min + `}${quote.destination.confirmations} ${quote.destination.asset} confirmations to complete`],
148
+ ['Refund', `${source.label} → sender above, minus fees`],
149
+ ['Expires', new Date(quote.expiresAt).toISOString().replace('T', ' ').replace(/\.\d{3}Z$/, ' UTC')]
150
+ ]
151
+ });
152
+ ui.print(`Provider fees already deducted from estimated ${destination.asset}. Source network fee is extra.`);
153
+ if (quote.refund.partialResultPossible) {
154
+ ui.print(`Partial fill possible: ${destination.asset} received + remaining ${source.asset} refunded minus fees.`);
155
+ ui.print('The minimum above applies only to a full swap.');
156
+ }
157
+ ui.print(`Once exchanged, delayed ${destination.asset} cannot auto-refund to ${source.asset}.`);
158
+ const confirmed = await ui.confirm({ message: 'Accept destination, cost and minimum, and swap?', default: false });
159
+ if (!confirmed)
160
+ return;
161
+ const operation = await withSpinner(ui, 'Preparing and submitting swap…', () => service.execute(quoteId, randomUUID()));
162
+ showSwap(ui, operation);
163
+ if (!terminalSwapStates.includes(operation.state))
164
+ await followSwap(ui, service, operation, true);
165
+ }
166
+ catch (error) {
167
+ report(ui, error, 'Swap could not be started.');
168
+ }
169
+ }
170
+ async function trackSwaps(ui, service) {
171
+ try {
172
+ const refreshed = new Set();
173
+ const swaps = await withSpinner(ui, 'Updating swap statuses…', async () => {
174
+ const entries = await service.list();
175
+ for (let i = 0; i < entries.length; i++) {
176
+ if (!terminalSwapStates.includes(entries[i].state)) {
177
+ entries[i] = await service.status(entries[i].requestId);
178
+ refreshed.add(entries[i].requestId);
179
+ }
180
+ }
181
+ return entries;
182
+ });
183
+ if (!swaps.length) {
184
+ ui.print('No swaps recorded.');
185
+ return;
186
+ }
187
+ const requestId = await ui.select({
188
+ message: 'Select a swap:',
189
+ choices: [
190
+ ...swaps.map(swap => ({ name: swapRow(swap), value: swap.requestId })),
191
+ { name: 'Go back', value: 'back', back: true }
192
+ ]
193
+ });
194
+ if (requestId === 'back')
195
+ return;
196
+ const current = refreshed.has(requestId) ? swaps.find(swap => swap.requestId === requestId) :
197
+ await withSpinner(ui, 'Checking swap status…', () => service.status(requestId));
198
+ showSwap(ui, current, current.state !== swaps.find(swap => swap.requestId === requestId).state);
199
+ if (terminalSwapStates.includes(current.state))
200
+ return;
201
+ await followSwap(ui, service, current, false);
202
+ }
203
+ catch (error) {
204
+ report(ui, error, 'Could not update swaps.');
205
+ }
206
+ }
207
+ /** Waits, or less once the person leaves. */
208
+ function pause(ms, leaving) {
209
+ let timer;
210
+ return Promise.race([leaving, new Promise(resolve => { timer = setTimeout(resolve, ms); })])
211
+ .finally(() => clearTimeout(timer));
212
+ }
213
+ /** Polls until the swap settles, needs attention, or the person leaves. A request under way always finishes first. */
214
+ async function followSwap(ui, service, initial, resume) {
215
+ ui.print('Updating automatically. Press Enter to return to the menu. Leaving this screen does not cancel funds already sent.');
216
+ const watch = ui.watch('Updating swap…');
217
+ let left = false;
218
+ let aborted;
219
+ const leaving = watch.left.then(() => { left = true; }, error => { aborted = error; });
220
+ const settled = () => {
221
+ if (aborted)
222
+ throw aborted;
223
+ return left;
224
+ };
225
+ let previous = swapDisplayKey(initial);
226
+ try {
227
+ while (!settled()) {
228
+ const operation = await (resume ? service.resume(initial.requestId) : service.status(initial.requestId));
229
+ if (settled())
230
+ return;
231
+ const signature = swapDisplayKey(operation);
232
+ if (signature !== previous) {
233
+ watch.pause();
234
+ showSwap(ui, operation);
235
+ previous = signature;
236
+ }
237
+ if (terminalSwapStates.includes(operation.state) || operation.state === 'needs_attention')
238
+ return;
239
+ watch.update(`${labels[operation.state]}${operation.message ? ` · ${operation.message}` : ''} · Enter to return`);
240
+ await pause(swapConfig.pollIntervalMs, leaving);
241
+ }
242
+ }
243
+ finally {
244
+ watch.stop();
245
+ }
246
+ }
247
+ function swapRow(swap) {
248
+ const stale = swap.updateError && !terminalSwapStates.includes(swap.state) ? ' · update unavailable' : '';
249
+ return `${swap.createdAt.slice(0, 16).replace('T', ' ')} · ${swap.quote.source.amount} ${swap.quote.source.asset} → ${swap.quote.destination.asset} · ${labels[swap.state].split(' · ')[0]}${stale}`;
250
+ }
251
+ function swapDisplayKey(operation) {
252
+ return JSON.stringify([operation.state, operation.confirmations, operation.updateError, operation.transactions, operation.delayed, operation.message, operation.payout, operation.refund, operation.refundConfirmations]);
253
+ }
254
+ function showSwap(ui, swap, showHeading = true) {
255
+ if (showHeading)
256
+ ui.print(`Swap ${swap.requestId}: ${labels[swap.state]} · ${swap.quote.source.asset} (${swap.quote.source.network}) → ${swap.quote.destination.asset} (${swap.quote.destination.network})`);
257
+ if (swap.payout)
258
+ ui.print(`${swap.quote.destination.asset} confirmations: ${swap.confirmations}/${swap.requiredConfirmations}`);
259
+ for (const transaction of swap.transactions)
260
+ ui.print(`${transaction.kind}: ${transaction.explorer}`);
261
+ if (swap.payout)
262
+ ui.print(`${swap.quote.destination.asset} payout: ${swap.payout.amount} ${swap.quote.destination.asset} · ${swap.payout.explorer}`);
263
+ if (swap.refund) {
264
+ ui.print(`${swap.quote.source.asset} refund: ${swap.refund.amount} ${swap.quote.source.asset} · ${swap.refund.explorer}`);
265
+ ui.print(`${swap.quote.source.network.toUpperCase()} refund confirmations: ${swap.refundConfirmations}/${swap.requiredRefundConfirmations}`);
266
+ }
267
+ if (swap.message)
268
+ ui.print(swap.message);
269
+ if (swap.updateError)
270
+ ui.print(`Could not update or continue: ${swap.updateError} Last successful check: ${swap.lastCheckedAt || 'none'}.`);
271
+ if (swap.delayed)
272
+ ui.print('This swap is taking longer than expected. Keep its ID and transaction links; do not send another deposit.');
273
+ }
274
+ //# sourceMappingURL=swap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../app/swap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM1C,MAAM,MAAM,GAA8B;IACtC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,4BAA4B;IACrG,eAAe,EAAE,yCAAyC,EAAE,iBAAiB,EAAE,oBAAoB;IACnG,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,kCAAkC;IAClH,cAAc,EAAE,2BAA2B,EAAE,cAAc,EAAE,qCAAqC;IAClG,iBAAiB,EAAE,8BAA8B,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,2CAA2C;IACvI,iBAAiB,EAAE,8DAA8D,EAAE,cAAc,EAAE,gBAAgB;IACnH,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,yCAAyC,EAAE,eAAe,EAAE,iBAAiB;CACnH,CAAC;AAGF,MAAM,aAAa,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAEzG,KAAK,UAAU,WAAW,CAAI,EAAM,EAAE,IAAY,EAAE,IAAsB;IACtE,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC;QAAC,OAAO,MAAM,IAAI,EAAE,CAAC;IAAC,CAAC;YACpB,CAAC;QAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAAC,CAAC;AAC/B,CAAC;AAED,2GAA2G;AAC3G,SAAS,MAAM,CAAC,EAAM,EAAE,KAAc,EAAE,QAAgB;IACpD,IAAI,eAAe,CAAC,KAAK,CAAC;QAAE,MAAM,KAAK,CAAC;IACxC,EAAE,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAM,EAAE,OAAiB;IACpD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE;YACL,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,MAAM,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;YAChE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE;YACvC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;SACjD;KACJ,CAAC,CAAC;IACH,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO;IAC7B,IAAI,KAAK,KAAK,OAAO;QAAE,MAAM,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;;QAChD,MAAM,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,EAAM,EAAE,OAAiB;IAC9C,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;IAC9C,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,MAAM,WAAW,CAAC,EAAE,EAAE,0BAA0B,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClJ,IAAI,QAAQ,EAAE,CAAC;YACX,EAAE,CAAC,KAAK,CAAC,sCAAsC,QAAQ,CAAC,SAAS,yCAAyC,CAAC,CAAC;YAC5G,OAAO;QACX,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACzG,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;YAAC,EAAE,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,KAAK,qBAAqB,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACnF,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC;YAC1B,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,sCAAsC;YAC9D,QAAQ,CAAC,KAAa;gBAClB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK;oBAAE,OAAO,IAAI,CAAC;gBACvE,IAAI,CAAC;oBACD,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS;2BACjF,gBAAgB,MAAM,CAAC,KAAK,gBAAgB,OAAO,GAAG,CAAC;gBAClE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAAC,OAAQ,KAAe,CAAC,OAAO,CAAC;gBAAC,CAAC;YACxD,CAAC;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO;QAC3B,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,WAAW,WAAW,CAAC,KAAK,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/G,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,IAAI,CAAC,UAAU;YAAE,EAAE,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,KAAK,yIAAyI,CAAC,CAAC;QAC5L,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC;YAC7B,OAAO,EAAE,WAAW,WAAW,CAAC,KAAK,MAAM;YAC3C,MAAM,EAAE,KAAK,CAAC,EAAE;gBACZ,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAA0B,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5D,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CACxH,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACrF,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5G,OAAO;oBACH,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,KAAK,yBAAyB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/H,GAAG,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;iBACzD,CAAC;YACN,CAAC;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;QACtD,IAAI,UAAU,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,0EAA0E,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/K,IAAI,OAAO,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAChE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;gBACxD,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvE,OAAO,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YACzC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACnD,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;gBAAC,EAAE,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC5G,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxE,EAAE,CAAC,KAAK,CAAC,QAAQ,aAAa,oBAAoB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,4CAA4C,CAAC,CAAC;YACrI,UAAU,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,iCAAiC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC;QAClH,CAAC;QACD,KAAK,MAAM,WAAW,IAAI,UAAU,CAAC,WAAW;YAAE,EAAE,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,QAAQ,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7G,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YACjD,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,aAAa;gBAAE,OAAO,IAAI,CAAC;YAC9D,EAAE,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,yCAAyC,GAAG,CAAC,CAAC;YACvK,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAAC,EAAE,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC1G,UAAU,CAAC,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC;YAC5B,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE;gBACL,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC/B,IAAI,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,KAAK,CAAC,WAAW,CAAC,SAAS,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ,KAAK,CAAC,kBAAkB,CAAC,OAAO,SAAS,KAAK,CAAC,OAAO,KAAK,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE;oBACjO,KAAK,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;aACvD;SACJ,CAAC,CAAC;QACH,IAAI,OAAO,KAAK,QAAQ;YAAE,OAAO;QACjC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,CAAE,CAAC;QACxE,EAAE,CAAC,KAAK,CAAC;YACL,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,KAAK,CAAC,WAAW,CAAC,SAAS,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC;YAC7I,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE;gBACF,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,MAAM,WAAW,CAAC,KAAK,MAAM,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC3G,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;gBACtC,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,kBAAkB,KAAK,CAAC,eAAe,aAAa,CAAC;gBACxH,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,kBAAkB,CAAC,OAAO,UAAU,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC;gBACtI,CAAC,aAAa,EAAE,SAAS,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,aAAa,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtH,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,4BAA4B,CAAC;gBACjM,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,KAAK,6BAA6B,CAAC;gBACxD,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;aACtG;SACJ,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,iDAAiD,WAAW,CAAC,KAAK,gCAAgC,CAAC,CAAC;QAC7G,IAAI,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACrC,EAAE,CAAC,KAAK,CAAC,0BAA0B,WAAW,CAAC,KAAK,yBAAyB,MAAM,CAAC,KAAK,uBAAuB,CAAC,CAAC;YAClH,EAAE,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC/D,CAAC;QACD,EAAE,CAAC,KAAK,CAAC,2BAA2B,WAAW,CAAC,KAAK,0BAA0B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAChG,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,iDAAiD,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACnH,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,gCAAgC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACxH,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACxB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,MAAM,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACtG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,4BAA4B,CAAC,CAAC;IAAC,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,EAAM,EAAE,OAAiB;IAC/C,IAAI,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjD,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBACxD,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;YACD,OAAO,OAAO,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC;YAC9B,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE;gBACL,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;gBACtE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;aACjD;SACJ,CAAC,CAAC;QACH,IAAI,SAAS,KAAK,MAAM;YAAE,OAAO;QACjC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAE,CAAC,CAAC;YAC1F,MAAM,WAAW,CAAC,EAAE,EAAE,uBAAuB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACpF,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAE,CAAC,KAAK,CAAC,CAAC;QACjG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO;QACvD,MAAM,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC;IAAC,CAAC;AACrE,CAAC;AAED,6CAA6C;AAC7C,SAAS,KAAK,CAAC,EAAU,EAAE,OAAsB;IAC7C,IAAI,KAAgD,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7F,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,sHAAsH;AACtH,KAAK,UAAU,UAAU,CAAC,EAAM,EAAE,OAAiB,EAAE,OAAiB,EAAE,MAAe;IACnF,EAAE,CAAC,KAAK,CAAC,oHAAoH,CAAC,CAAC;IAC/H,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACzC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,OAAgB,CAAC;IACrB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,GAAY,EAAE;QAC1B,IAAI,OAAO;YAAE,MAAM,OAAO,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IACF,IAAI,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC;QACD,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACzG,IAAI,OAAO,EAAE;gBAAE,OAAO;YACtB,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAAC,QAAQ,GAAG,SAAS,CAAC;YAAC,CAAC;YAC7F,IAAI,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,KAAK,iBAAiB;gBAAE,OAAO;YAClG,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;YAClH,MAAM,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;YAAS,CAAC;QAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAAC,CAAC;AAC/B,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1G,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;AACzM,CAAC;AAED,SAAS,cAAc,CAAC,SAAmB;IACvC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAC9N,CAAC;AAED,SAAS,QAAQ,CAAC,EAAM,EAAE,IAAc,EAAE,WAAW,GAAG,IAAI;IACxD,IAAI,WAAW;QAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,GAAG,CAAC,CAAC;IAC7M,IAAI,IAAI,CAAC,MAAM;QAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,mBAAmB,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAChI,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,YAAY;QAAE,EAAE,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtG,IAAI,IAAI,CAAC,MAAM;QAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrJ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1H,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,0BAA0B,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,2BAA2B,EAAE,CAAC,CAAC;IACjJ,CAAC;IACD,IAAI,IAAI,CAAC,OAAO;QAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,WAAW;QAAE,EAAE,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,WAAW,2BAA2B,IAAI,CAAC,aAAa,IAAI,MAAM,GAAG,CAAC,CAAC;IAC5I,IAAI,IAAI,CAAC,OAAO;QAAE,EAAE,CAAC,KAAK,CAAC,2GAA2G,CAAC,CAAC;AAC5I,CAAC"}
package/dist/app/ui.d.ts CHANGED
@@ -17,12 +17,24 @@ export interface Choice<T> {
17
17
  value: T;
18
18
  /** Selected by Escape in hosts that have one. */
19
19
  back?: boolean;
20
+ /** Shown with this reason, never picked. */
21
+ disabled?: string;
20
22
  }
21
23
  export interface Spinner {
22
24
  succeed(text: string): void;
23
25
  fail(text: string): void;
24
26
  stop(): void;
25
27
  }
28
+ /** A spinner over work that goes on until the person leaves it with Enter. */
29
+ export interface Watch {
30
+ /** Shows the spinner again with this text, below any output since it paused. */
31
+ update(text: string): void;
32
+ /** Hides the spinner so output can follow. */
33
+ pause(): void;
34
+ stop(): void;
35
+ /** Settles when the person leaves; rejects like a prompt when the host aborts. */
36
+ readonly left: Promise<void>;
37
+ }
26
38
  export type Validation = true | string;
27
39
  /** Everything the shared flows need from a terminal, real or emulated. */
28
40
  export interface Ui {
@@ -52,6 +64,7 @@ export interface Ui {
52
64
  source: (input: string) => Array<Choice<string>>;
53
65
  }): Promise<string>;
54
66
  spinner(text: string): Spinner;
67
+ watch(text: string): Watch;
55
68
  }
56
69
  /** Thrown by a pending prompt when the user exits or the wallet locks. Named like inquirer's Ctrl+C error. */
57
70
  export declare class PromptAborted extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../app/ui.ts"],"names":[],"mappings":"AAyCA,8GAA8G;AAC9G,MAAM,OAAO,aAAc,SAAQ,KAAK;IACpC,YAAY,OAAO,GAAG,sBAAsB;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC1C,KAAK,IAAI,OAAO,GAAG,KAAK,EAAE,OAAO,YAAY,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1E,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../app/ui.ts"],"names":[],"mappings":"AAuDA,8GAA8G;AAC9G,MAAM,OAAO,aAAc,SAAQ,KAAK;IACpC,YAAY,OAAO,GAAG,sBAAsB;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC1C,KAAK,IAAI,OAAO,GAAG,KAAK,EAAE,OAAO,YAAY,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1E,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
@@ -1,14 +1,18 @@
1
1
  export { formatUnits, normalizeDecimal, parseDecimalToUnits } from './amounts.js';
2
- export { NetworkRegistry, ACTIVE_NETWORKS } from './network-registry.js';
2
+ export { NetworkRegistry, ACTIVE_NETWORKS, networkStorageName, byRecentUse, isNetworkUsageEntry, recordNetworkUse } from './network-registry.js';
3
3
  export { default as Web3Network } from './network/lib/Web3Network.js';
4
4
  export { default as BitcoinNetwork, signBitcoinTransaction } from './network/lib/BitcoinNetwork.js';
5
5
  export { TransferService } from './transfer-service.js';
6
6
  export { SwapService } from './swap/service.js';
7
7
  export { swapConfig } from './swap/config.js';
8
+ export { routeForNetwork } from './swap/routes.js';
8
9
  export { clearSensitiveData } from './sensitive-data.js';
10
+ export { walletConfig } from './config.js';
11
+ export { HODL_FILE_IV_BYTES, HODL_FILE_KEY_BYTES, HODL_FILE_SALT_BYTES, HODL_FILE_SCRYPT, HODL_FILE_TAG_BYTES, formatHodlFile, hodlFileHeader, isHodlFile, parseHodlFile } from './hodl-file.js';
9
12
  export * from './app/index.js';
10
13
  export { AgentError } from './agent-errors.js';
11
14
  export type { WalletStore } from './wallet-store.js';
15
+ export type { HodlFile, ScryptCost } from './hodl-file.js';
12
16
  export type { TransferResult } from './transfer-service.js';
13
17
  export type { SwapServiceOptions } from './swap/service.js';
14
18
  export type * from './network/types.js';
@@ -1,11 +1,14 @@
1
1
  export { formatUnits, normalizeDecimal, parseDecimalToUnits } from './amounts.js';
2
- export { NetworkRegistry, ACTIVE_NETWORKS } from './network-registry.js';
2
+ export { NetworkRegistry, ACTIVE_NETWORKS, networkStorageName, byRecentUse, isNetworkUsageEntry, recordNetworkUse } from './network-registry.js';
3
3
  export { default as Web3Network } from './network/lib/Web3Network.js';
4
4
  export { default as BitcoinNetwork, signBitcoinTransaction } from './network/lib/BitcoinNetwork.js';
5
5
  export { TransferService } from './transfer-service.js';
6
6
  export { SwapService } from './swap/service.js';
7
7
  export { swapConfig } from './swap/config.js';
8
+ export { routeForNetwork } from './swap/routes.js';
8
9
  export { clearSensitiveData } from './sensitive-data.js';
10
+ export { walletConfig } from './config.js';
11
+ export { HODL_FILE_IV_BYTES, HODL_FILE_KEY_BYTES, HODL_FILE_SALT_BYTES, HODL_FILE_SCRYPT, HODL_FILE_TAG_BYTES, formatHodlFile, hodlFileHeader, isHodlFile, parseHodlFile } from './hodl-file.js';
9
12
  export * from './app/index.js';
10
13
  export { AgentError } from './agent-errors.js';
11
14
  //# sourceMappingURL=browser-core.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-core.js","sourceRoot":"","sources":["../browser-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"browser-core.js","sourceRoot":"","sources":["../browser-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACjJ,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACH,kBAAkB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EACpG,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAC5D,MAAM,gBAAgB,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const walletConfig: {
2
+ history: {
3
+ recentTransfers: number;
4
+ /** Transfers kept per address and network once scans have found more. */
5
+ keptTransfers: number;
6
+ /** Leading or trailing characters an incoming sender shares with a known address to be hidden as an imitation. */
7
+ lookAlikeChars: number;
8
+ /** Log ranges read at once while catching up from a cursor. */
9
+ parallelRanges: number;
10
+ };
11
+ };
package/dist/config.js ADDED
@@ -0,0 +1,12 @@
1
+ export const walletConfig = {
2
+ history: {
3
+ recentTransfers: 10,
4
+ /** Transfers kept per address and network once scans have found more. */
5
+ keptTransfers: 500,
6
+ /** Leading or trailing characters an incoming sender shares with a known address to be hidden as an imitation. */
7
+ lookAlikeChars: 4,
8
+ /** Log ranges read at once while catching up from a cursor. */
9
+ parallelRanges: 4
10
+ }
11
+ };
12
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,OAAO,EAAE;QACL,eAAe,EAAE,EAAE;QACnB,yEAAyE;QACzE,aAAa,EAAE,GAAG;QAClB,kHAAkH;QAClH,cAAc,EAAE,CAAC;QACjB,+DAA+D;QAC/D,cAAc,EAAE,CAAC;KACpB;CACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The encrypted .HODL format shared by the CLI and the web: scrypt, then AES-256-GCM, in hex.
3
+ * v3 is `v3:N:r:p:salt:iv:tag:ciphertext` and authenticates `v3:N:r:p:salt` as additional data.
4
+ * v2 is `v2:salt:iv:tag:ciphertext` with scrypt at N=2^14, r=8, p=1; it is read, never written.
5
+ */
6
+ export type ScryptCost = {
7
+ N: number;
8
+ r: number;
9
+ p: number;
10
+ };
11
+ export type HodlFile = {
12
+ cost: ScryptCost;
13
+ salt: Uint8Array;
14
+ iv: Uint8Array;
15
+ tag: Uint8Array;
16
+ ciphertext: Uint8Array;
17
+ additionalData?: Uint8Array;
18
+ };
19
+ export declare const HODL_FILE_SCRYPT: ScryptCost;
20
+ export declare const HODL_FILE_KEY_BYTES = 32;
21
+ export declare const HODL_FILE_SALT_BYTES = 16;
22
+ export declare const HODL_FILE_IV_BYTES = 12;
23
+ export declare const HODL_FILE_TAG_BYTES = 16;
24
+ /** Whether the text has the shape of a v2 or v3 file. Older files start differently. */
25
+ export declare function isHodlFile(text: string): boolean;
26
+ /** Scrypt's working memory for the cost, as Node's `maxmem` must allow it. */
27
+ export declare function scryptMemory({ N, r, p }: ScryptCost): number;
28
+ export declare function parseHodlFile(text: string): HodlFile;
29
+ /** The v3 header for a new file; its text is also the file's additional data. */
30
+ export declare function hodlFileHeader(salt: Uint8Array, cost?: ScryptCost): string;
31
+ export declare function formatHodlFile(header: string, iv: Uint8Array, tag: Uint8Array, ciphertext: Uint8Array): string;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * The encrypted .HODL format shared by the CLI and the web: scrypt, then AES-256-GCM, in hex.
3
+ * v3 is `v3:N:r:p:salt:iv:tag:ciphertext` and authenticates `v3:N:r:p:salt` as additional data.
4
+ * v2 is `v2:salt:iv:tag:ciphertext` with scrypt at N=2^14, r=8, p=1; it is read, never written.
5
+ */
6
+ export const HODL_FILE_SCRYPT = { N: 2 ** 17, r: 8, p: 1 };
7
+ export const HODL_FILE_KEY_BYTES = 32;
8
+ export const HODL_FILE_SALT_BYTES = 16;
9
+ export const HODL_FILE_IV_BYTES = 12;
10
+ export const HODL_FILE_TAG_BYTES = 16;
11
+ const V2_SCRYPT = { N: 2 ** 14, r: 8, p: 1 };
12
+ const MIN_SCRYPT_N = 2 ** 14;
13
+ const MAX_SCRYPT_P = 16;
14
+ // Bounds the header too, so a forged one cannot exhaust memory before authentication fails.
15
+ const MAX_SCRYPT_MEMORY = 256 * 1024 * 1024;
16
+ const UNSUPPORTED = 'Unsupported encrypted payload format';
17
+ /** Whether the text has the shape of a v2 or v3 file. Older files start differently. */
18
+ export function isHodlFile(text) {
19
+ const parts = text.trim().split(':');
20
+ return (parts[0] === 'v2' && parts.length === 5) || (parts[0] === 'v3' && parts.length === 8);
21
+ }
22
+ /** Scrypt's working memory for the cost, as Node's `maxmem` must allow it. */
23
+ export function scryptMemory({ N, r, p }) {
24
+ return 128 * r * (N + p + 2);
25
+ }
26
+ export function parseHodlFile(text) {
27
+ if (!isHodlFile(text))
28
+ throw new Error(UNSUPPORTED);
29
+ const parts = text.trim().split(':');
30
+ if (parts[0] === 'v2') {
31
+ const [, salt, iv, tag, ciphertext] = parts;
32
+ return { cost: V2_SCRYPT, ...sealedParts(salt, iv, tag, ciphertext) };
33
+ }
34
+ const [, N, r, p, salt, iv, tag, ciphertext] = parts;
35
+ const cost = { N: decimal(N), r: decimal(r), p: decimal(p) };
36
+ if (!validCost(cost))
37
+ throw new Error(UNSUPPORTED);
38
+ return { cost, ...sealedParts(salt, iv, tag, ciphertext), additionalData: utf8(parts.slice(0, 5).join(':')) };
39
+ }
40
+ /** The v3 header for a new file; its text is also the file's additional data. */
41
+ export function hodlFileHeader(salt, cost = HODL_FILE_SCRYPT) {
42
+ if (!validCost(cost) || salt.length !== HODL_FILE_SALT_BYTES)
43
+ throw new Error(UNSUPPORTED);
44
+ return `v3:${cost.N}:${cost.r}:${cost.p}:${toHex(salt)}`;
45
+ }
46
+ export function formatHodlFile(header, iv, tag, ciphertext) {
47
+ return `${header}:${toHex(iv)}:${toHex(tag)}:${toHex(ciphertext)}`;
48
+ }
49
+ function sealedParts(salt, iv, tag, ciphertext) {
50
+ return {
51
+ salt: fromHex(salt, HODL_FILE_SALT_BYTES),
52
+ iv: fromHex(iv, HODL_FILE_IV_BYTES),
53
+ tag: fromHex(tag, HODL_FILE_TAG_BYTES),
54
+ ciphertext: fromHex(ciphertext)
55
+ };
56
+ }
57
+ function validCost({ N, r, p }) {
58
+ return Number.isSafeInteger(r) && r >= 1
59
+ && Number.isSafeInteger(p) && p >= 1 && p <= MAX_SCRYPT_P
60
+ && Number.isSafeInteger(N) && N >= MIN_SCRYPT_N && (N & (N - 1)) === 0
61
+ && 128 * N * r <= MAX_SCRYPT_MEMORY;
62
+ }
63
+ function decimal(value) {
64
+ return /^[1-9][0-9]{0,15}$/.test(value) ? Number(value) : NaN;
65
+ }
66
+ function utf8(value) {
67
+ return new TextEncoder().encode(value);
68
+ }
69
+ function toHex(bytes) {
70
+ return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');
71
+ }
72
+ function fromHex(value, length) {
73
+ if (!/^(?:[0-9a-f]{2})+$/i.test(value) || (length !== undefined && value.length !== length * 2)) {
74
+ throw new Error(UNSUPPORTED);
75
+ }
76
+ return Uint8Array.from(value.match(/../g), byte => parseInt(byte, 16));
77
+ }
78
+ //# sourceMappingURL=hodl-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hodl-file.js","sourceRoot":"","sources":["../hodl-file.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,35 @@
1
- export declare const ERC20_ABI: {
2
- constant: boolean;
3
- inputs: {
4
- name: string;
5
- type: string;
6
- }[];
7
- name: string;
8
- outputs: {
9
- name: string;
10
- type: string;
11
- }[];
12
- type: string;
13
- }[];
1
+ export declare const ERC20_ABI: readonly [{
2
+ readonly name: "decimals";
3
+ readonly type: "function";
4
+ readonly stateMutability: "view";
5
+ readonly inputs: readonly [];
6
+ readonly outputs: readonly [{
7
+ readonly type: "uint8";
8
+ }];
9
+ }, {
10
+ readonly name: "balanceOf";
11
+ readonly type: "function";
12
+ readonly stateMutability: "view";
13
+ readonly inputs: readonly [{
14
+ readonly type: "address";
15
+ readonly name: "_owner";
16
+ }];
17
+ readonly outputs: readonly [{
18
+ readonly type: "uint256";
19
+ readonly name: "balance";
20
+ }];
21
+ }, {
22
+ readonly name: "transfer";
23
+ readonly type: "function";
24
+ readonly stateMutability: "nonpayable";
25
+ readonly inputs: readonly [{
26
+ readonly type: "address";
27
+ readonly name: "_to";
28
+ }, {
29
+ readonly type: "uint256";
30
+ readonly name: "_value";
31
+ }];
32
+ readonly outputs: readonly [{
33
+ readonly type: "bool";
34
+ }];
35
+ }];
@@ -1,27 +1,7 @@
1
- export const ERC20_ABI = [
2
- {
3
- "constant": true,
4
- "inputs": [],
5
- "name": "decimals",
6
- "outputs": [{ "name": "", "type": "uint8" }],
7
- "type": "function"
8
- },
9
- {
10
- "constant": true,
11
- "inputs": [{ "name": "_owner", "type": "address" }],
12
- "name": "balanceOf",
13
- "outputs": [{ "name": "balance", "type": "uint256" }],
14
- "type": "function"
15
- },
16
- {
17
- "constant": false,
18
- "inputs": [
19
- { "name": "_to", "type": "address" },
20
- { "name": "_value", "type": "uint256" }
21
- ],
22
- "name": "transfer",
23
- "outputs": [{ "name": "", "type": "bool" }],
24
- "type": "function"
25
- }
26
- ];
1
+ import { parseAbi } from 'viem';
2
+ export const ERC20_ABI = parseAbi([
3
+ 'function decimals() view returns (uint8)',
4
+ 'function balanceOf(address _owner) view returns (uint256 balance)',
5
+ 'function transfer(address _to, uint256 _value) returns (bool)'
6
+ ]);
27
7
  //# sourceMappingURL=erc20.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../../network/abis/erc20.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB;QACI,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,CAAC,EAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAC,CAAC;QAC1C,MAAM,EAAE,UAAU;KACrB;IACD;QACI,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAC,CAAC;QACjD,MAAM,EAAE,WAAW;QACnB,SAAS,EAAE,CAAC,EAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAC,CAAC;QACnD,MAAM,EAAE,UAAU;KACrB;IACD;QACI,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE;YACN,EAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAC;YAClC,EAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAC;SACxC;QACD,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,CAAC,EAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAC,CAAC;QACzC,MAAM,EAAE,UAAU;KACrB;CACJ,CAAC"}
1
+ {"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../../network/abis/erc20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC9B,0CAA0C;IAC1C,mEAAmE;IACnE,+DAA+D;CAClE,CAAC,CAAC"}