@@ -442,6 +442,7 @@ pub fn place_perp_order(
442442 None ,
443443 None ,
444444 None ,
445+ None ,
445446 ) ?;
446447 emit_stack :: < _ , { OrderActionRecord :: SIZE } > ( order_action_record) ?;
447448
@@ -721,6 +722,7 @@ pub fn cancel_order(
721722 None ,
722723 None ,
723724 None ,
725+ None ,
724726 ) ?;
725727 emit_stack :: < _ , { OrderActionRecord :: SIZE } > ( order_action_record) ?;
726728 }
@@ -1324,7 +1326,7 @@ pub fn fill_perp_order(
13241326 let fill_price =
13251327 calculate_fill_price ( quote_asset_amount, base_asset_amount, BASE_PRECISION_U64 ) ?;
13261328
1327- let perp_market = perp_market_map. get_ref ( & market_index) ?;
1329+ let mut perp_market = perp_market_map. get_ref_mut ( & market_index) ?;
13281330 validate_fill_price_within_price_bands (
13291331 fill_price,
13301332 oracle_price,
@@ -1335,6 +1337,8 @@ pub fn fill_perp_order(
13351337 . max_oracle_twap_5min_percent_divergence ( ) ,
13361338 perp_market. is_prediction_market ( ) ,
13371339 ) ?;
1340+
1341+ perp_market. last_fill_price = fill_price;
13381342 }
13391343
13401344 let base_asset_amount_after = user. perp_positions [ position_index] . base_asset_amount ;
@@ -2449,6 +2453,7 @@ pub fn fulfill_perp_order_with_amm(
24492453 taker_existing_base_asset_amount,
24502454 maker_existing_quote_entry_amount,
24512455 maker_existing_base_asset_amount,
2456+ None ,
24522457 ) ?;
24532458 emit_stack :: < _ , { OrderActionRecord :: SIZE } > ( order_action_record) ?;
24542459
@@ -2897,6 +2902,7 @@ pub fn fulfill_perp_order_with_match(
28972902 taker_existing_base_asset_amount,
28982903 maker_existing_quote_entry_amount,
28992904 maker_existing_base_asset_amount,
2905+ None ,
29002906 ) ?;
29012907 emit_stack :: < _ , { OrderActionRecord :: SIZE } > ( order_action_record) ?;
29022908
@@ -2989,11 +2995,10 @@ pub fn trigger_order(
29892995 "Order is not triggerable"
29902996 ) ?;
29912997
2992- validate ! (
2993- !user. orders[ order_index] . triggered( ) ,
2994- ErrorCode :: OrderNotTriggerable ,
2995- "Order is already triggered"
2996- ) ?;
2998+ if user. orders [ order_index] . triggered ( ) {
2999+ msg ! ( "Order is already triggered" ) ;
3000+ return Ok ( ( ) ) ;
3001+ }
29973002
29983003 validate ! (
29993004 market_type == MarketType :: Perp ,
@@ -3049,10 +3054,9 @@ pub fn trigger_order(
30493054 "oracle price vs twap too divergent"
30503055 ) ?;
30513056
3052- let can_trigger = order_satisfies_trigger_condition (
3053- & user. orders [ order_index] ,
3054- oracle_price. unsigned_abs ( ) . cast ( ) ?,
3055- ) ?;
3057+ let trigger_price =
3058+ perp_market. get_trigger_price ( oracle_price, now, state. use_median_trigger_price ( ) ) ?;
3059+ let can_trigger = order_satisfies_trigger_condition ( & user. orders [ order_index] , trigger_price) ?;
30563060 validate ! ( can_trigger, ErrorCode :: OrderDidNotSatisfyTriggerCondition ) ?;
30573061
30583062 let ( _, worst_case_liability_value_before) = user
@@ -3125,6 +3129,7 @@ pub fn trigger_order(
31253129 None ,
31263130 None ,
31273131 None ,
3132+ Some ( trigger_price) ,
31283133 ) ?;
31293134 emit ! ( order_action_record) ;
31303135
@@ -3810,6 +3815,7 @@ pub fn place_spot_order(
38103815 None ,
38113816 None ,
38123817 None ,
3818+ None ,
38133819 ) ?;
38143820 emit_stack :: < _ , { OrderActionRecord :: SIZE } > ( order_action_record) ?;
38153821
@@ -5046,6 +5052,7 @@ pub fn fulfill_spot_order_with_match(
50465052 None ,
50475053 None ,
50485054 None ,
5055+ None ,
50495056 ) ?;
50505057 emit_stack :: < _ , { OrderActionRecord :: SIZE } > ( order_action_record) ?;
50515058
@@ -5319,6 +5326,7 @@ pub fn fulfill_spot_order_with_external_market(
53195326 None ,
53205327 None ,
53215328 None ,
5329+ None ,
53225330 ) ?;
53235331 emit_stack :: < _ , { OrderActionRecord :: SIZE } > ( order_action_record) ?;
53245332
@@ -5522,6 +5530,7 @@ pub fn trigger_spot_order(
55225530 None ,
55235531 None ,
55245532 None ,
5533+ Some ( oracle_price. unsigned_abs ( ) ) ,
55255534 ) ?;
55265535
55275536 emit ! ( order_action_record) ;
0 commit comments