use vapory_types::{U256, Address};
use tetsy_kvdb::DBTransaction;
use tetsy_vm::{Error as VmError, ActionParams};
use tetsy_util_mem as malloc_size_of;
mod config;
mod db;
mod executive_tracer;
mod import;
mod noop_tracer;
mod types;
pub use crate::{
config::Config,
db::{TraceDB, DatabaseExtras},
localized::LocalizedTrace,
executive_tracer::{ExecutiveTracer, ExecutiveVMTracer},
import::ImportRequest,
noop_tracer::{NoopTracer, NoopVMTracer},
types::{
Tracing,
error::Error as TraceError,
localized,
trace::{self, VMTrace, VMOperation, VMExecutedOperation, MemoryDiff, StorageDiff, RewardType},
flat::{self, FlatTrace, FlatTransactionTraces, FlatBlockTraces},
filter::{self, Filter, AddressesFilter},
}
};
pub(crate) type BlockNumber = u64;
pub trait Tracer: Send {
type Output;
fn prepare_trace_call(&mut self, params: &ActionParams, depth: usize, is_builtin: bool);
fn prepare_trace_create(&mut self, params: &ActionParams);
fn done_trace_call(&mut self, gas_used: U256, output: &[u8]);
fn done_trace_create(&mut self, gas_used: U256, code: &[u8], address: Address);
fn done_trace_failed(&mut self, error: &VmError);
fn trace_suicide(&mut self, address: Address, balance: U256, refund_address: Address);
fn trace_reward(&mut self, author: Address, value: U256, reward_type: RewardType);
fn drain(self) -> Vec<Self::Output>;
}
pub trait VMTracer: Send {
type Output;
fn trace_next_instruction(&mut self, _pc: usize, _instruction: u8, _current_gas: U256) -> bool { false }
fn trace_prepare_execute(&mut self, _pc: usize, _instruction: u8, _gas_cost: U256, _mem_written: Option<(usize, usize)>, _store_written: Option<(U256, U256)>) {}
fn trace_failed(&mut self) {}
fn trace_executed(&mut self, _gas_used: U256, _stack_push: &[U256], _mem: &[u8]) {}
fn prepare_subtrace(&mut self, _code: &[u8]) {}
fn done_subtrace(&mut self) {}
fn drain(self) -> Option<Self::Output>;
}
pub trait Database {
fn tracing_enabled(&self) -> bool;
fn import(&self, batch: &mut DBTransaction, request: ImportRequest);
fn trace(&self, block_number: BlockNumber, tx_position: usize, trace_position: Vec<usize>) -> Option<LocalizedTrace>;
fn transaction_traces(&self, block_number: BlockNumber, tx_position: usize) -> Option<Vec<LocalizedTrace>>;
fn block_traces(&self, block_number: BlockNumber) -> Option<Vec<LocalizedTrace>>;
fn filter(&self, filter: &Filter) -> Vec<LocalizedTrace>;
}