OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-wallet / cmd / balance.js

61 lines · javascript ref:
// cmd/balance.js - Show Wallet Balances

/**
 * Balance command handler
 * @param {WalletContext} context - Wallet context
 * @param {Object} enabledProtocols - Enabled protocol instances
 * @returns {Array} - Command definition
 */
export default function (context, enabledProtocols) {
  return [
    async function handler(args) {
      console.log('💰 Wallet Balances')
      console.log('')

      // Filter protocols if specific one requested
      const protocols = args.protocol
        ? { [args.protocol]: context.protocols[args.protocol] }
        : context.protocols

      if (args.protocol && !protocols[args.protocol]) {
        console.error(`❌ Protocol "${args.protocol}" not enabled`)
        process.exit(1)
      }

      // Get balances from each protocol
      for (const [name, instance] of Object.entries(protocols)) {
        const balances = await instance.getBalance()

        console.log(`${name.toUpperCase()}:`)

        if (Array.isArray(balances)) {
          // Multi-asset protocol (like WDK)
          for (const balance of balances) {
            if (balance.error) {
              console.log(`  ${balance.currency || balance.chain}: Error - ${balance.error}`)
              continue
            }

            const currency = balance.currency || 'UNKNOWN'
            const chain = balance.chain

            // Format balance based on chain using protocol's formatter
            if (instance.formatBalance) {
              const formatted = instance.formatBalance(balance.wei || BigInt(balance.amount), chain)
              console.log(`  ${currency} (${chain}): ${formatted}`)
            } else {
              const amount = balance.amount || '0'
              console.log(`  ${currency} (${chain}): ${amount}`)
            }
          }
        } else {
          // Single asset protocol
          console.log(`  ${balances.currency}: ${balances.amount}`)
        }

        console.log('')
      }
    }
  ]
}