use crate::{
db::{StateAcc, TryStateAcc},
helpers::Ctx,
Block, BundleDriver, DriveBundleResult, EvmErrored, EvmNeedsBlock, EvmNeedsTx, EvmReady,
EvmTransacted, Tx,
};
use alloy::rpc::types::BlockOverrides;
use revm::{
context::{result::ExecutionResult, ContextTr},
Database, DatabaseCommit, Inspector,
};
impl<Db, Insp> EvmNeedsTx<Db, Insp>
where
Db: Database,
Insp: Inspector<Ctx<Db>>,
{
pub fn close_block(self) -> EvmNeedsBlock<Db, Insp> {
unsafe { core::mem::transmute(self) }
}
pub fn drive_bundle<D>(self, driver: &mut D) -> DriveBundleResult<D, Db, Insp>
where
D: BundleDriver<Db, Insp>,
Db: DatabaseCommit,
{
let trevm = driver.run_bundle(self)?;
match driver.post_bundle(&trevm) {
Ok(_) => Ok(trevm),
Err(e) => Err(trevm.errored(e)),
}
}
pub fn fill_tx<T: Tx>(mut self, filler: &T) -> EvmReady<Db, Insp> {
filler.fill_tx(&mut self.inner);
unsafe { core::mem::transmute(self) }
}
pub fn run_tx<T: Tx>(
self,
filler: &T,
) -> Result<EvmTransacted<Db, Insp>, EvmErrored<Db, Insp>> {
self.fill_tx(filler).run()
}
#[cfg(feature = "call")]
pub fn call_tx<T: Tx>(
self,
filler: &T,
) -> Result<(ExecutionResult, Self), EvmErrored<Db, Insp>> {
self.fill_tx(filler).call()
}
#[cfg(feature = "estimate_gas")]
pub fn estimate_tx_gas<T: Tx>(
self,
filler: &T,
) -> Result<(crate::EstimationResult, EvmReady<Db, Insp>), EvmErrored<Db, Insp>> {
self.fill_tx(filler).estimate_gas()
}
}
impl<Db, Insp> EvmNeedsTx<Db, Insp>
where
Db: Database + StateAcc,
Insp: Inspector<Ctx<Db>>,
{
pub fn apply_block_overrides(mut self, overrides: &BlockOverrides) -> Self {
overrides.fill_block(&mut self.inner);
if let Some(hashes) = overrides.block_hash.as_ref() {
self.inner.db_mut().set_block_hashes(hashes)
}
self
}
pub fn maybe_apply_block_overrides(self, overrides: Option<&BlockOverrides>) -> Self {
if let Some(overrides) = overrides {
self.apply_block_overrides(overrides)
} else {
self
}
}
}
impl<Db, Insp> EvmNeedsTx<Db, Insp>
where
Db: Database + TryStateAcc,
Insp: Inspector<Ctx<Db>>,
{
pub fn try_apply_block_overrides(
mut self,
overrides: &BlockOverrides,
) -> Result<Self, EvmErrored<Db, Insp, <Db as TryStateAcc>::Error>> {
overrides.fill_block(&mut self.inner);
if let Some(hashes) = overrides.block_hash.as_ref() {
trevm_try!(self.inner.db_mut().try_set_block_hashes(hashes), self);
}
Ok(self)
}
pub fn try_maybe_apply_block_overrides(
self,
overrides: Option<&BlockOverrides>,
) -> Result<Self, EvmErrored<Db, Insp, <Db as TryStateAcc>::Error>> {
if let Some(overrides) = overrides {
self.try_apply_block_overrides(overrides)
} else {
Ok(self)
}
}
}