use crate::{MonadCfgEnv, MonadChainContext, MonadHardfork, MonadJournal};
use revm::{
context::{BlockEnv, LocalContext, TxEnv},
context_interface::JournalTr,
database_interface::{Database, EmptyDB},
Context,
};
pub type MonadContext<DB> =
Context<BlockEnv, TxEnv, MonadCfgEnv, DB, MonadJournal<DB>, MonadChainContext>;
pub trait DefaultMonad {
fn monad() -> MonadContext<EmptyDB>;
}
pub fn monad_context_with_db<DB: Database>(db: DB) -> MonadContext<DB> {
let mut journaled_state = MonadJournal::new(db);
journaled_state.set_spec_id(MonadHardfork::default().into());
Context {
block: BlockEnv::default(),
tx: TxEnv::default(),
cfg: MonadCfgEnv::new(),
journaled_state,
chain: MonadChainContext::default(),
local: LocalContext::default(),
error: Ok(()),
}
}
impl DefaultMonad for MonadContext<EmptyDB> {
fn monad() -> Self {
monad_context_with_db(EmptyDB::new())
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::{api::builder::MonadBuilder, MonadJournalTr};
use revm::{context::Cfg, inspector::NoOpInspector, ExecuteEvm};
#[test]
fn default_run_monad() {
let ctx = Context::monad();
assert_eq!(ctx.cfg.spec(), MonadHardfork::MonadTen);
assert_eq!(ctx.journaled_state.monad_spec(), MonadHardfork::MonadTen);
let mut evm = ctx.build_monad_with_inspector(NoOpInspector {});
let tx = TxEnv::default();
let _ = evm.transact(tx);
}
}