pub mod codec;
mod internal_cache;
mod containers;
pub use containers::*;
#[cfg(feature = "native")]
mod prover_storage;
#[cfg(feature = "native")]
mod tree_db;
mod scratchpad;
pub mod storage;
mod utils;
mod witness;
mod zk_storage;
pub use zk_storage::ZkStorage;
pub mod config;
use std::fmt::Display;
use std::str;
#[cfg(feature = "native")]
pub use prover_storage::{delete_storage, ProverStorage};
pub use scratchpad::*;
pub use sov_first_read_last_write_cache::cache::CacheLog;
use sov_rollup_interface::digest::Digest;
pub use storage::Storage;
use utils::AlignedVec;
pub use crate::witness::{ArrayWitness, TreeWitnessReader, Witness};
#[derive(
borsh::BorshDeserialize,
borsh::BorshSerialize,
Debug,
PartialEq,
Eq,
Clone,
serde::Serialize,
serde::Deserialize,
)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct Prefix {
prefix: AlignedVec,
}
impl Display for Prefix {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let buf = self.prefix.as_ref();
match str::from_utf8(buf) {
Ok(s) => {
write!(f, "{:?}", s)
}
Err(_) => {
write!(f, "0x{}", hex::encode(buf))
}
}
}
}
impl Prefix {
pub fn new(prefix: Vec<u8>) -> Self {
Self {
prefix: AlignedVec::new(prefix),
}
}
pub fn as_aligned_vec(&self) -> &AlignedVec {
&self.prefix
}
pub fn len(&self) -> usize {
self.prefix.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.prefix.is_empty()
}
pub fn extended(&self, bytes: &[u8]) -> Self {
let mut prefix = self.clone();
prefix.extend(bytes.iter().copied());
prefix
}
}
impl Extend<u8> for Prefix {
fn extend<T: IntoIterator<Item = u8>>(&mut self, iter: T) {
self.prefix
.extend(&AlignedVec::new(iter.into_iter().collect()))
}
}
pub trait MerkleProofSpec {
type Witness: Witness;
type Hasher: Digest<OutputSize = sha2::digest::typenum::U32>;
}
use sha2::Sha256;
#[derive(Clone)]
pub struct DefaultStorageSpec;
impl MerkleProofSpec for DefaultStorageSpec {
type Witness = ArrayWitness;
type Hasher = Sha256;
}