1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use crate::quantities::{BaseLots, QuoteLots};
use bytemuck::{Pod, Zeroable};

#[repr(C)]
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Zeroable, Pod)]
pub struct TraderState {
    pub quote_lots_locked: QuoteLots,
    pub quote_lots_free: QuoteLots,
    pub base_lots_locked: BaseLots,
    pub base_lots_free: BaseLots,
    _padding: [u64; 8],
}

impl TraderState {
    #[inline(always)]
    pub(crate) fn unlock_quote_lots(&mut self, quote_lots: QuoteLots) {
        self.quote_lots_locked -= quote_lots;
        self.quote_lots_free += quote_lots;
    }

    #[inline(always)]
    pub(crate) fn unlock_base_lots(&mut self, base_lots: BaseLots) {
        self.base_lots_locked -= base_lots;
        self.base_lots_free += base_lots;
    }

    #[inline(always)]
    pub(crate) fn process_limit_sell(
        &mut self,
        base_lots_removed: BaseLots,
        quote_lots_received: QuoteLots,
    ) {
        self.base_lots_locked -= base_lots_removed;
        self.quote_lots_free += quote_lots_received;
    }

    #[inline(always)]
    pub(crate) fn process_limit_buy(
        &mut self,
        quote_lots_removed: QuoteLots,
        base_lots_received: BaseLots,
    ) {
        self.quote_lots_locked -= quote_lots_removed;
        self.base_lots_free += base_lots_received;
    }

    #[inline(always)]
    pub(crate) fn lock_quote_lots(&mut self, quote_lots: QuoteLots) {
        self.quote_lots_locked += quote_lots;
    }

    #[inline(always)]
    pub(crate) fn lock_base_lots(&mut self, base_lots: BaseLots) {
        self.base_lots_locked += base_lots;
    }

    #[inline(always)]
    pub(crate) fn use_free_quote_lots(&mut self, quote_lots: QuoteLots) {
        self.quote_lots_free -= quote_lots;
    }

    #[inline(always)]
    pub(crate) fn use_free_base_lots(&mut self, base_lots: BaseLots) {
        self.base_lots_free -= base_lots;
    }

    #[inline(always)]
    pub(crate) fn deposit_free_quote_lots(&mut self, quote_lots: QuoteLots) {
        self.quote_lots_free += quote_lots;
    }

    #[inline(always)]
    pub(crate) fn deposit_free_base_lots(&mut self, base_lots: BaseLots) {
        self.base_lots_free += base_lots;
    }
}