Skip to content

Commit 967236a

Browse files
authored
program: update get_perp_baseline_start_price_offset (#868)
* bigz/update-get_perp_baseline_start_price_offset * bigz/update-get_perp_baseline_start_price_offset
1 parent 4b39b96 commit 967236a

File tree

2 files changed

+63
-18
lines changed

2 files changed

+63
-18
lines changed

programs/drift/src/state/order_params.rs

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::math::safe_unwrap::SafeUnwrap;
66
use crate::state::events::OrderActionExplanation;
77
use crate::state::perp_market::{ContractTier, PerpMarket};
88
use crate::state::user::{MarketType, OrderTriggerCondition, OrderType};
9-
use crate::PERCENTAGE_PRECISION_U64;
9+
use crate::{PERCENTAGE_PRECISION_U64, PRICE_PRECISION_I64};
1010
use anchor_lang::prelude::*;
1111
use borsh::{BorshDeserialize, BorshSerialize};
1212
use std::ops::Div;
@@ -66,7 +66,7 @@ impl OrderParams {
6666
}
6767

6868
let auction_start_price_offset =
69-
OrderParams::get_perp_baseline_start_price_offset(perp_market)?;
69+
OrderParams::get_perp_baseline_start_price_offset(perp_market, self.direction)?;
7070
let new_auction_start_price = oracle_price.safe_add(auction_start_price_offset)?;
7171

7272
if self.auction_duration.is_none() {
@@ -179,7 +179,7 @@ impl OrderParams {
179179
}
180180

181181
let new_start_price_offset =
182-
OrderParams::get_perp_baseline_start_price_offset(perp_market)?;
182+
OrderParams::get_perp_baseline_start_price_offset(perp_market, self.direction)?;
183183
match self.direction {
184184
PositionDirection::Long => {
185185
let current_start_price_offset =
@@ -257,22 +257,63 @@ impl OrderParams {
257257
Ok(())
258258
}
259259

260-
pub fn get_perp_baseline_start_price_offset(perp_market: &PerpMarket) -> DriftResult<i64> {
260+
pub fn get_perp_baseline_start_price_offset(
261+
perp_market: &PerpMarket,
262+
direction: PositionDirection,
263+
) -> DriftResult<i64> {
261264
// price offsets baselines for perp market auctions
262-
263-
let mark_twap = perp_market
265+
let mark_twap_slow = perp_market
264266
.amm
265267
.last_ask_price_twap
266268
.safe_add(perp_market.amm.last_bid_price_twap)?
267-
.safe_div(2)?;
269+
.safe_div(2)?
270+
.cast::<i64>()?;
268271

269-
let baseline_start_price_offset = mark_twap.cast::<i64>()?.safe_sub(
272+
let baseline_start_price_offset_slow = mark_twap_slow.safe_sub(
270273
perp_market
271274
.amm
272275
.historical_oracle_data
273276
.last_oracle_price_twap,
274277
)?;
275278

279+
let baseline_start_price_offset_fast = perp_market
280+
.amm
281+
.last_mark_price_twap_5min
282+
.cast::<i64>()?
283+
.safe_sub(
284+
perp_market
285+
.amm
286+
.historical_oracle_data
287+
.last_oracle_price_twap_5min,
288+
)?;
289+
290+
let baseline_start_price_offset = match direction {
291+
PositionDirection::Long => {
292+
let frac_of_spread_in_price: i64 = perp_market
293+
.amm
294+
.long_spread
295+
.cast::<i64>()?
296+
.safe_mul(mark_twap_slow)?
297+
.safe_div(PRICE_PRECISION_I64 * 10)?;
298+
299+
baseline_start_price_offset_slow
300+
.max(baseline_start_price_offset_fast)
301+
.safe_add(frac_of_spread_in_price)?
302+
}
303+
PositionDirection::Short => {
304+
let frac_of_spread_in_price: i64 = perp_market
305+
.amm
306+
.short_spread
307+
.cast::<i64>()?
308+
.safe_mul(mark_twap_slow)?
309+
.safe_div(PRICE_PRECISION_I64 * 10)?;
310+
311+
baseline_start_price_offset_slow
312+
.min(baseline_start_price_offset_fast)
313+
.safe_sub(frac_of_spread_in_price)?
314+
}
315+
};
316+
276317
Ok(baseline_start_price_offset)
277318
}
278319

@@ -286,7 +327,7 @@ impl OrderParams {
286327
.last_oracle_price_twap
287328
.unsigned_abs();
288329
let baseline_start_price_offset =
289-
OrderParams::get_perp_baseline_start_price_offset(perp_market)?;
330+
OrderParams::get_perp_baseline_start_price_offset(perp_market, direction)?;
290331
let (min_divisor, max_divisor) = perp_market.get_auction_end_min_max_divisors()?;
291332

292333
let amm_spread_side_pct = if direction == PositionDirection::Short {

programs/drift/src/state/order_params/tests.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,10 @@ mod update_perp_auction_params {
173173
.update_perp_auction_params(&perp_market, oracle_price)
174174
.unwrap();
175175
assert_ne!(order_params_before, order_params_after);
176-
assert_eq!(order_params_after.auction_duration, Some(120));
176+
assert_eq!(order_params_after.auction_duration, Some(114));
177177
assert_eq!(
178178
order_params_after.auction_start_price,
179-
Some(100 * PRICE_PRECISION_I64)
179+
Some(100 * PRICE_PRECISION_I64 + 100000)
180180
);
181181
assert_eq!(
182182
order_params_after.auction_end_price,
@@ -214,10 +214,10 @@ mod update_perp_auction_params {
214214
.update_perp_auction_params(&perp_market, oracle_price)
215215
.unwrap();
216216
assert_ne!(order_params_before, order_params_after);
217-
assert_eq!(order_params_after.auction_duration, Some(120));
217+
assert_eq!(order_params_after.auction_duration, Some(114));
218218
assert_eq!(
219219
order_params_after.auction_start_price,
220-
Some(100 * PRICE_PRECISION_I64)
220+
Some(100 * PRICE_PRECISION_I64 - 100000) // %1 / 10 = 10 bps aggression
221221
);
222222
assert_eq!(
223223
order_params_after.auction_end_price,
@@ -265,7 +265,7 @@ mod update_perp_auction_params {
265265
.update_perp_auction_params(&perp_market, oracle_price)
266266
.unwrap();
267267
assert_ne!(order_params_before, order_params_after);
268-
assert_eq!(order_params_after.auction_start_price.unwrap(), 99117618);
268+
assert_eq!(order_params_after.auction_start_price.unwrap(), 99216638);
269269

270270
let order_params_before = OrderParams {
271271
order_type: OrderType::Market,
@@ -282,7 +282,7 @@ mod update_perp_auction_params {
282282
.update_perp_auction_params(&perp_market, oracle_price)
283283
.unwrap();
284284
assert_ne!(order_params_before, order_params_after);
285-
assert_eq!(order_params_after.auction_start_price.unwrap(), 99117618);
285+
assert_eq!(order_params_after.auction_start_price.unwrap(), 98900980);
286286

287287
let order_params_before = OrderParams {
288288
order_type: OrderType::Market,
@@ -351,7 +351,7 @@ mod update_perp_auction_params {
351351
.update_perp_auction_params(&perp_market, oracle_price)
352352
.unwrap();
353353
assert_ne!(order_params_before, order_params_after);
354-
assert_eq!(order_params_after.auction_start_price.unwrap(), 117618);
354+
assert_eq!(order_params_after.auction_start_price.unwrap(), 216638);
355355

356356
let order_params_before = OrderParams {
357357
order_type: OrderType::Oracle,
@@ -471,8 +471,10 @@ mod get_close_perp_params {
471471
let amm = AMM {
472472
last_ask_price_twap: 99 * PRICE_PRECISION_U64,
473473
last_bid_price_twap: 97 * PRICE_PRECISION_U64,
474+
last_mark_price_twap_5min: 98 * PRICE_PRECISION_U64,
474475
historical_oracle_data: HistoricalOracleData {
475476
last_oracle_price_twap: 100 * PRICE_PRECISION_I64,
477+
last_oracle_price_twap_5min: 100 * PRICE_PRECISION_I64,
476478
..HistoricalOracleData::default()
477479
},
478480
mark_std: PRICE_PRECISION_U64,
@@ -541,8 +543,10 @@ mod get_close_perp_params {
541543
let amm = AMM {
542544
last_ask_price_twap: 103 * PRICE_PRECISION_U64,
543545
last_bid_price_twap: 101 * PRICE_PRECISION_U64,
546+
last_mark_price_twap_5min: 102 * PRICE_PRECISION_U64,
544547
historical_oracle_data: HistoricalOracleData {
545548
last_oracle_price_twap: 100 * PRICE_PRECISION_I64,
549+
last_oracle_price_twap_5min: 100 * PRICE_PRECISION_I64,
546550
..HistoricalOracleData::default()
547551
},
548552
mark_std: PRICE_PRECISION_U64,
@@ -630,7 +634,7 @@ mod get_close_perp_params {
630634
let auction_start_price = params.auction_start_price.unwrap();
631635
let auction_end_price = params.auction_end_price.unwrap();
632636
let oracle_price_offset = params.oracle_price_offset.unwrap();
633-
assert_eq!(auction_start_price, 87705234);
637+
assert_eq!(auction_start_price, 81093372);
634638
assert_eq!(auction_end_price, -251200914);
635639
assert_eq!(oracle_price_offset, -251200914);
636640

@@ -668,7 +672,7 @@ mod get_close_perp_params {
668672
let auction_start_price = params.auction_start_price.unwrap();
669673
let auction_end_price = params.auction_end_price.unwrap();
670674
let oracle_price_offset = params.oracle_price_offset.unwrap();
671-
assert_eq!(auction_start_price, 183);
675+
assert_eq!(auction_start_price, 115);
672676
assert_eq!(auction_end_price, -1021);
673677
assert_eq!(oracle_price_offset, -1021);
674678

0 commit comments

Comments
 (0)