revm_interpreter/interpreter/ext_bytecode/
serde.rs

1use super::ExtBytecode;
2use crate::interpreter::Jumps;
3use primitives::B256;
4use serde::{Deserialize, Deserializer, Serialize, Serializer};
5
6#[derive(Serialize, Deserialize)]
7struct ExtBytecodeSerde {
8    base: bytecode::Bytecode,
9    program_counter: usize,
10    bytecode_hash: Option<B256>,
11}
12
13impl Serialize for ExtBytecode {
14    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
15    where
16        S: Serializer,
17    {
18        ExtBytecodeSerde {
19            base: self.base.clone(),
20            program_counter: self.pc(),
21            bytecode_hash: self.bytecode_hash,
22        }
23        .serialize(serializer)
24    }
25}
26
27impl<'de> Deserialize<'de> for ExtBytecode {
28    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
29    where
30        D: Deserializer<'de>,
31    {
32        let ExtBytecodeSerde {
33            base,
34            program_counter,
35            bytecode_hash,
36        } = ExtBytecodeSerde::deserialize(deserializer)?;
37
38        let mut bytecode = if let Some(hash) = bytecode_hash {
39            Self::new_with_hash(base, hash)
40        } else {
41            Self::new(base)
42        };
43
44        if program_counter >= bytecode.base.bytecode().len() {
45            panic!("serde pc: {program_counter} is greater than or equal to bytecode len");
46        }
47        bytecode.absolute_jump(program_counter);
48        Ok(bytecode)
49    }
50}