phoenix/program/
events.rs

1use crate::state::markets::MarketEvent;
2use borsh::{BorshDeserialize, BorshSerialize};
3use solana_program::pubkey::Pubkey;
4
5#[derive(Debug, Copy, Clone, BorshDeserialize, BorshSerialize)]
6pub struct AuditLogHeader {
7    pub instruction: u8,
8    pub sequence_number: u64,
9    pub timestamp: i64,
10    pub slot: u64,
11    pub market: Pubkey,
12    pub signer: Pubkey,
13    pub total_events: u16,
14}
15
16#[derive(Debug, Copy, Clone, BorshDeserialize, BorshSerialize)]
17pub struct FillEvent {
18    pub index: u16,
19    pub maker_id: Pubkey,
20    pub order_sequence_number: u64,
21    pub price_in_ticks: u64,
22    pub base_lots_filled: u64,
23    pub base_lots_remaining: u64,
24}
25
26#[derive(Debug, Copy, Clone, BorshDeserialize, BorshSerialize)]
27pub struct ReduceEvent {
28    pub index: u16,
29    pub order_sequence_number: u64,
30    pub price_in_ticks: u64,
31    pub base_lots_removed: u64,
32    pub base_lots_remaining: u64,
33}
34
35#[derive(Debug, Copy, Clone, BorshDeserialize, BorshSerialize)]
36pub struct PlaceEvent {
37    pub index: u16,
38    pub order_sequence_number: u64,
39    pub client_order_id: u128,
40    pub price_in_ticks: u64,
41    pub base_lots_placed: u64,
42}
43
44#[derive(Debug, Copy, Clone, BorshDeserialize, BorshSerialize)]
45pub struct EvictEvent {
46    pub index: u16,
47    pub maker_id: Pubkey,
48    pub order_sequence_number: u64,
49    pub price_in_ticks: u64,
50    pub base_lots_evicted: u64,
51}
52
53#[derive(Debug, Copy, Clone, BorshDeserialize, BorshSerialize)]
54pub struct FillSummaryEvent {
55    pub index: u16,
56    pub client_order_id: u128,
57    pub total_base_lots_filled: u64,
58    pub total_quote_lots_filled: u64,
59    pub total_fee_in_quote_lots: u64,
60}
61
62#[derive(Debug, Copy, Clone, BorshDeserialize, BorshSerialize)]
63pub struct FeeEvent {
64    pub index: u16,
65    pub fees_collected_in_quote_lots: u64,
66}
67
68#[derive(Debug, Copy, Clone, BorshDeserialize, BorshSerialize)]
69pub struct TimeInForceEvent {
70    pub index: u16,
71    pub order_sequence_number: u64,
72    pub last_valid_slot: u64,
73    pub last_valid_unix_timestamp_in_seconds: u64,
74}
75
76#[derive(Debug, Copy, Clone, BorshDeserialize, BorshSerialize)]
77pub struct ExpiredOrderEvent {
78    pub index: u16,
79    pub maker_id: Pubkey,
80    pub order_sequence_number: u64,
81    pub price_in_ticks: u64,
82    pub base_lots_removed: u64,
83}
84
85#[derive(Debug, Copy, Clone, BorshDeserialize, BorshSerialize)]
86pub enum PhoenixMarketEvent {
87    Uninitialized,
88    Header(AuditLogHeader),
89    Fill(FillEvent),
90    Place(PlaceEvent),
91    Reduce(ReduceEvent),
92    Evict(EvictEvent),
93    FillSummary(FillSummaryEvent),
94    Fee(FeeEvent),
95    TimeInForce(TimeInForceEvent),
96    ExpiredOrder(ExpiredOrderEvent),
97}
98
99impl Default for PhoenixMarketEvent {
100    fn default() -> Self {
101        Self::Uninitialized
102    }
103}
104
105impl PhoenixMarketEvent {
106    pub fn set_index(&mut self, i: u16) {
107        match self {
108            Self::Fill(FillEvent { index, .. }) => *index = i,
109            Self::Place(PlaceEvent { index, .. }) => *index = i,
110            Self::Reduce(ReduceEvent { index, .. }) => *index = i,
111            Self::FillSummary(FillSummaryEvent { index, .. }) => *index = i,
112            Self::Evict(EvictEvent { index, .. }) => *index = i,
113            Self::Fee(FeeEvent { index, .. }) => *index = i,
114            Self::TimeInForce(TimeInForceEvent { index, .. }) => *index = i,
115            Self::ExpiredOrder(ExpiredOrderEvent { index, .. }) => *index = i,
116            _ => panic!("Cannot set index on uninitialized or header event"),
117        }
118    }
119}
120
121impl From<MarketEvent<Pubkey>> for PhoenixMarketEvent {
122    fn from(e: MarketEvent<Pubkey>) -> Self {
123        match e {
124            MarketEvent::<Pubkey>::Fill {
125                maker_id,
126                order_sequence_number,
127                price_in_ticks,
128                base_lots_filled,
129                base_lots_remaining,
130            } => Self::Fill(FillEvent {
131                maker_id,
132                order_sequence_number,
133                price_in_ticks: price_in_ticks.into(),
134                base_lots_filled: base_lots_filled.into(),
135                base_lots_remaining: base_lots_remaining.into(),
136                index: 0,
137            }),
138            MarketEvent::<Pubkey>::Place {
139                order_sequence_number,
140                client_order_id,
141                price_in_ticks,
142                base_lots_placed,
143            } => Self::Place(PlaceEvent {
144                order_sequence_number,
145                client_order_id,
146                price_in_ticks: price_in_ticks.into(),
147                base_lots_placed: base_lots_placed.into(),
148                index: 0,
149            }),
150            MarketEvent::<Pubkey>::Reduce {
151                order_sequence_number,
152                price_in_ticks,
153                base_lots_removed,
154                base_lots_remaining,
155            } => Self::Reduce(ReduceEvent {
156                order_sequence_number,
157                price_in_ticks: price_in_ticks.into(),
158                base_lots_removed: base_lots_removed.into(),
159                base_lots_remaining: base_lots_remaining.into(),
160                index: 0,
161            }),
162            MarketEvent::<Pubkey>::Evict {
163                maker_id,
164                order_sequence_number,
165                price_in_ticks,
166                base_lots_evicted,
167            } => Self::Evict(EvictEvent {
168                maker_id,
169                order_sequence_number,
170                price_in_ticks: price_in_ticks.into(),
171                base_lots_evicted: base_lots_evicted.into(),
172                index: 0,
173            }),
174            MarketEvent::<Pubkey>::FillSummary {
175                client_order_id,
176                total_base_lots_filled,
177                total_quote_lots_filled,
178                total_fee_in_quote_lots,
179            } => Self::FillSummary(FillSummaryEvent {
180                client_order_id,
181                total_base_lots_filled: total_base_lots_filled.into(),
182                total_quote_lots_filled: total_quote_lots_filled.into(),
183                total_fee_in_quote_lots: total_fee_in_quote_lots.into(),
184                index: 0,
185            }),
186            MarketEvent::<Pubkey>::Fee {
187                fees_collected_in_quote_lots,
188            } => Self::Fee(FeeEvent {
189                fees_collected_in_quote_lots: fees_collected_in_quote_lots.into(),
190                index: 0,
191            }),
192            MarketEvent::<Pubkey>::TimeInForce {
193                order_sequence_number,
194                last_valid_slot,
195                last_valid_unix_timestamp_in_seconds,
196            } => Self::TimeInForce(TimeInForceEvent {
197                order_sequence_number,
198                last_valid_slot,
199                last_valid_unix_timestamp_in_seconds,
200                index: 0,
201            }),
202            MarketEvent::<Pubkey>::ExpiredOrder {
203                maker_id,
204                order_sequence_number,
205                price_in_ticks,
206                base_lots_removed,
207            } => Self::ExpiredOrder(ExpiredOrderEvent {
208                maker_id,
209                order_sequence_number,
210                price_in_ticks: price_in_ticks.into(),
211                base_lots_removed: base_lots_removed.into(),
212                index: 0,
213            }),
214        }
215    }
216}