git.delta.rocks / unique-network / refs/commits / 2d71e7a206db

difftreelog

source

pallets/nft/src/eth/log.rs1.2 KiBsourcehistory
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        // TODO: Remove reallocation21        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            // In debug mode, log recorder panics if dropped with logs left31            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}