1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use bytes::Bytes;
use hash::Address;
use uint::Uint;
use maybe::MaybeEmpty;
#[derive(Debug, PartialEq, Deserialize)]
pub struct Call {
	
	pub data: Bytes,
	
	pub destination: MaybeEmpty<Address>,
	
	#[serde(rename="gasLimit")]
	pub gas_limit: Uint,
	
	pub value: Uint,
}
#[cfg(test)]
mod tests {
	use serde_json;
	use vm::Call;
	use ethereum_types::{U256, H160 as Hash160};
	use uint::Uint;
	use hash::Address;
	use maybe::MaybeEmpty;
	use std::str::FromStr;
	#[test]
	fn call_deserialization_empty_dest() {
		let s = r#"{
			"data" : "0x1111222233334444555566667777888899990000aaaabbbbccccddddeeeeffff",
			"destination" : "",
			"gasLimit" : "0x1748766aa5",
			"value" : "0x00"
		}"#;
		let call: Call = serde_json::from_str(s).unwrap();
		assert_eq!(&call.data[..],
			&[0x11, 0x11, 0x22, 0x22, 0x33, 0x33, 0x44, 0x44, 0x55, 0x55, 0x66, 0x66, 0x77, 0x77,
			  0x88, 0x88, 0x99, 0x99, 0x00, 0x00, 0xaa, 0xaa, 0xbb, 0xbb, 0xcc, 0xcc, 0xdd, 0xdd,
			  0xee, 0xee, 0xff, 0xff]);
		assert_eq!(call.destination, MaybeEmpty::None);
		assert_eq!(call.gas_limit, Uint(U256::from(0x1748766aa5u64)));
		assert_eq!(call.value, Uint(U256::from(0)));
	}
	#[test]
	fn call_deserialization_full_dest() {
		let s = r#"{
			"data" : "0x1234",
			"destination" : "5a39ed1020c04d4d84539975b893a4e7c53eab6c",
			"gasLimit" : "0x1748766aa5",
			"value" : "0x00"
		}"#;
		let call: Call = serde_json::from_str(s).unwrap();
		assert_eq!(&call.data[..], &[0x12, 0x34]);
		assert_eq!(call.destination, MaybeEmpty::Some(Address(Hash160::from_str("5a39ed1020c04d4d84539975b893a4e7c53eab6c").unwrap())));
		assert_eq!(call.gas_limit, Uint(U256::from(0x1748766aa5u64)));
		assert_eq!(call.value, Uint(U256::from(0)));
	}
}