diff --git a/token/cli/src/main.rs b/token/cli/src/main.rs index ee2e83f5..36de6149 100644 --- a/token/cli/src/main.rs +++ b/token/cli/src/main.rs @@ -4,7 +4,7 @@ use clap::{ }; use serde::Serialize; use solana_account_decoder::{ - parse_token::{TokenAccountType, UiAccountState}, + parse_token::{parse_token, TokenAccountType, UiAccountState}, UiAccountData, }; use solana_clap_utils::{ @@ -1645,43 +1645,19 @@ async fn command_account_info(config: &Config<'_>, address: Pubkey) -> CommandRe async fn command_display(config: &Config<'_>, address: Pubkey) -> CommandResult { let account = config.get_account_checked(&address).await?; + let token_data = parse_token(&account.data, None); - let cli_output = if let Ok(multisig) = Multisig::unpack(&account.data) { - let n = multisig.n as usize; - - if n > multisig.signers.len() { - return Err(format!( - "Multisig {} malformed: {} signers required, but only {} declared", - address, - n, - multisig.signers.len() - ) - .into()); - } - - CliMultisig { + if let Ok(TokenAccountType::Multisig(multisig)) = token_data { + let cli_output = CliMultisig { address: address.to_string(), program_id: config.program_id.to_string(), - m: multisig.m, - n: multisig.n, - signers: multisig - .signers - .iter() - .enumerate() - .filter_map(|(i, signer)| { - if i < n { - Some(signer.to_string()) - } else { - None - } - }) - .collect(), - } + multisig, + }; + + Ok(config.output_format.formatted_string(&cli_output)) } else { panic!("unimplemented"); - }; - - Ok(config.output_format.formatted_string(&cli_output)) + } } async fn command_gc( diff --git a/token/cli/src/output.rs b/token/cli/src/output.rs index 172c2ebc..d444c601 100644 --- a/token/cli/src/output.rs +++ b/token/cli/src/output.rs @@ -1,7 +1,9 @@ use crate::{config::Config, sort::UnsupportedAccount}; use console::Emoji; use serde::{Deserialize, Serialize, Serializer}; -use solana_account_decoder::parse_token::{UiAccountState, UiTokenAccount, UiTokenAmount}; +use solana_account_decoder::parse_token::{ + UiAccountState, UiMultisig, UiTokenAccount, UiTokenAmount, +}; use solana_cli_output::{display::writeln_name_value, OutputFormat, QuietDisplay, VerboseDisplay}; use std::fmt::{self, Display}; @@ -149,9 +151,8 @@ impl fmt::Display for CliWalletAddress { pub(crate) struct CliMultisig { pub(crate) address: String, pub(crate) program_id: String, - pub(crate) m: u8, - pub(crate) n: u8, - pub(crate) signers: Vec, + #[serde(flatten)] + pub(crate) multisig: UiMultisig, } impl QuietDisplay for CliMultisig {} @@ -159,16 +160,18 @@ impl VerboseDisplay for CliMultisig {} impl fmt::Display for CliMultisig { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let m = self.multisig.num_required_signers; + let n = self.multisig.num_valid_signers; writeln!(f)?; writeln_name_value(f, "Type:", "Multisig")?; writeln_name_value(f, "Address:", &self.address)?; writeln_name_value(f, "Program:", &self.program_id)?; - writeln_name_value(f, "M/N:", &format!("{}/{}", self.m, self.n))?; + writeln_name_value(f, "M/N:", &format!("{}/{}", m, n))?; writeln_name_value(f, "Signers:", " ")?; - let width = if self.n >= 9 { 4 } else { 3 }; - for i in 0..self.n as usize { + let width = if n >= 9 { 4 } else { 3 }; + for i in 0..n as usize { let title = format!("{1:>0$}:", width, i + 1); - let pubkey = &self.signers[i]; + let pubkey = &self.multisig.signers[i]; writeln_name_value(f, &title, pubkey)?; } Ok(())