txboost_rs/
bundle.rs

1use ethers::types::{H256, U64};
2use serde::{de, Deserialize, Deserializer, Serialize};
3
4pub type BundleHash = H256;
5
6#[derive(Serialize, Debug, Clone)]
7pub struct SendBundleRequest {
8    pub txs: Vec<BundleHash>,
9    #[serde(rename = "blockNumber")]
10    pub block_number: U64,
11    #[serde(rename = "minTimestamp", skip_serializing_if = "Option::is_none")]
12    pub min_timestamp: Option<u64>,
13    #[serde(rename = "maxTimestamp", skip_serializing_if = "Option::is_none")]
14    pub max_timestamp: Option<u64>,
15    #[serde(rename = "revertingTxHashes", skip_serializing_if = "Option::is_none")]
16    pub reverting_tx_hashes: Option<Vec<BundleHash>>,
17}
18
19#[derive(Serialize, Debug, Clone)]
20pub struct SimulateBundleRequest {
21    pub txs: Vec<BundleHash>,
22    #[serde(rename = "blockNumber")]
23    pub block_number: U64,
24    #[serde(rename = "stateBlockNumber")]
25    pub state_block_number: StateBlockNumber,
26    pub timestamp: Option<u64>,
27}
28
29#[derive(Serialize, Debug, Clone, Default)]
30pub enum StateBlockNumber {
31    Number(U64),
32    #[default]
33    Latest,
34}
35
36impl<'de> Deserialize<'de> for StateBlockNumber {
37    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
38    where
39        D: Deserializer<'de>,
40    {
41        let s = String::deserialize(deserializer)?;
42
43        if s == "latest" {
44            Ok(StateBlockNumber::Latest)
45        } else {
46            U64::from_str_radix(&s, 16)
47                .map(StateBlockNumber::Number)
48                .map_err(de::Error::custom)
49        }
50    }
51}
52
53impl Default for SendBundleRequest {
54    fn default() -> Self {
55        Self {
56            txs: Vec::new(),
57            block_number: U64::zero(),
58            min_timestamp: None,
59            max_timestamp: None,
60            reverting_tx_hashes: None,
61        }
62    }
63}
64
65impl SendBundleRequest {
66    pub fn new(txs: Vec<BundleHash>, block_number: U64) -> Self {
67        Self {
68            txs,
69            block_number,
70            ..Default::default()
71        }
72    }
73
74    pub fn with_min_timestamp(mut self, min_timestamp: u64) -> Self {
75        self.min_timestamp = Some(min_timestamp);
76        self
77    }
78
79    pub fn with_max_timestamp(mut self, max_timestamp: u64) -> Self {
80        self.max_timestamp = Some(max_timestamp);
81        self
82    }
83
84    pub fn with_reverting_tx_hashes(mut self, reverting_tx_hashes: Vec<BundleHash>) -> Self {
85        self.reverting_tx_hashes = Some(reverting_tx_hashes);
86        self
87    }
88}
89
90impl SimulateBundleRequest {
91    pub fn new(
92        txs: Vec<BundleHash>,
93        block_number: U64,
94        state_block_number: StateBlockNumber,
95    ) -> Self {
96        Self {
97            txs,
98            block_number,
99            state_block_number,
100            timestamp: None,
101        }
102    }
103
104    pub fn timestamp(mut self, timestamp: u64) -> Self {
105        self.timestamp = Some(timestamp);
106        self
107    }
108
109    pub fn block(&self) -> U64 {
110        self.block_number
111    }
112
113    pub fn state_block_number(mut self, state_block_number: StateBlockNumber) -> Self {
114        self.state_block_number = state_block_number;
115        self
116    }
117}