use alloy::{dyn_abi::SolType, primitives::Address, sol};
use hypersync_client::simple_types::Log;
use nautilus_model::defi::SharedDex;
use crate::{
events::initialize::InitializeEvent, hypersync::helpers::validate_event_signature_hash,
};
const INITIALIZE_EVENT_SIGNATURE_HASH: &str =
"98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95";
sol! {
struct InitializeEventData {
uint160 sqrt_price_x96;
int24 tick;
}
}
pub fn parse_initialize_event(dex: SharedDex, log: Log) -> anyhow::Result<InitializeEvent> {
validate_event_signature_hash("InitializeEvent", INITIALIZE_EVENT_SIGNATURE_HASH, &log)?;
if let Some(data) = &log.data {
let data_bytes = data.as_ref();
if data_bytes.len() < 2 * 32 {
anyhow::bail!("Initialize event data is too short");
}
let decoded = match <InitializeEventData as SolType>::abi_decode(data_bytes) {
Ok(decoded) => decoded,
Err(e) => anyhow::bail!("Failed to decode initialize event data: {e}"),
};
let pool_address = Address::from_slice(
log.address
.clone()
.expect("Contract address should be set in logs")
.as_ref(),
);
Ok(InitializeEvent::new(
dex,
pool_address,
decoded.sqrt_price_x96,
i32::try_from(decoded.tick)?,
))
} else {
Err(anyhow::anyhow!("Missing data in initialize event log"))
}
}