use alloy::primitives::{Address, U256};
use hypersync_client::simple_types::Log;
use crate::{
events::pool_created::PoolCreatedEvent,
hypersync::helpers::{
extract_address_from_topic, extract_block_number, validate_event_signature_hash,
},
};
const POOL_CREATED_EVENT_SIGNATURE_HASH: &str =
"783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118";
pub fn parse_pool_created_event(log: Log) -> anyhow::Result<PoolCreatedEvent> {
validate_event_signature_hash("PoolCreatedEvent", POOL_CREATED_EVENT_SIGNATURE_HASH, &log)?;
let block_number = extract_block_number(&log)?;
let token = extract_address_from_topic(&log, 1, "token0")?;
let token1 = extract_address_from_topic(&log, 2, "token1")?;
let fee = if let Some(topic) = log.topics.get(3).and_then(|t| t.as_ref()) {
U256::from_be_slice(topic.as_ref()).as_limbs()[0] as u32
} else {
anyhow::bail!("Missing fee in topic3 when parsing pool created event");
};
if let Some(data) = log.data {
let data_bytes = data.as_ref();
let tick_spacing_bytes: [u8; 32] = data_bytes[0..32].try_into()?;
let tick_spacing = u32::from_be_bytes(tick_spacing_bytes[28..32].try_into()?);
let pool_address_bytes: [u8; 32] = data_bytes[32..64].try_into()?;
let pool_address = Address::from_slice(&pool_address_bytes[12..32]);
Ok(PoolCreatedEvent::new(
block_number.into(),
token,
token1,
pool_address,
Some(fee),
Some(tick_spacing),
))
} else {
Err(anyhow::anyhow!("Missing data in pool created event log"))
}
}