Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

token-client: Make confirmation of ProgramRpcClientSendTransaction optional #7596

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
2 changes: 1 addition & 1 deletion single-pool/cli/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ impl Config {
// and program client
let program_client = Arc::new(ProgramRpcClient::new(
rpc_client.clone(),
ProgramRpcClientSendTransaction,
ProgramRpcClientSendTransaction::new_with_confirmation(),
));

// resolve default signer
Expand Down
2 changes: 1 addition & 1 deletion single-pool/cli/tests/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ async fn setup(initialize: bool) -> Env {
let rpc_client = Arc::new(validator.get_async_rpc_client());
let program_client: PClient = Arc::new(ProgramRpcClient::new(
rpc_client.clone(),
ProgramRpcClientSendTransaction,
ProgramRpcClientSendTransaction::new_with_confirmation(),
));

// write the payer to disk
Expand Down
8 changes: 4 additions & 4 deletions token-upgrade/cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ async fn process_create_escrow_account(

let program_client = Arc::new(ProgramRpcClient::new(
rpc_client.clone(),
ProgramRpcClientSendTransaction,
ProgramRpcClientSendTransaction::new_with_confirmation(),
));
let token = Token::new(
program_client.clone(),
Expand Down Expand Up @@ -545,7 +545,7 @@ mod test {
let rpc_client = Arc::new(test_validator.get_async_rpc_client());
let client = Arc::new(ProgramRpcClient::new(
rpc_client.clone(),
ProgramRpcClientSendTransaction,
ProgramRpcClientSendTransaction::new_with_confirmation(),
));

let mint_authority = Keypair::new();
Expand Down Expand Up @@ -614,7 +614,7 @@ mod test {
let rpc_client = Arc::new(test_validator.get_async_rpc_client());
let client = Arc::new(ProgramRpcClient::new(
rpc_client.clone(),
ProgramRpcClientSendTransaction,
ProgramRpcClientSendTransaction::new_with_confirmation(),
));

let mint_authority = Keypair::new();
Expand Down Expand Up @@ -721,7 +721,7 @@ mod test {
let rpc_client = Arc::new(test_validator.get_async_rpc_client());
let client = Arc::new(ProgramRpcClient::new(
rpc_client.clone(),
ProgramRpcClientSendTransaction,
ProgramRpcClientSendTransaction::new_with_confirmation(),
));

let mint_authority = Keypair::new();
Expand Down
4 changes: 2 additions & 2 deletions token/cli/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,12 +116,12 @@ impl<'a> Config<'a> {
.unwrap_or_default();
Arc::new(ProgramOfflineClient::new(
blockhash,
ProgramRpcClientSendTransaction,
ProgramRpcClientSendTransaction::new(),
))
} else {
Arc::new(ProgramRpcClient::new(
rpc_client.clone(),
ProgramRpcClientSendTransaction,
ProgramRpcClientSendTransaction::new(),
))
};
Self::new_with_clients_and_ws_url(
Expand Down
42 changes: 26 additions & 16 deletions token/cli/tests/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,9 +190,11 @@ fn test_config_with_default_signer<'a>(
) -> Config<'a> {
let websocket_url = test_validator.rpc_pubsub_url();
let rpc_client = Arc::new(test_validator.get_async_rpc_client());
let program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> = Arc::new(
ProgramRpcClient::new(rpc_client.clone(), ProgramRpcClientSendTransaction),
);
let program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> =
Arc::new(ProgramRpcClient::new(
rpc_client.clone(),
ProgramRpcClientSendTransaction::new_with_confirmation(),
));
Config {
rpc_client,
program_client,
Expand All @@ -219,9 +221,11 @@ fn test_config_without_default_signer<'a>(
) -> Config<'a> {
let websocket_url = test_validator.rpc_pubsub_url();
let rpc_client = Arc::new(test_validator.get_async_rpc_client());
let program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> = Arc::new(
ProgramRpcClient::new(rpc_client.clone(), ProgramRpcClientSendTransaction),
);
let program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> =
Arc::new(ProgramRpcClient::new(
rpc_client.clone(),
ProgramRpcClientSendTransaction::new_with_confirmation(),
));
Config {
rpc_client,
program_client,
Expand Down Expand Up @@ -3132,7 +3136,7 @@ async fn do_offline_multisig_transfer(
let offline_program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> =
Arc::new(ProgramOfflineClient::new(
blockhash,
ProgramRpcClientSendTransaction,
ProgramRpcClientSendTransaction::new_with_confirmation(),
));
let mut args = vec![
"spl-token".to_string(),
Expand Down Expand Up @@ -3192,9 +3196,11 @@ async fn do_offline_multisig_transfer(
assert!(!absent_signers.contains(&token.to_string()));

// now send the transaction
let rpc_program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> = Arc::new(
ProgramRpcClient::new(config.rpc_client.clone(), ProgramRpcClientSendTransaction),
);
let rpc_program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> =
Arc::new(ProgramRpcClient::new(
config.rpc_client.clone(),
ProgramRpcClientSendTransaction::new_with_confirmation(),
));
config.program_client = rpc_program_client;
let mut args = vec![
"spl-token".to_string(),
Expand Down Expand Up @@ -3849,9 +3855,11 @@ async fn transfer_hook(test_validator: &TestValidator, payer: &Keypair) {
// Make sure that parsing transfer hook accounts works
let real_program_client = config.program_client;
let blockhash = Hash::default();
let program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> = Arc::new(
ProgramOfflineClient::new(blockhash, ProgramRpcClientSendTransaction),
);
let program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> =
Arc::new(ProgramOfflineClient::new(
blockhash,
ProgramRpcClientSendTransaction::new_with_confirmation(),
));
config.program_client = program_client;
let _result = exec_test_cmd(
&config,
Expand Down Expand Up @@ -3965,9 +3973,11 @@ async fn transfer_hook_with_transfer_fee(test_validator: &TestValidator, payer:

// Make sure that parsing transfer hook accounts and expected-fee works
let blockhash = Hash::default();
let program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> = Arc::new(
ProgramOfflineClient::new(blockhash, ProgramRpcClientSendTransaction),
);
let program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>> =
Arc::new(ProgramOfflineClient::new(
blockhash,
ProgramRpcClientSendTransaction::new_with_confirmation(),
));
config.program_client = program_client;

let _result = exec_test_cmd(
Expand Down
31 changes: 25 additions & 6 deletions token/client/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,23 @@ pub trait SimulateTransactionRpc: SimulateTransaction {
}

#[derive(Debug, Clone, Copy, Default)]
pub struct ProgramRpcClientSendTransaction;
pub struct ProgramRpcClientSendTransaction {
/// Confirm the transaction after sending it
confirm: bool,
}

impl ProgramRpcClientSendTransaction {
/// Create an instance that sends the transaction **without** waiting for
/// confirmation.
pub fn new() -> Self {
Self::default()
}

/// Create an instance that sends and confirms the transaction.
pub fn new_with_confirmation() -> Self {
Self { confirm: true }
}
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RpcClientResponse {
Expand All @@ -139,16 +155,19 @@ impl SendTransactionRpc for ProgramRpcClientSendTransaction {
client: &'a RpcClient,
transaction: &'a Transaction,
) -> BoxFuture<'a, ProgramClientResult<Self::Output>> {
let confirm = self.confirm;
Box::pin(async move {
if !transaction.is_signed() {
return Err("Cannot send transaction: not fully signed".into());
}

client
.send_and_confirm_transaction(transaction)
.await
.map(RpcClientResponse::Signature)
.map_err(Into::into)
if confirm {
client.send_and_confirm_transaction(transaction).await
} else {
client.send_transaction(transaction).await
}
.map(RpcClientResponse::Signature)
.map_err(Into::into)
})
}
}
Expand Down
2 changes: 1 addition & 1 deletion token/transfer-hook/cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -601,7 +601,7 @@ mod test {
let rpc_client = Arc::new(test_validator.get_async_rpc_client());
let client = Arc::new(ProgramRpcClient::new(
rpc_client.clone(),
ProgramRpcClientSendTransaction,
ProgramRpcClientSendTransaction::new_with_confirmation(),
));

let token = Token::new(
Expand Down
Loading