revm_interpreter/interpreter/ext_bytecode/
serde.rs1use 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}