@@ -62,7 +62,7 @@ use crate::state::order_params::{
6262 ModifyOrderParams , OrderParams , PlaceOrderOptions , PostOnlyParam ,
6363} ;
6464use crate :: state:: paused_operations:: { PerpOperation , SpotOperation } ;
65- use crate :: state:: perp_market:: { AMMAvailability , MarketStatus , PerpMarket } ;
65+ use crate :: state:: perp_market:: { MarketStatus , PerpMarket } ;
6666use crate :: state:: perp_market_map:: PerpMarketMap ;
6767use crate :: state:: protected_maker_mode_config:: ProtectedMakerParams ;
6868use crate :: state:: spot_fulfillment_params:: { ExternalSpotFill , SpotFulfillmentParams } ;
@@ -88,10 +88,6 @@ mod tests;
8888
8989#[ cfg( test) ]
9090mod amm_jit_tests;
91-
92- #[ cfg( test) ]
93- mod amm_lp_jit_tests;
94-
9591#[ cfg( test) ]
9692mod fuel_tests;
9793
@@ -998,13 +994,8 @@ pub fn fill_perp_order(
998994 . position ( |order| order. order_id == order_id && order. status == OrderStatus :: Open )
999995 . ok_or_else ( print_error ! ( ErrorCode :: OrderDoesNotExist ) ) ?;
1000996
1001- let ( order_status, market_index, order_market_type, order_direction) = get_struct_values ! (
1002- user. orders[ order_index] ,
1003- status,
1004- market_index,
1005- market_type,
1006- direction
1007- ) ;
997+ let ( order_status, market_index, order_market_type) =
998+ get_struct_values ! ( user. orders[ order_index] , status, market_index, market_type) ;
1008999
10091000 validate ! (
10101001 order_market_type == MarketType :: Perp ,
@@ -1070,14 +1061,9 @@ pub fn fill_perp_order(
10701061 let safe_oracle_validity: OracleValidity ;
10711062 let oracle_price: i64 ;
10721063 let oracle_twap_5min: i64 ;
1073- let perp_market_index: u16 ;
10741064 let user_can_skip_duration: bool ;
1075- let amm_can_skip_duration: bool ;
1076- let amm_has_low_enough_inventory: bool ;
1077- let oracle_valid_for_amm_fill: bool ;
10781065 let oracle_stale_for_margin: bool ;
1079- let min_auction_duration: u8 ;
1080- let mut amm_is_available = !state. amm_paused ( ) ?;
1066+ let mut amm_is_available: bool = !state. amm_paused ( ) ?;
10811067 {
10821068 let market = & mut perp_market_map. get_ref_mut ( & market_index) ?;
10831069 validation:: perp_market:: validate_perp_market ( market) ?;
@@ -1104,59 +1090,40 @@ pub fn fill_perp_order(
11041090 & market. amm . oracle_source ,
11051091 oracle:: LogMode :: SafeMMOracle ,
11061092 market. amm . oracle_slot_delay_override ,
1093+ market. amm . oracle_low_risk_slot_delay_override ,
11071094 ) ?;
11081095
1109- oracle_valid_for_amm_fill =
1110- is_oracle_valid_for_action ( safe_oracle_validity, Some ( DriftAction :: FillOrderAmm ) ) ?;
1096+ user_can_skip_duration = user. can_skip_auction_duration ( user_stats) ?;
1097+ amm_is_available &= market. amm_can_fill_order (
1098+ & user. orders [ order_index] ,
1099+ slot,
1100+ fill_mode,
1101+ state,
1102+ safe_oracle_validity,
1103+ user_can_skip_duration,
1104+ & mm_oracle_price_data,
1105+ ) ?;
11111106
11121107 oracle_stale_for_margin = mm_oracle_price_data. get_delay ( )
11131108 > state
11141109 . oracle_guard_rails
11151110 . validity
11161111 . slots_before_stale_for_margin ;
11171112
1118- amm_is_available &= oracle_valid_for_amm_fill;
1119- amm_is_available &= !market. is_operation_paused ( PerpOperation :: AmmFill ) ;
1120- amm_is_available &= !market. has_too_much_drawdown ( ) ?;
1121-
1122- // We are already using safe oracle data from MM oracle.
1123- // But AMM isnt available if we could have used MM oracle but fell back due to price diff
1124- let amm_available_mm_oracle_recent_but_volatile =
1125- if mm_oracle_price_data. is_enabled ( ) && mm_oracle_price_data. is_mm_oracle_as_recent ( ) {
1126- let amm_available = !mm_oracle_price_data. is_mm_exchange_diff_bps_high ( ) ;
1127- amm_available
1128- } else {
1129- true
1130- } ;
1131- amm_is_available &= amm_available_mm_oracle_recent_but_volatile;
1132-
1133- let amm_wants_to_jit_make = market. amm . amm_wants_to_jit_make ( order_direction) ?;
1134- amm_has_low_enough_inventory = market
1135- . amm
1136- . amm_has_low_enough_inventory ( amm_wants_to_jit_make) ?;
1137- amm_can_skip_duration =
1138- market. can_skip_auction_duration ( & state, amm_has_low_enough_inventory) ?;
1139-
1140- user_can_skip_duration = user. can_skip_auction_duration ( user_stats) ?;
1141-
11421113 reserve_price_before = market. amm . reserve_price ( ) ?;
11431114 oracle_price = mm_oracle_price_data. get_price ( ) ;
11441115 oracle_twap_5min = market
11451116 . amm
11461117 . historical_oracle_data
11471118 . last_oracle_price_twap_5min ;
1148- perp_market_index = market. market_index ;
1149-
1150- min_auction_duration =
1151- market. get_min_perp_auction_duration ( state. min_perp_auction_duration ) ;
11521119 }
11531120
11541121 // allow oracle price to be used to calculate limit price if it's valid or stale for amm
11551122 let valid_oracle_price =
11561123 if is_oracle_valid_for_action ( safe_oracle_validity, Some ( DriftAction :: OracleOrderPrice ) ) ? {
11571124 Some ( oracle_price)
11581125 } else {
1159- msg ! ( "Perp market = {} oracle deemed invalid" , perp_market_index ) ;
1126+ msg ! ( "Perp market = {} oracle deemed invalid" , market_index ) ;
11601127 None
11611128 } ;
11621129
@@ -1285,16 +1252,6 @@ pub fn fill_perp_order(
12851252 return Ok ( ( 0 , 0 ) ) ;
12861253 }
12871254
1288- let amm_availability = if amm_is_available {
1289- if amm_can_skip_duration && user_can_skip_duration {
1290- AMMAvailability :: Immediate
1291- } else {
1292- AMMAvailability :: AfterMinDuration
1293- }
1294- } else {
1295- AMMAvailability :: Unavailable
1296- } ;
1297-
12981255 let ( base_asset_amount, quote_asset_amount) = fulfill_perp_order (
12991256 user,
13001257 order_index,
@@ -1315,8 +1272,7 @@ pub fn fill_perp_order(
13151272 valid_oracle_price,
13161273 now,
13171274 slot,
1318- min_auction_duration,
1319- amm_availability,
1275+ amm_is_available,
13201276 fill_mode,
13211277 oracle_stale_for_margin,
13221278 rev_share_escrow,
@@ -1782,8 +1738,7 @@ fn fulfill_perp_order(
17821738 valid_oracle_price : Option < i64 > ,
17831739 now : i64 ,
17841740 slot : u64 ,
1785- min_auction_duration : u8 ,
1786- amm_availability : AMMAvailability ,
1741+ amm_is_available : bool ,
17871742 fill_mode : FillMode ,
17881743 oracle_stale_for_margin : bool ,
17891744 rev_share_escrow : & mut Option < & mut RevenueShareEscrowZeroCopyMut > ,
@@ -1807,19 +1762,13 @@ fn fulfill_perp_order(
18071762
18081763 let fulfillment_methods = {
18091764 let market = perp_market_map. get_ref ( & market_index) ?;
1810- let oracle_price = oracle_map. get_price_data ( & market. oracle_id ( ) ) ?. price ;
1811-
18121765 determine_perp_fulfillment_methods (
18131766 & user. orders [ user_order_index] ,
18141767 maker_orders_info,
18151768 & market. amm ,
18161769 reserve_price_before,
1817- Some ( oracle_price) ,
18181770 limit_price,
1819- amm_availability,
1820- slot,
1821- min_auction_duration,
1822- fill_mode,
1771+ amm_is_available,
18231772 ) ?
18241773 } ;
18251774
@@ -3138,6 +3087,7 @@ pub fn trigger_order(
31383087 . last_oracle_price_twap ,
31393088 perp_market. get_max_confidence_interval_multiplier ( ) ?,
31403089 0 ,
3090+ 0 ,
31413091 ) ?;
31423092
31433093 let is_oracle_valid =
@@ -5435,6 +5385,7 @@ pub fn trigger_spot_order(
54355385 spot_market. historical_oracle_data . last_oracle_price_twap ,
54365386 spot_market. get_max_confidence_interval_multiplier ( ) ?,
54375387 0 ,
5388+ 0 ,
54385389 ) ?;
54395390 let strict_oracle_price = StrictOraclePrice {
54405391 current : oracle_price_data. price ,
0 commit comments