use context::result::ExecResultAndState;
use handler::{system_call::SYSTEM_ADDRESS, ExecuteCommitEvm, ExecuteEvm, SystemCallEvm};
use primitives::{Address, Bytes};
pub trait InspectEvm: ExecuteEvm {
type Inspector;
fn set_inspector(&mut self, inspector: Self::Inspector);
fn inspect_one_tx(&mut self, tx: Self::Tx) -> Result<Self::ExecutionResult, Self::Error>;
fn inspect_tx(
&mut self,
tx: Self::Tx,
) -> Result<ExecResultAndState<Self::ExecutionResult, Self::State>, Self::Error> {
let output = self.inspect_one_tx(tx)?;
let state = self.finalize();
Ok(ExecResultAndState::new(output, state))
}
fn inspect(
&mut self,
tx: Self::Tx,
inspector: Self::Inspector,
) -> Result<ExecResultAndState<Self::ExecutionResult, Self::State>, Self::Error> {
let output = self.inspect_one(tx, inspector)?;
let state = self.finalize();
Ok(ExecResultAndState::new(output, state))
}
fn inspect_one(
&mut self,
tx: Self::Tx,
inspector: Self::Inspector,
) -> Result<Self::ExecutionResult, Self::Error> {
self.set_inspector(inspector);
self.inspect_one_tx(tx)
}
}
pub trait InspectCommitEvm: InspectEvm + ExecuteCommitEvm {
fn inspect_tx_commit(&mut self, tx: Self::Tx) -> Result<Self::ExecutionResult, Self::Error> {
let output = self.inspect_one_tx(tx)?;
self.commit_inner();
Ok(output)
}
fn inspect_commit(
&mut self,
tx: Self::Tx,
inspector: Self::Inspector,
) -> Result<Self::ExecutionResult, Self::Error> {
let output = self.inspect_one(tx, inspector)?;
self.commit_inner();
Ok(output)
}
}
pub trait InspectSystemCallEvm: InspectEvm + SystemCallEvm {
fn inspect_one_system_call(
&mut self,
system_contract_address: Address,
data: Bytes,
) -> Result<Self::ExecutionResult, Self::Error> {
self.inspect_one_system_call_with_caller(SYSTEM_ADDRESS, system_contract_address, data)
}
fn inspect_one_system_call_with_caller(
&mut self,
caller: Address,
system_contract_address: Address,
data: Bytes,
) -> Result<Self::ExecutionResult, Self::Error>;
fn inspect_system_call(
&mut self,
system_contract_address: Address,
data: Bytes,
) -> Result<ExecResultAndState<Self::ExecutionResult, Self::State>, Self::Error> {
let output = self.inspect_one_system_call(system_contract_address, data)?;
let state = self.finalize();
Ok(ExecResultAndState::new(output, state))
}
fn inspect_system_call_with_caller(
&mut self,
caller: Address,
system_contract_address: Address,
data: Bytes,
) -> Result<ExecResultAndState<Self::ExecutionResult, Self::State>, Self::Error> {
let output =
self.inspect_one_system_call_with_caller(caller, system_contract_address, data)?;
let state = self.finalize();
Ok(ExecResultAndState::new(output, state))
}
fn inspect_one_system_call_with_inspector(
&mut self,
system_contract_address: Address,
data: Bytes,
inspector: Self::Inspector,
) -> Result<Self::ExecutionResult, Self::Error> {
self.set_inspector(inspector);
self.inspect_one_system_call(system_contract_address, data)
}
fn inspect_system_call_with_inspector(
&mut self,
system_contract_address: Address,
data: Bytes,
inspector: Self::Inspector,
) -> Result<ExecResultAndState<Self::ExecutionResult, Self::State>, Self::Error> {
let output =
self.inspect_one_system_call_with_inspector(system_contract_address, data, inspector)?;
let state = self.finalize();
Ok(ExecResultAndState::new(output, state))
}
fn inspect_one_system_call_with_inspector_and_caller(
&mut self,
caller: Address,
system_contract_address: Address,
data: Bytes,
inspector: Self::Inspector,
) -> Result<Self::ExecutionResult, Self::Error> {
self.set_inspector(inspector);
self.inspect_one_system_call_with_caller(caller, system_contract_address, data)
}
fn inspect_system_call_with_inspector_and_caller(
&mut self,
caller: Address,
system_contract_address: Address,
data: Bytes,
inspector: Self::Inspector,
) -> Result<ExecResultAndState<Self::ExecutionResult, Self::State>, Self::Error> {
let output = self.inspect_one_system_call_with_inspector_and_caller(
caller,
system_contract_address,
data,
inspector,
)?;
let state = self.finalize();
Ok(ExecResultAndState::new(output, state))
}
}