use alloy_primitives::{B256, U256}; use reth_codecs::{add_arbitrary_tests, Compact}; use serde::{Deserialize, Serialize}; /// Account storage entry. /// /// `key` is the subkey when used as a value in the `StorageChangeSets` table. #[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Ord)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] #[add_arbitrary_tests(compact)] pub struct StorageEntry { /// Storage key. pub key: B256, /// Value on storage key. pub value: U256, } impl StorageEntry { /// Create a new `StorageEntry` with given key and value. pub const fn new(key: B256, value: U256) -> Self { Self { key, value } } } impl From<(B256, U256)> for StorageEntry { fn from((key, value): (B256, U256)) -> Self { Self { key, value } } } // NOTE: Removing reth_codec and manually encode subkey // and compress second part of the value. If we have compression // over whole value (Even SubKey) that would mess up fetching of values with seek_by_key_subkey impl Compact for StorageEntry { fn to_compact(&self, buf: &mut B) -> usize where B: bytes::BufMut + AsMut<[u8]>, { // for now put full bytes and later compress it. buf.put_slice(&self.key[..]); self.value.to_compact(buf) + 32 } fn from_compact(buf: &[u8], len: usize) -> (Self, &[u8]) { let key = B256::from_slice(&buf[..32]); let (value, out) = U256::from_compact(&buf[32..], len - 32); (Self { key, value }, out) } }