sui_deepbook_indexer/
types.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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}