revm_interpreter/interpreter/ext_bytecode/
serde.rs

1use super::ExtBytecode;
2use crate::interpreter::Jumps;
3use primitives::B256;
4use serde::{Deserialize, Deserializer, Serialize, Serializer};
5use std::{borrow::Cow, format};
6
7#[derive(Serialize, Deserialize)]
8struct ExtBytecodeSerde<'a> {
9    base: Cow<'a, bytecode::Bytecode>,
10    program_counter: usize,
11    bytecode_hash: Option<B256>,
12}
13
14impl Serialize for ExtBytecode {
15    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
16    where
17        S: Serializer,
18    {
19        ExtBytecodeSerde {
20            base: Cow::Borrowed(&self.base),
21            program_counter: self.pc(),
22            bytecode_hash: self.bytecode_hash,
23        }
24        .serialize(serializer)
25    }
26}
27
28impl<'de> Deserialize<'de> for ExtBytecode {
29    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
30    where
31        D: Deserializer<'de>,
32    {
33        let ExtBytecodeSerde {
34            base,
35            program_counter,
36            bytecode_hash,
37        } = ExtBytecodeSerde::deserialize(deserializer)?;
38        let mut bytecode = Self::new_with_optional_hash(base.into_owned(), bytecode_hash);
39        let len = bytecode.base.bytecode().len();
40        if program_counter >= len {
41            return Err(serde::de::Error::custom(format!(
42                "program counter ({program_counter}) exceeds bytecode length ({len})"
43            )));
44        }
45        bytecode.absolute_jump(program_counter);
46        Ok(bytecode)
47    }
48}