Skip to content

Commit df87570

Browse files
authored
program: add paused operations to user stats (#2037)
* program: add paused operations to user stats * tweaks * fix * CHANGELOG
1 parent b7f5a60 commit df87570

File tree

10 files changed

+159
-56
lines changed

10 files changed

+159
-56
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Features
1111

12+
- program: add reduce only atomic taking against amm option [#2037](https://github.com/drift-labs/protocol-v2/pull/2037)
13+
1214
### Fixes
1315

1416
### Breaking

programs/drift/src/controller/orders.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -996,8 +996,13 @@ pub fn fill_perp_order(
996996
.position(|order| order.order_id == order_id && order.status == OrderStatus::Open)
997997
.ok_or_else(print_error!(ErrorCode::OrderDoesNotExist))?;
998998

999-
let (order_status, market_index, order_market_type) =
1000-
get_struct_values!(user.orders[order_index], status, market_index, market_type);
999+
let (order_status, market_index, order_market_type, order_reduce_only) = get_struct_values!(
1000+
user.orders[order_index],
1001+
status,
1002+
market_index,
1003+
market_type,
1004+
reduce_only
1005+
);
10011006

10021007
validate!(
10031008
order_market_type == MarketType::Perp,
@@ -1095,7 +1100,7 @@ pub fn fill_perp_order(
10951100
market.amm.oracle_low_risk_slot_delay_override,
10961101
)?;
10971102

1098-
user_can_skip_duration = user.can_skip_auction_duration(user_stats)?;
1103+
user_can_skip_duration = user.can_skip_auction_duration(user_stats, order_reduce_only)?;
10991104
amm_is_available &= market.amm_can_fill_order(
11001105
&user.orders[order_index],
11011106
slot,

programs/drift/src/controller/orders/amm_jit_tests.rs

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,9 @@ pub mod amm_jit {
332332

333333
let order_index = 0;
334334
let min_auction_duration = 0;
335-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
335+
let user_can_skip_auction_duration = taker
336+
.can_skip_auction_duration(&taker_stats, false)
337+
.unwrap();
336338
let is_amm_available = get_amm_is_available(
337339
&taker.orders[order_index],
338340
min_auction_duration,
@@ -535,7 +537,9 @@ pub mod amm_jit {
535537

536538
let order_index = 0;
537539
let min_auction_duration = 10;
538-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
540+
let user_can_skip_auction_duration = taker
541+
.can_skip_auction_duration(&taker_stats, false)
542+
.unwrap();
539543
let is_amm_available = get_amm_is_available(
540544
&taker.orders[order_index],
541545
min_auction_duration,
@@ -749,7 +753,9 @@ pub mod amm_jit {
749753

750754
let order_index = 0;
751755
let min_auction_duration = 10;
752-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
756+
let user_can_skip_auction_duration = taker
757+
.can_skip_auction_duration(&taker_stats, false)
758+
.unwrap();
753759
let is_amm_available = get_amm_is_available(
754760
&taker.orders[order_index],
755761
min_auction_duration,
@@ -959,7 +965,9 @@ pub mod amm_jit {
959965

960966
let order_index = 0;
961967
let min_auction_duration = 10;
962-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
968+
let user_can_skip_auction_duration = taker
969+
.can_skip_auction_duration(&taker_stats, false)
970+
.unwrap();
963971
let is_amm_available = get_amm_is_available(
964972
&taker.orders[order_index],
965973
min_auction_duration,
@@ -1172,7 +1180,9 @@ pub mod amm_jit {
11721180

11731181
let order_index = 0;
11741182
let min_auction_duration = 0;
1175-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
1183+
let user_can_skip_auction_duration = taker
1184+
.can_skip_auction_duration(&taker_stats, false)
1185+
.unwrap();
11761186
let is_amm_available = get_amm_is_available(
11771187
&taker.orders[order_index],
11781188
min_auction_duration,
@@ -1393,7 +1403,9 @@ pub mod amm_jit {
13931403

13941404
let order_index = 0;
13951405
let min_auction_duration = 10;
1396-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
1406+
let user_can_skip_auction_duration = taker
1407+
.can_skip_auction_duration(&taker_stats, false)
1408+
.unwrap();
13971409
let is_amm_available = get_amm_is_available(
13981410
&taker.orders[order_index],
13991411
min_auction_duration,
@@ -1813,7 +1825,9 @@ pub mod amm_jit {
18131825

18141826
let order_index = 0;
18151827
let min_auction_duration = 0;
1816-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
1828+
let user_can_skip_auction_duration = taker
1829+
.can_skip_auction_duration(&taker_stats, false)
1830+
.unwrap();
18171831
let is_amm_available = get_amm_is_available(
18181832
&taker.orders[order_index],
18191833
min_auction_duration,
@@ -2013,7 +2027,9 @@ pub mod amm_jit {
20132027

20142028
let order_index = 0;
20152029
let min_auction_duration = 10;
2016-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
2030+
let user_can_skip_auction_duration = taker
2031+
.can_skip_auction_duration(&taker_stats, false)
2032+
.unwrap();
20172033
let is_amm_available = get_amm_is_available(
20182034
&taker.orders[order_index],
20192035
min_auction_duration,
@@ -2226,7 +2242,9 @@ pub mod amm_jit {
22262242

22272243
let order_index = 0;
22282244
let min_auction_duration = 10;
2229-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
2245+
let user_can_skip_auction_duration = taker
2246+
.can_skip_auction_duration(&taker_stats, false)
2247+
.unwrap();
22302248
let is_amm_available = get_amm_is_available(
22312249
&taker.orders[order_index],
22322250
min_auction_duration,
@@ -2778,8 +2796,9 @@ pub mod amm_jit {
27782796

27792797
let order_index = 0;
27802798
let min_auction_duration = 10;
2781-
let user_can_skip_auction_duration =
2782-
taker.can_skip_auction_duration(&taker_stats).unwrap();
2799+
let user_can_skip_auction_duration = taker
2800+
.can_skip_auction_duration(&taker_stats, false)
2801+
.unwrap();
27832802
let is_amm_available = get_amm_is_available(
27842803
&taker.orders[order_index],
27852804
min_auction_duration,
@@ -3022,7 +3041,9 @@ pub mod amm_jit {
30223041

30233042
let order_index = 0;
30243043
let min_auction_duration = 0;
3025-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
3044+
let user_can_skip_auction_duration = taker
3045+
.can_skip_auction_duration(&taker_stats, false)
3046+
.unwrap();
30263047
let is_amm_available = get_amm_is_available(
30273048
&taker.orders[order_index],
30283049
min_auction_duration,

programs/drift/src/controller/orders/fuel_tests.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,9 @@ pub mod fuel_scoring {
270270

271271
let order_index = 0;
272272
let min_auction_duration = 0;
273-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
273+
let user_can_skip_auction_duration = taker
274+
.can_skip_auction_duration(&taker_stats, false)
275+
.unwrap();
274276
let is_amm_available = get_amm_is_available(
275277
&taker.orders[order_index],
276278
min_auction_duration,

programs/drift/src/controller/orders/tests.rs

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ pub mod fill_order_protected_maker {
100100
use crate::state::spot_market_map::SpotMarketMap;
101101
use crate::state::state::State;
102102
use crate::state::user::{
103-
MarketType, OrderStatus, OrderType, SpotPosition, User, UserStats, UserStatus,
103+
MarketType, OrderStatus, OrderType, SpotPosition, User, UserStats,
104+
UserStatsPausedOperations, UserStatus,
104105
};
105106
use crate::test_utils::*;
106107
use crate::test_utils::{
@@ -231,7 +232,7 @@ pub mod fill_order_protected_maker {
231232
AccountLoader::try_from(&user_account_info).unwrap();
232233

233234
let mut taker_stats = UserStats {
234-
disable_update_perp_bid_ask_twap: true,
235+
paused_operations: UserStatsPausedOperations::AmmAtomicFill as u8,
235236
..UserStats::default()
236237
};
237238

@@ -323,7 +324,7 @@ pub mod fill_order_protected_maker {
323324

324325
// user exempt, no 10 bps applied for pmm
325326
let mut taker_stats = UserStats {
326-
disable_update_perp_bid_ask_twap: false,
327+
paused_operations: 0,
327328
..UserStats::default()
328329
};
329330

@@ -3367,7 +3368,9 @@ pub mod fulfill_order {
33673368

33683369
let order_index = 0;
33693370
let min_auction_duration = 0;
3370-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
3371+
let user_can_skip_auction_duration = taker
3372+
.can_skip_auction_duration(&taker_stats, false)
3373+
.unwrap();
33713374
let is_amm_available = get_amm_is_available(
33723375
&taker.orders[order_index],
33733376
min_auction_duration,
@@ -3625,7 +3628,9 @@ pub mod fulfill_order {
36253628

36263629
let order_index = 0;
36273630
let min_auction_duration = 10;
3628-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
3631+
let user_can_skip_auction_duration = taker
3632+
.can_skip_auction_duration(&taker_stats, false)
3633+
.unwrap();
36293634
let is_amm_available = get_amm_is_available(
36303635
&taker.orders[order_index],
36313636
min_auction_duration,
@@ -3831,7 +3836,9 @@ pub mod fulfill_order {
38313836

38323837
let order_index = 0;
38333838
let min_auction_duration = 0;
3834-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
3839+
let user_can_skip_auction_duration = taker
3840+
.can_skip_auction_duration(&taker_stats, false)
3841+
.unwrap();
38353842
let is_amm_available = get_amm_is_available(
38363843
&taker.orders[order_index],
38373844
min_auction_duration,
@@ -4050,7 +4057,9 @@ pub mod fulfill_order {
40504057

40514058
let order_index = 0;
40524059
let min_auction_duration = 10;
4053-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4060+
let user_can_skip_auction_duration = taker
4061+
.can_skip_auction_duration(&taker_stats, false)
4062+
.unwrap();
40544063
let is_amm_available = get_amm_is_available(
40554064
&taker.orders[order_index],
40564065
min_auction_duration,
@@ -4229,7 +4238,9 @@ pub mod fulfill_order {
42294238

42304239
let order_index = 0;
42314240
let min_auction_duration = 0;
4232-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4241+
let user_can_skip_auction_duration = taker
4242+
.can_skip_auction_duration(&taker_stats, false)
4243+
.unwrap();
42334244
let is_amm_available = get_amm_is_available(
42344245
&taker.orders[order_index],
42354246
min_auction_duration,
@@ -4440,7 +4451,9 @@ pub mod fulfill_order {
44404451

44414452
let order_index = 0;
44424453
let min_auction_duration = 10;
4443-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4454+
let user_can_skip_auction_duration = taker
4455+
.can_skip_auction_duration(&taker_stats, false)
4456+
.unwrap();
44444457
let is_amm_available = get_amm_is_available(
44454458
&taker.orders[order_index],
44464459
min_auction_duration,
@@ -4640,7 +4653,9 @@ pub mod fulfill_order {
46404653

46414654
let order_index = 0;
46424655
let min_auction_duration = 0;
4643-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4656+
let user_can_skip_auction_duration = taker
4657+
.can_skip_auction_duration(&taker_stats, false)
4658+
.unwrap();
46444659
let is_amm_available = get_amm_is_available(
46454660
&taker.orders[order_index],
46464661
min_auction_duration,
@@ -4793,7 +4808,9 @@ pub mod fulfill_order {
47934808

47944809
let order_index = 0;
47954810
let min_auction_duration = 0;
4796-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4811+
let user_can_skip_auction_duration = taker
4812+
.can_skip_auction_duration(&taker_stats, false)
4813+
.unwrap();
47974814
let is_amm_available = get_amm_is_available(
47984815
&taker.orders[order_index],
47994816
min_auction_duration,
@@ -4973,7 +4990,9 @@ pub mod fulfill_order {
49734990

49744991
let order_index = 0;
49754992
let min_auction_duration = 0;
4976-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4993+
let user_can_skip_auction_duration = taker
4994+
.can_skip_auction_duration(&taker_stats, false)
4995+
.unwrap();
49774996
let is_amm_available = get_amm_is_available(
49784997
&taker.orders[order_index],
49794998
min_auction_duration,
@@ -5576,7 +5595,9 @@ pub mod fulfill_order {
55765595

55775596
let order_index = 0;
55785597
let min_auction_duration = 10;
5579-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
5598+
let user_can_skip_auction_duration = taker
5599+
.can_skip_auction_duration(&taker_stats, false)
5600+
.unwrap();
55805601
let is_amm_available = get_amm_is_available(
55815602
&taker.orders[order_index],
55825603
min_auction_duration,
@@ -5833,7 +5854,9 @@ pub mod fulfill_order {
58335854

58345855
let order_index = 0;
58355856
let min_auction_duration = 0;
5836-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
5857+
let user_can_skip_auction_duration = taker
5858+
.can_skip_auction_duration(&taker_stats, false)
5859+
.unwrap();
58375860
let is_amm_available = get_amm_is_available(
58385861
&taker.orders[order_index],
58395862
min_auction_duration,

programs/drift/src/instructions/admin.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4484,19 +4484,19 @@ pub fn handle_update_spot_auction_duration(
44844484
Ok(())
44854485
}
44864486

4487-
pub fn handle_admin_disable_update_perp_bid_ask_twap(
4487+
pub fn handle_admin_update_user_stats_paused_operations(
44884488
ctx: Context<AdminDisableBidAskTwapUpdate>,
4489-
disable: bool,
4489+
paused_operations: u8,
44904490
) -> Result<()> {
44914491
let mut user_stats = load_mut!(ctx.accounts.user_stats)?;
44924492

44934493
msg!(
4494-
"disable_update_perp_bid_ask_twap: {:?} -> {:?}",
4495-
user_stats.disable_update_perp_bid_ask_twap,
4496-
disable
4494+
"user_stats.paused_operations: {:?} -> {:?}",
4495+
user_stats.paused_operations,
4496+
paused_operations
44974497
);
44984498

4499-
user_stats.disable_update_perp_bid_ask_twap = disable;
4499+
user_stats.paused_operations = paused_operations;
45004500
Ok(())
45014501
}
45024502

programs/drift/src/instructions/keeper.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2624,9 +2624,9 @@ pub fn handle_update_perp_bid_ask_twap<'c: 'info, 'info>(
26242624

26252625
let keeper_stats = load!(ctx.accounts.keeper_stats)?;
26262626
validate!(
2627-
!keeper_stats.disable_update_perp_bid_ask_twap,
2627+
keeper_stats.can_update_bid_ask_twap(),
26282628
ErrorCode::CantUpdatePerpBidAskTwap,
2629-
"Keeper stats disable_update_perp_bid_ask_twap is true"
2629+
"Keeper stats can_update_bid_ask_twap is false"
26302630
)?;
26312631

26322632
let min_if_stake = 1000 * QUOTE_PRECISION_U64;

programs/drift/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -528,11 +528,11 @@ pub mod drift {
528528
// handle_update_user_open_orders_count(ctx)
529529
// }
530530

531-
pub fn admin_disable_update_perp_bid_ask_twap(
531+
pub fn admin_update_user_stats_paused_operations(
532532
ctx: Context<AdminDisableBidAskTwapUpdate>,
533-
disable: bool,
533+
paused_operations: u8,
534534
) -> Result<()> {
535-
handle_admin_disable_update_perp_bid_ask_twap(ctx, disable)
535+
handle_admin_update_user_stats_paused_operations(ctx, paused_operations)
536536
}
537537

538538
pub fn settle_pnl<'c: 'info, 'info>(

0 commit comments

Comments
 (0)