use crate::core::error::Error;
pub trait Env {
fn get_span_size(&self) -> i64;
fn get_calldata(&self) -> Result<Vec<u8>, Error>;
fn set_return_data(&self, data: &[u8]) -> Result<(), Error>;
fn get_ask_count(&self) -> i64;
fn get_min_count(&self) -> i64;
fn get_ans_count(&self) -> Result<i64, Error>;
fn ask_external_data(&self, eid: i64, did: i64, data: &[u8]) -> Result<(), Error>;
fn get_external_data_status(&self, eid: i64, vid: i64) -> Result<i64, Error>;
fn get_external_data(&self, eid: i64, vid: i64) -> Result<Vec<u8>, Error>;
}
pub struct VMLogic<'a, E>
where
E: Env,
{
pub env: &'a E, pub gas_limit: u32, pub gas_used: u32, }
impl<'a, E> VMLogic<'a, E>
where
E: Env,
{
pub fn new(env: &'a E, gas: u32) -> VMLogic<'a, E> {
VMLogic { env: env, gas_limit: gas, gas_used: 0 }
}
pub fn consume_gas(&mut self, gas: u32) -> Result<(), Error> {
self.gas_used = self.gas_used.saturating_add(gas);
if self.gas_used > self.gas_limit {
Err(Error::OutOfGasError)
} else {
Ok(())
}
}
}