1use crate::Zenith;
2use alloy::rlp::BufMut;
3use trevm::journal::{JournalDecode, JournalDecodeError, JournalEncode};
4
5const ZENITH_HEADER_BYTES: usize = 32 + 32 + 32 + 20 + 32;
6
7impl JournalEncode for Zenith::BlockHeader {
8 fn serialized_size(&self) -> usize {
9 ZENITH_HEADER_BYTES
10 }
11
12 fn encode(&self, buf: &mut dyn BufMut) {
13 let Self { rollupChainId, hostBlockNumber, gasLimit, rewardAddress, blockDataHash } = self;
14
15 rollupChainId.encode(buf);
16 hostBlockNumber.encode(buf);
17 gasLimit.encode(buf);
18 rewardAddress.encode(buf);
19 blockDataHash.encode(buf);
20 }
21}
22
23impl JournalDecode for Zenith::BlockHeader {
24 fn decode(buf: &mut &[u8]) -> Result<Self, JournalDecodeError> {
25 Ok(Self {
26 rollupChainId: JournalDecode::decode(buf)?,
27 hostBlockNumber: JournalDecode::decode(buf)?,
28 gasLimit: JournalDecode::decode(buf)?,
29 rewardAddress: JournalDecode::decode(buf)?,
30 blockDataHash: JournalDecode::decode(buf)?,
31 })
32 }
33}
34
35#[cfg(test)]
36mod test {
37 use super::*;
38 use alloy::primitives::{Address, B256, U256};
39
40 fn roundtrip<T: JournalDecode + JournalEncode + PartialEq>(expected: &T) {
41 let enc = JournalEncode::encoded(expected);
42 assert_eq!(enc.len(), expected.serialized_size(), "{}", core::any::type_name::<T>());
43 let dec = T::decode(&mut enc.as_ref()).expect("decoding failed");
44 assert_eq!(&dec, expected);
45 }
46
47 #[test]
48 fn journal() {
49 roundtrip(&Zenith::BlockHeader {
50 rollupChainId: U256::from(1),
51 hostBlockNumber: U256::from(1),
52 gasLimit: U256::from(1),
53 rewardAddress: Address::repeat_byte(0xa),
54 blockDataHash: B256::repeat_byte(0xa),
55 });
56 }
57}