stratus/eth/primitives/
call_input.rs1use 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}