phoenix/state/
matching_engine_response.rs

1use crate::quantities::{BaseLots, QuoteLots};
2
3#[repr(C)]
4#[derive(Debug, Eq, PartialEq, Default, Copy, Clone)]
5pub struct MatchingEngineResponse {
6    pub num_quote_lots_in: QuoteLots,
7    pub num_base_lots_in: BaseLots,
8    pub num_quote_lots_out: QuoteLots,
9    pub num_base_lots_out: BaseLots,
10    pub num_quote_lots_posted: QuoteLots,
11    pub num_base_lots_posted: BaseLots,
12    pub num_free_quote_lots_used: QuoteLots,
13    pub num_free_base_lots_used: BaseLots,
14}
15
16impl MatchingEngineResponse {
17    pub fn new_from_buy(num_quote_lots_in: QuoteLots, num_base_lots_out: BaseLots) -> Self {
18        MatchingEngineResponse {
19            num_quote_lots_in,
20            num_base_lots_in: BaseLots::ZERO,
21            num_quote_lots_out: QuoteLots::ZERO,
22            num_base_lots_out,
23            num_quote_lots_posted: QuoteLots::ZERO,
24            num_base_lots_posted: BaseLots::ZERO,
25            num_free_quote_lots_used: QuoteLots::ZERO,
26            num_free_base_lots_used: BaseLots::ZERO,
27        }
28    }
29
30    pub fn new_from_sell(num_base_lots_in: BaseLots, num_quote_lots_out: QuoteLots) -> Self {
31        MatchingEngineResponse {
32            num_quote_lots_in: QuoteLots::ZERO,
33            num_base_lots_in,
34            num_quote_lots_out,
35            num_base_lots_out: BaseLots::ZERO,
36            num_quote_lots_posted: QuoteLots::ZERO,
37            num_base_lots_posted: BaseLots::ZERO,
38            num_free_quote_lots_used: QuoteLots::ZERO,
39            num_free_base_lots_used: BaseLots::ZERO,
40        }
41    }
42
43    pub fn new_withdraw(num_base_lots_out: BaseLots, num_quote_lots_out: QuoteLots) -> Self {
44        MatchingEngineResponse {
45            num_quote_lots_in: QuoteLots::ZERO,
46            num_base_lots_in: BaseLots::ZERO,
47            num_quote_lots_out,
48            num_base_lots_out,
49            num_quote_lots_posted: QuoteLots::ZERO,
50            num_base_lots_posted: BaseLots::ZERO,
51            num_free_quote_lots_used: QuoteLots::ZERO,
52            num_free_base_lots_used: BaseLots::ZERO,
53        }
54    }
55
56    #[inline(always)]
57    pub fn post_quote_lots(&mut self, num_quote_lots: QuoteLots) {
58        self.num_quote_lots_posted += num_quote_lots;
59    }
60
61    #[inline(always)]
62    pub fn post_base_lots(&mut self, num_base_lots: BaseLots) {
63        self.num_base_lots_posted += num_base_lots;
64    }
65
66    #[inline(always)]
67    pub fn num_base_lots(&self) -> BaseLots {
68        self.num_base_lots_in + self.num_base_lots_out
69    }
70
71    #[inline(always)]
72    pub fn num_quote_lots(&self) -> QuoteLots {
73        self.num_quote_lots_in + self.num_quote_lots_out
74    }
75
76    #[inline(always)]
77    pub fn use_free_quote_lots(&mut self, num_quote_lots: QuoteLots) {
78        self.num_free_quote_lots_used += num_quote_lots;
79    }
80
81    #[inline(always)]
82    pub fn use_free_base_lots(&mut self, num_base_lots: BaseLots) {
83        self.num_free_base_lots_used += num_base_lots;
84    }
85
86    #[inline(always)]
87    pub fn get_deposit_amount_bid_in_quote_lots(&self) -> QuoteLots {
88        self.num_quote_lots_in + self.num_quote_lots_posted - self.num_free_quote_lots_used
89    }
90
91    #[inline(always)]
92    pub fn get_deposit_amount_ask_in_base_lots(&self) -> BaseLots {
93        self.num_base_lots_in + self.num_base_lots_posted - self.num_free_base_lots_used
94    }
95
96    #[inline(always)]
97    pub fn verify_no_deposit(&self) -> bool {
98        self.num_base_lots_in + self.num_base_lots_posted == self.num_free_base_lots_used
99            && self.num_quote_lots_in + self.num_quote_lots_posted == self.num_free_quote_lots_used
100    }
101
102    #[inline(always)]
103    pub fn verify_no_withdrawal(&self) -> bool {
104        self.num_base_lots_out == BaseLots::ZERO && self.num_quote_lots_out == QuoteLots::ZERO
105    }
106}