use crate::{
errors::EvmError,
traits::{ResetBlock, ResetDB},
types::AllDBType,
TraceEvm,
};
use alloy::eips::{BlockId, BlockNumberOrTag};
use revm::{
context::BlockEnv,
context_interface::ContextTr,
database::{CacheDB, DatabaseRef},
ExecuteEvm,
};
impl<DB, INSP> ResetDB for TraceEvm<CacheDB<DB>, INSP>
where
DB: DatabaseRef,
{
fn reset_db(&mut self) {
let cached_db = &mut self.0.ctx.db().cache;
cached_db.accounts.clear();
cached_db.contracts.clear();
cached_db.logs = Vec::new();
cached_db.block_hashes.clear();
}
}
impl ResetBlock for AllDBType {
type Error = EvmError;
fn reset_block(&mut self, block_number: u64) -> Result<(), EvmError> {
let db = self.get_db_mut();
db.set_block_number(BlockId::Number(BlockNumberOrTag::Number(block_number)));
Ok(())
}
}
impl<DB, INSP> TraceEvm<CacheDB<DB>, INSP>
where
DB: DatabaseRef + ResetBlock,
<DB as ResetBlock>::Error: Into<EvmError>,
{
pub fn set_db_block(&mut self, block_env: BlockEnv) -> Result<(), EvmError> {
{
let cache_db = &mut self.0.ctx.db().db;
cache_db.reset_block(block_env.number).map_err(Into::into)?;
}
self.reset_db();
self.set_block(block_env);
Ok(())
}
}
#[cfg(feature = "foundry-fork")]
use foundry_fork_db::backend::SharedBackend;
#[cfg(feature = "foundry-fork")]
use crate::errors::InitError;
#[cfg(feature = "foundry-fork")]
impl ResetBlock for SharedBackend {
type Error = EvmError;
fn reset_block(&mut self, block_number: u64) -> Result<(), EvmError> {
self.set_pinned_block(BlockId::Number(BlockNumberOrTag::Number(block_number)))
.map_err(|e| EvmError::Init(InitError::DatabaseError(e.to_string())))?;
let data = self.data();
data.clear();
Ok(())
}
}