stratus/eth/primitives/
call_input.rs

1use display_json::DebugAsJson;
2use serde::Deserialize;
3
4use crate::eth::primitives::Address;
5use crate::eth::primitives::Bytes;
6use crate::eth::primitives::Wei;
7
8#[derive(DebugAsJson, Clone, PartialEq, Eq, serde::Serialize)]
9#[cfg_attr(test, derive(fake::Dummy))]
10pub struct CallInput {
11    #[serde(rename = "from")]
12    pub from: Option<Address>,
13
14    #[serde(rename = "to")]
15    pub to: Option<Address>,
16
17    #[serde(rename = "value", default)]
18    pub value: Wei,
19
20    #[serde(rename = "data", alias = "input", default)]
21    pub data: Bytes,
22}
23
24impl<'de> Deserialize<'de> for CallInput {
25    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
26    where
27        D: serde::Deserializer<'de>,
28    {
29        let s = serde_json::Value::deserialize(deserializer)?;
30
31        let from = serde_json::from_value(s.get("from").cloned().unwrap_or(serde_json::Value::Null)).map_err(serde::de::Error::custom)?;
32        let to = serde_json::from_value(s.get("to").cloned().unwrap_or(serde_json::Value::Null)).map_err(serde::de::Error::custom)?;
33        let value = serde_json::from_value(s.get("value").cloned().unwrap_or_else(|| serde_json::Value::String("0x0".to_string())))
34            .map_err(serde::de::Error::custom)?;
35
36        let data_value = s.get("data").or_else(|| s.get("input")).cloned().unwrap_or(serde_json::Value::Null);
37        let data = serde_json::from_value(data_value).unwrap_or_default();
38
39        Ok(CallInput { from, to, value, data })
40    }
41}