revm_bytecode/bytecode/
serde_impl.rs1use super::{Arc, Bytecode, BytecodeInner, BytecodeKind, JumpTable, OnceLock};
2use primitives::{Address, Bytes};
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize)]
6enum BytecodeSerde {
7 LegacyAnalyzed {
8 bytecode: Bytes,
9 original_len: usize,
10 jump_table: JumpTable,
11 },
12 Eip7702 {
13 delegated_address: Address,
14 },
15}
16
17impl Serialize for Bytecode {
18 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19 let repr = match self.kind() {
20 BytecodeKind::LegacyAnalyzed => BytecodeSerde::LegacyAnalyzed {
21 bytecode: self.0.bytecode.clone(),
22 original_len: self.0.original_len,
23 jump_table: self.0.jump_table.clone(),
24 },
25 BytecodeKind::Eip7702 => BytecodeSerde::Eip7702 {
26 delegated_address: self.eip7702_address().unwrap(),
27 },
28 };
29 repr.serialize(serializer)
30 }
31}
32
33impl<'de> Deserialize<'de> for Bytecode {
34 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
35 match BytecodeSerde::deserialize(deserializer)? {
36 BytecodeSerde::LegacyAnalyzed {
37 bytecode,
38 original_len,
39 jump_table,
40 } => Ok(Self(Arc::new(BytecodeInner {
41 kind: BytecodeKind::LegacyAnalyzed,
42 bytecode,
43 original_len,
44 jump_table,
45 hash: OnceLock::new(),
46 }))),
47 BytecodeSerde::Eip7702 { delegated_address } => {
48 Ok(Self::new_eip7702(delegated_address))
49 }
50 }
51 }
52}