use std::{ops::Deref, sync::Arc};
use nautilus_model::defi::{
dex::{Dex, SharedDex},
rpc::RpcLog,
};
use crate::{
events::{
burn::BurnEvent, collect::CollectEvent, flash::FlashEvent, initialize::InitializeEvent,
mint::MintEvent, pool_created::PoolCreatedEvent, swap::SwapEvent,
},
hypersync::HypersyncLog,
};
#[derive(Debug, Clone)]
pub struct DexExtended {
pub dex: SharedDex,
pub parse_pool_created_event_hypersync_fn:
Option<fn(HypersyncLog) -> anyhow::Result<PoolCreatedEvent>>,
pub parse_initialize_event_hypersync_fn:
Option<fn(SharedDex, HypersyncLog) -> anyhow::Result<InitializeEvent>>,
pub parse_swap_event_hypersync_fn:
Option<fn(SharedDex, HypersyncLog) -> anyhow::Result<SwapEvent>>,
pub parse_mint_event_hypersync_fn:
Option<fn(SharedDex, HypersyncLog) -> anyhow::Result<MintEvent>>,
pub parse_burn_event_hypersync_fn:
Option<fn(SharedDex, HypersyncLog) -> anyhow::Result<BurnEvent>>,
pub parse_collect_event_hypersync_fn:
Option<fn(SharedDex, HypersyncLog) -> anyhow::Result<CollectEvent>>,
pub parse_flash_event_hypersync_fn:
Option<fn(SharedDex, HypersyncLog) -> anyhow::Result<FlashEvent>>,
pub parse_pool_created_event_rpc_fn: Option<fn(&RpcLog) -> anyhow::Result<PoolCreatedEvent>>,
pub parse_initialize_event_rpc_fn:
Option<fn(SharedDex, &RpcLog) -> anyhow::Result<InitializeEvent>>,
pub parse_swap_event_rpc_fn: Option<fn(SharedDex, &RpcLog) -> anyhow::Result<SwapEvent>>,
pub parse_mint_event_rpc_fn: Option<fn(SharedDex, &RpcLog) -> anyhow::Result<MintEvent>>,
pub parse_burn_event_rpc_fn: Option<fn(SharedDex, &RpcLog) -> anyhow::Result<BurnEvent>>,
pub parse_collect_event_rpc_fn: Option<fn(SharedDex, &RpcLog) -> anyhow::Result<CollectEvent>>,
pub parse_flash_event_rpc_fn: Option<fn(SharedDex, &RpcLog) -> anyhow::Result<FlashEvent>>,
}
impl DexExtended {
#[must_use]
pub fn new(dex: Dex) -> Self {
Self {
dex: Arc::new(dex),
parse_pool_created_event_hypersync_fn: None,
parse_initialize_event_hypersync_fn: None,
parse_swap_event_hypersync_fn: None,
parse_mint_event_hypersync_fn: None,
parse_burn_event_hypersync_fn: None,
parse_collect_event_hypersync_fn: None,
parse_flash_event_hypersync_fn: None,
parse_pool_created_event_rpc_fn: None,
parse_initialize_event_rpc_fn: None,
parse_swap_event_rpc_fn: None,
parse_mint_event_rpc_fn: None,
parse_burn_event_rpc_fn: None,
parse_collect_event_rpc_fn: None,
parse_flash_event_rpc_fn: None,
}
}
pub fn set_pool_created_event_hypersync_parsing(
&mut self,
parse_fn: fn(HypersyncLog) -> anyhow::Result<PoolCreatedEvent>,
) {
self.parse_pool_created_event_hypersync_fn = Some(parse_fn);
}
pub fn set_initialize_event_hypersync_parsing(
&mut self,
parse_fn: fn(SharedDex, HypersyncLog) -> anyhow::Result<InitializeEvent>,
) {
self.parse_initialize_event_hypersync_fn = Some(parse_fn);
}
pub fn set_swap_event_hypersync_parsing(
&mut self,
parse_fn: fn(SharedDex, HypersyncLog) -> anyhow::Result<SwapEvent>,
) {
self.parse_swap_event_hypersync_fn = Some(parse_fn);
}
pub fn set_mint_event_hypersync_parsing(
&mut self,
parse_fn: fn(SharedDex, HypersyncLog) -> anyhow::Result<MintEvent>,
) {
self.parse_mint_event_hypersync_fn = Some(parse_fn);
}
pub fn set_burn_event_hypersync_parsing(
&mut self,
parse_fn: fn(SharedDex, HypersyncLog) -> anyhow::Result<BurnEvent>,
) {
self.parse_burn_event_hypersync_fn = Some(parse_fn);
}
pub fn set_collect_event_hypersync_parsing(
&mut self,
parse_fn: fn(SharedDex, HypersyncLog) -> anyhow::Result<CollectEvent>,
) {
self.parse_collect_event_hypersync_fn = Some(parse_fn);
}
pub fn set_flash_event_hypersync_parsing(
&mut self,
parse_fn: fn(SharedDex, HypersyncLog) -> anyhow::Result<FlashEvent>,
) {
self.parse_flash_event_hypersync_fn = Some(parse_fn);
}
pub fn set_pool_created_event_rpc_parsing(
&mut self,
parse_fn: fn(&RpcLog) -> anyhow::Result<PoolCreatedEvent>,
) {
self.parse_pool_created_event_rpc_fn = Some(parse_fn);
}
pub fn set_initialize_event_rpc_parsing(
&mut self,
parse_fn: fn(SharedDex, &RpcLog) -> anyhow::Result<InitializeEvent>,
) {
self.parse_initialize_event_rpc_fn = Some(parse_fn);
}
pub fn set_swap_event_rpc_parsing(
&mut self,
parse_fn: fn(SharedDex, &RpcLog) -> anyhow::Result<SwapEvent>,
) {
self.parse_swap_event_rpc_fn = Some(parse_fn);
}
pub fn set_mint_event_rpc_parsing(
&mut self,
parse_fn: fn(SharedDex, &RpcLog) -> anyhow::Result<MintEvent>,
) {
self.parse_mint_event_rpc_fn = Some(parse_fn);
}
pub fn set_burn_event_rpc_parsing(
&mut self,
parse_fn: fn(SharedDex, &RpcLog) -> anyhow::Result<BurnEvent>,
) {
self.parse_burn_event_rpc_fn = Some(parse_fn);
}
pub fn set_collect_event_rpc_parsing(
&mut self,
parse_fn: fn(SharedDex, &RpcLog) -> anyhow::Result<CollectEvent>,
) {
self.parse_collect_event_rpc_fn = Some(parse_fn);
}
pub fn set_flash_event_rpc_parsing(
&mut self,
parse_fn: fn(SharedDex, &RpcLog) -> anyhow::Result<FlashEvent>,
) {
self.parse_flash_event_rpc_fn = Some(parse_fn);
}
pub fn parse_pool_created_event_hypersync(
&self,
log: HypersyncLog,
) -> anyhow::Result<PoolCreatedEvent> {
if let Some(parse_fn) = &self.parse_pool_created_event_hypersync_fn {
parse_fn(log)
} else {
anyhow::bail!(
"HyperSync parsing of pool created event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name,
)
}
}
pub fn parse_swap_event_hypersync(&self, log: HypersyncLog) -> anyhow::Result<SwapEvent> {
if let Some(parse_fn) = &self.parse_swap_event_hypersync_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"HyperSync parsing of swap event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_mint_event_hypersync(&self, log: HypersyncLog) -> anyhow::Result<MintEvent> {
if let Some(parse_fn) = &self.parse_mint_event_hypersync_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"HyperSync parsing of mint event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_burn_event_hypersync(&self, log: HypersyncLog) -> anyhow::Result<BurnEvent> {
if let Some(parse_fn) = &self.parse_burn_event_hypersync_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"HyperSync parsing of burn event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_initialize_event_hypersync(
&self,
log: HypersyncLog,
) -> anyhow::Result<InitializeEvent> {
if let Some(parse_fn) = &self.parse_initialize_event_hypersync_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"HyperSync parsing of initialize event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_collect_event_hypersync(&self, log: HypersyncLog) -> anyhow::Result<CollectEvent> {
if let Some(parse_fn) = &self.parse_collect_event_hypersync_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"HyperSync parsing of collect event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_flash_event_hypersync(&self, log: HypersyncLog) -> anyhow::Result<FlashEvent> {
if let Some(parse_fn) = &self.parse_flash_event_hypersync_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"HyperSync parsing of flash event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_pool_created_event_rpc(&self, log: &RpcLog) -> anyhow::Result<PoolCreatedEvent> {
if let Some(parse_fn) = &self.parse_pool_created_event_rpc_fn {
parse_fn(log)
} else {
anyhow::bail!(
"RPC parsing of pool created event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name,
)
}
}
pub fn parse_swap_event_rpc(&self, log: &RpcLog) -> anyhow::Result<SwapEvent> {
if let Some(parse_fn) = &self.parse_swap_event_rpc_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"RPC parsing of swap event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_mint_event_rpc(&self, log: &RpcLog) -> anyhow::Result<MintEvent> {
if let Some(parse_fn) = &self.parse_mint_event_rpc_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"RPC parsing of mint event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_burn_event_rpc(&self, log: &RpcLog) -> anyhow::Result<BurnEvent> {
if let Some(parse_fn) = &self.parse_burn_event_rpc_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"RPC parsing of burn event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_initialize_event_rpc(&self, log: &RpcLog) -> anyhow::Result<InitializeEvent> {
if let Some(parse_fn) = &self.parse_initialize_event_rpc_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"RPC parsing of initialize event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_collect_event_rpc(&self, log: &RpcLog) -> anyhow::Result<CollectEvent> {
if let Some(parse_fn) = &self.parse_collect_event_rpc_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"RPC parsing of collect event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
pub fn parse_flash_event_rpc(&self, log: &RpcLog) -> anyhow::Result<FlashEvent> {
if let Some(parse_fn) = &self.parse_flash_event_rpc_fn {
parse_fn(self.dex.clone(), log)
} else {
anyhow::bail!(
"RPC parsing of flash event is not defined in this dex: {}:{}",
self.dex.chain,
self.dex.name
)
}
}
#[must_use]
pub fn needs_initialization(&self) -> bool {
self.dex.initialize_event.is_some()
}
}
impl Deref for DexExtended {
type Target = Dex;
fn deref(&self) -> &Self::Target {
&self.dex
}
}