/** * Queue Balance CLI command - Show queue balance and pending deposits */ import { Command } from 'commander'; import { getQueueBalance } from '../../balance.js'; import { handleCLIError, CLIError, ErrorCode } from '../errors.js'; import { clearProgress, createProgressReporter, printFields, printHeader, printJson, printList } from '../output.js'; import { resolveAddress } from '../config.js'; import type { RelayPool } from '../../types.js'; const SUPPORTED_POOLS: RelayPool[] = ['eth', 'usdc']; function printQueueBalanceHuman(result: Awaited>, pool: RelayPool): void { printHeader(`Queue ${pool.toUpperCase()} Balance`); printFields([ { label: 'Address', value: result.address }, { label: 'Balance', value: result.queueBalance }, { label: 'Pending', value: result.pendingCount }, ]); if (result.pendingDeposits.length > 0) { printList( result.pendingDeposits.map((deposit) => `nonce ${deposit.nonce}: ${deposit.amount} (${deposit.status})`) ); } } export function createQueueBalanceCommand(name = 'queue-balance'): Command { const balance = new Command(name) .description('Show queue balance and pending deposits') .option('--pool ', 'Pool to check (eth or usdc)', 'eth') .option('--address
', 'Address to check (or derived from WALLET_KEY / SIGNER_ADDRESS)') .option('--json', 'Output as JSON') .addHelpText('after', ` Examples: veil balance queue veil balance queue --pool usdc veil balance queue --address 0x... --json `) .action(async (options) => { try { const pool = (options.pool || 'eth').toLowerCase() as RelayPool; if (!SUPPORTED_POOLS.includes(pool)) { throw new CLIError(ErrorCode.INVALID_AMOUNT, `Unsupported pool: ${options.pool}. Supported: ${SUPPORTED_POOLS.join(', ')}`); } const resolvedAddress = resolveAddress({ address: options.address }, { required: true }); if (!resolvedAddress) { throw new CLIError( ErrorCode.WALLET_KEY_MISSING, 'Must provide --address, set SIGNER_ADDRESS, or set WALLET_KEY env.', ); } const address = resolvedAddress.address; const rpcUrl = process.env.RPC_URL; const onProgress = createProgressReporter(); const result = await getQueueBalance({ address, pool, rpcUrl, onProgress }); clearProgress(); if (options.json) { printJson(result); return; } printQueueBalanceHuman(result, pool); } catch (error) { clearProgress(); handleCLIError(error); } }); return balance; }