use std::convert::Infallible;
use revm_primitives::{EVMError, ResultAndState};
use super::*;
use crate::environment::Environment;
pub struct Coprocessor<'a> {
evm: Evm<'a, (), ArbiterDB>,
}
impl<'a> Coprocessor<'a> {
pub fn new(environment: &Environment) -> Self {
let db = environment.db.clone();
let evm = Evm::builder().with_db(db).build();
Self { evm }
}
pub fn transact(&mut self) -> Result<ResultAndState, EVMError<Infallible>> {
self.evm.transact()
}
}
#[cfg(test)]
mod tests {
use revm_primitives::{InvalidTransaction, U256};
use super::*;
#[test]
fn coprocessor() {
let environment = Environment::builder().build();
let mut coprocessor = Coprocessor::new(&environment);
coprocessor.evm.tx_mut().value = U256::from(100);
let outcome = coprocessor.transact();
if let Err(EVMError::Transaction(InvalidTransaction::LackOfFundForMaxFee {
fee,
balance,
})) = outcome
{
assert_eq!(*fee, U256::from(100));
assert_eq!(*balance, U256::from(0));
}
}
}