ic_web3_rs/types/
parity_pending_transaction.rs

1use serde::{
2    ser::{SerializeMap, Serializer},
3    Serialize,
4};
5
6use super::{Address, U256, U64};
7
8/// Condition to filter pending transactions
9#[derive(Clone, Serialize)]
10pub enum FilterCondition<T> {
11    /// Lower Than
12    #[serde(rename(serialize = "lt"))]
13    LowerThan(T),
14    /// Equal
15    #[serde(rename(serialize = "eq"))]
16    Equal(T),
17    /// Greater Than
18    #[serde(rename(serialize = "gt"))]
19    GreaterThan(T),
20}
21
22impl<T> From<T> for FilterCondition<T> {
23    fn from(t: T) -> Self {
24        FilterCondition::Equal(t)
25    }
26}
27
28/// To Filter
29#[derive(Clone)]
30pub enum ToFilter {
31    /// Address
32    Address(Address),
33    /// Action (i.e. contract creation)
34    Action,
35}
36
37/// Filter for pending transactions (only openethereum/Parity)
38#[derive(Clone, Default, Serialize)]
39pub struct ParityPendingTransactionFilter {
40    /// From address
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub from: Option<FilterCondition<Address>>,
43    /// To address or action, i.e. contract creation
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub to: Option<ToFilter>,
46    /// Gas
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub gas: Option<FilterCondition<U64>>,
49    /// Gas Price
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub gas_price: Option<FilterCondition<U64>>,
52    /// Value
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub value: Option<FilterCondition<U256>>,
55    /// Nonce
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub nonce: Option<FilterCondition<U256>>,
58}
59
60impl Serialize for ToFilter {
61    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
62    where
63        S: Serializer,
64    {
65        let mut map = serializer.serialize_map(Some(1))?;
66
67        match self {
68            Self::Address(a) => map.serialize_entry("eq", a)?,
69            Self::Action => map.serialize_entry("action", "contract_creation")?,
70        }
71        map.end()
72    }
73}
74
75impl ParityPendingTransactionFilter {
76    /// Returns a filter builder
77    pub fn builder() -> ParityPendingTransactionFilterBuilder {
78        Default::default()
79    }
80}
81
82/// Filter Builder
83#[derive(Default, Clone)]
84pub struct ParityPendingTransactionFilterBuilder {
85    filter: ParityPendingTransactionFilter,
86}
87
88impl ParityPendingTransactionFilterBuilder {
89    /// Sets `from`
90    pub fn from(mut self, from: Address) -> Self {
91        self.filter.from = Some(FilterCondition::Equal(from));
92        self
93    }
94
95    /// Sets `to`
96    pub fn to(mut self, to_or_action: ToFilter) -> Self {
97        self.filter.to = Some(to_or_action);
98        self
99    }
100
101    /// Sets `gas`
102    pub fn gas(mut self, gas: impl Into<FilterCondition<U64>>) -> Self {
103        self.filter.gas = Some(gas.into());
104        self
105    }
106
107    /// Sets `gas_price`
108    pub fn gas_price(mut self, gas_price: impl Into<FilterCondition<U64>>) -> Self {
109        self.filter.gas_price = Some(gas_price.into());
110        self
111    }
112
113    /// Sets `value`
114    pub fn value(mut self, value: impl Into<FilterCondition<U256>>) -> Self {
115        self.filter.value = Some(value.into());
116        self
117    }
118
119    /// Sets `nonce`
120    pub fn nonce(mut self, nonce: impl Into<FilterCondition<U256>>) -> Self {
121        self.filter.nonce = Some(nonce.into());
122        self
123    }
124
125    /// Returns filter
126    pub fn build(&self) -> ParityPendingTransactionFilter {
127        self.filter.clone()
128    }
129}