phoenix/state/
matching_engine_response.rs1use 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}