Skip to content

Commit 59524de

Browse files
crispheaney0xbigz
andauthored
program: check limit price after applying buffer in trigger limit ord… (#1648)
* program: check limit price after applying buffer in trigger limit order auction * program: reduce duplicate code * fix tests * CHANGELOG --------- Co-authored-by: 0xbigz <[email protected]>
1 parent d970769 commit 59524de

File tree

3 files changed

+18
-15
lines changed

3 files changed

+18
-15
lines changed

CHANGELOG.md

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

1414
- sdk: fix to getMaxTradeSizeUSDCForPerp which was previously overshooting max allowed size due to IMF factor
1515
- program: add existing position fields to order records ([#1614](https://github.com/drift-labs/protocol-v2/pull/1614))
16+
- program: check limit price after applying buffer in trigger limit order ([#1648](https://github.com/drift-labs/protocol-v2/pull/1648))
1617

1718
### Breaking
1819

programs/drift/src/state/order_params.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -480,17 +480,8 @@ impl OrderParams {
480480
let (mut auction_start_price, mut auction_end_price) = if limit_price != 0 {
481481
let (auction_start_price_offset, auction_end_price_offset) =
482482
OrderParams::get_perp_baseline_start_end_price_offset(perp_market, direction, 2)?;
483-
let mut auction_start_price = oracle_price.safe_add(auction_start_price_offset)?;
484-
let mut auction_end_price = oracle_price.safe_add(auction_end_price_offset)?;
485-
486-
let limit_price = limit_price as i64;
487-
if direction == PositionDirection::Long {
488-
auction_start_price = auction_start_price.min(limit_price);
489-
auction_end_price = auction_end_price.min(limit_price);
490-
} else {
491-
auction_start_price = auction_start_price.max(limit_price);
492-
auction_end_price = auction_end_price.max(limit_price);
493-
};
483+
let auction_start_price = oracle_price.safe_add(auction_start_price_offset)?;
484+
let auction_end_price = oracle_price.safe_add(auction_end_price_offset)?;
494485

495486
(auction_start_price, auction_end_price)
496487
} else {
@@ -528,6 +519,17 @@ impl OrderParams {
528519
auction_end_price = auction_end_price.min(MAX_PREDICTION_MARKET_PRICE_I64);
529520
}
530521

522+
if limit_price != 0 {
523+
let limit_price = limit_price as i64;
524+
if direction == PositionDirection::Long {
525+
auction_start_price = auction_start_price.min(limit_price);
526+
auction_end_price = auction_end_price.min(limit_price);
527+
} else {
528+
auction_start_price = auction_start_price.max(limit_price);
529+
auction_end_price = auction_end_price.max(limit_price);
530+
}
531+
}
532+
531533
let auction_duration = get_auction_duration(
532534
auction_end_price
533535
.safe_sub(auction_start_price)?

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,7 +1016,7 @@ mod update_perp_auction_params {
10161016
direction: PositionDirection::Long,
10171017
auction_start_price: None,
10181018
auction_end_price: None,
1019-
price: 95 * PRICE_PRECISION_U64,
1019+
price: 99 * PRICE_PRECISION_U64,
10201020
auction_duration: None,
10211021

10221022
..OrderParams::default()
@@ -1028,7 +1028,7 @@ mod update_perp_auction_params {
10281028
assert_ne!(order_params_before, order_params_after);
10291029
assert_eq!(
10301030
order_params_after.auction_start_price.unwrap(),
1031-
95 * PRICE_PRECISION_I64 - oracle_price / 400
1031+
(99 * PRICE_PRECISION_I64 - oracle_price / 400) - 98920 // approx equal with some noise
10321032
);
10331033

10341034
let order_params_before = OrderParams {
@@ -1055,7 +1055,7 @@ mod update_perp_auction_params {
10551055
direction: PositionDirection::Short,
10561056
auction_start_price: None,
10571057
auction_end_price: None,
1058-
price: 100 * PRICE_PRECISION_U64,
1058+
price: 99 * PRICE_PRECISION_U64 + 100000,
10591059
auction_duration: None,
10601060

10611061
..OrderParams::default()
@@ -1067,7 +1067,7 @@ mod update_perp_auction_params {
10671067
assert_ne!(order_params_before, order_params_after);
10681068
assert_eq!(
10691069
order_params_after.auction_start_price.unwrap(),
1070-
100 * PRICE_PRECISION_I64 + oracle_price / 400
1070+
(99 * PRICE_PRECISION_U64 + 100000) as i64 + oracle_price / 400 + 18879 // use limit price and oracle buffer with some noise
10711071
);
10721072

10731073
let order_params_before = OrderParams {

0 commit comments

Comments
 (0)