Skip to content

Commit 70c4a4d

Browse files
committed
merge master
2 parents 648bf33 + d04bb0c commit 70c4a4d

Some content is hidden

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

44 files changed

+1812
-3065
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@ 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+
1013
### Features
1114

15+
- program: make imf smoother between hlm and non hlm users ([#1969](https://github.com/drift-labs/protocol-v2/pull/1969))
16+
1217
### Fixes
1318

1419
### Breaking

programs/drift/src/controller/orders.rs

Lines changed: 21 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ use crate::state::order_params::{
6565
ModifyOrderParams, OrderParams, PlaceOrderOptions, PostOnlyParam,
6666
};
6767
use crate::state::paused_operations::{PerpOperation, SpotOperation};
68-
use crate::state::perp_market::{AMMAvailability, MarketStatus, PerpMarket};
68+
use crate::state::perp_market::{MarketStatus, PerpMarket};
6969
use crate::state::perp_market_map::PerpMarketMap;
7070
use crate::state::protected_maker_mode_config::ProtectedMakerParams;
7171
use crate::state::spot_fulfillment_params::{ExternalSpotFill, SpotFulfillmentParams};
@@ -90,10 +90,6 @@ mod tests;
9090

9191
#[cfg(test)]
9292
mod amm_jit_tests;
93-
94-
#[cfg(test)]
95-
mod amm_lp_jit_tests;
96-
9793
#[cfg(test)]
9894
mod fuel_tests;
9995

@@ -1000,13 +996,8 @@ pub fn fill_perp_order(
1000996
.position(|order| order.order_id == order_id && order.status == OrderStatus::Open)
1001997
.ok_or_else(print_error!(ErrorCode::OrderDoesNotExist))?;
1002998

1003-
let (order_status, market_index, order_market_type, order_direction) = get_struct_values!(
1004-
user.orders[order_index],
1005-
status,
1006-
market_index,
1007-
market_type,
1008-
direction
1009-
);
999+
let (order_status, market_index, order_market_type) =
1000+
get_struct_values!(user.orders[order_index], status, market_index, market_type);
10101001

10111002
validate!(
10121003
order_market_type == MarketType::Perp,
@@ -1072,14 +1063,9 @@ pub fn fill_perp_order(
10721063
let safe_oracle_validity: OracleValidity;
10731064
let oracle_price: i64;
10741065
let oracle_twap_5min: i64;
1075-
let perp_market_index: u16;
10761066
let user_can_skip_duration: bool;
1077-
let amm_can_skip_duration: bool;
1078-
let amm_has_low_enough_inventory: bool;
1079-
let oracle_valid_for_amm_fill: bool;
10801067
let oracle_stale_for_margin: bool;
1081-
let min_auction_duration: u8;
1082-
let mut amm_is_available = !state.amm_paused()?;
1068+
let mut amm_is_available: bool = !state.amm_paused()?;
10831069
{
10841070
let market = &mut perp_market_map.get_ref_mut(&market_index)?;
10851071
validation::perp_market::validate_perp_market(market)?;
@@ -1106,59 +1092,40 @@ pub fn fill_perp_order(
11061092
&market.amm.oracle_source,
11071093
oracle::LogMode::SafeMMOracle,
11081094
market.amm.oracle_slot_delay_override,
1095+
market.amm.oracle_low_risk_slot_delay_override,
11091096
)?;
11101097

1111-
oracle_valid_for_amm_fill =
1112-
is_oracle_valid_for_action(safe_oracle_validity, Some(DriftAction::FillOrderAmm))?;
1098+
user_can_skip_duration = user.can_skip_auction_duration(user_stats)?;
1099+
amm_is_available &= market.amm_can_fill_order(
1100+
&user.orders[order_index],
1101+
slot,
1102+
fill_mode,
1103+
state,
1104+
safe_oracle_validity,
1105+
user_can_skip_duration,
1106+
&mm_oracle_price_data,
1107+
)?;
11131108

11141109
oracle_stale_for_margin = mm_oracle_price_data.get_delay()
11151110
> state
11161111
.oracle_guard_rails
11171112
.validity
11181113
.slots_before_stale_for_margin;
11191114

1120-
amm_is_available &= oracle_valid_for_amm_fill;
1121-
amm_is_available &= !market.is_operation_paused(PerpOperation::AmmFill);
1122-
amm_is_available &= !market.has_too_much_drawdown()?;
1123-
1124-
// We are already using safe oracle data from MM oracle.
1125-
// But AMM isnt available if we could have used MM oracle but fell back due to price diff
1126-
let amm_available_mm_oracle_recent_but_volatile =
1127-
if mm_oracle_price_data.is_enabled() && mm_oracle_price_data.is_mm_oracle_as_recent() {
1128-
let amm_available = !mm_oracle_price_data.is_mm_exchange_diff_bps_high();
1129-
amm_available
1130-
} else {
1131-
true
1132-
};
1133-
amm_is_available &= amm_available_mm_oracle_recent_but_volatile;
1134-
1135-
let amm_wants_to_jit_make = market.amm.amm_wants_to_jit_make(order_direction)?;
1136-
amm_has_low_enough_inventory = market
1137-
.amm
1138-
.amm_has_low_enough_inventory(amm_wants_to_jit_make)?;
1139-
amm_can_skip_duration =
1140-
market.can_skip_auction_duration(&state, amm_has_low_enough_inventory)?;
1141-
1142-
user_can_skip_duration = user.can_skip_auction_duration(user_stats)?;
1143-
11441115
reserve_price_before = market.amm.reserve_price()?;
11451116
oracle_price = mm_oracle_price_data.get_price();
11461117
oracle_twap_5min = market
11471118
.amm
11481119
.historical_oracle_data
11491120
.last_oracle_price_twap_5min;
1150-
perp_market_index = market.market_index;
1151-
1152-
min_auction_duration =
1153-
market.get_min_perp_auction_duration(state.min_perp_auction_duration);
11541121
}
11551122

11561123
// allow oracle price to be used to calculate limit price if it's valid or stale for amm
11571124
let valid_oracle_price =
11581125
if is_oracle_valid_for_action(safe_oracle_validity, Some(DriftAction::OracleOrderPrice))? {
11591126
Some(oracle_price)
11601127
} else {
1161-
msg!("Perp market = {} oracle deemed invalid", perp_market_index);
1128+
msg!("Perp market = {} oracle deemed invalid", market_index);
11621129
None
11631130
};
11641131

@@ -1287,16 +1254,6 @@ pub fn fill_perp_order(
12871254
return Ok((0, 0));
12881255
}
12891256

1290-
let amm_availability = if amm_is_available {
1291-
if amm_can_skip_duration && user_can_skip_duration {
1292-
AMMAvailability::Immediate
1293-
} else {
1294-
AMMAvailability::AfterMinDuration
1295-
}
1296-
} else {
1297-
AMMAvailability::Unavailable
1298-
};
1299-
13001257
let (base_asset_amount, quote_asset_amount) = fulfill_perp_order(
13011258
user,
13021259
order_index,
@@ -1317,8 +1274,7 @@ pub fn fill_perp_order(
13171274
valid_oracle_price,
13181275
now,
13191276
slot,
1320-
min_auction_duration,
1321-
amm_availability,
1277+
amm_is_available,
13221278
fill_mode,
13231279
oracle_stale_for_margin,
13241280
rev_share_escrow,
@@ -1784,8 +1740,7 @@ fn fulfill_perp_order(
17841740
valid_oracle_price: Option<i64>,
17851741
now: i64,
17861742
slot: u64,
1787-
min_auction_duration: u8,
1788-
amm_availability: AMMAvailability,
1743+
amm_is_available: bool,
17891744
fill_mode: FillMode,
17901745
oracle_stale_for_margin: bool,
17911746
rev_share_escrow: &mut Option<&mut RevenueShareEscrowZeroCopyMut>,
@@ -1809,19 +1764,13 @@ fn fulfill_perp_order(
18091764

18101765
let fulfillment_methods = {
18111766
let market = perp_market_map.get_ref(&market_index)?;
1812-
let oracle_price = oracle_map.get_price_data(&market.oracle_id())?.price;
1813-
18141767
determine_perp_fulfillment_methods(
18151768
&user.orders[user_order_index],
18161769
maker_orders_info,
18171770
&market.amm,
18181771
reserve_price_before,
1819-
Some(oracle_price),
18201772
limit_price,
1821-
amm_availability,
1822-
slot,
1823-
min_auction_duration,
1824-
fill_mode,
1773+
amm_is_available,
18251774
)?
18261775
};
18271776

@@ -3140,6 +3089,7 @@ pub fn trigger_order(
31403089
.last_oracle_price_twap,
31413090
perp_market.get_max_confidence_interval_multiplier()?,
31423091
0,
3092+
0,
31433093
)?;
31443094

31453095
let is_oracle_valid =
@@ -5437,6 +5387,7 @@ pub fn trigger_spot_order(
54375387
spot_market.historical_oracle_data.last_oracle_price_twap,
54385388
spot_market.get_max_confidence_interval_multiplier()?,
54395389
0,
5390+
0,
54405391
)?;
54415392
let strict_oracle_price = StrictOraclePrice {
54425393
current: oracle_price_data.price,

0 commit comments

Comments
 (0)