@@ -65,7 +65,7 @@ use crate::state::order_params::{
6565 ModifyOrderParams , OrderParams , PlaceOrderOptions , PostOnlyParam ,
6666} ;
6767use crate :: state:: paused_operations:: { PerpOperation , SpotOperation } ;
68- use crate :: state:: perp_market:: { AMMAvailability , MarketStatus , PerpMarket } ;
68+ use crate :: state:: perp_market:: { MarketStatus , PerpMarket } ;
6969use crate :: state:: perp_market_map:: PerpMarketMap ;
7070use crate :: state:: protected_maker_mode_config:: ProtectedMakerParams ;
7171use crate :: state:: spot_fulfillment_params:: { ExternalSpotFill , SpotFulfillmentParams } ;
@@ -90,10 +90,6 @@ mod tests;
9090
9191#[ cfg( test) ]
9292mod amm_jit_tests;
93-
94- #[ cfg( test) ]
95- mod amm_lp_jit_tests;
96-
9793#[ cfg( test) ]
9894mod fuel_tests;
9995
@@ -1000,13 +996,8 @@ pub fn fill_perp_order(
1000996 . position ( |order| order. order_id == order_id && order. status == OrderStatus :: Open )
1001997 . ok_or_else ( print_error ! ( ErrorCode :: OrderDoesNotExist ) ) ?;
1002998
1003- let ( order_status, market_index, order_market_type, order_direction) = get_struct_values ! (
1004- user. orders[ order_index] ,
1005- status,
1006- market_index,
1007- market_type,
1008- direction
1009- ) ;
999+ let ( order_status, market_index, order_market_type) =
1000+ get_struct_values ! ( user. orders[ order_index] , status, market_index, market_type) ;
10101001
10111002 validate ! (
10121003 order_market_type == MarketType :: Perp ,
@@ -1072,14 +1063,9 @@ pub fn fill_perp_order(
10721063 let safe_oracle_validity: OracleValidity ;
10731064 let oracle_price: i64 ;
10741065 let oracle_twap_5min: i64 ;
1075- let perp_market_index: u16 ;
10761066 let user_can_skip_duration: bool ;
1077- let amm_can_skip_duration: bool ;
1078- let amm_has_low_enough_inventory: bool ;
1079- let oracle_valid_for_amm_fill: bool ;
10801067 let oracle_stale_for_margin: bool ;
1081- let min_auction_duration: u8 ;
1082- let mut amm_is_available = !state. amm_paused ( ) ?;
1068+ let mut amm_is_available: bool = !state. amm_paused ( ) ?;
10831069 {
10841070 let market = & mut perp_market_map. get_ref_mut ( & market_index) ?;
10851071 validation:: perp_market:: validate_perp_market ( market) ?;
@@ -1106,59 +1092,40 @@ pub fn fill_perp_order(
11061092 & market. amm . oracle_source ,
11071093 oracle:: LogMode :: SafeMMOracle ,
11081094 market. amm . oracle_slot_delay_override ,
1095+ market. amm . oracle_low_risk_slot_delay_override ,
11091096 ) ?;
11101097
1111- oracle_valid_for_amm_fill =
1112- is_oracle_valid_for_action ( safe_oracle_validity, Some ( DriftAction :: FillOrderAmm ) ) ?;
1098+ user_can_skip_duration = user. can_skip_auction_duration ( user_stats) ?;
1099+ amm_is_available &= market. amm_can_fill_order (
1100+ & user. orders [ order_index] ,
1101+ slot,
1102+ fill_mode,
1103+ state,
1104+ safe_oracle_validity,
1105+ user_can_skip_duration,
1106+ & mm_oracle_price_data,
1107+ ) ?;
11131108
11141109 oracle_stale_for_margin = mm_oracle_price_data. get_delay ( )
11151110 > state
11161111 . oracle_guard_rails
11171112 . validity
11181113 . slots_before_stale_for_margin ;
11191114
1120- amm_is_available &= oracle_valid_for_amm_fill;
1121- amm_is_available &= !market. is_operation_paused ( PerpOperation :: AmmFill ) ;
1122- amm_is_available &= !market. has_too_much_drawdown ( ) ?;
1123-
1124- // We are already using safe oracle data from MM oracle.
1125- // But AMM isnt available if we could have used MM oracle but fell back due to price diff
1126- let amm_available_mm_oracle_recent_but_volatile =
1127- if mm_oracle_price_data. is_enabled ( ) && mm_oracle_price_data. is_mm_oracle_as_recent ( ) {
1128- let amm_available = !mm_oracle_price_data. is_mm_exchange_diff_bps_high ( ) ;
1129- amm_available
1130- } else {
1131- true
1132- } ;
1133- amm_is_available &= amm_available_mm_oracle_recent_but_volatile;
1134-
1135- let amm_wants_to_jit_make = market. amm . amm_wants_to_jit_make ( order_direction) ?;
1136- amm_has_low_enough_inventory = market
1137- . amm
1138- . amm_has_low_enough_inventory ( amm_wants_to_jit_make) ?;
1139- amm_can_skip_duration =
1140- market. can_skip_auction_duration ( & state, amm_has_low_enough_inventory) ?;
1141-
1142- user_can_skip_duration = user. can_skip_auction_duration ( user_stats) ?;
1143-
11441115 reserve_price_before = market. amm . reserve_price ( ) ?;
11451116 oracle_price = mm_oracle_price_data. get_price ( ) ;
11461117 oracle_twap_5min = market
11471118 . amm
11481119 . historical_oracle_data
11491120 . last_oracle_price_twap_5min ;
1150- perp_market_index = market. market_index ;
1151-
1152- min_auction_duration =
1153- market. get_min_perp_auction_duration ( state. min_perp_auction_duration ) ;
11541121 }
11551122
11561123 // allow oracle price to be used to calculate limit price if it's valid or stale for amm
11571124 let valid_oracle_price =
11581125 if is_oracle_valid_for_action ( safe_oracle_validity, Some ( DriftAction :: OracleOrderPrice ) ) ? {
11591126 Some ( oracle_price)
11601127 } else {
1161- msg ! ( "Perp market = {} oracle deemed invalid" , perp_market_index ) ;
1128+ msg ! ( "Perp market = {} oracle deemed invalid" , market_index ) ;
11621129 None
11631130 } ;
11641131
@@ -1287,16 +1254,6 @@ pub fn fill_perp_order(
12871254 return Ok ( ( 0 , 0 ) ) ;
12881255 }
12891256
1290- let amm_availability = if amm_is_available {
1291- if amm_can_skip_duration && user_can_skip_duration {
1292- AMMAvailability :: Immediate
1293- } else {
1294- AMMAvailability :: AfterMinDuration
1295- }
1296- } else {
1297- AMMAvailability :: Unavailable
1298- } ;
1299-
13001257 let ( base_asset_amount, quote_asset_amount) = fulfill_perp_order (
13011258 user,
13021259 order_index,
@@ -1317,8 +1274,7 @@ pub fn fill_perp_order(
13171274 valid_oracle_price,
13181275 now,
13191276 slot,
1320- min_auction_duration,
1321- amm_availability,
1277+ amm_is_available,
13221278 fill_mode,
13231279 oracle_stale_for_margin,
13241280 rev_share_escrow,
@@ -1784,8 +1740,7 @@ fn fulfill_perp_order(
17841740 valid_oracle_price : Option < i64 > ,
17851741 now : i64 ,
17861742 slot : u64 ,
1787- min_auction_duration : u8 ,
1788- amm_availability : AMMAvailability ,
1743+ amm_is_available : bool ,
17891744 fill_mode : FillMode ,
17901745 oracle_stale_for_margin : bool ,
17911746 rev_share_escrow : & mut Option < & mut RevenueShareEscrowZeroCopyMut > ,
@@ -1809,19 +1764,13 @@ fn fulfill_perp_order(
18091764
18101765 let fulfillment_methods = {
18111766 let market = perp_market_map. get_ref ( & market_index) ?;
1812- let oracle_price = oracle_map. get_price_data ( & market. oracle_id ( ) ) ?. price ;
1813-
18141767 determine_perp_fulfillment_methods (
18151768 & user. orders [ user_order_index] ,
18161769 maker_orders_info,
18171770 & market. amm ,
18181771 reserve_price_before,
1819- Some ( oracle_price) ,
18201772 limit_price,
1821- amm_availability,
1822- slot,
1823- min_auction_duration,
1824- fill_mode,
1773+ amm_is_available,
18251774 ) ?
18261775 } ;
18271776
@@ -3140,6 +3089,7 @@ pub fn trigger_order(
31403089 . last_oracle_price_twap ,
31413090 perp_market. get_max_confidence_interval_multiplier ( ) ?,
31423091 0 ,
3092+ 0 ,
31433093 ) ?;
31443094
31453095 let is_oracle_valid =
@@ -5437,6 +5387,7 @@ pub fn trigger_spot_order(
54375387 spot_market. historical_oracle_data . last_oracle_price_twap ,
54385388 spot_market. get_max_confidence_interval_multiplier ( ) ?,
54395389 0 ,
5390+ 0 ,
54405391 ) ?;
54415392 let strict_oracle_price = StrictOraclePrice {
54425393 current : oracle_price_data. price ,
0 commit comments