diff --git a/linera-service/src/cli/main.rs b/linera-service/src/cli/main.rs index 91ccf055ad4..f53a3522ee6 100644 --- a/linera-service/src/cli/main.rs +++ b/linera-service/src/cli/main.rs @@ -2559,6 +2559,8 @@ async fn run(options: &ClientOptions) -> Result { short, owned, } => { + let wallet_path = options.wallet_path()?; + tracing::info!("Reading wallet from file: {}", wallet_path.display()); let wallet = options.wallet()?; let chain_ids = if let Some(chain_id) = chain_id { ensure!(!owned, "Cannot specify both --owned and a chain ID"); diff --git a/linera-service/src/wallet.rs b/linera-service/src/wallet.rs index 970b83e2f23..2e0f6f3334c 100644 --- a/linera-service/src/wallet.rs +++ b/linera-service/src/wallet.rs @@ -7,17 +7,12 @@ use linera_base::{ }; pub use linera_client::wallet::*; -pub fn pretty_print(wallet: &Wallet, chain_ids: impl IntoIterator) { +pub fn pretty_print(wallet: &Wallet, chain_ids: Vec) { let chain_ids: Vec<_> = chain_ids.into_iter().collect(); let total_chains = chain_ids.len(); - if total_chains == 0 { - println!("No chains in wallet."); - return; - } - let plural_s = if total_chains == 1 { "" } else { "s" }; - println!("\n\x1b[1mWALLET ({total_chains} chain{plural_s} in total)\x1b[0m",); + tracing::info!("Found {total_chains} chain{plural_s}"); let mut chains = chain_ids .into_iter() @@ -34,9 +29,9 @@ pub fn pretty_print(wallet: &Wallet, chain_ids: impl IntoIterator { @@ -65,36 +60,50 @@ impl<'a> ChainDetails<'a> { } fn print_paragraph(&self) { - let title = if self.is_admin { - "Admin Chain".to_string() - } else { - match self.origin { - Some(ChainOrigin::Root(i)) => format!("Root Chain {i}"), - _ => "Child Chain".to_string(), + println!("-----------------------"); + println!(" {:<20} {}", "Chain ID:", self.user_chain.chain_id); + + let mut tags = Vec::new(); + if self.is_default { + tags.push("DEFAULT"); + } + if self.is_admin { + tags.push("ADMIN"); + } + if !tags.is_empty() { + println!("{:<20} {}", "Tags:", tags.join(", ")); + } + + match self.origin { + Some(ChainOrigin::Root(_)) | None => { + println!("{:<20} -", "Parent chain:"); } - }; - let default_marker = if self.is_default { " [DEFAULT]" } else { "" }; + Some(ChainOrigin::Child { parent, .. }) => { + println!("{:<20} {parent}", "Parent chain:"); + } + } - // Print chain header in bold - println!("\x1b[1m{}{}\x1b[0m", title, default_marker); - println!(" Chain ID: {}", self.user_chain.chain_id); if let Some(owner) = &self.user_chain.owner { - println!(" Owner: {owner}"); + println!("{:<20} {owner}", "Default owner:"); } else { - println!(" Owner: No owner key"); + println!("{:<20} No owner key", "Default owner:"); } - println!(" Timestamp: {}", self.user_chain.timestamp); - println!(" Blocks: {}", self.user_chain.next_block_height); + + println!("{:<20} {}", "Timestamp:", self.user_chain.timestamp); + println!("{:<20} {}", "Blocks:", self.user_chain.next_block_height); + if let Some(epoch) = self.user_chain.epoch { - println!(" Epoch: {epoch}"); + println!("{:<20} {epoch}", "Epoch:"); } else { - println!(" Epoch: -"); + println!("{:<20} -", "Epoch:"); } + if let Some(hash) = self.user_chain.block_hash { - println!(" Latest Block: {}", hash); + println!("{:<20} {hash}", "Latest block hash:"); } + if self.user_chain.pending_proposal.is_some() { - println!(" Status: ⚠ Pending proposal"); + println!("{:<20} present", "Pending proposal:"); } } }