1use bigdecimal::BigDecimal;
5use sui_types::base_types::{SuiAddress, TransactionDigest};
6
7use std::fmt::{Display, Formatter};
8
9use crate::models::Balances as DBBalances;
10use crate::models::Flashloan as DBFlashloan;
11use crate::models::OrderFill as DBOrderFill;
12use crate::models::OrderUpdate as DBOrderUpdate;
13use crate::models::PoolPrice as DBPoolPrice;
14use crate::models::Proposals as DBProposals;
15use crate::models::Rebates as DBRebates;
16use crate::models::Stakes as DBStakes;
17use crate::models::SuiErrorTransactions;
18use crate::models::TradeParamsUpdate as DBTradeParamsUpdate;
19use crate::models::Votes as DBVotes;
20
21#[derive(Clone, Debug)]
22pub enum ProcessedTxnData {
23 Flashloan(Flashloan),
24 OrderUpdate(OrderUpdate),
25 OrderFill(OrderFill),
26 PoolPrice(PoolPrice),
27 Balances(Balances),
28 Proposals(Proposals),
29 Rebates(Rebates),
30 Stakes(Stakes),
31 TradeParamsUpdate(TradeParamsUpdate),
32 Votes(Votes),
33 Error(SuiTxnError),
34}
35
36#[derive(Clone, Debug)]
37pub(crate) enum OrderUpdateStatus {
38 Placed,
39 Modified,
40 Canceled,
41 Expired,
42}
43
44impl Display for OrderUpdateStatus {
45 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
46 let str = match self {
47 OrderUpdateStatus::Placed => "Placed",
48 OrderUpdateStatus::Modified => "Modified",
49 OrderUpdateStatus::Canceled => "Canceled",
50 OrderUpdateStatus::Expired => "Expired",
51 };
52 write!(f, "{str}")
53 }
54}
55
56#[derive(Clone, Debug)]
57pub struct OrderUpdate {
58 pub digest: String,
59 pub(crate) event_digest: String,
60 pub(crate) sender: String,
61 pub(crate) checkpoint: u64,
62 pub(crate) checkpoint_timestamp_ms: u64,
63 pub(crate) package: String,
64 pub(crate) status: OrderUpdateStatus,
65 pub(crate) pool_id: String,
66 pub(crate) order_id: u128,
67 pub(crate) client_order_id: u64,
68 pub(crate) price: u64,
69 pub(crate) is_bid: bool,
70 pub(crate) original_quantity: u64,
71 pub(crate) quantity: u64,
72 pub(crate) filled_quantity: u64,
73 pub(crate) onchain_timestamp: u64,
74 pub(crate) trader: String,
75 pub(crate) balance_manager_id: String,
76}
77
78impl OrderUpdate {
79 pub(crate) fn to_db(&self) -> DBOrderUpdate {
80 DBOrderUpdate {
81 digest: self.digest.clone(),
82 event_digest: self.event_digest.clone(),
83 sender: self.sender.clone(),
84 checkpoint: self.checkpoint as i64,
85 checkpoint_timestamp_ms: self.checkpoint_timestamp_ms as i64,
86 package: self.package.clone(),
87 status: self.status.clone().to_string(),
88 pool_id: self.pool_id.clone(),
89 order_id: BigDecimal::from(self.order_id).to_string(),
90 client_order_id: self.client_order_id as i64,
91 trader: self.trader.clone(),
92 price: self.price as i64,
93 is_bid: self.is_bid,
94 original_quantity: self.original_quantity as i64,
95 quantity: self.quantity as i64,
96 filled_quantity: self.filled_quantity as i64,
97 onchain_timestamp: self.onchain_timestamp as i64,
98 balance_manager_id: self.balance_manager_id.clone(),
99 }
100 }
101}
102
103#[derive(Clone, Debug)]
104pub struct OrderFill {
105 pub(crate) digest: String,
106 pub(crate) event_digest: String,
107 pub(crate) sender: String,
108 pub(crate) checkpoint: u64,
109 pub(crate) checkpoint_timestamp_ms: u64,
110 pub(crate) package: String,
111 pub(crate) pool_id: String,
112 pub(crate) maker_order_id: u128,
113 pub(crate) taker_order_id: u128,
114 pub(crate) maker_client_order_id: u64,
115 pub(crate) taker_client_order_id: u64,
116 pub(crate) price: u64,
117 pub(crate) taker_is_bid: bool,
118 pub(crate) taker_fee: u64,
119 pub(crate) taker_fee_is_deep: bool,
120 pub(crate) maker_fee: u64,
121 pub(crate) maker_fee_is_deep: bool,
122 pub(crate) base_quantity: u64,
123 pub(crate) quote_quantity: u64,
124 pub(crate) maker_balance_manager_id: String,
125 pub(crate) taker_balance_manager_id: String,
126 pub(crate) onchain_timestamp: u64,
127}
128
129impl OrderFill {
130 pub(crate) fn to_db(&self) -> DBOrderFill {
131 DBOrderFill {
132 digest: self.digest.clone(),
133 event_digest: self.event_digest.clone(),
134 sender: self.sender.clone(),
135 checkpoint: self.checkpoint as i64,
136 checkpoint_timestamp_ms: self.checkpoint_timestamp_ms as i64,
137 package: self.package.clone(),
138 pool_id: self.pool_id.clone(),
139 maker_order_id: BigDecimal::from(self.maker_order_id).to_string(),
140 taker_order_id: BigDecimal::from(self.taker_order_id).to_string(),
141 maker_client_order_id: self.maker_client_order_id as i64,
142 taker_client_order_id: self.taker_client_order_id as i64,
143 price: self.price as i64,
144 taker_fee: self.taker_fee as i64,
145 taker_fee_is_deep: self.taker_fee_is_deep,
146 maker_fee: self.maker_fee as i64,
147 maker_fee_is_deep: self.maker_fee_is_deep,
148 taker_is_bid: self.taker_is_bid,
149 base_quantity: self.base_quantity as i64,
150 quote_quantity: self.quote_quantity as i64,
151 maker_balance_manager_id: self.maker_balance_manager_id.clone(),
152 taker_balance_manager_id: self.taker_balance_manager_id.clone(),
153 onchain_timestamp: self.onchain_timestamp as i64,
154 }
155 }
156}
157
158#[derive(Clone, Debug)]
159pub struct Flashloan {
160 pub(crate) digest: String,
161 pub(crate) event_digest: String,
162 pub(crate) sender: String,
163 pub(crate) checkpoint: u64,
164 pub(crate) checkpoint_timestamp_ms: u64,
165 pub(crate) package: String,
166 pub(crate) borrow: bool,
167 pub(crate) pool_id: String,
168 pub(crate) borrow_quantity: u64,
169 pub(crate) type_name: String,
170}
171
172impl Flashloan {
173 pub(crate) fn to_db(&self) -> DBFlashloan {
174 DBFlashloan {
175 digest: self.digest.clone(),
176 event_digest: self.event_digest.clone(),
177 sender: self.sender.clone(),
178 checkpoint: self.checkpoint as i64,
179 checkpoint_timestamp_ms: self.checkpoint_timestamp_ms as i64,
180 package: self.package.clone(),
181 borrow: self.borrow,
182 pool_id: self.pool_id.clone(),
183 borrow_quantity: self.borrow_quantity as i64,
184 type_name: self.type_name.clone(),
185 }
186 }
187}
188
189#[derive(Clone, Debug)]
190pub struct PoolPrice {
191 pub(crate) digest: String,
192 pub(crate) event_digest: String,
193 pub(crate) sender: String,
194 pub(crate) checkpoint: u64,
195 pub(crate) checkpoint_timestamp_ms: u64,
196 pub(crate) package: String,
197 pub(crate) target_pool: String,
198 pub(crate) reference_pool: String,
199 pub(crate) conversion_rate: u64,
200}
201
202impl PoolPrice {
203 pub(crate) fn to_db(&self) -> DBPoolPrice {
204 DBPoolPrice {
205 digest: self.digest.clone(),
206 event_digest: self.event_digest.clone(),
207 sender: self.sender.clone(),
208 checkpoint: self.checkpoint as i64,
209 checkpoint_timestamp_ms: self.checkpoint_timestamp_ms as i64,
210 package: self.package.clone(),
211 target_pool: self.target_pool.clone(),
212 reference_pool: self.reference_pool.clone(),
213 conversion_rate: self.conversion_rate as i64,
214 }
215 }
216}
217
218#[derive(Clone, Debug)]
219pub struct Balances {
220 pub(crate) digest: String,
221 pub(crate) event_digest: String,
222 pub(crate) sender: String,
223 pub(crate) checkpoint: u64,
224 pub(crate) checkpoint_timestamp_ms: u64,
225 pub(crate) package: String,
226 pub(crate) balance_manager_id: String,
227 pub(crate) asset: String,
228 pub(crate) amount: u64,
229 pub(crate) deposit: bool,
230}
231
232impl Balances {
233 pub(crate) fn to_db(&self) -> DBBalances {
234 DBBalances {
235 digest: self.digest.clone(),
236 event_digest: self.event_digest.clone(),
237 sender: self.sender.clone(),
238 checkpoint: self.checkpoint as i64,
239 checkpoint_timestamp_ms: self.checkpoint_timestamp_ms as i64,
240 package: self.package.clone(),
241 balance_manager_id: self.balance_manager_id.clone(),
242 asset: self.asset.clone(),
243 amount: self.amount as i64,
244 deposit: self.deposit,
245 }
246 }
247}
248
249#[derive(Clone, Debug)]
250pub struct Proposals {
251 pub(crate) digest: String,
252 pub(crate) event_digest: String,
253 pub(crate) sender: String,
254 pub(crate) checkpoint: u64,
255 pub(crate) checkpoint_timestamp_ms: u64,
256 pub(crate) package: String,
257 pub(crate) pool_id: String,
258 pub(crate) balance_manager_id: String,
259 pub(crate) epoch: u64,
260 pub(crate) taker_fee: u64,
261 pub(crate) maker_fee: u64,
262 pub(crate) stake_required: u64,
263}
264
265impl Proposals {
266 pub(crate) fn to_db(&self) -> DBProposals {
267 DBProposals {
268 digest: self.digest.clone(),
269 event_digest: self.event_digest.clone(),
270 sender: self.sender.clone(),
271 checkpoint: self.checkpoint as i64,
272 checkpoint_timestamp_ms: self.checkpoint_timestamp_ms as i64,
273 package: self.package.clone(),
274 pool_id: self.pool_id.clone(),
275 balance_manager_id: self.balance_manager_id.clone(),
276 epoch: self.epoch as i64,
277 taker_fee: self.taker_fee as i64,
278 maker_fee: self.maker_fee as i64,
279 stake_required: self.stake_required as i64,
280 }
281 }
282}
283
284#[derive(Clone, Debug)]
285pub struct Rebates {
286 pub(crate) digest: String,
287 pub(crate) event_digest: String,
288 pub(crate) sender: String,
289 pub(crate) checkpoint: u64,
290 pub(crate) checkpoint_timestamp_ms: u64,
291 pub(crate) package: String,
292 pub(crate) pool_id: String,
293 pub(crate) balance_manager_id: String,
294 pub(crate) epoch: u64,
295 pub(crate) claim_amount: u64,
296}
297
298impl Rebates {
299 pub(crate) fn to_db(&self) -> DBRebates {
300 DBRebates {
301 digest: self.digest.clone(),
302 event_digest: self.event_digest.clone(),
303 sender: self.sender.clone(),
304 checkpoint: self.checkpoint as i64,
305 checkpoint_timestamp_ms: self.checkpoint_timestamp_ms as i64,
306 package: self.package.clone(),
307 pool_id: self.pool_id.clone(),
308 balance_manager_id: self.balance_manager_id.clone(),
309 epoch: self.epoch as i64,
310 claim_amount: self.claim_amount as i64,
311 }
312 }
313}
314
315#[derive(Clone, Debug)]
316pub struct Stakes {
317 pub(crate) digest: String,
318 pub(crate) event_digest: String,
319 pub(crate) sender: String,
320 pub(crate) checkpoint: u64,
321 pub(crate) checkpoint_timestamp_ms: u64,
322 pub(crate) package: String,
323 pub(crate) pool_id: String,
324 pub(crate) balance_manager_id: String,
325 pub(crate) epoch: u64,
326 pub(crate) amount: u64,
327 pub(crate) stake: bool,
328}
329
330impl Stakes {
331 pub(crate) fn to_db(&self) -> DBStakes {
332 DBStakes {
333 digest: self.digest.clone(),
334 event_digest: self.event_digest.clone(),
335 sender: self.sender.clone(),
336 checkpoint: self.checkpoint as i64,
337 checkpoint_timestamp_ms: self.checkpoint_timestamp_ms as i64,
338 package: self.package.clone(),
339 pool_id: self.pool_id.clone(),
340 balance_manager_id: self.balance_manager_id.clone(),
341 epoch: self.epoch as i64,
342 amount: self.amount as i64,
343 stake: self.stake,
344 }
345 }
346}
347
348#[derive(Clone, Debug)]
349pub struct TradeParamsUpdate {
350 pub(crate) digest: String,
351 pub(crate) event_digest: String,
352 pub(crate) sender: String,
353 pub(crate) checkpoint: u64,
354 pub(crate) checkpoint_timestamp_ms: u64,
355 pub(crate) package: String,
356 pub(crate) pool_id: String,
357 pub(crate) taker_fee: u64,
358 pub(crate) maker_fee: u64,
359 pub(crate) stake_required: u64,
360}
361
362impl TradeParamsUpdate {
363 pub(crate) fn to_db(&self) -> DBTradeParamsUpdate {
364 DBTradeParamsUpdate {
365 digest: self.digest.clone(),
366 event_digest: self.event_digest.clone(),
367 sender: self.sender.clone(),
368 checkpoint: self.checkpoint as i64,
369 checkpoint_timestamp_ms: self.checkpoint_timestamp_ms as i64,
370 package: self.package.clone(),
371 pool_id: self.pool_id.clone(),
372 taker_fee: self.taker_fee as i64,
373 maker_fee: self.maker_fee as i64,
374 stake_required: self.stake_required as i64,
375 }
376 }
377}
378
379#[derive(Clone, Debug)]
380pub struct Votes {
381 pub(crate) digest: String,
382 pub(crate) event_digest: String,
383 pub(crate) sender: String,
384 pub(crate) checkpoint: u64,
385 pub(crate) checkpoint_timestamp_ms: u64,
386 pub(crate) package: String,
387 pub(crate) pool_id: String,
388 pub(crate) balance_manager_id: String,
389 pub(crate) epoch: u64,
390 pub(crate) from_proposal_id: Option<String>,
391 pub(crate) to_proposal_id: String,
392 pub(crate) stake: u64,
393}
394
395impl Votes {
396 pub(crate) fn to_db(&self) -> DBVotes {
397 DBVotes {
398 digest: self.digest.clone(),
399 event_digest: self.event_digest.clone(),
400 sender: self.sender.clone(),
401 checkpoint: self.checkpoint as i64,
402 checkpoint_timestamp_ms: self.checkpoint_timestamp_ms as i64,
403 package: self.package.clone(),
404 pool_id: self.pool_id.clone(),
405 balance_manager_id: self.balance_manager_id.clone(),
406 epoch: self.epoch as i64,
407 from_proposal_id: self.from_proposal_id.clone(),
408 to_proposal_id: self.to_proposal_id.clone(),
409 stake: self.stake as i64,
410 }
411 }
412}
413
414#[derive(Clone, Debug)]
415pub struct SuiTxnError {
416 pub(crate) tx_digest: TransactionDigest,
417 pub(crate) sender: SuiAddress,
418 pub(crate) timestamp_ms: u64,
419 pub(crate) failure_status: String,
420 pub(crate) package: String,
421 pub(crate) cmd_idx: Option<u64>,
422}
423
424impl SuiTxnError {
425 pub(crate) fn to_db(&self) -> SuiErrorTransactions {
426 SuiErrorTransactions {
427 txn_digest: self.tx_digest.to_string(),
428 sender_address: self.sender.to_string(),
429 timestamp_ms: self.timestamp_ms as i64,
430 failure_status: self.failure_status.clone(),
431 package: self.package.clone(),
432 cmd_idx: self.cmd_idx.map(|idx| idx as i64),
433 }
434 }
435}