diff --git a/clap-utils/src/keypair.rs b/clap-utils/src/keypair.rs index 1b76bd2337..cf0324b7a6 100644 --- a/clap-utils/src/keypair.rs +++ b/clap-utils/src/keypair.rs @@ -25,6 +25,65 @@ use std::{ sync::Arc, }; +pub type CliSigners = Vec>; +pub type SignerIndex = usize; +pub struct CliSignerInfo { + pub signers: CliSigners, +} + +impl CliSignerInfo { + pub fn index_of(&self, pubkey: Option) -> Option { + if let Some(pubkey) = pubkey { + self.signers + .iter() + .position(|signer| signer.pubkey() == pubkey) + } else { + Some(0) + } + } +} + +pub struct DefaultSigner { + pub arg_name: String, + pub path: String, +} + +impl DefaultSigner { + pub fn generate_unique_signers( + &self, + bulk_signers: Vec>>, + matches: &ArgMatches<'_>, + wallet_manager: &mut Option>, + ) -> Result> { + let mut unique_signers = vec![]; + + // Determine if the default signer is needed + if bulk_signers.iter().any(|signer| signer.is_none()) { + let default_signer = self.signer_from_path(matches, wallet_manager)?; + unique_signers.push(default_signer); + } + + for signer in bulk_signers.into_iter() { + if let Some(signer) = signer { + if !unique_signers.iter().any(|s| s == &signer) { + unique_signers.push(signer); + } + } + } + Ok(CliSignerInfo { + signers: unique_signers, + }) + } + + pub fn signer_from_path( + &self, + matches: &ArgMatches, + wallet_manager: &mut Option>, + ) -> Result, Box> { + signer_from_path(matches, &self.path, &self.arg_name, wallet_manager) + } +} + pub enum KeypairUrl { Ask, Filepath(String), diff --git a/cli/src/cli.rs b/cli/src/cli.rs index db0d9ef600..b36f59c60e 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -21,7 +21,7 @@ use solana_clap_utils::{ fee_payer::{fee_payer_arg, FEE_PAYER_ARG}, input_parsers::*, input_validators::*, - keypair::signer_from_path, + keypair::*, nonce::*, offline::*, }; @@ -75,65 +75,6 @@ use std::{ use thiserror::Error; use url::Url; -pub type CliSigners = Vec>; -pub type SignerIndex = usize; -pub struct CliSignerInfo { - pub signers: CliSigners, -} - -impl CliSignerInfo { - pub(crate) fn index_of(&self, pubkey: Option) -> Option { - if let Some(pubkey) = pubkey { - self.signers - .iter() - .position(|signer| signer.pubkey() == pubkey) - } else { - Some(0) - } - } -} - -pub struct DefaultSigner { - pub arg_name: String, - pub path: String, -} - -impl DefaultSigner { - pub fn generate_unique_signers( - &self, - bulk_signers: Vec>>, - matches: &ArgMatches<'_>, - wallet_manager: &mut Option>, - ) -> Result> { - let mut unique_signers = vec![]; - - // Determine if the default signer is needed - if bulk_signers.iter().any(|signer| signer.is_none()) { - let default_signer = self.signer_from_path(matches, wallet_manager)?; - unique_signers.push(default_signer); - } - - for signer in bulk_signers.into_iter() { - if let Some(signer) = signer { - if !unique_signers.iter().any(|s| s == &signer) { - unique_signers.push(signer); - } - } - } - Ok(CliSignerInfo { - signers: unique_signers, - }) - } - - pub fn signer_from_path( - &self, - matches: &ArgMatches, - wallet_manager: &mut Option>, - ) -> Result, Box> { - signer_from_path(matches, &self.path, &self.arg_name, wallet_manager) - } -} - const DATA_CHUNK_SIZE: usize = 229; // Keep program chunks under PACKET_DATA_SIZE pub const DEFAULT_RPC_TIMEOUT_SECONDS: &str = "30"; diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index 9b05562f6b..2036badd5d 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -1,5 +1,5 @@ use crate::{ - cli::{CliCommand, CliCommandInfo, CliConfig, CliError, DefaultSigner, ProcessResult}, + cli::{CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult}, cli_output::*, display::{ format_labeled_address, new_spinner_progress_bar, println_name_value, println_transaction, @@ -8,7 +8,9 @@ use crate::{ }; use clap::{value_t, value_t_or_exit, App, AppSettings, Arg, ArgMatches, SubCommand}; use console::{style, Emoji}; -use solana_clap_utils::{commitment::commitment_arg, input_parsers::*, input_validators::*}; +use solana_clap_utils::{ + commitment::commitment_arg, input_parsers::*, input_validators::*, keypair::DefaultSigner, +}; use solana_client::{ pubsub_client::PubsubClient, rpc_client::{GetConfirmedSignaturesForAddress2Config, RpcClient}, diff --git a/cli/src/main.rs b/cli/src/main.rs index a3bfeecc9b..20bd4cc6e4 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -5,13 +5,15 @@ use clap::{ use console::style; use solana_clap_utils::{ - commitment::COMMITMENT_ARG, input_parsers::commitment_of, input_validators::is_url, - keypair::SKIP_SEED_PHRASE_VALIDATION_ARG, DisplayError, + commitment::COMMITMENT_ARG, + input_parsers::commitment_of, + input_validators::is_url, + keypair::{CliSigners, DefaultSigner, SKIP_SEED_PHRASE_VALIDATION_ARG}, + DisplayError, }; use solana_cli::{ cli::{ - app, parse_command, process_command, CliCommandInfo, CliConfig, CliSigners, DefaultSigner, - DEFAULT_RPC_TIMEOUT_SECONDS, + app, parse_command, process_command, CliCommandInfo, CliConfig, DEFAULT_RPC_TIMEOUT_SECONDS, }, cli_output::OutputFormat, display::{println_name_value, println_name_value_or}, diff --git a/cli/src/nonce.rs b/cli/src/nonce.rs index e97f45992f..c9841e195d 100644 --- a/cli/src/nonce.rs +++ b/cli/src/nonce.rs @@ -2,13 +2,18 @@ use crate::{ checks::{check_account_for_fee_with_commitment, check_unique_pubkeys}, cli::{ log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError, - DefaultSigner, ProcessResult, SignerIndex, + ProcessResult, }, cli_output::CliNonceAccount, spend_utils::{resolve_spend_tx_and_check_account_balance, SpendAmount}, }; use clap::{App, Arg, ArgMatches, SubCommand}; -use solana_clap_utils::{input_parsers::*, input_validators::*, nonce::*}; +use solana_clap_utils::{ + input_parsers::*, + input_validators::*, + keypair::{DefaultSigner, SignerIndex}, + nonce::*, +}; use solana_client::{nonce_utils::*, rpc_client::RpcClient}; use solana_remote_wallet::remote_wallet::RemoteWalletManager; use solana_sdk::{ diff --git a/cli/src/stake.rs b/cli/src/stake.rs index d3a55a8807..a01f50eb45 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -2,7 +2,7 @@ use crate::{ checks::{check_account_for_fee_with_commitment, check_unique_pubkeys}, cli::{ log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError, - DefaultSigner, ProcessResult, SignerIndex, + ProcessResult, }, cli_output::{CliStakeHistory, CliStakeHistoryEntry, CliStakeState, CliStakeType}, nonce::check_nonce_account, @@ -14,6 +14,7 @@ use solana_clap_utils::{ fee_payer::{fee_payer_arg, FEE_PAYER_ARG}, input_parsers::*, input_validators::*, + keypair::{DefaultSigner, SignerIndex}, nonce::*, offline::*, ArgConstant, diff --git a/cli/src/validator_info.rs b/cli/src/validator_info.rs index ed6c59b71a..a69e6df5c1 100644 --- a/cli/src/validator_info.rs +++ b/cli/src/validator_info.rs @@ -1,5 +1,5 @@ use crate::{ - cli::{CliCommand, CliCommandInfo, CliConfig, CliError, DefaultSigner, ProcessResult}, + cli::{CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult}, cli_output::{CliValidatorInfo, CliValidatorInfoVec}, spend_utils::{resolve_spend_tx_and_check_account_balance, SpendAmount}, }; @@ -13,6 +13,7 @@ use solana_account_decoder::validator_info::{ use solana_clap_utils::{ input_parsers::pubkey_of, input_validators::{is_pubkey, is_url}, + keypair::DefaultSigner, }; use solana_client::rpc_client::RpcClient; use solana_config_program::{config_instruction, get_config_data, ConfigKeys, ConfigState}; diff --git a/cli/src/vote.rs b/cli/src/vote.rs index e149fb166b..445647290c 100644 --- a/cli/src/vote.rs +++ b/cli/src/vote.rs @@ -2,13 +2,18 @@ use crate::{ checks::{check_account_for_fee_with_commitment, check_unique_pubkeys}, cli::{ log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError, - DefaultSigner, ProcessResult, SignerIndex, + ProcessResult, }, cli_output::{CliEpochVotingHistory, CliLockout, CliVoteAccount}, spend_utils::{resolve_spend_tx_and_check_account_balance, SpendAmount}, }; use clap::{value_t_or_exit, App, Arg, ArgMatches, SubCommand}; -use solana_clap_utils::{commitment::commitment_arg, input_parsers::*, input_validators::*}; +use solana_clap_utils::{ + commitment::commitment_arg, + input_parsers::*, + input_validators::*, + keypair::{DefaultSigner, SignerIndex}, +}; use solana_client::rpc_client::RpcClient; use solana_remote_wallet::remote_wallet::RemoteWalletManager; use solana_sdk::{