cfx_vm_types/
call_create_type.rs1use cfx_types::CreateContractAddressType;
24use rlp::{Decodable, DecoderError, Encodable, Rlp, RlpStream};
25use serde::Serialize;
26
27#[derive(Debug, PartialEq, Clone, Copy, Serialize, Eq, Default)]
29#[serde(rename_all = "lowercase")]
30pub enum CallType {
31 #[default]
33 None,
34 Call,
36 CallCode,
38 DelegateCall,
40 StaticCall,
42}
43
44impl Encodable for CallType {
45 fn rlp_append(&self, s: &mut RlpStream) {
46 let v = match *self {
47 CallType::None => 0u32,
48 CallType::Call => 1,
49 CallType::CallCode => 2,
50 CallType::DelegateCall => 3,
51 CallType::StaticCall => 4,
52 };
53 Encodable::rlp_append(&v, s);
54 }
55}
56
57impl Decodable for CallType {
58 fn decode(rlp: &Rlp) -> Result<Self, DecoderError> {
59 rlp.as_val().and_then(|v| {
60 Ok(match v {
61 0u32 => CallType::None,
62 1 => CallType::Call,
63 2 => CallType::CallCode,
64 3 => CallType::DelegateCall,
65 4 => CallType::StaticCall,
66 _ => {
67 return Err(DecoderError::Custom(
68 "Invalid value of CallType item",
69 ));
70 }
71 })
72 })
73 }
74}
75
76#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Default)]
78#[serde(rename_all = "lowercase")]
79pub enum CreateType {
80 #[default]
82 None,
83 CREATE,
85 CREATE2,
87}
88
89impl CreateType {
90 pub fn from_address_scheme(
91 address: &CreateContractAddressType,
92 ) -> CreateType {
93 match address {
94 CreateContractAddressType::FromSenderNonce => CreateType::CREATE,
95 CreateContractAddressType::FromSenderNonceAndCodeHash => {
96 CreateType::CREATE
97 }
98 CreateContractAddressType::FromBlockNumberSenderNonceAndCodeHash => {
99 unreachable!("Inactivate address scheme")
100 }
101 CreateContractAddressType::FromSenderSaltAndCodeHash(_) => {
102 CreateType::CREATE2
103 }
104 }
105 }
106}
107
108impl Encodable for CreateType {
109 fn rlp_append(&self, s: &mut RlpStream) {
110 let v = match *self {
111 CreateType::None => 0u32,
112 CreateType::CREATE => 1,
113 CreateType::CREATE2 => 2,
114 };
115 Encodable::rlp_append(&v, s);
116 }
117}
118
119impl Decodable for CreateType {
120 fn decode(rlp: &Rlp) -> Result<Self, DecoderError> {
121 rlp.as_val().and_then(|v| {
122 Ok(match v {
123 0u32 => CreateType::None,
124 1 => CreateType::CREATE,
125 2 => CreateType::CREATE2,
126 _ => {
127 return Err(DecoderError::Custom(
128 "Invalid value of CreateType item",
129 ));
130 }
131 })
132 })
133 }
134}
135
136#[cfg(test)]
137mod tests {
138 use super::CallType;
139 use rlp::*;
140
141 #[test]
142 fn encode_call_type() {
143 let ct = CallType::Call;
144
145 let mut s = RlpStream::new_list(2);
146 s.append(&ct);
147 assert!(!s.is_finished(), "List shouldn't finished yet");
148 s.append(&ct);
149 assert!(s.is_finished(), "List should be finished now");
150 s.out();
151 }
152
153 #[test]
154 fn should_encode_and_decode_call_type() {
155 let original = CallType::Call;
156 let encoded = encode(&original);
157 let decoded = decode(&encoded).expect("failure decoding CallType");
158 assert_eq!(original, decoded);
159 }
160}