nautilus_blockchain/exchanges/
extended.rs1use std::{ops::Deref, sync::Arc};
17
18use hypersync_client::simple_types::Log;
19use nautilus_model::{
20 defi::{
21 dex::{Dex, SharedDex},
22 token::Token,
23 },
24 enums::OrderSide,
25 types::{Price, Quantity},
26};
27
28use crate::events::{
29 burn::BurnEvent, mint::MintEvent, pool_created::PoolCreatedEvent, swap::SwapEvent,
30};
31
32#[derive(Debug, Clone)]
34pub struct DexExtended {
35 pub dex: SharedDex,
37 pub parse_pool_created_event_fn: Option<fn(Log) -> anyhow::Result<PoolCreatedEvent>>,
39 pub parse_swap_event_fn: Option<fn(Log) -> anyhow::Result<SwapEvent>>,
41 pub parse_mint_event_fn: Option<fn(Log) -> anyhow::Result<MintEvent>>,
43 pub parse_burn_event_fn: Option<fn(Log) -> anyhow::Result<BurnEvent>>,
45 pub convert_to_trade_data_fn:
47 Option<fn(&Token, &Token, &SwapEvent) -> anyhow::Result<(OrderSide, Quantity, Price)>>,
48}
49
50impl DexExtended {
51 #[must_use]
53 pub fn new(dex: Dex) -> Self {
54 Self {
55 dex: Arc::new(dex),
56 parse_pool_created_event_fn: None,
57 parse_swap_event_fn: None,
58 parse_mint_event_fn: None,
59 parse_burn_event_fn: None,
60 convert_to_trade_data_fn: None,
61 }
62 }
63
64 pub fn set_pool_created_event_parsing(
66 &mut self,
67 parse_pool_created_event: fn(Log) -> anyhow::Result<PoolCreatedEvent>,
68 ) {
69 self.parse_pool_created_event_fn = Some(parse_pool_created_event);
70 }
71
72 pub fn set_swap_event_parsing(
74 &mut self,
75 parse_swap_event: fn(Log) -> anyhow::Result<SwapEvent>,
76 ) {
77 self.parse_swap_event_fn = Some(parse_swap_event);
78 }
79
80 pub fn set_mint_event_parsing(
82 &mut self,
83 parse_mint_event: fn(Log) -> anyhow::Result<MintEvent>,
84 ) {
85 self.parse_mint_event_fn = Some(parse_mint_event);
86 }
87
88 pub fn set_burn_event_parsing(
90 &mut self,
91 parse_burn_event: fn(Log) -> anyhow::Result<BurnEvent>,
92 ) {
93 self.parse_burn_event_fn = Some(parse_burn_event);
94 }
95
96 pub fn set_convert_trade_data(
98 &mut self,
99 convert_trade_data: fn(
100 &Token,
101 &Token,
102 &SwapEvent,
103 ) -> anyhow::Result<(OrderSide, Quantity, Price)>,
104 ) {
105 self.convert_to_trade_data_fn = Some(convert_trade_data);
106 }
107
108 pub fn parse_pool_created_event(&self, log: Log) -> anyhow::Result<PoolCreatedEvent> {
110 if let Some(parse_pool_created_event_fn) = &self.parse_pool_created_event_fn {
111 parse_pool_created_event_fn(log)
112 } else {
113 anyhow::bail!(
114 "Parsing of pool created event in not defined in this dex: {}",
115 self.dex.name
116 )
117 }
118 }
119
120 pub fn parse_swap_event(&self, log: Log) -> anyhow::Result<SwapEvent> {
122 if let Some(parse_swap_event_fn) = &self.parse_swap_event_fn {
123 parse_swap_event_fn(log)
124 } else {
125 anyhow::bail!(
126 "Parsing of swap event in not defined in this dex: {}",
127 self.dex.name
128 )
129 }
130 }
131
132 pub fn convert_to_trade_data(
134 &self,
135 token0: &Token,
136 token1: &Token,
137 swap_event: &SwapEvent,
138 ) -> anyhow::Result<(OrderSide, Quantity, Price)> {
139 if let Some(convert_to_trade_data_fn) = &self.convert_to_trade_data_fn {
140 convert_to_trade_data_fn(token0, token1, swap_event)
141 } else {
142 anyhow::bail!(
143 "Converting to trade data is not defined in this dex: {}",
144 self.dex.name
145 )
146 }
147 }
148
149 pub fn parse_mint_event(&self, log: Log) -> anyhow::Result<MintEvent> {
151 if let Some(parse_mint_event_fn) = &self.parse_mint_event_fn {
152 parse_mint_event_fn(log)
153 } else {
154 anyhow::bail!(
155 "Parsing of mint event in not defined in this dex: {}",
156 self.dex.name
157 )
158 }
159 }
160
161 pub fn parse_burn_event(&self, log: Log) -> anyhow::Result<BurnEvent> {
163 if let Some(parse_burn_event_fn) = &self.parse_burn_event_fn {
164 parse_burn_event_fn(log)
165 } else {
166 anyhow::bail!(
167 "Parsing of burn event in not defined in this dex: {}",
168 self.dex.name
169 )
170 }
171 }
172}
173
174impl Deref for DexExtended {
175 type Target = Dex;
176
177 fn deref(&self) -> &Self::Target {
178 &self.dex
179 }
180}