1use anyhow::Result;
2use solana_client::rpc_client::RpcClient;
3use solana_sdk::{
4 message::VersionedMessage,
5 signature::{Keypair, Signature},
6 transaction::VersionedTransaction,
7};
8
9pub async fn sign_transaction(
25 rpc_url: &str,
26 private_key: &str,
27 mut transaction_message: VersionedMessage,
28) -> Result<VersionedTransaction> {
29 let rpc_client = RpcClient::new(rpc_url);
30 let signer = Keypair::from_base58_string(private_key);
31
32 transaction_message.set_recent_blockhash(rpc_client.get_latest_blockhash()?);
33
34 let signed_transaction = VersionedTransaction::try_new(transaction_message, &[&signer])?;
35
36 Ok(signed_transaction)
37}
38
39pub async fn execute_transaction(
40 rpc_url: &str,
41 signed_transaction: VersionedTransaction,
42) -> Result<Signature> {
43 let rpc_client = RpcClient::new(rpc_url);
44
45 rpc_client.simulate_transaction(&signed_transaction)?;
46
47 let signature = rpc_client.send_and_confirm_transaction_with_spinner(&signed_transaction)?;
48
49 Ok(signature)
50}
51
52pub async fn sing_and_execute_transaction(
53 rpc_url: &str,
54 private_key: &str,
55 transaction_message: VersionedMessage,
56) -> Result<Signature> {
57 let signed_transaction = sign_transaction(private_key, rpc_url, transaction_message).await?;
58 let signature = execute_transaction(rpc_url, signed_transaction).await?;
59
60 Ok(signature)
61}