1use ethereum_types::{U256, H256, Address};
19use bytes::Bytes;
20use hash::{keccak, KECCAK_EMPTY};
21use ethjson;
22
23use action_type::ActionType;
24
25use std::sync::Arc;
26
27#[derive(Clone, Debug)]
29pub enum ActionValue {
30 Transfer(U256),
32 Apparent(U256)
34}
35
36#[derive(Clone, Debug)]
38pub enum ParamsType {
39 Embedded,
41 Separate,
43}
44
45impl ActionValue {
46 pub fn value(&self) -> U256 {
48 match *self {
49 ActionValue::Transfer(x) | ActionValue::Apparent(x) => x
50 }
51 }
52
53 pub fn transfer<T: Into<U256>>(transfer_value: T) -> ActionValue {
55 ActionValue::Transfer(transfer_value.into())
56 }
57
58 pub fn apparent<T: Into<U256>>(apparent_value: T) -> ActionValue {
60 ActionValue::Apparent(apparent_value.into())
61 }
62}
63
64#[derive(Clone, Debug)]
67pub struct ActionParams {
68 pub code_address: Address,
70 pub code_hash: Option<H256>,
72 pub address: Address,
75 pub sender: Address,
77 pub origin: Address,
79 pub gas: U256,
81 pub gas_price: U256,
83 pub value: ActionValue,
85 pub code: Option<Arc<Bytes>>,
87 pub code_version: U256,
89 pub data: Option<Bytes>,
91 pub action_type: ActionType,
93 pub params_type: ParamsType,
95}
96
97impl Default for ActionParams {
98 fn default() -> ActionParams {
100 ActionParams {
101 code_address: Address::zero(),
102 code_hash: Some(KECCAK_EMPTY),
103 address: Address::zero(),
104 sender: Address::zero(),
105 origin: Address::zero(),
106 gas: U256::zero(),
107 gas_price: U256::zero(),
108 value: ActionValue::Transfer(U256::zero()),
109 code: None,
110 code_version: U256::zero(),
111 data: None,
112 action_type: ActionType::Create,
113 params_type: ParamsType::Separate,
114 }
115 }
116}
117
118impl From<ethjson::vm::Transaction> for ActionParams {
119 fn from(t: ethjson::vm::Transaction) -> Self {
120 let address: Address = t.address.into();
121 ActionParams {
122 code_address: Address::zero(),
123 code_hash: Some(keccak(&*t.code)),
124 address: address,
125 sender: t.sender.into(),
126 origin: t.origin.into(),
127 code: Some(Arc::new(t.code.into())),
128 code_version: t.code_version.into(),
129 data: Some(t.data.into()),
130 gas: t.gas.into(),
131 gas_price: t.gas_price.into(),
132 value: ActionValue::Transfer(t.value.into()),
133 action_type: ActionType::Call,
134 params_type: ParamsType::Separate,
135 }
136 }
137}