use std::marker::PhantomData;
use ethereum_types::U256;
use evm_arithmetization::tries::{ReceiptTrie, TransactionTrie};
use crate::core::IntraBlockTries;
pub trait Observer<WorldT> {
fn collect_tries(
&mut self,
block: U256,
batch: usize,
state_trie: &WorldT,
transaction_trie: &TransactionTrie,
receipt_trie: &ReceiptTrie,
);
}
#[derive(Debug)]
pub struct TriesObserverElement<StateTrieT> {
pub block: U256,
pub batch: usize,
pub tries: IntraBlockTries<StateTrieT>,
}
#[derive(Debug)]
pub struct TriesObserver<StateTrieT> {
pub data: Vec<TriesObserverElement<StateTrieT>>,
}
impl<StateTrieT> TriesObserver<StateTrieT> {
pub fn new() -> Self {
TriesObserver::<StateTrieT> { data: Vec::new() }
}
}
impl<WorldT: Clone> Observer<WorldT> for TriesObserver<WorldT> {
fn collect_tries(
&mut self,
block: U256,
batch: usize,
state_trie: &WorldT,
transaction_trie: &TransactionTrie,
receipt_trie: &ReceiptTrie,
) {
self.data.push(TriesObserverElement {
block,
batch,
tries: IntraBlockTries {
world: state_trie.clone(),
transaction: transaction_trie.clone(),
receipt: receipt_trie.clone(),
},
});
}
}
impl<StateTrieT> Default for TriesObserver<StateTrieT> {
fn default() -> Self {
Self::new()
}
}
#[derive(Default, Debug)]
pub struct DummyObserver<StateTrieT> {
phantom: PhantomData<StateTrieT>,
}
impl<StateTrieT> DummyObserver<StateTrieT> {
pub fn new() -> Self {
DummyObserver::<StateTrieT> {
phantom: Default::default(),
}
}
}
impl<WorldT> Observer<WorldT> for DummyObserver<WorldT> {
fn collect_tries(
&mut self,
_block: U256,
_batch: usize,
_state_trie: &WorldT,
_transaction_trie: &TransactionTrie,
_receipt_trie: &ReceiptTrie,
) {
}
}