diff --git a/crates/src/dlob/mod.rs b/crates/src/dlob/mod.rs index 1a1a664..5161b3a 100644 --- a/crates/src/dlob/mod.rs +++ b/crates/src/dlob/mod.rs @@ -471,28 +471,64 @@ impl DLOB { .store(slot, std::sync::atomic::Ordering::Relaxed) } - /// Get an L2 book of current orders + /// Get an L2 book of current orders at the current slot /// - /// It is valid at the current slot + /// # Panics + /// If orderbook doesn't exist. Use `get_l2_snapshot_safe` to handle missing orderbooks pub fn get_l2_snapshot(&self, market_index: u16, market_type: MarketType) -> Arc { let book = self .markets .get(&MarketId::new(market_index, market_type)) - .expect("orderbook exists for market"); + .expect(&format!( + "orderbook missing for market {}, {:?}", + market_index, market_type + )); book.l2_snapshot.read() } - /// Get an L3 book of current orders + /// Get an L2 book of current orders at the current slot + /// + /// Returns `None` if orderbook doesn't exist for this market + pub fn get_l2_snapshot_safe( + &self, + market_index: u16, + market_type: MarketType, + ) -> Option> { + let book = self + .markets + .get(&MarketId::new(market_index, market_type))?; + Some(book.l2_snapshot.read()) + } + + /// Get an L3 book of current orders at the current slot /// - /// It is valid at the current slot + /// # Panics + /// If orderbook doesn't exist. Use `get_l3_snapshot_safe` to handle missing orderbooks pub fn get_l3_snapshot(&self, market_index: u16, market_type: MarketType) -> Arc { let book = self .markets .get(&MarketId::new(market_index, market_type)) - .expect("orderbook exists for market"); + .expect(&format!( + "orderbook missing for market {}, {:?}", + market_index, market_type + )); book.l3_snapshot.read() } + /// Get an L3 book of current orders at the current slot + /// + /// Returns `None` if orderbook doesn't exist for this market + pub fn get_l3_snapshot_safe( + &self, + market_index: u16, + market_type: MarketType, + ) -> Option> { + let book = self + .markets + .get(&MarketId::new(market_index, market_type))?; + Some(book.l3_snapshot.read()) + } + pub fn find_crossing_region( &self, oracle_price: u64, diff --git a/crates/src/dlob/tests.rs b/crates/src/dlob/tests.rs index 1d118fe..3351177 100644 --- a/crates/src/dlob/tests.rs +++ b/crates/src/dlob/tests.rs @@ -69,7 +69,7 @@ fn dlob_limit_order_sorting() { // Build L3 snapshot to get sorted orders let oracle_price = 1000; if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -397,7 +397,7 @@ fn dlob_find_crosses_for_taker_order_full_fill() { // Update L3 view before finding crosses if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } // Create taker order to buy 7 units at 1000 @@ -437,7 +437,7 @@ fn dlob_find_crosses_for_taker_order_partial_fill() { // Update L3 view before finding crosses if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } // Create taker order to buy 5 units at 1000 @@ -533,7 +533,7 @@ fn dlob_find_crosses_for_taker_order_floating_limit() { // Update L3 view before finding crosses if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } // Create taker order to buy at 1000 @@ -574,7 +574,7 @@ fn dlob_find_crosses_for_taker_order_price_priority() { // Update L3 view before finding crosses if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } // Create taker order to buy 5 units at 1000 @@ -855,7 +855,7 @@ fn dlob_find_crosses_for_auctions_market_orders() { // Update L3 view before finding crosses if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let crosses = @@ -892,7 +892,7 @@ fn dlob_find_crosses_for_auctions_oracle_orders() { // Update L3 view before finding crosses if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let crosses = @@ -929,7 +929,7 @@ fn dlob_find_crosses_for_auctions_no_crosses() { // Update L3 view before finding crosses if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let crosses = @@ -1005,7 +1005,7 @@ fn dlob_find_crosses_for_auctions_comprehensive() { // Update L3 view before finding crosses if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let crosses = @@ -1668,7 +1668,7 @@ fn dlob_get_maker_bids_l3() { book.update_slot(slot); } if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -1746,7 +1746,7 @@ fn dlob_get_maker_asks_l3() { book.update_slot(slot); } if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -1819,7 +1819,7 @@ fn dlob_get_taker_bids_l3() { book.update_slot(slot); } if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -1881,7 +1881,7 @@ fn dlob_get_taker_asks_l3() { book.update_slot(slot); } if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -1978,7 +1978,7 @@ fn dlob_l3_functions_mixed_order_types() { book.update_slot(slot); } if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2075,7 +2075,7 @@ fn l3book_bids_query_with_fixed_and_floating_orders() { // Build L3 snapshot if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2136,7 +2136,7 @@ fn l3book_asks_query_with_fixed_and_floating_orders() { // Build L3 snapshot if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2188,7 +2188,7 @@ fn l3book_bids_with_oracle_price_change() { // Build L3 snapshot at initial oracle price if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(initial_oracle, &dlob.metadata); + book.update_l3_view(initial_oracle, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2243,7 +2243,7 @@ fn l3book_asks_with_oracle_price_change() { // Build L3 snapshot at initial oracle price if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(initial_oracle, &dlob.metadata); + book.update_l3_view(initial_oracle, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2310,7 +2310,7 @@ fn l3book_top_bids_and_top_asks() { // Build L3 snapshot if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2352,7 +2352,7 @@ fn l3book_empty_orderbook() { // Build L3 snapshot with empty orderbook if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2407,7 +2407,7 @@ fn l3book_bids_includes_all_order_types() { book.update_slot(slot); } if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2477,7 +2477,7 @@ fn l3book_vamm_orders_sorted_correctly() { book.update_slot(query_slot); } if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2602,7 +2602,7 @@ fn l3book_vamm_orders_sorted_correctly() { } // Update L3 view again if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2722,7 +2722,7 @@ fn dlob_l3_order_flags_correctness() { book.update_slot(slot); } if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp); @@ -2914,7 +2914,7 @@ fn dlob_l3_trigger_orders_by_price() { book.update_slot(slot); } if let Some(book) = dlob.markets.get(&MarketId::new(0, MarketType::Perp)) { - book.update_l3_view(oracle_price, &dlob.metadata); + book.update_l3_view(oracle_price, &dlob.metadata, &dashmap::DashMap::default()); } let l3book = dlob.get_l3_snapshot(0, MarketType::Perp);