1use pallet_evm::PrecompileLog;2use sp_std::cell::RefCell;3use sp_std::vec::Vec;4use sp_core::{H160, H256};56#[derive(Default)]7pub struct LogRecorder(RefCell<Vec<(Vec<H256>, Vec<u8>)>>);89impl LogRecorder {10 pub fn is_empty(&self) -> bool {11 self.0.borrow().is_empty()12 }13 pub fn log(&self, topics: Vec<H256>, data: super::abi::AbiWriter) {14 self.0.borrow_mut().push((topics, data.finish()));15 }16 fn retrieve_logs(self) -> Vec<(Vec<H256>, Vec<u8>)> {17 self.0.replace(Vec::new())18 }19 pub fn retrieve_logs_for_contract(self, contract: H160) -> Vec<PrecompileLog> {20 21 self.retrieve_logs().into_iter()22 .map(|(topics, data)| PrecompileLog(contract.clone(), topics, data))23 .collect()24 }25}26impl Drop for LogRecorder {27 fn drop(&mut self) {28 #[cfg(feature = "std")]29 {30 31 let logs = self.0.borrow();32 if !logs.is_empty() {33 eprintln!("Logs lost:");34 for line in logs.iter() {35 eprintln!("{:?} {:?}", line.0, line.1);36 }37 panic!();38 }39 }40 }41}