Cli: add spinner progress bar when waiting for transaction confirmation (#8916)
* Add _with_spinner method * Use _with_spinner method in cli
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -3883,6 +3883,7 @@ dependencies = [
|
|||||||
"assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"indicatif 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"jsonrpc-http-server 14.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"jsonrpc-http-server 14.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -3894,6 +3895,7 @@ dependencies = [
|
|||||||
"solana-logger 1.1.0",
|
"solana-logger 1.1.0",
|
||||||
"solana-net-utils 1.1.0",
|
"solana-net-utils 1.1.0",
|
||||||
"solana-sdk 1.1.0",
|
"solana-sdk 1.1.0",
|
||||||
|
"solana-vote-program 1.1.0",
|
||||||
"thiserror 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"thiserror 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tungstenite 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tungstenite 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -1255,7 +1255,8 @@ fn process_deploy(
|
|||||||
)?;
|
)?;
|
||||||
|
|
||||||
trace!("Creating program account");
|
trace!("Creating program account");
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut create_account_tx, &signers);
|
let result =
|
||||||
|
rpc_client.send_and_confirm_transaction_with_spinner(&mut create_account_tx, &signers);
|
||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
.map_err(|_| CliError::DynamicProgramError("Program allocate space failed".to_string()))?;
|
.map_err(|_| CliError::DynamicProgramError("Program allocate space failed".to_string()))?;
|
||||||
|
|
||||||
@ -1264,7 +1265,7 @@ fn process_deploy(
|
|||||||
|
|
||||||
trace!("Finalizing program account");
|
trace!("Finalizing program account");
|
||||||
rpc_client
|
rpc_client
|
||||||
.send_and_confirm_transaction(&mut finalize_tx, &signers)
|
.send_and_confirm_transaction_with_spinner(&mut finalize_tx, &signers)
|
||||||
.map_err(|_| {
|
.map_err(|_| {
|
||||||
CliError::DynamicProgramError("Program finalize transaction failed".to_string())
|
CliError::DynamicProgramError("Program finalize transaction failed".to_string())
|
||||||
})?;
|
})?;
|
||||||
@ -1328,7 +1329,8 @@ fn process_pay(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result =
|
||||||
|
rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
}
|
}
|
||||||
} else if *witnesses == None {
|
} else if *witnesses == None {
|
||||||
@ -1362,8 +1364,10 @@ fn process_pay(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(
|
||||||
.send_and_confirm_transaction(&mut tx, &[config.signers[0], &contract_state]);
|
&mut tx,
|
||||||
|
&[config.signers[0], &contract_state],
|
||||||
|
);
|
||||||
let signature_str = log_instruction_custom_error::<BudgetError>(result)?;
|
let signature_str = log_instruction_custom_error::<BudgetError>(result)?;
|
||||||
|
|
||||||
Ok(json!({
|
Ok(json!({
|
||||||
@ -1399,8 +1403,10 @@ fn process_pay(
|
|||||||
if sign_only {
|
if sign_only {
|
||||||
return_signers(&tx)
|
return_signers(&tx)
|
||||||
} else {
|
} else {
|
||||||
let result = rpc_client
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(
|
||||||
.send_and_confirm_transaction(&mut tx, &[config.signers[0], &contract_state]);
|
&mut tx,
|
||||||
|
&[config.signers[0], &contract_state],
|
||||||
|
);
|
||||||
check_account_for_fee(
|
check_account_for_fee(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&config.signers[0].pubkey(),
|
&config.signers[0].pubkey(),
|
||||||
@ -1436,7 +1442,8 @@ fn process_cancel(rpc_client: &RpcClient, config: &CliConfig, pubkey: &Pubkey) -
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &[config.signers[0]]);
|
let result =
|
||||||
|
rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &[config.signers[0]]);
|
||||||
log_instruction_custom_error::<BudgetError>(result)
|
log_instruction_custom_error::<BudgetError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1459,7 +1466,8 @@ fn process_time_elapsed(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &[config.signers[0]]);
|
let result =
|
||||||
|
rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &[config.signers[0]]);
|
||||||
log_instruction_custom_error::<BudgetError>(result)
|
log_instruction_custom_error::<BudgetError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1516,7 +1524,7 @@ fn process_transfer(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1539,7 +1547,8 @@ fn process_witness(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &[config.signers[0]]);
|
let result =
|
||||||
|
rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &[config.signers[0]]);
|
||||||
log_instruction_custom_error::<BudgetError>(result)
|
log_instruction_custom_error::<BudgetError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2146,7 +2155,7 @@ pub fn request_and_confirm_airdrop(
|
|||||||
}
|
}
|
||||||
}?;
|
}?;
|
||||||
let mut tx = keypair.airdrop_transaction();
|
let mut tx = keypair.airdrop_transaction();
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &[&keypair]);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &[&keypair]);
|
||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ pub fn process_authorize_nonce_account(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<NonceError>(result)
|
log_instruction_custom_error::<NonceError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -537,7 +537,7 @@ pub fn process_create_nonce_account(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -578,8 +578,8 @@ pub fn process_new_nonce(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result =
|
let result = rpc_client
|
||||||
rpc_client.send_and_confirm_transaction(&mut tx, &[config.signers[0], nonce_authority]);
|
.send_and_confirm_transaction_with_spinner(&mut tx, &[config.signers[0], nonce_authority]);
|
||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -651,7 +651,7 @@ pub fn process_withdraw_from_nonce_account(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<NonceError>(result)
|
log_instruction_custom_error::<NonceError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -860,7 +860,7 @@ pub fn process_create_stake_account(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -922,7 +922,7 @@ pub fn process_stake_authorize(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<StakeError>(result)
|
log_instruction_custom_error::<StakeError>(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -975,7 +975,7 @@ pub fn process_deactivate_stake_account(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<StakeError>(result)
|
log_instruction_custom_error::<StakeError>(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1034,7 +1034,7 @@ pub fn process_withdraw_stake(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1167,7 +1167,7 @@ pub fn process_split_stake(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<StakeError>(result)
|
log_instruction_custom_error::<StakeError>(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1223,7 +1223,7 @@ pub fn process_stake_set_lockup(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<StakeError>(result)
|
log_instruction_custom_error::<StakeError>(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1457,7 +1457,7 @@ pub fn process_delegate_stake(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<StakeError>(result)
|
log_instruction_custom_error::<StakeError>(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,7 @@ pub fn process_create_storage_account(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,7 +266,7 @@ pub fn process_claim_storage_reward(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let signature_str = rpc_client.send_and_confirm_transaction(&mut tx, &signers)?;
|
let signature_str = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &signers)?;
|
||||||
Ok(signature_str)
|
Ok(signature_str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,7 +368,7 @@ pub fn process_set_validator_info(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let signature_str = rpc_client.send_and_confirm_transaction(&mut tx, &signers)?;
|
let signature_str = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &signers)?;
|
||||||
|
|
||||||
println!("Success! Validator info published at: {:?}", info_pubkey);
|
println!("Success! Validator info published at: {:?}", info_pubkey);
|
||||||
println!("{}", signature_str);
|
println!("{}", signature_str);
|
||||||
|
@ -445,7 +445,7 @@ pub fn process_create_vote_account(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -477,7 +477,8 @@ pub fn process_vote_authorize(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &[config.signers[0]]);
|
let result =
|
||||||
|
rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &[config.signers[0]]);
|
||||||
log_instruction_custom_error::<VoteError>(result)
|
log_instruction_custom_error::<VoteError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -508,7 +509,7 @@ pub fn process_vote_update_validator(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut tx, &config.signers);
|
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||||
log_instruction_custom_error::<VoteError>(result)
|
log_instruction_custom_error::<VoteError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -621,7 +622,8 @@ pub fn process_withdraw_from_vote_account(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&transaction.message,
|
&transaction.message,
|
||||||
)?;
|
)?;
|
||||||
let result = rpc_client.send_and_confirm_transaction(&mut transaction, &config.signers);
|
let result =
|
||||||
|
rpc_client.send_and_confirm_transaction_with_spinner(&mut transaction, &config.signers);
|
||||||
log_instruction_custom_error::<VoteError>(result)
|
log_instruction_custom_error::<VoteError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
bincode = "1.2.1"
|
bincode = "1.2.1"
|
||||||
bs58 = "0.3.0"
|
bs58 = "0.3.0"
|
||||||
|
indicatif = "0.14.0"
|
||||||
jsonrpc-core = "14.0.5"
|
jsonrpc-core = "14.0.5"
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
rayon = "1.3.0"
|
rayon = "1.3.0"
|
||||||
@ -20,6 +21,7 @@ serde_derive = "1.0.103"
|
|||||||
serde_json = "1.0.48"
|
serde_json = "1.0.48"
|
||||||
solana-net-utils = { path = "../net-utils", version = "1.1.0" }
|
solana-net-utils = { path = "../net-utils", version = "1.1.0" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.1.0" }
|
solana-sdk = { path = "../sdk", version = "1.1.0" }
|
||||||
|
solana-vote-program = { path = "../programs/vote", version = "1.1.0" }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
tungstenite = "0.10.1"
|
tungstenite = "0.10.1"
|
||||||
url = "2.1.1"
|
url = "2.1.1"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
client_error::{ClientError, Result as ClientResult},
|
client_error::{ClientError, ClientErrorKind, Result as ClientResult},
|
||||||
generic_rpc_client_request::GenericRpcClientRequest,
|
generic_rpc_client_request::GenericRpcClientRequest,
|
||||||
mock_rpc_client_request::{MockRpcClientRequest, Mocks},
|
mock_rpc_client_request::{MockRpcClientRequest, Mocks},
|
||||||
rpc_client_request::RpcClientRequest,
|
rpc_client_request::RpcClientRequest,
|
||||||
@ -11,6 +11,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
use bincode::serialize;
|
use bincode::serialize;
|
||||||
|
use indicatif::{ProgressBar, ProgressStyle};
|
||||||
use log::*;
|
use log::*;
|
||||||
use serde_json::{json, Value};
|
use serde_json::{json, Value};
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
@ -26,9 +27,11 @@ use solana_sdk::{
|
|||||||
signers::Signers,
|
signers::Signers,
|
||||||
transaction::{self, Transaction, TransactionError},
|
transaction::{self, Transaction, TransactionError},
|
||||||
};
|
};
|
||||||
|
use solana_vote_program::vote_state::MAX_LOCKOUT_HISTORY;
|
||||||
use std::{
|
use std::{
|
||||||
error,
|
error,
|
||||||
net::SocketAddr,
|
net::SocketAddr,
|
||||||
|
str::FromStr,
|
||||||
thread::sleep,
|
thread::sleep,
|
||||||
time::{Duration, Instant},
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
@ -946,6 +949,93 @@ impl RpcClient {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn send_and_confirm_transaction_with_spinner<T: Signers>(
|
||||||
|
&self,
|
||||||
|
transaction: &mut Transaction,
|
||||||
|
signer_keys: &T,
|
||||||
|
) -> ClientResult<String> {
|
||||||
|
let mut send_retries = 20;
|
||||||
|
let signature_str = loop {
|
||||||
|
let mut status_retries = 15;
|
||||||
|
let (signature_str, status) = loop {
|
||||||
|
let signature_str = self.send_transaction(transaction)?;
|
||||||
|
|
||||||
|
// Get recent commitment in order to count confirmations for successful transactions
|
||||||
|
let status = self.get_signature_status_with_commitment(
|
||||||
|
&signature_str,
|
||||||
|
CommitmentConfig::recent(),
|
||||||
|
)?;
|
||||||
|
if status.is_none() {
|
||||||
|
status_retries -= 1;
|
||||||
|
if status_retries == 0 {
|
||||||
|
break (signature_str, status);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break (signature_str, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg!(not(test)) {
|
||||||
|
sleep(Duration::from_millis(500));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
send_retries = if let Some(result) = status.clone() {
|
||||||
|
match result {
|
||||||
|
Ok(_) => 0,
|
||||||
|
Err(TransactionError::AccountInUse) => {
|
||||||
|
// Fetch a new blockhash and re-sign the transaction before sending it again
|
||||||
|
self.resign_transaction(transaction, signer_keys)?;
|
||||||
|
send_retries - 1
|
||||||
|
}
|
||||||
|
// If transaction errors, return right away; no point in counting confirmations
|
||||||
|
Err(_) => 0,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
send_retries - 1
|
||||||
|
};
|
||||||
|
if send_retries == 0 {
|
||||||
|
if let Some(result) = status {
|
||||||
|
match result {
|
||||||
|
Ok(_) => {
|
||||||
|
break signature_str;
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
return Err(err.into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Err(
|
||||||
|
RpcError::ForUser("unable to confirm transaction. This can happen in situations such as transaction expiration and insufficient fee-payer funds".to_string()).into(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let progress_bar = new_spinner_progress_bar();
|
||||||
|
progress_bar.set_message("Confirming...");
|
||||||
|
let mut confirmations = 0;
|
||||||
|
let signature = Signature::from_str(&signature_str).map_err(|_| {
|
||||||
|
ClientError::from(ClientErrorKind::Custom(format!(
|
||||||
|
"Returned string {} cannot be parsed as a signature",
|
||||||
|
signature_str
|
||||||
|
)))
|
||||||
|
})?;
|
||||||
|
loop {
|
||||||
|
// Return when default (max) commitment is reached
|
||||||
|
// Failed transactions have already been eliminated, `is_some` check is sufficient
|
||||||
|
if self.get_signature_status(&signature_str)?.is_some() {
|
||||||
|
progress_bar.set_message("Transaction confirmed");
|
||||||
|
progress_bar.finish_and_clear();
|
||||||
|
return Ok(signature_str);
|
||||||
|
}
|
||||||
|
progress_bar.set_message(&format!(
|
||||||
|
"[{}/{}] Waiting for confirmations",
|
||||||
|
confirmations, MAX_LOCKOUT_HISTORY,
|
||||||
|
));
|
||||||
|
sleep(Duration::from_millis(500));
|
||||||
|
confirmations = self.get_num_blocks_since_signature_confirmation(&signature)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn validator_exit(&self) -> ClientResult<bool> {
|
pub fn validator_exit(&self) -> ClientResult<bool> {
|
||||||
let response = self
|
let response = self
|
||||||
.client
|
.client
|
||||||
@ -961,6 +1051,14 @@ impl RpcClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn new_spinner_progress_bar() -> ProgressBar {
|
||||||
|
let progress_bar = ProgressBar::new(42);
|
||||||
|
progress_bar
|
||||||
|
.set_style(ProgressStyle::default_spinner().template("{spinner:.green} {wide_msg}"));
|
||||||
|
progress_bar.enable_steady_tick(100);
|
||||||
|
progress_bar
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_rpc_request_str(rpc_addr: SocketAddr, tls: bool) -> String {
|
pub fn get_rpc_request_str(rpc_addr: SocketAddr, tls: bool) -> String {
|
||||||
if tls {
|
if tls {
|
||||||
format!("https://{}", rpc_addr)
|
format!("https://{}", rpc_addr)
|
||||||
|
Reference in New Issue
Block a user