1use bytes::Bytes;
2use ethereum_types::{Bloom, H160, H256, U256};
3use rkyv::{
4 Archive, Archived, Deserialize, Serialize,
5 rancor::{Fallible, Source},
6 ser::{Allocator, Writer},
7 vec::{ArchivedVec, VecResolver},
8 with::{ArchiveWith, DeserializeWith, SerializeWith},
9};
10use std::{
11 collections::HashMap,
12 hash::{Hash, Hasher},
13};
14
15pub use ethrex_trie::rkyv_utils::H256Wrapper;
17
18#[derive(Archive, Serialize, Deserialize)]
19#[rkyv(remote = Vec<Vec<u8>>)]
20pub struct VecVecWrapper {
21 #[rkyv(getter = vec_vec_to_vec)]
22 vec_vec: Vec<Vec<u8>>,
23}
24
25fn vec_vec_to_vec(vec_vec: &[Vec<u8>]) -> Vec<Vec<u8>> {
26 vec_vec.iter().map(|b| b.to_vec()).collect()
27}
28
29impl From<VecVecWrapper> for Vec<Vec<u8>> {
30 fn from(value: VecVecWrapper) -> Self {
31 value.vec_vec
32 }
33}
34
35#[derive(Archive, Serialize, Deserialize)]
36#[rkyv(remote = U256)]
37pub struct U256Wrapper([u64; 4]);
38
39impl From<U256Wrapper> for U256 {
40 fn from(value: U256Wrapper) -> Self {
41 Self(value.0)
42 }
43}
44
45#[derive(Archive, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash)]
46#[rkyv(remote = H160)]
47#[rkyv(derive(Ord, PartialOrd))]
48pub struct H160Wrapper([u8; 20]);
49
50impl From<H160Wrapper> for H160 {
51 fn from(value: H160Wrapper) -> Self {
52 Self(value.0)
53 }
54}
55
56impl PartialEq for ArchivedH160Wrapper {
57 fn eq(&self, other: &Self) -> bool {
58 self.0 == other.0
59 }
60}
61
62impl Eq for ArchivedH160Wrapper {}
63
64impl Hash for ArchivedH160Wrapper {
65 fn hash<H: Hasher>(&self, state: &mut H) {
66 self.0.hash(state);
67 }
68}
69
70#[derive(Archive, Serialize, Deserialize)]
71#[rkyv(remote = Option<H160>)]
72pub enum OptionH160Wrapper {
73 Some(#[rkyv(with = H160Wrapper)] H160),
74 None,
75}
76
77impl From<OptionH160Wrapper> for Option<H160> {
78 fn from(value: OptionH160Wrapper) -> Self {
79 if let OptionH160Wrapper::Some(x) = value {
80 Some(x)
81 } else {
82 None
83 }
84 }
85}
86
87#[derive(Archive, Serialize, Deserialize)]
88#[rkyv(remote = Bytes)]
89pub struct BytesWrapper {
90 #[rkyv(getter = bytes_to_vec)]
91 bytes: Vec<u8>,
92}
93
94fn bytes_to_vec(bytes: &Bytes) -> Vec<u8> {
95 bytes.to_vec()
96}
97
98impl From<BytesWrapper> for Bytes {
99 fn from(value: BytesWrapper) -> Self {
100 Self::copy_from_slice(&value.bytes)
101 }
102}
103
104#[derive(Archive, Serialize, Deserialize)]
105#[rkyv(remote = Bloom)]
106pub struct BloomWrapper {
107 #[rkyv(getter = bloom_to_bytes)]
108 bloom_bytes: [u8; 256],
109}
110
111fn bloom_to_bytes(bloom: &Bloom) -> [u8; 256] {
112 bloom.0
113}
114
115impl From<BloomWrapper> for Bloom {
116 fn from(value: BloomWrapper) -> Self {
117 Self::from_slice(&value.bloom_bytes)
118 }
119}
120
121#[derive(Archive, Serialize, Deserialize)]
122#[rkyv(remote = Option<H256>)]
123pub enum OptionH256Wrapper {
124 Some(#[rkyv(with = H256Wrapper)] H256),
125 None,
126}
127
128impl From<OptionH256Wrapper> for Option<H256> {
129 fn from(value: OptionH256Wrapper) -> Self {
130 if let OptionH256Wrapper::Some(x) = value {
131 Some(x)
132 } else {
133 None
134 }
135 }
136}
137
138#[derive(Archive, Serialize, Deserialize)]
139#[rkyv(remote = Option<HashMap<H160, Vec<Vec<u8>>>>)]
140pub enum OptionStorageWrapper {
141 Some(
142 #[rkyv(with = rkyv::with::MapKV<H160Wrapper, rkyv::with::AsBox>)]
143 HashMap<H160, Vec<Vec<u8>>>,
144 ),
145 None,
146}
147
148impl From<OptionStorageWrapper> for Option<HashMap<H160, Vec<Vec<u8>>>> {
149 fn from(value: OptionStorageWrapper) -> Self {
150 if let OptionStorageWrapper::Some(x) = value {
151 Some(x)
152 } else {
153 None
154 }
155 }
156}
157pub struct AccessListItemWrapper;
158
159pub struct AccessListItemWrapperResolver {
160 len: usize,
161 inner: VecResolver,
162}
163
164impl ArchiveWith<(H160, Vec<H256>)> for AccessListItemWrapper {
165 type Archived = ArchivedVec<u8>;
166 type Resolver = AccessListItemWrapperResolver;
167 fn resolve_with(
168 _: &(H160, Vec<H256>),
169 resolver: Self::Resolver,
170 out: rkyv::Place<Self::Archived>,
171 ) {
172 ArchivedVec::resolve_from_len(resolver.len, resolver.inner, out);
173 }
174}
175
176impl<S> SerializeWith<(H160, Vec<H256>), S> for AccessListItemWrapper
177where
178 S: Fallible + Allocator + Writer + ?Sized,
179{
180 fn serialize_with(
181 field: &(H160, Vec<H256>),
182 serializer: &mut S,
183 ) -> Result<Self::Resolver, S::Error> {
184 let mut encoded: Vec<u8> = Vec::new();
185 encoded.extend_from_slice(&field.0.0);
187 encoded.extend_from_slice(&(field.1.len() as u64).to_le_bytes());
189 for slot in field.1.iter() {
190 encoded.extend_from_slice(&slot.0);
192 }
193
194 Ok(AccessListItemWrapperResolver {
195 len: encoded.len(),
196 inner: ArchivedVec::serialize_from_slice(encoded.as_slice(), serializer)?,
197 })
198 }
199}
200
201impl<D> DeserializeWith<Archived<Vec<u8>>, (H160, Vec<H256>), D> for AccessListItemWrapper
202where
203 D: Fallible<Error = rkyv::rancor::Error> + ?Sized,
204{
205 fn deserialize_with(
206 field: &Archived<Vec<u8>>,
207 _: &mut D,
208 ) -> Result<(H160, Vec<H256>), D::Error> {
209 let address = H160::from_slice(&field[0..20]);
210
211 let access_list_length =
212 u64::from_le_bytes(field[20..28].try_into().map_err(rkyv::rancor::Error::new)?)
213 as usize;
214
215 let mut access_list_keys = Vec::with_capacity(access_list_length);
216 let mut start = 28_usize;
217 let mut end = start + 32_usize; for _ in 0..access_list_length {
219 access_list_keys.push(H256::from_slice(&field[start..end]));
220 start = end;
221 end = start + 32_usize;
222 }
223 Ok((address, access_list_keys))
224 }
225}