-
Notifications
You must be signed in to change notification settings - Fork 1k
Expand file tree
/
Copy pathmod.rs
More file actions
133 lines (113 loc) · 3.42 KB
/
mod.rs
File metadata and controls
133 lines (113 loc) · 3.42 KB
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
use bytes::Bytes;
use revm::{B160, B256, U256};
use std::collections::{BTreeMap, HashMap};
mod deserializer;
mod spec;
use deserializer::*;
use serde_derive::*;
pub use self::spec::SpecName;
#[derive(Debug, PartialEq, Eq, Deserialize)]
pub struct TestSuit(pub BTreeMap<String, TestUnit>);
#[derive(Debug, PartialEq, Eq, Deserialize)]
pub struct TestUnit {
pub env: Env,
pub pre: HashMap<B160, AccountInfo>,
pub post: BTreeMap<SpecName, Vec<Test>>,
pub transaction: TransactionParts,
}
/// State test indexed state result deserialization.
#[derive(Debug, PartialEq, Eq, Deserialize)]
pub struct Test {
/// Post state hash
pub hash: B256,
/// Indexes
pub indexes: TxPartIndices,
// logs
pub logs: B256,
#[serde(default)]
#[serde(deserialize_with = "deserialize_opt_str_as_bytes")]
pub txbytes: Option<Bytes>,
}
#[derive(Debug, PartialEq, Eq, Deserialize)]
pub struct TxPartIndices {
pub data: usize,
pub gas: usize,
pub value: usize,
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize)]
#[serde(deny_unknown_fields)]
#[serde(rename_all = "camelCase")]
pub struct AccountInfo {
pub balance: U256,
#[serde(deserialize_with = "deserialize_str_as_bytes")]
pub code: Bytes,
#[serde(deserialize_with = "deserialize_str_as_u64")]
pub nonce: u64,
pub storage: HashMap<U256, U256>,
}
#[derive(Debug, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Env {
pub current_coinbase: B160,
#[serde(default, deserialize_with = "deserialize_str_as_u256")]
pub current_difficulty: U256,
#[serde(deserialize_with = "deserialize_str_as_u256")]
pub current_gas_limit: U256,
#[serde(deserialize_with = "deserialize_str_as_u256")]
pub current_number: U256,
#[serde(deserialize_with = "deserialize_str_as_u256")]
pub current_timestamp: U256,
pub current_base_fee: Option<U256>,
pub previous_hash: B256,
}
#[derive(Debug, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionParts {
#[serde(deserialize_with = "deserialize_vec_as_vec_bytes")]
pub data: Vec<Bytes>,
pub access_lists: Option<Vec<Option<AccessList>>>,
pub gas_limit: Vec<U256>,
pub gas_price: Option<U256>,
pub nonce: U256,
pub secret_key: Option<B256>,
#[serde(deserialize_with = "deserialize_maybe_empty")]
pub to: Option<B160>,
pub value: Vec<U256>,
pub max_fee_per_gas: Option<U256>,
pub max_priority_fee_per_gas: Option<U256>,
}
#[derive(Debug, PartialEq, Eq, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct AccessListItem {
pub address: B160,
pub storage_keys: Vec<B256>,
}
pub type AccessList = Vec<AccessListItem>;
#[cfg(test)]
mod tests {
use super::*;
use serde_json::Error;
use revm::B160;
#[test]
pub fn serialize_u256() -> Result<(), Error> {
let json = r#"{"_item":"0x10"}"#;
#[derive(Deserialize, Debug)]
pub struct Test {
_item: Option<U256>,
}
let out: Test = serde_json::from_str(json)?;
println!("out:{out:?}");
Ok(())
}
#[test]
pub fn serialize_b160() -> Result<(), Error> {
let json = r#"{"_item":"0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"}"#;
#[derive(Deserialize, Debug)]
pub struct Test {
_item: B160,
}
let out: Test = serde_json::from_str(json)?;
println!("out:{out:?}");
Ok(())
}
}