use std::str::FromStr; use ethabi::ethereum_types::Address; use substreams::scalar::BigInt; use substreams_ethereum::pb::eth::v2::{self as eth}; use substreams_helper::{event_handler::EventHandler, hex::Hexable}; use crate::abi::factory::events::PoolCreated; use tycho_substreams::prelude::*; #[substreams::handlers::map] pub fn map_pools_created( params: String, block: eth::Block, ) -> Result { let mut new_pools: Vec = vec![]; let factory_address = params.as_str(); get_new_pools(&block, &mut new_pools, factory_address); Ok(BlockChanges { block: Some((&block).into()), changes: new_pools }) } // Extract new pools from PoolCreated events fn get_new_pools( block: ð::Block, new_pools: &mut Vec, factory_address: &str, ) { // Extract new pools from PoolCreated events let mut on_pool_created = |event: PoolCreated, _tx: ð::TransactionTrace, _log: ð::Log| { let tycho_tx: Transaction = _tx.into(); new_pools.push(TransactionChanges { tx: Some(tycho_tx.clone()), contract_changes: vec![], entity_changes: vec![EntityChanges { component_id: event.pool.to_hex(), attributes: vec![ Attribute { name: "liquidity".to_string(), value: BigInt::from(0).to_signed_bytes_le(), change: ChangeType::Creation.into(), }, Attribute { name: "tick".to_string(), value: BigInt::from(0).to_signed_bytes_le(), change: ChangeType::Creation.into(), }, Attribute { name: "sqrt_price_x96".to_string(), value: BigInt::from(0).to_signed_bytes_le(), change: ChangeType::Creation.into(), }, ], }], component_changes: vec![ProtocolComponent { id: event.pool.to_hex(), tokens: vec![event.token0, event.token1], contracts: vec![], static_att: vec![ Attribute { name: "fee".to_string(), value: event.fee.to_signed_bytes_le(), change: ChangeType::Creation.into(), }, Attribute { name: "tick_spacing".to_string(), value: event.tick_spacing.to_signed_bytes_le(), change: ChangeType::Creation.into(), }, Attribute { name: "pool_address".to_string(), value: event.pool, change: ChangeType::Creation.into(), }, ], change: i32::from(ChangeType::Creation), protocol_type: Option::from(ProtocolType { name: "uniswap_v3_pool".to_string(), financial_type: FinancialType::Swap.into(), attribute_schema: vec![], implementation_type: ImplementationType::Custom.into(), }), tx: Some(tycho_tx), }], balance_changes: vec![], }) }; let mut eh = EventHandler::new(block); eh.filter_by_address(vec![Address::from_str(factory_address).unwrap()]); eh.on::(&mut on_pool_created); eh.handle_events(); }