Skip to content

Commit d04bb0c

Browse files
amm available for low risk orders (#1968)
* amm available for low risk orders * remove unnecessary import * all builds * repurpose taker_speed_bump_override * fix one test * better CU opt for amm_can_fill_order * add tests for amm_can_fill_order and is_oracle_low_risk * fix test * sdk changes starting * sdk still has errors * fix sdk * update idl * tests pass + sdk changes + rename taker_speed_bump_override * apply max in getOracleValidity * add changelog and address comments * make linter happy * calculate_repeg_validity change * cump switchboard tx cus ix * update idl --------- Co-authored-by: Chris Heaney <[email protected]>
1 parent 6af0b76 commit d04bb0c

File tree

34 files changed

+1275
-2988
lines changed

34 files changed

+1275
-2988
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ 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

1215
- program: make imf smoother between hlm and non hlm users ([#1969](https://github.com/drift-labs/protocol-v2/pull/1969))

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

@@ -998,13 +994,8 @@ pub fn fill_perp_order(
998994
.position(|order| order.order_id == order_id && order.status == OrderStatus::Open)
999995
.ok_or_else(print_error!(ErrorCode::OrderDoesNotExist))?;
1000996

1001-
let (order_status, market_index, order_market_type, order_direction) = get_struct_values!(
1002-
user.orders[order_index],
1003-
status,
1004-
market_index,
1005-
market_type,
1006-
direction
1007-
);
997+
let (order_status, market_index, order_market_type) =
998+
get_struct_values!(user.orders[order_index], status, market_index, market_type);
1008999

10091000
validate!(
10101001
order_market_type == MarketType::Perp,
@@ -1070,14 +1061,9 @@ pub fn fill_perp_order(
10701061
let safe_oracle_validity: OracleValidity;
10711062
let oracle_price: i64;
10721063
let oracle_twap_5min: i64;
1073-
let perp_market_index: u16;
10741064
let user_can_skip_duration: bool;
1075-
let amm_can_skip_duration: bool;
1076-
let amm_has_low_enough_inventory: bool;
1077-
let oracle_valid_for_amm_fill: bool;
10781065
let oracle_stale_for_margin: bool;
1079-
let min_auction_duration: u8;
1080-
let mut amm_is_available = !state.amm_paused()?;
1066+
let mut amm_is_available: bool = !state.amm_paused()?;
10811067
{
10821068
let market = &mut perp_market_map.get_ref_mut(&market_index)?;
10831069
validation::perp_market::validate_perp_market(market)?;
@@ -1104,59 +1090,40 @@ pub fn fill_perp_order(
11041090
&market.amm.oracle_source,
11051091
oracle::LogMode::SafeMMOracle,
11061092
market.amm.oracle_slot_delay_override,
1093+
market.amm.oracle_low_risk_slot_delay_override,
11071094
)?;
11081095

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

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

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

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

@@ -1285,16 +1252,6 @@ pub fn fill_perp_order(
12851252
return Ok((0, 0));
12861253
}
12871254

1288-
let amm_availability = if amm_is_available {
1289-
if amm_can_skip_duration && user_can_skip_duration {
1290-
AMMAvailability::Immediate
1291-
} else {
1292-
AMMAvailability::AfterMinDuration
1293-
}
1294-
} else {
1295-
AMMAvailability::Unavailable
1296-
};
1297-
12981255
let (base_asset_amount, quote_asset_amount) = fulfill_perp_order(
12991256
user,
13001257
order_index,
@@ -1315,8 +1272,7 @@ pub fn fill_perp_order(
13151272
valid_oracle_price,
13161273
now,
13171274
slot,
1318-
min_auction_duration,
1319-
amm_availability,
1275+
amm_is_available,
13201276
fill_mode,
13211277
oracle_stale_for_margin,
13221278
rev_share_escrow,
@@ -1782,8 +1738,7 @@ fn fulfill_perp_order(
17821738
valid_oracle_price: Option<i64>,
17831739
now: i64,
17841740
slot: u64,
1785-
min_auction_duration: u8,
1786-
amm_availability: AMMAvailability,
1741+
amm_is_available: bool,
17871742
fill_mode: FillMode,
17881743
oracle_stale_for_margin: bool,
17891744
rev_share_escrow: &mut Option<&mut RevenueShareEscrowZeroCopyMut>,
@@ -1807,19 +1762,13 @@ fn fulfill_perp_order(
18071762

18081763
let fulfillment_methods = {
18091764
let market = perp_market_map.get_ref(&market_index)?;
1810-
let oracle_price = oracle_map.get_price_data(&market.oracle_id())?.price;
1811-
18121765
determine_perp_fulfillment_methods(
18131766
&user.orders[user_order_index],
18141767
maker_orders_info,
18151768
&market.amm,
18161769
reserve_price_before,
1817-
Some(oracle_price),
18181770
limit_price,
1819-
amm_availability,
1820-
slot,
1821-
min_auction_duration,
1822-
fill_mode,
1771+
amm_is_available,
18231772
)?
18241773
};
18251774

@@ -3138,6 +3087,7 @@ pub fn trigger_order(
31383087
.last_oracle_price_twap,
31393088
perp_market.get_max_confidence_interval_multiplier()?,
31403089
0,
3090+
0,
31413091
)?;
31423092

31433093
let is_oracle_valid =
@@ -5435,6 +5385,7 @@ pub fn trigger_spot_order(
54355385
spot_market.historical_oracle_data.last_oracle_price_twap,
54365386
spot_market.get_max_confidence_interval_multiplier()?,
54375387
0,
5388+
0,
54385389
)?;
54395390
let strict_oracle_price = StrictOraclePrice {
54405391
current: oracle_price_data.price,

0 commit comments

Comments
 (0)