#[cfg(feature = "provider")]
use {
crate::error::Result, alloy_sol_types::SolEvent, tronz_primitives::B256,
tronz_provider::types::Log,
};
#[cfg(feature = "provider")]
pub fn decode_log<E: SolEvent>(log: &Log) -> Result<E> {
E::decode_raw_log(log.topics.iter().copied(), &log.data).map_err(Into::into)
}
#[cfg(feature = "provider")]
pub fn log_matches<E: SolEvent>(log: &Log) -> bool {
if E::ANONYMOUS {
return true;
}
log.topics.first().is_some_and(|t| *t == E::SIGNATURE_HASH)
}
#[cfg(feature = "provider")]
pub fn decode_logs<'a, E: SolEvent + 'a>(logs: &'a [Log]) -> impl Iterator<Item = Result<E>> + 'a {
logs.iter()
.filter(|log| log_matches::<E>(log))
.map(decode_log::<E>)
}
#[cfg(feature = "provider")]
pub fn topic0_set(logs: &[Log]) -> impl Iterator<Item = B256> + '_ {
let mut seen = std::collections::HashSet::new();
logs.iter()
.filter_map(move |log| log.topics.first().copied().filter(|t| seen.insert(*t)))
}