Parcel #acw2oc04i9f7egg

Created by Anonymous
Public

Created January 8, 2025 Expires in 23 days

Loading editor...

use std::{str::FromStr, sync::Arc};

use base64::{prelude::BASE64_STANDARD, Engine};
use dotenvy::var;
use reqwest::{header::AUTHORIZATION, Client};
use serde_json::{json, Value};
use solana_sdk::{
    compute_budget::ComputeBudgetInstruction,
    hash::Hash,
    instruction::Instruction,
    message::v0::Message,
    signature::{Keypair, Signature},
    signer::Signer,
    system_instruction,
    transaction::VersionedTransaction,
};

use crate::{
    consts::{BLOXROUTE_TIP, COMPUTE_UNIT_LIMIT},
    sender::TxSender,
    ARGS, PRIORITY_FEE_PRICE,
};

#[derive(Clone)]
pub(crate) struct BloxrouteTxSender {
    client: Arc<Client>,
    url: String,
    auth_key: String,
    provider: &'static str,
    offchain_tip: bool,
}

impl BloxrouteTxSender {
    pub(crate) fn new(url: String, auth_key: String, provider: &'static str) -> BloxrouteTxSender {
        BloxrouteTxSender {
            client: Arc::new(Client::new()),
            url,
            auth_key,
            provider,
            offchain_tip: var("BLOXROUTE_OFFCHAIN_TIP").unwrap_or("false".to_string()) == "true",
        }
    }
}

impl TxSender for BloxrouteTxSender {
    fn provider(&self) -> &'static str {
        self.provider
    }

    async fn warmup(&self) -> anyhow::Result<()> {
        let _ = self.client.get(&self.url).send().await?.text().await?;
        Ok(())
    }

    async fn send(&self, tx: VersionedTransaction) -> anyhow::Result<Signature> {
        let payload = if self.offchain_tip {
            json!({
                "transaction": {
                    "content": BASE64_STANDARD.encode(bincode::serialize(&tx).unwrap())
                },
                "skipPreFlight": true,
                "frontRunningProtection": false,
                "useStakedRPCs": true,
                "tip": ARGS.get().unwrap().tip_lamports
            })
        } else {
            json!({
                "transaction": {
                    "content": BASE64_STANDARD.encode(bincode::serialize(&tx).unwrap())
                },
                "skipPreFlight": true,
                "frontRunningProtection": false,
                "useStakedRPCs": true,
            })
        };

        let result: Value = self
            .client
            .post(&self.url)
            .json(&payload)
            .header(AUTHORIZATION, &self.auth_key)
            .send()
            .await?
            .json()
            .await?;

        if let Some(sig) = result["signature"].as_str() {
            Ok(Signature::from_str(sig)?)
        } else {
            anyhow::bail!("Failed to send transaction: {:?}", result);
        }
    }

    fn generate_txn(
        &self,
        signer: &Keypair,
        mut ixs: Vec<Instruction>,
        hash: Hash,
    ) -> anyhow::Result<VersionedTransaction> {
        ixs.push(ComputeBudgetInstruction::set_compute_unit_limit(
            COMPUTE_UNIT_LIMIT,
        ));
        ixs.push(ComputeBudgetInstruction::set_compute_unit_price(
            *PRIORITY_FEE_PRICE.get().unwrap(),
        ));

        if !self.offchain_tip {
            ixs.push(system_instruction::transfer(
                &signer.pubkey(),
                &BLOXROUTE_TIP,
                ARGS.get().unwrap().tip_lamports,
            ));
        }

        Ok(VersionedTransaction::try_new(
            solana_sdk::message::VersionedMessage::V0(Message::try_compile(
                &signer.pubkey(),
                &ixs,
                &[],
                hash,
            )?),
            &[signer],
        )?)
    }
}