diff --git a/programs/drift/src/controller/orders.rs b/programs/drift/src/controller/orders.rs index 1e461a5855..9544a6b53a 100644 --- a/programs/drift/src/controller/orders.rs +++ b/programs/drift/src/controller/orders.rs @@ -901,7 +901,15 @@ fn merge_modify_order_params_with_existing_order( existing_order: &Order, modify_order_params: &ModifyOrderParams, ) -> DriftResult> { - let order_type = existing_order.order_type; + let existing_order_triggered = existing_order.order_type == OrderType::TriggerLimit + && existing_order.triggered(); + let user_modifying_trigger_price = modify_order_params.trigger_price.is_some(); + + let order_type = if existing_order_triggered && !user_modifying_trigger_price { + OrderType::Limit + } else { + existing_order.order_type + }; let market_type = existing_order.market_type; let direction = modify_order_params .direction @@ -935,20 +943,18 @@ fn merge_modify_order_params_with_existing_order( }); let bit_flags = 0; let max_ts = modify_order_params.max_ts.or(Some(existing_order.max_ts)); - let trigger_price = modify_order_params - .trigger_price - .or(Some(existing_order.trigger_price)); - let trigger_condition = - modify_order_params - .trigger_condition - .unwrap_or(match existing_order.trigger_condition { - OrderTriggerCondition::TriggeredAbove | OrderTriggerCondition::Above => { - OrderTriggerCondition::Above - } - OrderTriggerCondition::TriggeredBelow | OrderTriggerCondition::Below => { - OrderTriggerCondition::Below - } - }); + let (trigger_price, trigger_condition) = if existing_order_triggered && !user_modifying_trigger_price { + (None, OrderTriggerCondition::Above) + } else { + ( + modify_order_params + .trigger_price + .or(Some(existing_order.trigger_price)), + modify_order_params + .trigger_condition + .unwrap_or(existing_order.trigger_condition), + ) + }; let oracle_price_offset = modify_order_params .oracle_price_offset .or(Some(existing_order.oracle_price_offset));