use crate::{helpers::Ctx, Cfg, EvmErrored, HasCfg, Trevm};
use revm::{context::ContextTr, Database, Inspector};
impl<Db, Insp, TrevmState> Trevm<Db, Insp, TrevmState>
where
Db: Database,
Insp: Inspector<Ctx<Db>>,
TrevmState: HasCfg,
{
pub fn cfg(&self) -> &revm::context::CfgEnv {
self.inner.ctx.cfg()
}
pub fn chain_id(&self) -> u64 {
self.cfg().chain_id
}
pub fn set_code_size_limit(&mut self, limit: usize) -> Option<usize> {
let mut csl = None;
self.inner.ctx.modify_cfg(|cfg| {
csl = cfg.limit_contract_code_size.replace(limit);
});
csl
}
pub fn disable_code_size_limit(&mut self) -> Option<usize> {
let mut csl = None;
self.inner.ctx.modify_cfg(|cfg| csl = cfg.limit_contract_code_size.take());
csl
}
pub fn without_code_size_limit<F, NewState: HasCfg>(mut self, f: F) -> Trevm<Db, Insp, NewState>
where
F: FnOnce(Self) -> Trevm<Db, Insp, NewState>,
{
let limit = self.disable_code_size_limit();
let mut new = f(self);
if let Some(limit) = limit {
new.set_code_size_limit(limit);
}
new
}
pub fn set_default_code_size_limit(&mut self) -> Option<usize> {
self.set_code_size_limit(0x6000)
}
pub fn disable_chain_id_check(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.tx_chain_id_check = false);
}
pub fn enable_chain_id_check(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.tx_chain_id_check = true);
}
pub fn without_chain_id_check<F, NewState: HasCfg>(mut self, f: F) -> Trevm<Db, Insp, NewState>
where
F: FnOnce(Self) -> Trevm<Db, Insp, NewState>,
{
let previous = self.inner.cfg().tx_chain_id_check;
self.disable_chain_id_check();
let mut new = f(self);
new.inner.ctx.modify_cfg(|cfg| cfg.tx_chain_id_check = previous);
new
}
pub fn with_cfg<C, F, NewState>(mut self, cfg: &C, f: F) -> Trevm<Db, Insp, NewState>
where
C: Cfg,
F: FnOnce(Self) -> Trevm<Db, Insp, NewState>,
NewState: HasCfg,
{
let previous = self.inner.cfg().clone();
cfg.fill_cfg(&mut self.inner);
let mut this = f(self);
this.inner.ctx.modify_cfg(|cfg| *cfg = previous);
this
}
pub fn try_with_cfg<C, F, NewState, E>(
mut self,
cfg: &C,
f: F,
) -> Result<Trevm<Db, Insp, NewState>, EvmErrored<Db, Insp, E>>
where
C: Cfg,
F: FnOnce(Self) -> Result<Trevm<Db, Insp, NewState>, EvmErrored<Db, Insp, E>>,
NewState: HasCfg,
{
let previous = self.inner.cfg().clone();
cfg.fill_cfg(&mut self.inner);
match f(self) {
Ok(mut evm) => {
evm.inner.modify_cfg(|cfg| *cfg = previous);
Ok(evm)
}
Err(mut evm) => {
evm.inner.modify_cfg(|cfg| *cfg = previous);
Err(evm)
}
}
}
#[cfg(feature = "memory_limit")]
pub fn set_memory_limit(&mut self, new_limit: u64) -> u64 {
let mut ml = 0;
self.inner.ctx.modify_cfg(|cfg| ml = core::mem::replace(&mut cfg.memory_limit, new_limit));
ml
}
#[cfg(feature = "optional_balance_check")]
pub fn disable_balance_check(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.disable_balance_check = true)
}
#[cfg(feature = "optional_balance_check")]
pub fn enable_balance_check(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.disable_balance_check = false)
}
#[cfg(feature = "optional_balance_check")]
pub fn without_balance_check<F, NewState: HasCfg>(mut self, f: F) -> Trevm<Db, Insp, NewState>
where
F: FnOnce(Self) -> Trevm<Db, Insp, NewState>,
{
let previous = self.inner.cfg().disable_balance_check;
self.disable_balance_check();
let mut new = f(self);
new.inner.ctx.modify_cfg(|cfg| cfg.disable_balance_check = previous);
new
}
#[cfg(feature = "optional_block_gas_limit")]
pub fn disable_block_gas_limit(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.disable_block_gas_limit = true);
}
#[cfg(feature = "optional_block_gas_limit")]
pub fn enable_block_gas_limit(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.disable_block_gas_limit = false);
}
#[cfg(feature = "optional_block_gas_limit")]
pub fn without_block_gas_limit<F, NewState: HasCfg>(mut self, f: F) -> Trevm<Db, Insp, NewState>
where
F: FnOnce(Self) -> Trevm<Db, Insp, NewState>,
{
let previous = self.inner.cfg().disable_block_gas_limit;
self.disable_block_gas_limit();
let mut new = f(self);
new.inner.ctx.modify_cfg(|cfg| cfg.disable_block_gas_limit = previous);
new
}
#[cfg(feature = "optional_eip3607")]
pub fn disable_eip3607(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.disable_eip3607 = true);
}
#[cfg(feature = "optional_eip3607")]
pub fn enable_eip3607(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.disable_eip3607 = false);
}
#[cfg(feature = "optional_eip3607")]
pub fn without_eip3607<F, NewState: HasCfg>(mut self, f: F) -> Trevm<Db, Insp, NewState>
where
F: FnOnce(Self) -> Trevm<Db, Insp, NewState>,
{
let previous = self.inner.cfg().disable_eip3607;
self.disable_eip3607();
let mut new = f(self);
new.inner.ctx.modify_cfg(|cfg| cfg.disable_eip3607 = previous);
new
}
#[cfg(feature = "optional_no_base_fee")]
pub fn disable_base_fee(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.disable_base_fee = true)
}
#[cfg(feature = "optional_no_base_fee")]
pub fn enable_base_fee(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.disable_base_fee = false)
}
#[cfg(feature = "optional_no_base_fee")]
pub fn without_base_fee<F, NewState: HasCfg>(mut self, f: F) -> Trevm<Db, Insp, NewState>
where
F: FnOnce(Self) -> Trevm<Db, Insp, NewState>,
{
let previous = self.inner.cfg().disable_base_fee;
self.disable_base_fee();
let mut new = f(self);
new.inner.ctx.modify_cfg(|cfg| cfg.disable_base_fee = previous);
new
}
pub fn disable_nonce_check(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.disable_nonce_check = true)
}
pub fn enable_nonce_check(&mut self) {
self.inner.ctx.modify_cfg(|cfg| cfg.disable_nonce_check = false)
}
pub fn without_nonce_check<F, NewState: HasCfg>(mut self, f: F) -> Trevm<Db, Insp, NewState>
where
F: FnOnce(Self) -> Trevm<Db, Insp, NewState>,
{
let previous = self.inner.cfg().disable_nonce_check;
self.disable_nonce_check();
let mut new = f(self);
new.inner.ctx.modify_cfg(|cfg| cfg.disable_nonce_check = previous);
new
}
}