Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,16 @@ pub enum Command {
#[clap(value_enum)]
shell: clap_complete::Shell,
},
#[clap(name = "balance", alias = "balance")]
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
#[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<Pubkey>,
Comment on lines +357 to +358
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
#[clap(index = 1, value_name = "ACCOUNT_ADDRESS")]
pubkey: Option<Pubkey>,
#[clap(short, long]
account: Option<Pubkey>,

For consistency with other options

/// Display balance in lamports instead of SOL
#[clap(long)]
lamports: bool,
},
}

#[derive(Debug, Parser)]
Expand Down Expand Up @@ -915,6 +925,7 @@ fn process_command(opts: Opts) -> Result<()> {
);
Ok(())
}
Command::Balance { pubkey, lamports } => balance(&opts.cfg_override, pubkey, lamports),
}
}

Expand Down Expand Up @@ -4417,6 +4428,53 @@ fn create_client<U: ToString>(url: U) -> RpcClient {
RpcClient::new_with_commitment(url, CommitmentConfig::confirmed())
}

fn balance(cfg_override: &ConfigOverride, pubkey: Option<Pubkey>, 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());
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

~ will not be expanded by read_from_file, so this is unhelpful and should fail earlier

(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::*;
Expand Down
Loading