Skip to content

Commit 39c4d65

Browse files
committed
merge master
2 parents 5702b5e + d04bb0c commit 39c4d65

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1972
-3089
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
- program: relax filling conditions for low risk orders vs amm ([#1968](https://github.com/drift-labs/protocol-v2/pull/1968))
11+
- sdk: make oracle validity match program and propogate to dlob and math functions ([#1968](https://github.com/drift-labs/protocol-v2/pull/1968))
12+
13+
### Features
14+
15+
- program: make imf smoother between hlm and non hlm users ([#1969](https://github.com/drift-labs/protocol-v2/pull/1969))
16+
17+
### Fixes
18+
19+
### Breaking
20+
21+
## [2.142.0] - 2025-10-14
22+
1023
### Features
1124

1225
### Fixes

programs/drift/src/controller/orders.rs

Lines changed: 21 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ use crate::state::order_params::{
6262
ModifyOrderParams, OrderParams, PlaceOrderOptions, PostOnlyParam,
6363
};
6464
use crate::state::paused_operations::{PerpOperation, SpotOperation};
65-
use crate::state::perp_market::{AMMAvailability, MarketStatus, PerpMarket};
65+
use crate::state::perp_market::{MarketStatus, PerpMarket};
6666
use crate::state::perp_market_map::PerpMarketMap;
6767
use crate::state::protected_maker_mode_config::ProtectedMakerParams;
6868
use crate::state::spot_fulfillment_params::{ExternalSpotFill, SpotFulfillmentParams};
@@ -88,10 +88,6 @@ mod tests;
8888

8989
#[cfg(test)]
9090
mod amm_jit_tests;
91-
92-
#[cfg(test)]
93-
mod amm_lp_jit_tests;
94-
9591
#[cfg(test)]
9692
mod 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

Comments
 (0)