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
use vapory_types::{U256, H256};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BasicAccount {
pub nonce: U256,
pub balance: U256,
pub storage_root: H256,
pub code_hash: H256,
pub code_version: U256,
}
impl tetsy_rlp::Encodable for BasicAccount {
fn rlp_append(&self, stream: &mut tetsy_rlp::RlpStream) {
let use_short_version = self.code_version == U256::zero();
match use_short_version {
true => { stream.begin_list(4); }
false => { stream.begin_list(5); }
}
stream.append(&self.nonce);
stream.append(&self.balance);
stream.append(&self.storage_root);
stream.append(&self.code_hash);
if !use_short_version {
stream.append(&self.code_version);
}
}
}
impl tetsy_rlp::Decodable for BasicAccount {
fn decode(rlp: &tetsy_rlp::Rlp) -> Result<Self, tetsy_rlp::DecoderError> {
let use_short_version = match rlp.item_count()? {
4 => true,
5 => false,
_ => return Err(tetsy_rlp::DecoderError::RlpIncorrectListLen),
};
Ok(BasicAccount {
nonce: rlp.val_at(0)?,
balance: rlp.val_at(1)?,
storage_root: rlp.val_at(2)?,
code_hash: rlp.val_at(3)?,
code_version: if use_short_version {
U256::zero()
} else {
rlp.val_at(4)?
},
})
}
}