@solana-compass/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +327 -0
  2. package/bin/sol.mjs +6 -0
  3. package/dist/commands/config.d.ts +2 -0
  4. package/dist/commands/config.js +73 -0
  5. package/dist/commands/config.js.map +1 -0
  6. package/dist/commands/lend.d.ts +2 -0
  7. package/dist/commands/lend.js +262 -0
  8. package/dist/commands/lend.js.map +1 -0
  9. package/dist/commands/lp.d.ts +2 -0
  10. package/dist/commands/lp.js +158 -0
  11. package/dist/commands/lp.js.map +1 -0
  12. package/dist/commands/network.d.ts +2 -0
  13. package/dist/commands/network.js +126 -0
  14. package/dist/commands/network.js.map +1 -0
  15. package/dist/commands/portfolio.d.ts +2 -0
  16. package/dist/commands/portfolio.js +187 -0
  17. package/dist/commands/portfolio.js.map +1 -0
  18. package/dist/commands/stake.d.ts +2 -0
  19. package/dist/commands/stake.js +143 -0
  20. package/dist/commands/stake.js.map +1 -0
  21. package/dist/commands/token.d.ts +2 -0
  22. package/dist/commands/token.js +551 -0
  23. package/dist/commands/token.js.map +1 -0
  24. package/dist/commands/tx.d.ts +2 -0
  25. package/dist/commands/tx.js +131 -0
  26. package/dist/commands/tx.js.map +1 -0
  27. package/dist/commands/wallet.d.ts +2 -0
  28. package/dist/commands/wallet.js +403 -0
  29. package/dist/commands/wallet.js.map +1 -0
  30. package/dist/core/config-manager.d.ts +31 -0
  31. package/dist/core/config-manager.js +79 -0
  32. package/dist/core/config-manager.js.map +1 -0
  33. package/dist/core/kamino-compat.d.ts +17 -0
  34. package/dist/core/kamino-compat.js +38 -0
  35. package/dist/core/kamino-compat.js.map +1 -0
  36. package/dist/core/lend-service.d.ts +41 -0
  37. package/dist/core/lend-service.js +331 -0
  38. package/dist/core/lend-service.js.map +1 -0
  39. package/dist/core/lp-service.d.ts +30 -0
  40. package/dist/core/lp-service.js +21 -0
  41. package/dist/core/lp-service.js.map +1 -0
  42. package/dist/core/onramp-service.d.ts +15 -0
  43. package/dist/core/onramp-service.js +57 -0
  44. package/dist/core/onramp-service.js.map +1 -0
  45. package/dist/core/portfolio-service.d.ts +55 -0
  46. package/dist/core/portfolio-service.js +272 -0
  47. package/dist/core/portfolio-service.js.map +1 -0
  48. package/dist/core/price-service.d.ts +8 -0
  49. package/dist/core/price-service.js +116 -0
  50. package/dist/core/price-service.js.map +1 -0
  51. package/dist/core/rpc.d.ts +5 -0
  52. package/dist/core/rpc.js +69 -0
  53. package/dist/core/rpc.js.map +1 -0
  54. package/dist/core/stake-service.d.ts +42 -0
  55. package/dist/core/stake-service.js +319 -0
  56. package/dist/core/stake-service.js.map +1 -0
  57. package/dist/core/swap-service.d.ts +31 -0
  58. package/dist/core/swap-service.js +142 -0
  59. package/dist/core/swap-service.js.map +1 -0
  60. package/dist/core/token-registry.d.ts +23 -0
  61. package/dist/core/token-registry.js +174 -0
  62. package/dist/core/token-registry.js.map +1 -0
  63. package/dist/core/token-service.d.ts +20 -0
  64. package/dist/core/token-service.js +92 -0
  65. package/dist/core/token-service.js.map +1 -0
  66. package/dist/core/transaction.d.ts +55 -0
  67. package/dist/core/transaction.js +196 -0
  68. package/dist/core/transaction.js.map +1 -0
  69. package/dist/core/wallet-manager.d.ts +20 -0
  70. package/dist/core/wallet-manager.js +142 -0
  71. package/dist/core/wallet-manager.js.map +1 -0
  72. package/dist/db/database.d.ts +3 -0
  73. package/dist/db/database.js +44 -0
  74. package/dist/db/database.js.map +1 -0
  75. package/dist/db/migrations/001_initial.d.ts +1 -0
  76. package/dist/db/migrations/001_initial.js +116 -0
  77. package/dist/db/migrations/001_initial.js.map +1 -0
  78. package/dist/db/migrations/002_tx_prices.d.ts +1 -0
  79. package/dist/db/migrations/002_tx_prices.js +5 -0
  80. package/dist/db/migrations/002_tx_prices.js.map +1 -0
  81. package/dist/db/repos/price-repo.d.ts +11 -0
  82. package/dist/db/repos/price-repo.js +14 -0
  83. package/dist/db/repos/price-repo.js.map +1 -0
  84. package/dist/db/repos/snapshot-repo.d.ts +27 -0
  85. package/dist/db/repos/snapshot-repo.js +32 -0
  86. package/dist/db/repos/snapshot-repo.js.map +1 -0
  87. package/dist/db/repos/token-repo.d.ts +17 -0
  88. package/dist/db/repos/token-repo.js +53 -0
  89. package/dist/db/repos/token-repo.js.map +1 -0
  90. package/dist/db/repos/transaction-repo.d.ts +22 -0
  91. package/dist/db/repos/transaction-repo.js +28 -0
  92. package/dist/db/repos/transaction-repo.js.map +1 -0
  93. package/dist/db/repos/wallet-repo.d.ts +18 -0
  94. package/dist/db/repos/wallet-repo.js +44 -0
  95. package/dist/db/repos/wallet-repo.js.map +1 -0
  96. package/dist/index.d.ts +1 -0
  97. package/dist/index.js +84 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/output/formatter.d.ts +27 -0
  100. package/dist/output/formatter.js +76 -0
  101. package/dist/output/formatter.js.map +1 -0
  102. package/dist/output/portfolio-renderer.d.ts +3 -0
  103. package/dist/output/portfolio-renderer.js +205 -0
  104. package/dist/output/portfolio-renderer.js.map +1 -0
  105. package/dist/output/table.d.ts +8 -0
  106. package/dist/output/table.js +22 -0
  107. package/dist/output/table.js.map +1 -0
  108. package/dist/utils/fs.d.ts +7 -0
  109. package/dist/utils/fs.js +39 -0
  110. package/dist/utils/fs.js.map +1 -0
  111. package/dist/utils/retry.d.ts +17 -0
  112. package/dist/utils/retry.js +55 -0
  113. package/dist/utils/retry.js.map +1 -0
  114. package/dist/utils/solana.d.ts +9 -0
  115. package/dist/utils/solana.js +26 -0
  116. package/dist/utils/solana.js.map +1 -0
  117. package/dist/utils/token-list.d.ts +9 -0
  118. package/dist/utils/token-list.js +31 -0
  119. package/dist/utils/token-list.js.map +1 -0
  120. package/package.json +44 -0
