tensor_trade/
utils.rs

1use anyhow::Result;
2use solana_client::rpc_client::RpcClient;
3use solana_sdk::{
4    message::VersionedMessage,
5    signature::{Keypair, Signature},
6    transaction::VersionedTransaction,
7};
8
9// NOTE: Not working.
10// pub async fn to_valid_account(account: &str) -> Result<Pubkey> {
11//     // Convert to bytes.
12//     let bytes = hex::decode(account)?;
13//     // Verify that the bytes length is 32.
14//     if bytes.len() != 32 {
15//         return Err(anyhow::anyhow!("invalid account"));
16//     }
17//     // Convert to [u8; 32].
18//     let bytes = bytes.as_slice();
19//     let bytes = <[u8; 32]>::try_from(bytes)?;
20
21//     Ok(Pubkey::from(bytes))
22// }
23
24pub 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}