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}