use types::{Address, U256, Bytes};
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct CallRequest {
#[serde(skip_serializing_if="Option::is_none")]
pub from: Option<Address>,
pub to: Address,
#[serde(skip_serializing_if="Option::is_none")]
pub gas: Option<U256>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename = "gasPrice")]
pub gas_price: Option<U256>,
#[serde(skip_serializing_if="Option::is_none")]
pub value: Option<U256>,
#[serde(skip_serializing_if="Option::is_none")]
pub data: Option<Bytes>,
}
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct TransactionRequest {
pub from: Address,
#[serde(skip_serializing_if="Option::is_none")]
pub to: Option<Address>,
#[serde(skip_serializing_if="Option::is_none")]
pub gas: Option<U256>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename = "gasPrice")]
pub gas_price: Option<U256>,
#[serde(skip_serializing_if="Option::is_none")]
pub value: Option<U256>,
#[serde(skip_serializing_if="Option::is_none")]
pub data: Option<Bytes>,
#[serde(skip_serializing_if="Option::is_none")]
pub nonce: Option<U256>,
#[serde(skip_serializing_if="Option::is_none")]
pub condition: Option<TransactionCondition>,
}
#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub enum TransactionCondition {
#[serde(rename="block")]
Block(u64),
#[serde(rename="time")]
Timestamp(u64),
}
#[cfg(test)]
mod tests {
use serde_json;
use super::{CallRequest, TransactionRequest, TransactionCondition};
#[test]
fn should_serialize_call_request() {
let call_request = CallRequest {
from: None,
to: 5.into(),
gas: Some(21_000.into()),
gas_price: None,
value: Some(5_000_000.into()),
data: Some(vec![1, 2, 3].into()),
};
let serialized = serde_json::to_string_pretty(&call_request).unwrap();
assert_eq!(serialized,
r#"{
"to": "0x0000000000000000000000000000000000000005",
"gas": "0x5208",
"value": "0x4c4b40",
"data": "0x010203"
}"#);
}
#[test]
fn should_serialize_transaction_request() {
let tx_request = TransactionRequest {
from: 5.into(),
to: None,
gas: Some(21_000.into()),
gas_price: None,
value: Some(5_000_000.into()),
data: Some(vec![1, 2, 3].into()),
nonce: None,
condition: Some(TransactionCondition::Block(5)),
};
let serialized = serde_json::to_string_pretty(&tx_request).unwrap();
assert_eq!(serialized,
r#"{
"from": "0x0000000000000000000000000000000000000005",
"gas": "0x5208",
"value": "0x4c4b40",
"data": "0x010203",
"condition": {
"block": 5
}
}"#);
}
}