Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

program: better derive perp auction params when missing #869

Merged
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions programs/drift/src/controller/orders.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2598,7 +2598,8 @@
&mut user.orders[order_index],
oracle_price_data,
slot,
state.min_perp_auction_duration,
30,
Some(&perp_market),

Check warning on line 2602 in programs/drift/src/controller/orders.rs

View check run for this annotation

Codecov / codecov/patch

programs/drift/src/controller/orders.rs#L2602

Added line #L2602 was not covered by tests
)?;

if user.orders[order_index].has_auction() {
Expand Down Expand Up @@ -2692,6 +2693,7 @@
oracle_price_data: &OraclePriceData,
slot: u64,
min_auction_duration: u8,
perp_market: Option<&PerpMarket>,
) -> DriftResult {
order.trigger_condition = match order.trigger_condition {
OrderTriggerCondition::Above => OrderTriggerCondition::TriggeredAbove,
Expand All @@ -2704,7 +2706,12 @@
order.slot = slot;

let (auction_duration, auction_start_price, auction_end_price) =
calculate_auction_params_for_trigger_order(order, oracle_price_data, min_auction_duration)?;
calculate_auction_params_for_trigger_order(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

probably should still check if trigger limit passes oracle to determine auction

order,
oracle_price_data,
min_auction_duration,
perp_market,
)?;

order.auction_duration = auction_duration;
order.auction_start_price = auction_start_price;
Expand Down Expand Up @@ -4696,7 +4703,8 @@
&mut user.orders[order_index],
oracle_price_data,
slot,
state.default_spot_auction_duration,
30,
None,

Check warning on line 4707 in programs/drift/src/controller/orders.rs

View check run for this annotation

Codecov / codecov/patch

programs/drift/src/controller/orders.rs#L4707

Added line #L4707 was not covered by tests
)?;

if user.orders[order_index].has_auction() {
Expand Down
38 changes: 30 additions & 8 deletions programs/drift/src/controller/orders/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10488,8 +10488,14 @@ pub mod update_trigger_order_params {
let slot = 10;
let min_auction_duration = 10;

update_trigger_order_params(&mut order, &oracle_price_data, slot, min_auction_duration)
.unwrap();
update_trigger_order_params(
&mut order,
&oracle_price_data,
slot,
min_auction_duration,
None,
)
.unwrap();

assert_eq!(order.slot, slot);
assert_eq!(order.auction_duration, min_auction_duration);
Expand All @@ -10507,8 +10513,14 @@ pub mod update_trigger_order_params {
..Order::default()
};

update_trigger_order_params(&mut order, &oracle_price_data, slot, min_auction_duration)
.unwrap();
update_trigger_order_params(
&mut order,
&oracle_price_data,
slot,
min_auction_duration,
None,
)
.unwrap();

assert_eq!(order.slot, slot);
assert_eq!(order.auction_duration, min_auction_duration);
Expand All @@ -10526,8 +10538,13 @@ pub mod update_trigger_order_params {
..Order::default()
};

let err =
update_trigger_order_params(&mut order, &oracle_price_data, slot, min_auction_duration);
let err = update_trigger_order_params(
&mut order,
&oracle_price_data,
slot,
min_auction_duration,
None,
);
assert!(err.is_err());

let mut order = Order {
Expand All @@ -10537,8 +10554,13 @@ pub mod update_trigger_order_params {
..Order::default()
};

let err =
update_trigger_order_params(&mut order, &oracle_price_data, slot, min_auction_duration);
let err = update_trigger_order_params(
&mut order,
&oracle_price_data,
slot,
min_auction_duration,
None,
);
assert!(err.is_err());
}
}
Expand Down
23 changes: 20 additions & 3 deletions programs/drift/src/math/auction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
use crate::state::user::{Order, OrderType};
use solana_program::msg;

use crate::state::perp_market::PerpMarket;
use crate::OrderParams;
use std::cmp::min;

#[cfg(test)]
Expand Down Expand Up @@ -218,6 +220,7 @@
order: &Order,
oracle_price_data: &OraclePriceData,
min_auction_duration: u8,
perp_market: Option<&PerpMarket>,
) -> DriftResult<(u8, i64, i64)> {
// if trigger limit doesn't cross oracle, no auction
if order.order_type == OrderType::TriggerLimit {
Expand All @@ -233,8 +236,22 @@

let auction_duration = min_auction_duration;

let (auction_start_price, auction_end_price) =
calculate_auction_prices(oracle_price_data, order.direction, order.price)?;
if let Some(perp_market) = perp_market {
let (auction_start_price, auction_end_price, derived_auction_duration) =

Check warning on line 240 in programs/drift/src/math/auction.rs

View check run for this annotation

Codecov / codecov/patch

programs/drift/src/math/auction.rs#L240

Added line #L240 was not covered by tests
OrderParams::derive_market_order_auction_params(
perp_market,
order.direction,
oracle_price_data.price,
order.price,

Check warning on line 245 in programs/drift/src/math/auction.rs

View check run for this annotation

Codecov / codecov/patch

programs/drift/src/math/auction.rs#L243-L245

Added lines #L243 - L245 were not covered by tests
)?;

Ok((auction_duration, auction_start_price, auction_end_price))
let auction_duration = auction_duration.max(derived_auction_duration);

Check warning on line 248 in programs/drift/src/math/auction.rs

View check run for this annotation

Codecov / codecov/patch

programs/drift/src/math/auction.rs#L248

Added line #L248 was not covered by tests

Ok((auction_duration, auction_start_price, auction_end_price))

Check warning on line 250 in programs/drift/src/math/auction.rs

View check run for this annotation

Codecov / codecov/patch

programs/drift/src/math/auction.rs#L250

Added line #L250 was not covered by tests
} else {
let (auction_start_price, auction_end_price) =
calculate_auction_prices(oracle_price_data, order.direction, order.price)?;

Ok((auction_duration, auction_start_price, auction_end_price))
}
}
6 changes: 6 additions & 0 deletions programs/drift/src/math/auction/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@ mod calculate_auction_params_for_trigger_order {
&order,
&oracle_price_data,
min_auction_duration,
None,
)
.unwrap();
assert_eq!(auction_duration, 0);
Expand All @@ -412,6 +413,7 @@ mod calculate_auction_params_for_trigger_order {
&order,
&oracle_price_data,
min_auction_duration,
None,
)
.unwrap();
assert_eq!(auction_duration, 0);
Expand All @@ -426,6 +428,7 @@ mod calculate_auction_params_for_trigger_order {
&order,
&oracle_price_data,
min_auction_duration,
None,
)
.unwrap();
assert_eq!(auction_duration, 10);
Expand All @@ -440,6 +443,7 @@ mod calculate_auction_params_for_trigger_order {
&order,
&oracle_price_data,
min_auction_duration,
None,
)
.unwrap();

Expand Down Expand Up @@ -467,6 +471,7 @@ mod calculate_auction_params_for_trigger_order {
&order,
&oracle_price_data,
min_auction_duration,
None,
)
.unwrap();

Expand All @@ -481,6 +486,7 @@ mod calculate_auction_params_for_trigger_order {
&order,
&oracle_price_data,
min_auction_duration,
None,
)
.unwrap();

Expand Down
Loading
Loading