use crate::{DBColumn, Error, StoreItem}; use ssz::{Decode, Encode}; use types::{ BlobSidecarList, EthSpec, ExecutionPayload, ExecutionPayloadCapella, ExecutionPayloadDeneb, ExecutionPayloadMerge, }; macro_rules! impl_store_item { ($ty_name:ident) => { impl StoreItem for $ty_name { fn db_column() -> DBColumn { DBColumn::ExecPayload } fn as_store_bytes(&self) -> Result, Error> { Ok(self.as_ssz_bytes()) } fn from_store_bytes(bytes: &[u8]) -> Result { Ok(Self::from_ssz_bytes(bytes)?) } } }; } impl_store_item!(ExecutionPayloadMerge); impl_store_item!(ExecutionPayloadCapella); impl_store_item!(ExecutionPayloadDeneb); impl_store_item!(BlobSidecarList); /// This fork-agnostic implementation should be only used for writing. /// /// It is very inefficient at reading, and decoding the desired fork-specific variant is recommended /// instead. impl StoreItem for ExecutionPayload { fn db_column() -> DBColumn { DBColumn::ExecPayload } fn as_store_bytes(&self) -> Result, Error> { Ok(self.as_ssz_bytes()) } fn from_store_bytes(bytes: &[u8]) -> Result { ExecutionPayloadDeneb::from_ssz_bytes(bytes) .map(Self::Deneb) .or_else(|_| { ExecutionPayloadCapella::from_ssz_bytes(bytes) .map(Self::Capella) .or_else(|_| ExecutionPayloadMerge::from_ssz_bytes(bytes).map(Self::Merge)) }) .map_err(Into::into) } }