kabu_defi_market/
logs_parser.rs1use alloy_network::Network;
2use alloy_primitives::Log;
3use alloy_provider::Provider;
4use eyre::Result;
5use std::collections::HashMap;
6use tokio::sync::broadcast;
7use tracing::error;
8
9use kabu_types_events::LoomTask;
10use kabu_types_market::PoolLoaders;
11
12pub async fn process_log_entries<P, N>(
13 log_entries: Vec<Log>,
14 pool_loaders: &PoolLoaders<P, N>,
15 tasks_tx: broadcast::Sender<LoomTask>,
16) -> Result<()>
17where
18 N: Network,
19 P: Provider<N> + Send + Sync + Clone + 'static,
20{
21 let mut pool_to_fetch = Vec::new();
22 let mut processed_pools = HashMap::new();
23
24 for log_entry in log_entries.into_iter() {
25 if let Some((pool_id, pool_class)) = pool_loaders.determine_pool_class(&log_entry) {
26 if processed_pools.insert(log_entry.address, true).is_some() {
28 continue;
29 }
30
31 pool_to_fetch.push((pool_id, pool_class));
32 }
33 }
34
35 if let Err(e) = tasks_tx.send(LoomTask::FetchAndAddPools(pool_to_fetch)) {
36 error!("Failed to send task: {}", e);
37 }
38 Ok(())
39}