diff --git a/cli/src/lib.rs b/cli/src/lib.rs index 46385392ed..8dec393b62 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -350,6 +350,16 @@ pub enum Command { #[clap(value_enum)] shell: clap_complete::Shell, }, + #[clap(name = "balance", alias = "balance")] + /// Get your balance + Balance { + /// Account balance to check (defaults to configured wallet) + #[clap(index = 1, value_name = "ACCOUNT_ADDRESS")] + pubkey: Option, + /// Display balance in lamports instead of SOL + #[clap(long)] + lamports: bool, + }, } #[derive(Debug, Parser)] @@ -915,6 +925,7 @@ fn process_command(opts: Opts) -> Result<()> { ); Ok(()) } + Command::Balance { pubkey, lamports } => balance(&opts.cfg_override, pubkey, lamports), } } @@ -4417,6 +4428,53 @@ fn create_client(url: U) -> RpcClient { RpcClient::new_with_commitment(url, CommitmentConfig::confirmed()) } +fn balance(cfg_override: &ConfigOverride, pubkey: Option, lamports: bool) -> Result<()> { + // Get config or use defaults when outside workspace + let (cluster_url, wallet_path) = match Config::discover(cfg_override) { + Ok(Some(cfg)) => ( + cfg.provider.cluster.url().to_string(), + cfg.provider.wallet.to_string(), + ), + _ => { + // Default to mainnet and standard Solana CLI keypair path + let default_cluster = "https://api.mainnet-beta.solana.com".to_string(); + let default_keypair = dirs::home_dir() + .map(|home| { + home.join(".config/solana/id.json") + .to_string_lossy() + .to_string() + }) + .unwrap_or_else(|| "~/.config/solana/id.json".to_string()); + (default_cluster, default_keypair) + } + }; + + // Create RPC client from cluster URL + let client = RpcClient::new(cluster_url); + + // Determine the actual pubkey to check + let actual_pubkey = if let Some(pubkey) = pubkey { + pubkey + } else { + // Load keypair from wallet path and get pubkey + let keypair = Keypair::read_from_file(wallet_path) + .map_err(|e| anyhow!("Failed to read keypair: {}", e))?; + keypair.pubkey() + }; + + // Get balance + let balance = client.get_balance(&actual_pubkey)?; + + // Format and display output + if lamports { + println!("{}", balance); + } else { + println!("{:.9} SOL", balance as f64 / 1_000_000_000.0); + } + + Ok(()) +} + #[cfg(test)] mod tests { use super::*;