use crate::{
evm::MonadEvm, instructions::MonadInstructions, precompiles::MonadPrecompiles,
MonadChainContext, MonadHardfork, MonadJournal,
};
use revm::{
context::Cfg,
context_interface::{Block, LocalContextTr, Transaction},
Context, Database,
};
pub type DefaultMonadEvm<CTX, INSP = ()> =
MonadEvm<CTX, INSP, MonadInstructions<CTX>, MonadPrecompiles>;
pub trait MonadBuilder: Sized {
type Context;
fn build_monad(self) -> DefaultMonadEvm<Self::Context>;
fn build_monad_with_inspector<INSP>(
self,
inspector: INSP,
) -> DefaultMonadEvm<Self::Context, INSP>;
}
impl<BLOCK, TX, CFG, DB, LOCAL> MonadBuilder
for Context<BLOCK, TX, CFG, DB, MonadJournal<DB>, MonadChainContext, LOCAL>
where
BLOCK: Block,
TX: Transaction,
CFG: Cfg<Spec = MonadHardfork>,
DB: Database,
LOCAL: LocalContextTr,
{
type Context = Self;
fn build_monad(self) -> DefaultMonadEvm<Self::Context> {
MonadEvm::new(self, ())
}
fn build_monad_with_inspector<INSP>(
self,
inspector: INSP,
) -> DefaultMonadEvm<Self::Context, INSP> {
MonadEvm::new(self, inspector)
}
}