off_grid_primitives/spot/
market.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4pub struct L1 {
5 pub lmp: Option<u64>,
7 pub bid_head: Option<u64>,
9 pub ask_head: Option<u64>,
11 pub limit_buy_slippage_limit: Option<u64>,
13 pub limit_sell_slippage_limit: Option<u64>,
15 pub market_buy_slippage_limit: Option<u64>,
17 pub market_sell_slippage_limit: Option<u64>,
19}
20
21#[derive(Debug, thiserror::Error, PartialEq, Eq)]
22pub enum L1Error {
23 #[error("price is zero")]
24 PriceIsZero,
25}
26
27impl Default for L1 {
28 fn default() -> Self {
29 Self {
30 lmp: None,
31 bid_head: None,
32 ask_head: None,
33 limit_buy_slippage_limit: Some(10000u64),
34 limit_sell_slippage_limit: Some(10000u64),
35 market_buy_slippage_limit: Some(10000u64),
36 market_sell_slippage_limit: Some(10000u64),
37 }
38 }
39}
40
41impl L1 {
42 pub fn new() -> Self {
43 Self::default()
44 }
45
46 pub fn new_with_slippage(
47 lmp: Option<u64>,
48 bid_head: Option<u64>,
49 ask_head: Option<u64>,
50 limit_buy_slippage_limit: Option<u64>,
51 limit_sell_slippage_limit: Option<u64>,
52 market_buy_slippage_limit: Option<u64>,
53 market_sell_slippage_limit: Option<u64>,
54 ) -> Self {
55 Self {
56 lmp,
57 bid_head,
58 ask_head,
59 limit_buy_slippage_limit,
60 limit_sell_slippage_limit,
61 market_buy_slippage_limit,
62 market_sell_slippage_limit,
63 }
64 }
65
66 pub fn ask_head(&self) -> Option<u64> {
68 self.ask_head
69 }
70
71 pub fn bid_head(&self) -> Option<u64> {
73 self.bid_head
74 }
75
76 pub fn lmp(&self) -> Option<u64> {
77 self.lmp
78 }
79
80 pub fn set_lmp(&mut self, price: u64) {
81 self.lmp = Some(price);
82 }
83
84 pub fn set_ask_head(&mut self, price: u64) {
85 self.ask_head = Some(price);
86 }
87
88 pub fn set_bid_head(&mut self, price: u64) {
89 self.bid_head = Some(price);
90 }
91
92 pub fn set_limit_buy_slippage_limit(&mut self, slippage_limit: Option<u64>) {
94 self.limit_buy_slippage_limit = slippage_limit;
95 }
96
97 pub fn set_limit_sell_slippage_limit(&mut self, slippage_limit: Option<u64>) {
99 self.limit_sell_slippage_limit = slippage_limit;
100 }
101
102 pub fn set_market_buy_slippage_limit(&mut self, slippage_limit: Option<u64>) {
104 self.market_buy_slippage_limit = slippage_limit;
105 }
106
107 pub fn set_market_sell_slippage_limit(&mut self, slippage_limit: Option<u64>) {
109 self.market_sell_slippage_limit = slippage_limit;
110 }
111
112 #[cfg_attr(test, allow(dead_code))]
122 pub fn det_limit_sell_make_price(
123 &self,
124 lp: u64,
125 bid_head: u64,
126 ask_head: u64,
127 spread: u32,
128 ) -> u64 {
129 const DENOM: u64 = 10000; let lmp = self.lmp().unwrap_or(0);
131
132 if ask_head == 0 && bid_head == 0 {
133 if lmp != 0 {
135 let down = ((lmp as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
137 let price = if lp <= down { down } else { lp };
138 return price;
139 }
140 return lp;
142 } else if ask_head == 0 && bid_head != 0 {
143 if lmp != 0 {
145 let mut down = ((lmp as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
146 down = if lp <= down { down } else { lp };
147 let price = if down <= bid_head { bid_head } else { down };
148 return price;
149 }
150 let mut down = ((bid_head as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
152 down = if lp <= down { down } else { lp };
153 let price = if down <= bid_head { bid_head } else { down };
154 return price;
155 } else if ask_head != 0 && bid_head == 0 {
156 if lmp != 0 {
158 let down = ((lmp as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
159 let price = if lp <= down { down } else { lp };
160 return price;
161 }
162 let down = ((ask_head as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
164 let price = if lp <= down { down } else { lp };
165 return price;
166 } else {
167 if lmp != 0 {
169 let down = ((lmp as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
170 let price = if lp <= down { down } else { lp };
171 return price;
172 }
173 let price = if lp <= bid_head { bid_head } else { lp };
176 return price;
177 }
178 }
179
180 #[cfg_attr(test, allow(dead_code))]
190 pub fn det_limit_buy_make_price(
191 &self,
192 lp: u64,
193 bid_head: u64,
194 ask_head: u64,
195 spread: u32,
196 ) -> u64 {
197 const DENOM: u64 = 10000; let lmp = self.lmp().unwrap_or(0);
199
200 if ask_head == 0 && bid_head == 0 {
201 if lmp != 0 {
203 let up = ((lmp as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
205 let price = if lp >= up { up } else { lp };
206 return price;
207 }
208 return lp;
210 } else if ask_head == 0 && bid_head != 0 {
211 if lmp != 0 {
213 let up = ((lmp as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
215 let price = if lp >= up { up } else { lp };
216 return price;
217 }
218 let up = ((bid_head as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
220 let price = if lp >= up { up } else { lp };
221 return price;
222 } else if ask_head != 0 && bid_head == 0 {
223 if lmp != 0 {
225 let mut up = ((lmp as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
226 up = if lp >= up { up } else { lp };
227 let price = if up >= ask_head { ask_head } else { up };
228 return price;
229 }
230 let mut up = ((ask_head as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
232 up = if lp >= up { up } else { lp };
233 let price = if up >= ask_head { ask_head } else { up };
234 return price;
235 } else {
236 if lmp != 0 {
238 let mut up = ((lmp as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
239 up = if lp >= up { up } else { lp };
240 let price = if up >= ask_head { ask_head } else { up };
241 return price;
242 }
243 let price = if lp >= ask_head { ask_head } else { lp };
245 return price;
246 }
247 }
248
249 #[cfg_attr(test, allow(dead_code))]
258 pub fn det_market_buy_make_price(
259 &self,
260 bid_head: u64,
261 ask_head: u64,
262 spread: u32,
263 ) -> u64 {
264 const DENOM: u64 = 10000; let lmp = self.lmp().unwrap_or(0);
266
267 if ask_head == 0 && bid_head == 0 {
268 if lmp != 0 {
271 let up = ((lmp as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
273 return up;
274 }
275 return 0;
277 } else if ask_head == 0 && bid_head != 0 {
278 if lmp != 0 {
280 let temp = if bid_head >= lmp { bid_head } else { lmp };
281 let up = ((temp as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
282 return up;
283 }
284 let up = ((bid_head as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
286 return up;
287 } else if ask_head != 0 && bid_head == 0 {
288 if lmp != 0 {
290 let up = ((lmp as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
291 let price = if ask_head >= up { up } else { ask_head };
292 return price;
293 }
294 return ask_head;
296 } else {
297 if lmp != 0 {
299 let temp = if bid_head >= lmp { bid_head } else { lmp };
300 let up = ((temp as u128 * (DENOM + spread as u64) as u128) / DENOM as u128) as u64;
301 let price = if ask_head >= up { up } else { ask_head };
302 return price;
303 }
304 return ask_head;
306 }
307 }
308
309 #[cfg_attr(test, allow(dead_code))]
318 pub fn det_market_sell_make_price(
319 &self,
320 bid_head: u64,
321 ask_head: u64,
322 spread: u32,
323 ) -> u64 {
324 const DENOM: u64 = 10000; let lmp = self.lmp().unwrap_or(0);
326
327 if ask_head == 0 && bid_head == 0 {
328 if lmp != 0 {
331 let down = ((lmp as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
333 let price = if down == 0 { 1 } else { down };
335 return price;
336 }
337 return 0;
339 } else if ask_head == 0 && bid_head != 0 {
340 if lmp != 0 {
342 let mut down = ((lmp as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
343 down = if down <= bid_head { bid_head } else { down };
344 let price = if down == 0 { 1 } else { down };
346 return price;
347 }
348 return bid_head;
350 } else if ask_head != 0 && bid_head == 0 {
351 if lmp != 0 {
353 let temp = if lmp <= ask_head { lmp } else { ask_head };
354 let down = ((temp as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
355 let price = if down == 0 { 1 } else { down };
357 return price;
358 }
359 let down = ((ask_head as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
361 let price = if down == 0 { 1 } else { down };
363 return price;
364 } else {
365 if lmp != 0 {
367 let temp = if lmp <= ask_head { lmp } else { ask_head };
368 let mut down = ((temp as u128 * (DENOM - spread as u64) as u128) / DENOM as u128) as u64;
369 down = if down <= bid_head { bid_head } else { down };
370 let price = if down == 0 { 1 } else { down };
372 return price;
373 }
374 return bid_head;
376 }
377 }
378
379
380}