txboost-rs 0.1.0

Txboost middleware for ethers
Documentation
use ethers::types::{H256, U64};
use serde::{de, Deserialize, Deserializer, Serialize};

pub type BundleHash = H256;

#[derive(Serialize, Debug, Clone)]
pub struct SendBundleRequest {
    pub txs: Vec<BundleHash>,
    #[serde(rename = "blockNumber")]
    pub block_number: U64,
    #[serde(rename = "minTimestamp", skip_serializing_if = "Option::is_none")]
    pub min_timestamp: Option<u64>,
    #[serde(rename = "maxTimestamp", skip_serializing_if = "Option::is_none")]
    pub max_timestamp: Option<u64>,
    #[serde(rename = "revertingTxHashes", skip_serializing_if = "Option::is_none")]
    pub reverting_tx_hashes: Option<Vec<BundleHash>>,
}

#[derive(Serialize, Debug, Clone)]
pub struct SimulateBundleRequest {
    pub txs: Vec<BundleHash>,
    #[serde(rename = "blockNumber")]
    pub block_number: U64,
    #[serde(rename = "stateBlockNumber")]
    pub state_block_number: StateBlockNumber,
    pub timestamp: Option<u64>,
}

#[derive(Serialize, Debug, Clone, Default)]
pub enum StateBlockNumber {
    Number(U64),
    #[default]
    Latest,
}

impl<'de> Deserialize<'de> for StateBlockNumber {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;

        if s == "latest" {
            Ok(StateBlockNumber::Latest)
        } else {
            U64::from_str_radix(&s, 16)
                .map(StateBlockNumber::Number)
                .map_err(de::Error::custom)
        }
    }
}

impl Default for SendBundleRequest {
    fn default() -> Self {
        Self {
            txs: Vec::new(),
            block_number: U64::zero(),
            min_timestamp: None,
            max_timestamp: None,
            reverting_tx_hashes: None,
        }
    }
}

impl SendBundleRequest {
    pub fn new(txs: Vec<BundleHash>, block_number: U64) -> Self {
        Self {
            txs,
            block_number,
            ..Default::default()
        }
    }

    pub fn with_min_timestamp(mut self, min_timestamp: u64) -> Self {
        self.min_timestamp = Some(min_timestamp);
        self
    }

    pub fn with_max_timestamp(mut self, max_timestamp: u64) -> Self {
        self.max_timestamp = Some(max_timestamp);
        self
    }

    pub fn with_reverting_tx_hashes(mut self, reverting_tx_hashes: Vec<BundleHash>) -> Self {
        self.reverting_tx_hashes = Some(reverting_tx_hashes);
        self
    }
}

impl SimulateBundleRequest {
    pub fn new(
        txs: Vec<BundleHash>,
        block_number: U64,
        state_block_number: StateBlockNumber,
    ) -> Self {
        Self {
            txs,
            block_number,
            state_block_number,
            timestamp: None,
        }
    }

    pub fn timestamp(mut self, timestamp: u64) -> Self {
        self.timestamp = Some(timestamp);
        self
    }

    pub fn block(&self) -> U64 {
        self.block_number
    }

    pub fn state_block_number(mut self, state_block_number: StateBlockNumber) -> Self {
        self.state_block_number = state_block_number;
        self
    }
}