diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 313ca9f11a..ce5a73a06f 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -276,6 +276,7 @@ pub enum CliCommand { memo: Option, fee_payer: SignerIndex, custodian: Option, + no_wait: bool, }, StakeSetLockup { stake_account_pubkey: Pubkey, @@ -1679,6 +1680,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo, fee_payer, custodian, + no_wait, } => process_stake_authorize( &rpc_client, config, @@ -1692,6 +1694,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *nonce_authority, memo.as_ref(), *fee_payer, + *no_wait, ), CliCommand::StakeSetLockup { stake_account_pubkey, diff --git a/cli/src/stake.rs b/cli/src/stake.rs index 43927d8e33..0b8566de1c 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -238,6 +238,12 @@ impl StakeSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(custodian_arg()) + .arg( + Arg::with_name("no_wait") + .long("no-wait") + .takes_value(false) + .help("Return signature immediately after submitting the transaction, instead of waiting for confirmations"), + ) ) .subcommand( SubCommand::with_name("deactivate-stake") @@ -627,6 +633,7 @@ pub fn parse_stake_authorize( signer_of(matches, NONCE_AUTHORITY_ARG.name, wallet_manager)?; let (fee_payer, fee_payer_pubkey) = signer_of(matches, FEE_PAYER_ARG.name, wallet_manager)?; let (custodian, custodian_pubkey) = signer_of(matches, "custodian", wallet_manager)?; + let no_wait = matches.is_present("no_wait"); bulk_signers.push(fee_payer); if nonce_account.is_some() { @@ -663,6 +670,7 @@ pub fn parse_stake_authorize( memo, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), custodian: custodian_pubkey.and_then(|_| signer_info.index_of(custodian_pubkey)), + no_wait, }, signers: signer_info.signers, }) @@ -1094,6 +1102,7 @@ pub fn process_stake_authorize( nonce_authority: SignerIndex, memo: Option<&String>, fee_payer: SignerIndex, + no_wait: bool, ) -> ProcessResult { let mut ixs = Vec::new(); let custodian = custodian.map(|index| config.signers[index]); @@ -1157,7 +1166,11 @@ pub fn process_stake_authorize( &tx.message, config.commitment, )?; - let result = rpc_client.send_and_confirm_transaction_with_spinner(&tx); + let result = if no_wait { + rpc_client.send_transaction(&tx) + } else { + rpc_client.send_and_confirm_transaction_with_spinner(&tx) + }; log_instruction_custom_error::(result, &config) } } @@ -2151,6 +2164,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into(),], }, @@ -2188,6 +2202,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2229,6 +2244,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2259,6 +2275,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into(),], }, @@ -2286,6 +2303,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2319,6 +2337,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2353,6 +2372,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into(),], }, @@ -2384,6 +2404,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2394,6 +2415,35 @@ mod tests { }, ); + // Test Authorize Subcommand w/ no-wait + let test_authorize = test_commands.clone().get_matches_from(vec![ + "test", + "stake-authorize", + &stake_account_string, + "--new-stake-authority", + &stake_account_string, + "--no-wait", + ]); + assert_eq!( + parse_command(&test_authorize, &default_signer, &mut None).unwrap(), + CliCommandInfo { + command: CliCommand::StakeAuthorize { + stake_account_pubkey, + new_authorizations: vec![(StakeAuthorize::Staker, stake_account_pubkey, 0)], + sign_only: false, + dump_transaction_message: false, + blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster), + nonce_account: None, + nonce_authority: 0, + memo: None, + fee_payer: 0, + custodian: None, + no_wait: true, + }, + signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], + } + ); + // Test Authorize Subcommand w/ sign-only let blockhash = Hash::default(); let blockhash_string = format!("{}", blockhash); @@ -2421,6 +2471,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -2460,6 +2511,7 @@ mod tests { memo: None, fee_payer: 1, custodian: None, + no_wait: false, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2509,6 +2561,7 @@ mod tests { memo: None, fee_payer: 1, custodian: None, + no_wait: false, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2544,6 +2597,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -2584,6 +2638,7 @@ mod tests { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2620,6 +2675,7 @@ mod tests { memo: None, fee_payer: 1, custodian: None, + no_wait: false, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2660,6 +2716,7 @@ mod tests { memo: None, fee_payer: 1, custodian: None, + no_wait: false, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), diff --git a/cli/tests/stake.rs b/cli/tests/stake.rs index 2f7ed02d64..98cd20e12c 100644 --- a/cli/tests/stake.rs +++ b/cli/tests/stake.rs @@ -608,6 +608,7 @@ fn test_stake_authorize() { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -638,6 +639,7 @@ fn test_stake_authorize() { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -663,6 +665,7 @@ fn test_stake_authorize() { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -688,6 +691,7 @@ fn test_stake_authorize() { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }; config_offline.output_format = OutputFormat::JsonCompact; let sign_reply = process_command(&config_offline).unwrap(); @@ -706,6 +710,7 @@ fn test_stake_authorize() { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -756,6 +761,7 @@ fn test_stake_authorize() { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }; let sign_reply = process_command(&config_offline).unwrap(); let sign_only = parse_sign_only_reply_string(&sign_reply); @@ -778,6 +784,7 @@ fn test_stake_authorize() { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -881,6 +888,7 @@ fn test_stake_authorize_with_fee_payer() { memo: None, fee_payer: 1, custodian: None, + no_wait: false, }; process_command(&config).unwrap(); // `config` balance has not changed, despite submitting the TX @@ -902,6 +910,7 @@ fn test_stake_authorize_with_fee_payer() { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }; config_offline.output_format = OutputFormat::JsonCompact; let sign_reply = process_command(&config_offline).unwrap(); @@ -920,6 +929,7 @@ fn test_stake_authorize_with_fee_payer() { memo: None, fee_payer: 0, custodian: None, + no_wait: false, }; process_command(&config).unwrap(); // `config`'s balance again has not changed