diff --git a/clap-utils/src/offline.rs b/clap-utils/src/offline.rs index b0533a28de..81dce6ecf4 100644 --- a/clap-utils/src/offline.rs +++ b/clap-utils/src/offline.rs @@ -1,4 +1,5 @@ -use crate::ArgConstant; +use crate::{input_validators::*, ArgConstant}; +use clap::{App, Arg}; pub const BLOCKHASH_ARG: ArgConstant<'static> = ArgConstant { name: "blockhash", @@ -17,3 +18,43 @@ pub const SIGNER_ARG: ArgConstant<'static> = ArgConstant { long: "signer", help: "Provide a public-key/signature pair for the transaction", }; + +pub fn blockhash_arg<'a, 'b>() -> Arg<'a, 'b> { + Arg::with_name(BLOCKHASH_ARG.name) + .long(BLOCKHASH_ARG.long) + .takes_value(true) + .value_name("BLOCKHASH") + .validator(is_hash) + .help(BLOCKHASH_ARG.help) +} + +pub fn sign_only_arg<'a, 'b>() -> Arg<'a, 'b> { + Arg::with_name(SIGN_ONLY_ARG.name) + .long(SIGN_ONLY_ARG.long) + .takes_value(false) + .requires(BLOCKHASH_ARG.name) + .help(SIGN_ONLY_ARG.help) +} + +fn signer_arg<'a, 'b>() -> Arg<'a, 'b> { + Arg::with_name(SIGNER_ARG.name) + .long(SIGNER_ARG.long) + .takes_value(true) + .value_name("PUBKEY=SIGNATURE") + .validator(is_pubkey_sig) + .requires(BLOCKHASH_ARG.name) + .multiple(true) + .help(SIGNER_ARG.help) +} + +pub trait OfflineArgs { + fn offline_args(self) -> Self; +} + +impl OfflineArgs for App<'_, '_> { + fn offline_args(self) -> Self { + self.arg(blockhash_arg()) + .arg(sign_only_arg()) + .arg(signer_arg()) + } +} diff --git a/cli/src/cli.rs b/cli/src/cli.rs index c119f41f38..03036cd8f2 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -4,7 +4,7 @@ use crate::{ cluster_query::*, display::{new_spinner_progress_bar, println_name_value, println_transaction}, nonce::*, - offline::{blockhash_query::BlockhashQuery, *}, + offline::blockhash_query::BlockhashQuery, spend_utils::*, stake::*, validator_info::*, @@ -17,7 +17,7 @@ use serde_json::{self, json, Value}; use solana_account_decoder::{UiAccount, UiAccountEncoding}; use solana_clap_utils::{ self, commitment::commitment_arg_with_default, input_parsers::*, input_validators::*, - keypair::signer_from_path, nonce::*, offline::SIGN_ONLY_ARG, ArgConstant, + keypair::signer_from_path, nonce::*, offline::*, ArgConstant, }; use solana_client::{ client_error::{ClientError, ClientErrorKind, Result as ClientResult}, @@ -2357,6 +2357,7 @@ pub fn app<'ab, 'v>(name: &str, about: &'ab str, version: &'v str) -> App<'ab, ' #[cfg(test)] mod tests { use super::*; + use crate::offline::*; use serde_json::Value; use solana_client::mock_sender::SIGNATURE; use solana_sdk::{ diff --git a/cli/src/offline/blockhash_query.rs b/cli/src/offline/blockhash_query.rs index ec84802ab3..06cc0605d4 100644 --- a/cli/src/offline/blockhash_query.rs +++ b/cli/src/offline/blockhash_query.rs @@ -1,5 +1,10 @@ use super::*; -use solana_clap_utils::nonce::*; +use clap::ArgMatches; +use solana_clap_utils::{ + input_parsers::{pubkey_of, value_of}, + nonce::*, + offline::*, +}; use solana_client::nonce_utils; use solana_sdk::commitment_config::CommitmentConfig; @@ -110,7 +115,7 @@ impl Default for BlockhashQuery { #[cfg(test)] mod tests { use super::*; - use crate::offline::blockhash_query::BlockhashQuery; + use crate::offline::blockhash_query::{self, BlockhashQuery}; use clap::App; use serde_json::{self, json, Value}; use solana_account_decoder::{UiAccount, UiAccountEncoding}; diff --git a/cli/src/offline/mod.rs b/cli/src/offline/mod.rs index 283f49edf3..f00cb8f1e2 100644 --- a/cli/src/offline/mod.rs +++ b/cli/src/offline/mod.rs @@ -1,13 +1,7 @@ pub mod blockhash_query; -use clap::{App, Arg, ArgMatches}; use serde_json::Value; -use solana_clap_utils::{ - input_parsers::{pubkey_of, value_of}, - input_validators::{is_hash, is_pubkey_sig}, - keypair::presigner_from_pubkey_sigs, - offline::{BLOCKHASH_ARG, SIGNER_ARG, SIGN_ONLY_ARG}, -}; +use solana_clap_utils::keypair::presigner_from_pubkey_sigs; use solana_client::rpc_client::RpcClient; use solana_sdk::{ fee_calculator::FeeCalculator, @@ -17,46 +11,6 @@ use solana_sdk::{ }; use std::str::FromStr; -fn blockhash_arg<'a, 'b>() -> Arg<'a, 'b> { - Arg::with_name(BLOCKHASH_ARG.name) - .long(BLOCKHASH_ARG.long) - .takes_value(true) - .value_name("BLOCKHASH") - .validator(is_hash) - .help(BLOCKHASH_ARG.help) -} - -fn sign_only_arg<'a, 'b>() -> Arg<'a, 'b> { - Arg::with_name(SIGN_ONLY_ARG.name) - .long(SIGN_ONLY_ARG.long) - .takes_value(false) - .requires(BLOCKHASH_ARG.name) - .help(SIGN_ONLY_ARG.help) -} - -fn signer_arg<'a, 'b>() -> Arg<'a, 'b> { - Arg::with_name(SIGNER_ARG.name) - .long(SIGNER_ARG.long) - .takes_value(true) - .value_name("PUBKEY=SIGNATURE") - .validator(is_pubkey_sig) - .requires(BLOCKHASH_ARG.name) - .multiple(true) - .help(SIGNER_ARG.help) -} - -pub trait OfflineArgs { - fn offline_args(self) -> Self; -} - -impl OfflineArgs for App<'_, '_> { - fn offline_args(self) -> Self { - self.arg(blockhash_arg()) - .arg(sign_only_arg()) - .arg(signer_arg()) - } -} - pub struct SignOnly { pub blockhash: Hash, pub present_signers: Vec<(Pubkey, Signature)>, diff --git a/cli/src/stake.rs b/cli/src/stake.rs index eb1e514863..963f1807ba 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -6,7 +6,7 @@ use crate::{ }, cli_output::{CliStakeHistory, CliStakeHistoryEntry, CliStakeState, CliStakeType}, nonce::check_nonce_account, - offline::{blockhash_query::BlockhashQuery, *}, + offline::blockhash_query::BlockhashQuery, spend_utils::{resolve_spend_tx_and_check_account_balances, SpendAmount}, }; use clap::{App, Arg, ArgGroup, ArgMatches, SubCommand}; @@ -1762,7 +1762,10 @@ pub fn process_delegate_stake( #[cfg(test)] mod tests { use super::*; - use crate::cli::{app, parse_command}; + use crate::{ + cli::{app, parse_command}, + offline::blockhash_query, + }; use solana_sdk::{ hash::Hash, signature::{