@@ -0,0 +1,551 @@
1
+ import { resolveToken, resolveTokens, syncTokenCache } from '../core/token-registry.js';
2
+ import { getPrices } from '../core/price-service.js';
3
+ import { getTokenBalances, getAllTokenAccounts } from '../core/token-service.js';
4
+ import { getQuote, executeSwap } from '../core/swap-service.js';
5
+ import { getDefaultWalletName, resolveWalletName, loadSigner } from '../core/wallet-manager.js';
6
+ import { output, success, failure, isJsonMode, timed, verbose } from '../output/formatter.js';
7
+ import { table } from '../output/table.js';
8
+ import { isValidAddress, solToLamports, uiToTokenAmount, explorerUrl, SOL_MINT } from '../utils/solana.js';
9
+ import { buildAndSendTransaction } from '../core/transaction.js';
10
+ import { address } from '@solana/kit';
11
+ import { getTransferSolInstruction } from '@solana-program/system';
12
+ import { getBurnCheckedInstruction, getCloseAccountInstruction } from '@solana-program/token';
13
+ import * as walletRepo from '../db/repos/wallet-repo.js';
14
+ export function registerTokenCommand(program) {
15
+ const token = program.command('token').description('Token operations');
16
+ token
17
+ .command('price <symbols...>')
18
+ .description('Get current USD price for one or more tokens')
19
+ .action(async (symbols) => {
20
+ try {
21
+ const { result: data, elapsed_ms } = await timed(async () => {
22
+ const resolved = await resolveTokens(symbols);
23
+ const mints = [...resolved.values()].map(t => t.mint);
24
+ const prices = await getPrices(mints);
25
+ return symbols.map(sym => {
26
+ const token = resolved.get(sym);
27
+ if (!token)
28
+ return { symbol: sym, mint: null, priceUsd: null, error: 'Unknown token' };
29
+ const price = prices.get(token.mint);
30
+ return {
31
+ symbol: token.symbol,
32
+ name: token.name,
33
+ mint: token.mint,
34
+ priceUsd: price?.priceUsd ?? null,
35
+ };
36
+ });
37
+ });
38
+ if (isJsonMode()) {
39
+ output(success(data, { elapsed_ms }));
40
+ }
41
+ else {
42
+ for (const p of data) {
43
+ if (p.priceUsd !== null) {
44
+ console.log(`${p.symbol}: $${p.priceUsd.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 6 })}`);
45
+ }
46
+ else {
47
+ console.log(`${p.symbol}: ${p.error || 'price unavailable'}`);
48
+ }
49
+ }
50
+ }
51
+ }
52
+ catch (err) {
53
+ output(failure('PRICE_FETCH_FAILED', err.message));
54
+ process.exitCode = 1;
55
+ }
56
+ });
57
+ token
58
+ .command('info <symbol>')
59
+ .description('Show token metadata (decimals, supply, authorities)')
60
+ .action(async (symbol) => {
61
+ try {
62
+ const { result: data, elapsed_ms } = await timed(async () => {
63
+ const token = await resolveToken(symbol);
64
+ if (!token)
65
+ throw new Error(`Unknown token: ${symbol}`);
66
+ return token;
67
+ });
68
+ if (isJsonMode()) {
69
+ output(success(data, { elapsed_ms }));
70
+ }
71
+ else {
72
+ console.log(`${data.symbol} — ${data.name}`);
73
+ console.log(` Mint: ${data.mint}`);
74
+ console.log(` Decimals: ${data.decimals}`);
75
+ if (data.logoUri)
76
+ console.log(` Logo: ${data.logoUri}`);
77
+ }
78
+ }
79
+ catch (err) {
80
+ output(failure('TOKEN_INFO_FAILED', err.message));
81
+ process.exitCode = 1;
82
+ }
83
+ });
84
+ token
85
+ .command('list')
86
+ .description('List all tokens in wallet')
87
+ .option('--wallet <name>', 'Wallet to use')
88
+ .action(async (opts) => {
89
+ try {
90
+ const walletName = opts.wallet ? resolveWalletName(opts.wallet) : getDefaultWalletName();
91
+ const wallet = walletRepo.getWallet(walletName);
92
+ const { result: balances, elapsed_ms } = await timed(() => getTokenBalances(wallet.address));
93
+ if (isJsonMode()) {
94
+ output(success({ wallet: walletName, tokens: balances }, { elapsed_ms }));
95
+ }
96
+ else {
97
+ console.log(`Tokens in wallet "${walletName}":\n`);
98
+ if (balances.length === 0) {
99
+ console.log(' No tokens found.');
100
+ }
101
+ else {
102
+ console.log(table(balances.map(b => ({
103
+ symbol: b.symbol,
104
+ balance: b.uiBalance.toFixed(6),
105
+ mint: b.mint.length > 20 ? b.mint.slice(0, 8) + '...' + b.mint.slice(-4) : b.mint,
106
+ })), [
107
+ { key: 'symbol', header: 'Token' },
108
+ { key: 'balance', header: 'Balance', align: 'right' },
109
+ { key: 'mint', header: 'Mint' },
110
+ ]));
111
+ }
112
+ }
113
+ }
114
+ catch (err) {
115
+ output(failure('TOKEN_LIST_FAILED', err.message));
116
+ process.exitCode = 1;
117
+ }
118
+ });
119
+ token
120
+ .command('sync')
121
+ .description('Refresh token metadata cache from Jupiter')
122
+ .action(async () => {
123
+ try {
124
+ const { result: count, elapsed_ms } = await timed(() => syncTokenCache());
125
+ if (isJsonMode()) {
126
+ output(success({ tokensCached: count }, { elapsed_ms }));
127
+ }
128
+ else {
129
+ console.log(`Synced ${count} tokens to cache.`);
130
+ }
131
+ }
132
+ catch (err) {
133
+ output(failure('TOKEN_SYNC_FAILED', err.message));
134
+ process.exitCode = 1;
135
+ }
136
+ });
137
+ token
138
+ .command('swap <amount> <from> <to>')
139
+ .description('Swap tokens via Jupiter (e.g., sol token swap 1.5 SOL USDC)')
140
+ .option('--slippage <bps>', 'Slippage tolerance in basis points', parseInt)
141
+ .option('--quote-only', 'Show quote without executing')
142
+ .option('--wallet <name>', 'Wallet to use')
143
+ .option('--yes', 'Skip confirmation')
144
+ .action(async (amountStr, from, to, opts) => {
145
+ try {
146
+ const amount = parseFloat(amountStr);
147
+ if (isNaN(amount) || amount <= 0)
148
+ throw new Error('Invalid amount');
149
+ const { result: quote, elapsed_ms } = await timed(() => getQuote(from, to, amount, { slippageBps: opts.slippage }));
150
+ if (opts.quoteOnly) {
151
+ if (isJsonMode()) {
152
+ const { _raw, ...quoteData } = quote;
153
+ output(success(quoteData, { elapsed_ms }));
154
+ }
155
+ else {
156
+ console.log(`Swap Quote:`);
157
+ console.log(` ${quote.inputUiAmount} ${quote.inputSymbol} → ${quote.outputUiAmount.toFixed(6)} ${quote.outputSymbol}`);
158
+ console.log(` Price impact: ${quote.priceImpactPct.toFixed(4)}%`);
159
+ console.log(` Route: ${quote.routePlan}`);
160
+ console.log(` Slippage: ${quote.slippageBps / 100}%`);
161
+ }
162
+ return;
163
+ }
164
+ // Show quote before executing (unless --yes)
165
+ if (!opts.yes && !isJsonMode()) {
166
+ console.log(`Swap: ${quote.inputUiAmount} ${quote.inputSymbol} → ${quote.outputUiAmount.toFixed(6)} ${quote.outputSymbol}`);
167
+ console.log(` Price impact: ${quote.priceImpactPct.toFixed(4)}%`);
168
+ console.log(` Route: ${quote.routePlan}`);
169
+ }
170
+ const walletName = opts.wallet ? resolveWalletName(opts.wallet) : getDefaultWalletName();
171
+ const result = await executeSwap(from, to, amount, walletName, { slippageBps: opts.slippage });
172
+ if (isJsonMode()) {
173
+ output(success(result, { elapsed_ms }));
174
+ }
175
+ else {
176
+ console.log(`\nSwap executed!`);
177
+ console.log(` ${result.inputAmount} ${result.inputSymbol} → ${result.outputAmount.toFixed(6)} ${result.outputSymbol}`);
178
+ console.log(` Signature: ${result.signature}`);
179
+ console.log(` Explorer: ${result.explorerUrl}`);
180
+ }
181
+ }
182
+ catch (err) {
183
+ output(failure('SWAP_FAILED', err.message));
184
+ process.exitCode = 1;
185
+ }
186
+ });
187
+ token
188
+ .command('send <amount> <tokenSymbol> <recipient>')
189
+ .description('Send SOL or SPL tokens to an address')
190
+ .option('--wallet <name>', 'Wallet to send from')
191
+ .option('--yes', 'Skip confirmation')
192
+ .action(async (amountStr, tokenSymbol, recipient, opts) => {
193
+ try {
194
+ const amount = parseFloat(amountStr);
195
+ if (isNaN(amount) || amount <= 0)
196
+ throw new Error('Invalid amount');
197
+ if (!isValidAddress(recipient))
198
+ throw new Error('Invalid recipient address');
199
+ const walletName = opts.wallet ? resolveWalletName(opts.wallet) : getDefaultWalletName();
200
+ const signer = await loadSigner(walletName);
201
+ const tokenMeta = await resolveToken(tokenSymbol);
202
+ if (!tokenMeta)
203
+ throw new Error(`Unknown token: ${tokenSymbol}`);
204
+ if (!opts.yes && !isJsonMode()) {
205
+ console.log(`Send ${amount} ${tokenMeta.symbol} from "${walletName}" to ${recipient}`);
206
+ }
207
+ if (tokenMeta.mint === SOL_MINT) {
208
+ const ix = getTransferSolInstruction({
209
+ source: signer,
210
+ destination: address(recipient),
211
+ amount: solToLamports(amount),
212
+ });
213
+ const result = await buildAndSendTransaction([ix], signer, {
214
+ txType: 'transfer',
215
+ walletName,
216
+ fromMint: SOL_MINT,
217
+ fromAmount: String(solToLamports(amount)),
218
+ });
219
+ if (isJsonMode()) {
220
+ output(success({
221
+ signature: result.signature,
222
+ from: signer.address,
223
+ to: recipient,
224
+ amount,
225
+ token: tokenMeta.symbol,
226
+ status: result.status,
227
+ explorerUrl: result.explorerUrl,
228
+ }));
229
+ }
230
+ else {
231
+ console.log(`\nSent ${amount} SOL`);
232
+ console.log(` Signature: ${result.signature}`);
233
+ console.log(` Explorer: ${result.explorerUrl}`);
234
+ }
235
+ }
236
+ else {
237
+ // SPL token transfer — requires token program instructions
238
+ // TODO: Implement SPL token transfer using @solana-program/token
239
+ throw new Error('SPL token transfers coming soon. Use SOL transfers for now.');
240
+ }
241
+ }
242
+ catch (err) {
243
+ output(failure('SEND_FAILED', err.message));
244
+ process.exitCode = 1;
245
+ }
246
+ });
247
+ // ── Burn ────────────────────────────────────────────────────
248
+ token
249
+ .command('burn <symbol> [amount]')
250
+ .description('Burn tokens from wallet')
251
+ .option('--all', 'Burn entire balance')
252
+ .option('--close', 'Close the token account after burning')
253
+ .option('--wallet <name>', 'Wallet to use')
254
+ .option('--yes', 'Skip confirmation')
255
+ .action(async (symbol, amountStr, opts) => {
256
+ try {
257
+ const { result: data, elapsed_ms } = await timed(async () => {
258
+ const walletName = opts.wallet ? resolveWalletName(opts.wallet) : getDefaultWalletName();
259
+ const signer = await loadSigner(walletName);
260
+ const wallet = walletRepo.getWallet(walletName);
261
+ if (!wallet)
262
+ throw new Error(`Wallet "${walletName}" not found`);
263
+ const tokenMeta = await resolveToken(symbol);
264
+ if (!tokenMeta)
265
+ throw new Error(`Unknown token: ${symbol}`);
266
+ if (tokenMeta.mint === SOL_MINT)
267
+ throw new Error('Cannot burn native SOL');
268
+ // Find the token account
269
+ const accounts = await getAllTokenAccounts(wallet.address);
270
+ const tokenAccount = accounts.find(a => a.mint === tokenMeta.mint);
271
+ if (!tokenAccount)
272
+ throw new Error(`No token account found for ${tokenMeta.symbol}`);
273
+ let burnAmount;
274
+ if (opts.all) {
275
+ burnAmount = BigInt(tokenAccount.balance);
276
+ if (burnAmount === 0n)
277
+ throw new Error(`Token account for ${tokenMeta.symbol} has zero balance`);
278
+ }
279
+ else if (amountStr) {
280
+ const amount = parseFloat(amountStr);
281
+ if (isNaN(amount) || amount <= 0)
282
+ throw new Error('Invalid amount');
283
+ burnAmount = uiToTokenAmount(amount, tokenMeta.decimals);
284
+ if (burnAmount > BigInt(tokenAccount.balance)) {
285
+ throw new Error(`Insufficient balance: have ${tokenAccount.uiBalance}, want to burn ${amount}`);
286
+ }
287
+ }
288
+ else {
289
+ throw new Error('Specify an amount or use --all');
290
+ }
291
+ const uiBurnAmount = Number(burnAmount) / Math.pow(10, tokenMeta.decimals);
292
+ if (!opts.yes && !isJsonMode()) {
293
+ console.log(`Burn ${uiBurnAmount} ${tokenMeta.symbol} from "${walletName}"`);
294
+ if (opts.close)
295
+ console.log(' + close token account (reclaim rent)');
296
+ }
297
+ const instructions = [
298
+ getBurnCheckedInstruction({
299
+ account: address(tokenAccount.pubkey),
300
+ mint: address(tokenMeta.mint),
301
+ authority: signer,
302
+ amount: burnAmount,
303
+ decimals: tokenMeta.decimals,
304
+ }),
305
+ ];
306
+ // Close account if requested and entire balance is being burned
307
+ const shouldClose = opts.close && (opts.all || burnAmount === BigInt(tokenAccount.balance));
308
+ if (shouldClose) {
309
+ instructions.push(getCloseAccountInstruction({
310
+ account: address(tokenAccount.pubkey),
311
+ destination: address(wallet.address),
312
+ owner: signer,
313
+ }));
314
+ }
315
+ const result = await buildAndSendTransaction(instructions, signer, {
316
+ txType: 'burn',
317
+ walletName,
318
+ fromMint: tokenMeta.mint,
319
+ fromAmount: String(burnAmount),
320
+ });
321
+ return {
322
+ signature: result.signature,
323
+ token: tokenMeta.symbol,
324
+ mint: tokenMeta.mint,
325
+ amountBurned: uiBurnAmount,
326
+ accountClosed: shouldClose,
327
+ status: result.status,
328
+ explorerUrl: result.explorerUrl,
329
+ };
330
+ });
331
+ if (isJsonMode()) {
332
+ output(success(data, { elapsed_ms }));
333
+ }
334
+ else {
335
+ console.log(`\nBurned ${data.amountBurned} ${data.token}`);
336
+ if (data.accountClosed)
337
+ console.log(' Account closed (rent reclaimed)');
338
+ console.log(` Signature: ${data.signature}`);
339
+ console.log(` Explorer: ${data.explorerUrl}`);
340
+ }
341
+ }
342
+ catch (err) {
343
+ output(failure('BURN_FAILED', err.message));
344
+ process.exitCode = 1;
345
+ }
346
+ });
347
+ // ── Close ───────────────────────────────────────────────────
348
+ token
349
+ .command('close [symbol]')
350
+ .description('Close token accounts to reclaim rent SOL (~0.002 SOL each)')
351
+ .option('--burn', 'Burn remaining dust tokens before closing')
352
+ .option('--all', 'Close everything: swap valuable tokens to SOL, burn dust, close')
353
+ .option('--wallet <name>', 'Wallet to use')
354
+ .option('--yes', 'Skip confirmation')
355
+ .action(async (symbol, opts) => {
356
+ try {
357
+ const { result: data, elapsed_ms } = await timed(async () => {
358
+ const walletName = opts.wallet ? resolveWalletName(opts.wallet) : getDefaultWalletName();
359
+ const signer = await loadSigner(walletName);
360
+ const wallet = walletRepo.getWallet(walletName);
361
+ if (!wallet)
362
+ throw new Error(`Wallet "${walletName}" not found`);
363
+ const accounts = await getAllTokenAccounts(wallet.address);
364
+ // If specific token, filter to just that one
365
+ let targets;
366
+ if (symbol) {
367
+ const tokenMeta = await resolveToken(symbol);
368
+ if (!tokenMeta)
369
+ throw new Error(`Unknown token: ${symbol}`);
370
+ targets = accounts.filter(a => a.mint === tokenMeta.mint);
371
+ if (targets.length === 0)
372
+ throw new Error(`No token account found for ${symbol}`);
373
+ }
374
+ else {
375
+ targets = accounts;
376
+ }
377
+ if (targets.length === 0)
378
+ throw new Error('No token accounts to close');
379
+ // Classify accounts
380
+ const empty = [];
381
+ const hasDust = [];
382
+ const hasValue = [];
383
+ const DUST_THRESHOLD_USD = 0.0001;
384
+ // Get prices for non-zero accounts
385
+ const nonZeroMints = targets.filter(a => a.balance !== '0').map(a => a.mint);
386
+ const prices = nonZeroMints.length > 0 ? await getPrices(nonZeroMints) : new Map();
387
+ for (const account of targets) {
388
+ if (account.balance === '0') {
389
+ empty.push(account);
390
+ continue;
391
+ }
392
+ const price = prices.get(account.mint);
393
+ const valueUsd = price ? price.priceUsd * account.uiBalance : null;
394
+ if (valueUsd === null || valueUsd < DUST_THRESHOLD_USD) {
395
+ hasDust.push(account);
396
+ }
397
+ else {
398
+ hasValue.push(account);
399
+ }
400
+ }
401
+ if (!isJsonMode()) {
402
+ if (empty.length > 0)
403
+ console.log(` ${empty.length} empty account(s) — will close`);
404
+ if (hasDust.length > 0)
405
+ console.log(` ${hasDust.length} dust account(s) (< $0.0001)${opts.burn || opts.all ? ' — will burn + close' : ' — use --burn to burn + close'}`);
406
+ if (hasValue.length > 0)
407
+ console.log(` ${hasValue.length} account(s) with value${opts.all ? ' — will swap to SOL + close' : ' — use --all to swap + close'}`);
408
+ }
409
+ const results = [];
410
+ // 1. Handle --all: swap valuable tokens to SOL first
411
+ if (opts.all && hasValue.length > 0) {
412
+ for (const account of hasValue) {
413
+ if (account.mint === SOL_MINT)
414
+ continue;
415
+ try {
416
+ if (!isJsonMode())
417
+ console.log(` Swapping ${account.uiBalance} ${account.symbol} to SOL...`);
418
+ const swapResult = await executeSwap(account.symbol, 'SOL', account.uiBalance, walletName, { rewardBps: 500 });
419
+ results.push({
420
+ account: account.pubkey,
421
+ mint: account.mint,
422
+ symbol: account.symbol,
423
+ action: 'swapped',
424
+ signature: swapResult.signature,
425
+ explorerUrl: swapResult.explorerUrl,
426
+ });
427
+ // After swap the account may now be empty — add to close list
428
+ empty.push(account);
429
+ }
430
+ catch (err) {
431
+ verbose(`Failed to swap ${account.symbol}: ${err.message}`);
432
+ results.push({
433
+ account: account.pubkey,
434
+ mint: account.mint,
435
+ symbol: account.symbol,
436
+ action: `swap failed: ${err.message}`,
437
+ });
438
+ }
439
+ }
440
+ }
441
+ // 2. Burn dust + close, or just close empty
442
+ const toProcess = [
443
+ ...empty.map(a => ({ ...a, needsBurn: false })),
444
+ ...(opts.burn || opts.all ? hasDust.map(a => ({ ...a, needsBurn: true })) : []),
445
+ ];
446
+ // Batch into transactions (max ~20 accounts per tx to stay under compute limits)
447
+ const BATCH_SIZE = 20;
448
+ for (let i = 0; i < toProcess.length; i += BATCH_SIZE) {
449
+ const batch = toProcess.slice(i, i + BATCH_SIZE);
450
+ const instructions = [];
451
+ for (const account of batch) {
452
+ if (account.needsBurn && account.balance !== '0') {
453
+ instructions.push(getBurnCheckedInstruction({
454
+ account: address(account.pubkey),
455
+ mint: address(account.mint),
456
+ authority: signer,
457
+ amount: BigInt(account.balance),
458
+ decimals: account.decimals,
459
+ }));
460
+ }
461
+ instructions.push(getCloseAccountInstruction({
462
+ account: address(account.pubkey),
463
+ destination: address(wallet.address),
464
+ owner: signer,
465
+ }));
466
+ }
467
+ if (instructions.length === 0)
468
+ continue;
469
+ // 5% of reclaimed rent to compassSOL reserve
470
+ const RENT_PER_ACCOUNT = 2039280n;
471
+ const contributionPerAccount = RENT_PER_ACCOUNT * 5n / 100n;
472
+ const totalContribution = contributionPerAccount * BigInt(batch.length);
473
+ instructions.push(getTransferSolInstruction({
474
+ source: signer,
475
+ destination: address('8H2xjMT543YWBLRjJ24BrQyBgFuQRU6MgENA3mqXoh7y'),
476
+ amount: totalContribution,
477
+ }));
478
+ try {
479
+ const txResult = await buildAndSendTransaction(instructions, signer, {
480
+ txType: 'close',
481
+ walletName,
482
+ });
483
+ for (const account of batch) {
484
+ results.push({
485
+ account: account.pubkey,
486
+ mint: account.mint,
487
+ symbol: account.symbol,
488
+ action: account.needsBurn ? 'burned + closed' : 'closed',
489
+ signature: txResult.signature,
490
+ explorerUrl: txResult.explorerUrl,
491
+ });
492
+ }
493
+ }
494
+ catch (err) {
495
+ for (const account of batch) {
496
+ results.push({
497
+ account: account.pubkey,
498
+ mint: account.mint,
499
+ symbol: account.symbol,
500
+ action: `failed: ${err.message}`,
501
+ });
502
+ }
503
+ }
504
+ }
505
+ // Accounts that weren't processed (have value but no --all, dust but no --burn)
506
+ const skippedValue = opts.all ? [] : hasValue;
507
+ const skippedDust = (opts.burn || opts.all) ? [] : hasDust;
508
+ return {
509
+ closed: results.filter(r => r.action.includes('closed')).length,
510
+ burned: results.filter(r => r.action.includes('burned')).length,
511
+ swapped: results.filter(r => r.action === 'swapped').length,
512
+ failed: results.filter(r => r.action.includes('failed')).length,
513
+ skippedWithValue: skippedValue.length,
514
+ skippedWithDust: skippedDust.length,
515
+ rentReclaimed: results.filter(r => r.action.includes('closed')).length * 0.00203,
516
+ accounts: results,
517
+ };
518
+ });
519
+ if (isJsonMode()) {
520
+ output(success(data, { elapsed_ms }));
521
+ }
522
+ else {
523
+ console.log(`\nClosed ${data.closed} account(s)`);
524
+ if (data.burned > 0)
525
+ console.log(` Burned dust in ${data.burned} account(s)`);
526
+ if (data.swapped > 0)
527
+ console.log(` Swapped ${data.swapped} token(s) to SOL`);
528
+ if (data.failed > 0)
529
+ console.log(` Failed: ${data.failed}`);
530
+ if (data.rentReclaimed > 0)
531
+ console.log(` Rent reclaimed: ~${data.rentReclaimed.toFixed(5)} SOL`);
532
+ if (data.skippedWithValue > 0)
533
+ console.log(` Skipped ${data.skippedWithValue} account(s) with value (use --all)`);
534
+ if (data.skippedWithDust > 0)
535
+ console.log(` Skipped ${data.skippedWithDust} dust account(s) (use --burn)`);
536
+ if (data.accounts.length > 0) {
537
+ const sigs = [...new Set(data.accounts.filter(a => a.signature).map(a => a.signature))];
538
+ for (const sig of sigs) {
539
+ console.log(` Tx: ${explorerUrl(sig)}`);
540
+ }
541
+ }
542
+ console.log('');
543
+ }
544
+ }
545
+ catch (err) {
546
+ output(failure('CLOSE_FAILED', err.message));
547
+ process.exitCode = 1;
548
+ }
549
+ });
550
+ }
551
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTxCommand(program: Command): void;