2023-02-03 09:14:14 -08:00
|
|
|
use log::*;
|
2023-02-03 02:45:22 -08:00
|
|
|
use solana_client::{nonblocking::rpc_client::RpcClient, rpc_config::RpcSendTransactionConfig};
|
|
|
|
use solana_sdk::{
|
|
|
|
hash::Hash, instruction::Instruction, signature::Keypair, signature::Signer,
|
|
|
|
transaction::Transaction,
|
|
|
|
};
|
2023-02-03 03:55:59 -08:00
|
|
|
use std::sync::{Arc, RwLock};
|
2023-02-03 02:45:22 -08:00
|
|
|
use tokio::spawn;
|
|
|
|
|
|
|
|
pub async fn send_loop(
|
|
|
|
ixs_rx: async_channel::Receiver<Vec<Instruction>>,
|
|
|
|
blockhash: Arc<RwLock<Hash>>,
|
|
|
|
client: Arc<RpcClient>,
|
|
|
|
keypair: Keypair,
|
|
|
|
) {
|
2023-02-03 09:14:14 -08:00
|
|
|
info!("signing with keypair pk={:?}", keypair.pubkey());
|
2023-02-03 02:45:22 -08:00
|
|
|
let cfg = RpcSendTransactionConfig {
|
|
|
|
skip_preflight: true,
|
|
|
|
..RpcSendTransactionConfig::default()
|
|
|
|
};
|
|
|
|
loop {
|
|
|
|
if let Ok(ixs) = ixs_rx.recv().await {
|
2023-02-03 09:14:14 -08:00
|
|
|
// TODO add priority fee
|
2023-02-03 02:45:22 -08:00
|
|
|
let tx = Transaction::new_signed_with_payer(
|
|
|
|
&ixs,
|
|
|
|
Some(&keypair.pubkey()),
|
|
|
|
&[&keypair],
|
|
|
|
*blockhash.read().unwrap(),
|
|
|
|
);
|
|
|
|
// TODO: collect metrics
|
2023-02-03 09:14:14 -08:00
|
|
|
info!("send tx={:?}", tx.signatures[0]);
|
2023-02-03 02:45:22 -08:00
|
|
|
client.send_transaction_with_config(&tx, cfg).await;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn init(
|
|
|
|
ixs_rx: async_channel::Receiver<Vec<Instruction>>,
|
|
|
|
blockhash: Arc<RwLock<Hash>>,
|
|
|
|
client: Arc<RpcClient>,
|
|
|
|
keypair: Keypair,
|
|
|
|
) {
|
2023-02-03 09:14:14 -08:00
|
|
|
spawn(async move { send_loop(ixs_rx, blockhash, client, keypair).await });
|
2023-02-03 02:45:22 -08:00
|
|
|
}
|