@@ -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
@@ -1009,13 +1005,8 @@ pub fn fill_perp_order(
10091005 . position ( |order| order. order_id == order_id && order. status == OrderStatus :: Open )
10101006 . ok_or_else ( print_error ! ( ErrorCode :: OrderDoesNotExist ) ) ?;
10111007
1012- let ( order_status, market_index, order_market_type, order_direction) = get_struct_values ! (
1013- user. orders[ order_index] ,
1014- status,
1015- market_index,
1016- market_type,
1017- direction
1018- ) ;
1008+ let ( order_status, market_index, order_market_type) =
1009+ get_struct_values ! ( user. orders[ order_index] , status, market_index, market_type) ;
10191010
10201011 validate ! (
10211012 order_market_type == MarketType :: Perp ,
@@ -1081,14 +1072,9 @@ pub fn fill_perp_order(
10811072 let safe_oracle_validity: OracleValidity ;
10821073 let oracle_price: i64 ;
10831074 let oracle_twap_5min: i64 ;
1084- let perp_market_index: u16 ;
10851075 let user_can_skip_duration: bool ;
1086- let amm_can_skip_duration: bool ;
1087- let amm_has_low_enough_inventory: bool ;
1088- let oracle_valid_for_amm_fill: bool ;
10891076 let oracle_stale_for_margin: bool ;
1090- let min_auction_duration: u8 ;
1091- let mut amm_is_available = !state. amm_paused ( ) ?;
1077+ let mut amm_is_available: bool = !state. amm_paused ( ) ?;
10921078 {
10931079 let market = & mut perp_market_map. get_ref_mut ( & market_index) ?;
10941080 validation:: perp_market:: validate_perp_market ( market) ?;
@@ -1115,59 +1101,40 @@ pub fn fill_perp_order(
11151101 & market. amm . oracle_source ,
11161102 oracle:: LogMode :: SafeMMOracle ,
11171103 market. amm . oracle_slot_delay_override ,
1104+ market. amm . oracle_low_risk_slot_delay_override ,
11181105 ) ?;
11191106
1120- oracle_valid_for_amm_fill =
1121- is_oracle_valid_for_action ( safe_oracle_validity, Some ( DriftAction :: FillOrderAmm ) ) ?;
1107+ user_can_skip_duration = user. can_skip_auction_duration ( user_stats) ?;
1108+ amm_is_available &= market. amm_can_fill_order (
1109+ & user. orders [ order_index] ,
1110+ slot,
1111+ fill_mode,
1112+ state,
1113+ safe_oracle_validity,
1114+ user_can_skip_duration,
1115+ & mm_oracle_price_data,
1116+ ) ?;
11221117
11231118 oracle_stale_for_margin = mm_oracle_price_data. get_delay ( )
11241119 > state
11251120 . oracle_guard_rails
11261121 . validity
11271122 . slots_before_stale_for_margin ;
11281123
1129- amm_is_available &= oracle_valid_for_amm_fill;
1130- amm_is_available &= !market. is_operation_paused ( PerpOperation :: AmmFill ) ;
1131- amm_is_available &= !market. has_too_much_drawdown ( ) ?;
1132-
1133- // We are already using safe oracle data from MM oracle.
1134- // But AMM isnt available if we could have used MM oracle but fell back due to price diff
1135- let amm_available_mm_oracle_recent_but_volatile =
1136- if mm_oracle_price_data. is_enabled ( ) && mm_oracle_price_data. is_mm_oracle_as_recent ( ) {
1137- let amm_available = !mm_oracle_price_data. is_mm_exchange_diff_bps_high ( ) ;
1138- amm_available
1139- } else {
1140- true
1141- } ;
1142- amm_is_available &= amm_available_mm_oracle_recent_but_volatile;
1143-
1144- let amm_wants_to_jit_make = market. amm . amm_wants_to_jit_make ( order_direction) ?;
1145- amm_has_low_enough_inventory = market
1146- . amm
1147- . amm_has_low_enough_inventory ( amm_wants_to_jit_make) ?;
1148- amm_can_skip_duration =
1149- market. can_skip_auction_duration ( & state, amm_has_low_enough_inventory) ?;
1150-
1151- user_can_skip_duration = user. can_skip_auction_duration ( user_stats) ?;
1152-
11531124 reserve_price_before = market. amm . reserve_price ( ) ?;
11541125 oracle_price = mm_oracle_price_data. get_price ( ) ;
11551126 oracle_twap_5min = market
11561127 . amm
11571128 . historical_oracle_data
11581129 . last_oracle_price_twap_5min ;
1159- perp_market_index = market. market_index ;
1160-
1161- min_auction_duration =
1162- market. get_min_perp_auction_duration ( state. min_perp_auction_duration ) ;
11631130 }
11641131
11651132 // allow oracle price to be used to calculate limit price if it's valid or stale for amm
11661133 let valid_oracle_price =
11671134 if is_oracle_valid_for_action ( safe_oracle_validity, Some ( DriftAction :: OracleOrderPrice ) ) ? {
11681135 Some ( oracle_price)
11691136 } else {
1170- msg ! ( "Perp market = {} oracle deemed invalid" , perp_market_index ) ;
1137+ msg ! ( "Perp market = {} oracle deemed invalid" , market_index ) ;
11711138 None
11721139 } ;
11731140
@@ -1296,16 +1263,6 @@ pub fn fill_perp_order(
12961263 return Ok ( ( 0 , 0 ) ) ;
12971264 }
12981265
1299- let amm_availability = if amm_is_available {
1300- if amm_can_skip_duration && user_can_skip_duration {
1301- AMMAvailability :: Immediate
1302- } else {
1303- AMMAvailability :: AfterMinDuration
1304- }
1305- } else {
1306- AMMAvailability :: Unavailable
1307- } ;
1308-
13091266 let ( base_asset_amount, quote_asset_amount) = fulfill_perp_order (
13101267 user,
13111268 order_index,
@@ -1326,8 +1283,7 @@ pub fn fill_perp_order(
13261283 valid_oracle_price,
13271284 now,
13281285 slot,
1329- min_auction_duration,
1330- amm_availability,
1286+ amm_is_available,
13311287 fill_mode,
13321288 oracle_stale_for_margin,
13331289 rev_share_escrow,
@@ -1807,8 +1763,7 @@ fn fulfill_perp_order(
18071763 valid_oracle_price : Option < i64 > ,
18081764 now : i64 ,
18091765 slot : u64 ,
1810- min_auction_duration : u8 ,
1811- amm_availability : AMMAvailability ,
1766+ amm_is_available : bool ,
18121767 fill_mode : FillMode ,
18131768 oracle_stale_for_margin : bool ,
18141769 rev_share_escrow : & mut Option < & mut RevenueShareEscrowZeroCopyMut > ,
@@ -1832,19 +1787,13 @@ fn fulfill_perp_order(
18321787
18331788 let fulfillment_methods = {
18341789 let market = perp_market_map. get_ref ( & market_index) ?;
1835- let oracle_price = oracle_map. get_price_data ( & market. oracle_id ( ) ) ?. price ;
1836-
18371790 determine_perp_fulfillment_methods (
18381791 & user. orders [ user_order_index] ,
18391792 maker_orders_info,
18401793 & market. amm ,
18411794 reserve_price_before,
1842- Some ( oracle_price) ,
18431795 limit_price,
1844- amm_availability,
1845- slot,
1846- min_auction_duration,
1847- fill_mode,
1796+ amm_is_available,
18481797 ) ?
18491798 } ;
18501799
@@ -3244,6 +3193,7 @@ pub fn trigger_order(
32443193 . last_oracle_price_twap ,
32453194 perp_market. get_max_confidence_interval_multiplier ( ) ?,
32463195 0 ,
3196+ 0 ,
32473197 ) ?;
32483198
32493199 let is_oracle_valid =
@@ -5560,6 +5510,7 @@ pub fn trigger_spot_order(
55605510 spot_market. historical_oracle_data . last_oracle_price_twap ,
55615511 spot_market. get_max_confidence_interval_multiplier ( ) ?,
55625512 0 ,
5513+ 0 ,
55635514 ) ?;
55645515 let strict_oracle_price = StrictOraclePrice {
55655516 current : oracle_price_data. price ,
0 commit comments