nautilus_blockchain/exchanges/
extended.rs1use std::{ops::Deref, sync::Arc};
17
18use hypersync_client::simple_types::Log;
19use nautilus_model::defi::dex::{Dex, SharedDex};
20
21use crate::events::{
22 burn::BurnEvent, collect::CollectEvent, flash::FlashEvent, initialize::InitializeEvent,
23 mint::MintEvent, pool_created::PoolCreatedEvent, swap::SwapEvent,
24};
25
26#[derive(Debug, Clone)]
28pub struct DexExtended {
29 pub dex: SharedDex,
31 pub parse_pool_created_event_fn: Option<fn(Log) -> anyhow::Result<PoolCreatedEvent>>,
33 pub parse_initialize_event_fn: Option<fn(SharedDex, Log) -> anyhow::Result<InitializeEvent>>,
35 pub parse_swap_event_fn: Option<fn(SharedDex, Log) -> anyhow::Result<SwapEvent>>,
37 pub parse_mint_event_fn: Option<fn(SharedDex, Log) -> anyhow::Result<MintEvent>>,
39 pub parse_burn_event_fn: Option<fn(SharedDex, Log) -> anyhow::Result<BurnEvent>>,
41 pub parse_collect_event_fn: Option<fn(SharedDex, Log) -> anyhow::Result<CollectEvent>>,
43 pub parse_flash_event_fn: Option<fn(SharedDex, Log) -> anyhow::Result<FlashEvent>>,
45}
46
47impl DexExtended {
48 #[must_use]
50 pub fn new(dex: Dex) -> Self {
51 Self {
52 dex: Arc::new(dex),
53 parse_pool_created_event_fn: None,
54 parse_initialize_event_fn: None,
55 parse_swap_event_fn: None,
56 parse_mint_event_fn: None,
57 parse_burn_event_fn: None,
58 parse_collect_event_fn: None,
59 parse_flash_event_fn: None,
60 }
61 }
62
63 pub fn set_pool_created_event_parsing(
65 &mut self,
66 parse_pool_created_event: fn(Log) -> anyhow::Result<PoolCreatedEvent>,
67 ) {
68 self.parse_pool_created_event_fn = Some(parse_pool_created_event);
69 }
70
71 pub fn set_initialize_event_parsing(
73 &mut self,
74 parse_initialize_event: fn(SharedDex, Log) -> anyhow::Result<InitializeEvent>,
75 ) {
76 self.parse_initialize_event_fn = Some(parse_initialize_event);
77 }
78
79 pub fn set_swap_event_parsing(
81 &mut self,
82 parse_swap_event: fn(SharedDex, Log) -> anyhow::Result<SwapEvent>,
83 ) {
84 self.parse_swap_event_fn = Some(parse_swap_event);
85 }
86
87 pub fn set_mint_event_parsing(
89 &mut self,
90 parse_mint_event: fn(SharedDex, Log) -> anyhow::Result<MintEvent>,
91 ) {
92 self.parse_mint_event_fn = Some(parse_mint_event);
93 }
94
95 pub fn set_burn_event_parsing(
97 &mut self,
98 parse_burn_event: fn(SharedDex, Log) -> anyhow::Result<BurnEvent>,
99 ) {
100 self.parse_burn_event_fn = Some(parse_burn_event);
101 }
102
103 pub fn set_collect_event_parsing(
105 &mut self,
106 parse_collect_event: fn(SharedDex, Log) -> anyhow::Result<CollectEvent>,
107 ) {
108 self.parse_collect_event_fn = Some(parse_collect_event);
109 }
110
111 pub fn set_flash_event_parsing(
113 &mut self,
114 parse_flash_event: fn(SharedDex, Log) -> anyhow::Result<FlashEvent>,
115 ) {
116 self.parse_flash_event_fn = Some(parse_flash_event);
117 }
118
119 pub fn parse_pool_created_event(&self, log: Log) -> anyhow::Result<PoolCreatedEvent> {
125 if let Some(parse_pool_created_event_fn) = &self.parse_pool_created_event_fn {
126 parse_pool_created_event_fn(log)
127 } else {
128 anyhow::bail!(
129 "Parsing of pool created event in not defined in this dex: {}:{}",
130 self.dex.chain,
131 self.dex.name,
132 )
133 }
134 }
135
136 pub fn parse_swap_event(&self, log: Log) -> anyhow::Result<SwapEvent> {
142 if let Some(parse_swap_event_fn) = &self.parse_swap_event_fn {
143 parse_swap_event_fn(self.dex.clone(), log)
144 } else {
145 anyhow::bail!(
146 "Parsing of swap event in not defined in this dex: {}:{}",
147 self.dex.chain,
148 self.dex.name
149 )
150 }
151 }
152
153 pub fn parse_mint_event(&self, log: Log) -> anyhow::Result<MintEvent> {
159 if let Some(parse_mint_event_fn) = &self.parse_mint_event_fn {
160 parse_mint_event_fn(self.dex.clone(), log)
161 } else {
162 anyhow::bail!(
163 "Parsing of mint event in not defined in this dex: {}:{}",
164 self.dex.chain,
165 self.dex.name
166 )
167 }
168 }
169
170 pub fn parse_burn_event(&self, log: Log) -> anyhow::Result<BurnEvent> {
176 if let Some(parse_burn_event_fn) = &self.parse_burn_event_fn {
177 parse_burn_event_fn(self.dex.clone(), log)
178 } else {
179 anyhow::bail!(
180 "Parsing of burn event in not defined in this dex: {}",
181 self.dex.name
182 )
183 }
184 }
185
186 pub fn needs_initialization(&self) -> bool {
188 self.dex.initialize_event.is_some()
189 }
190
191 pub fn parse_initialize_event(&self, log: Log) -> anyhow::Result<InitializeEvent> {
197 if let Some(parse_initialize_event_fn) = &self.parse_initialize_event_fn {
198 parse_initialize_event_fn(self.dex.clone(), log)
199 } else {
200 anyhow::bail!(
201 "Parsing of initialize event in not defined in this dex: {}",
202 self.dex.name
203 )
204 }
205 }
206
207 pub fn parse_collect_event(&self, log: Log) -> anyhow::Result<CollectEvent> {
213 if let Some(parse_collect_event_fn) = &self.parse_collect_event_fn {
214 parse_collect_event_fn(self.dex.clone(), log)
215 } else {
216 anyhow::bail!(
217 "Parsing of collect event in not defined in this dex: {}:{}",
218 self.dex.chain,
219 self.dex.name
220 )
221 }
222 }
223}
224
225impl Deref for DexExtended {
226 type Target = Dex;
227
228 fn deref(&self) -> &Self::Target {
229 &self.dex
230 }
231}