Skip to content

Commit a17e8c3

Browse files
committed
Merge remote-tracking branch 'origin/master' into chore/anchor-32
2 parents 1392999 + 0c1bb26 commit a17e8c3

File tree

21 files changed

+17862
-13857
lines changed

21 files changed

+17862
-13857
lines changed

CHANGELOG.md

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

1414
### Breaking
1515

16+
## [2.151.0] - 2025-12-03
17+
18+
### Features
19+
20+
- program: add reduce only atomic taking against amm option [#2037](https://github.com/drift-labs/protocol-v2/pull/2037)
21+
22+
### Fixes
23+
24+
### Breaking
25+
1626
## [2.150.0] - 2025-12-01
1727

1828
### Features

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

programs/drift/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "drift"
3-
version = "2.150.0"
3+
version = "2.151.0"
44
description = "Created with Anchor"
55
edition = "2018"
66

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
@@ -348,7 +348,9 @@ pub mod amm_jit {
348348

349349
let order_index = 0;
350350
let min_auction_duration = 0;
351-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
351+
let user_can_skip_auction_duration = taker
352+
.can_skip_auction_duration(&taker_stats, false)
353+
.unwrap();
352354
let is_amm_available = get_amm_is_available(
353355
&taker.orders[order_index],
354356
min_auction_duration,
@@ -551,7 +553,9 @@ pub mod amm_jit {
551553

552554
let order_index = 0;
553555
let min_auction_duration = 10;
554-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
556+
let user_can_skip_auction_duration = taker
557+
.can_skip_auction_duration(&taker_stats, false)
558+
.unwrap();
555559
let is_amm_available = get_amm_is_available(
556560
&taker.orders[order_index],
557561
min_auction_duration,
@@ -765,7 +769,9 @@ pub mod amm_jit {
765769

766770
let order_index = 0;
767771
let min_auction_duration = 10;
768-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
772+
let user_can_skip_auction_duration = taker
773+
.can_skip_auction_duration(&taker_stats, false)
774+
.unwrap();
769775
let is_amm_available = get_amm_is_available(
770776
&taker.orders[order_index],
771777
min_auction_duration,
@@ -975,7 +981,9 @@ pub mod amm_jit {
975981

976982
let order_index = 0;
977983
let min_auction_duration = 10;
978-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
984+
let user_can_skip_auction_duration = taker
985+
.can_skip_auction_duration(&taker_stats, false)
986+
.unwrap();
979987
let is_amm_available = get_amm_is_available(
980988
&taker.orders[order_index],
981989
min_auction_duration,
@@ -1196,7 +1204,9 @@ pub mod amm_jit {
11961204

11971205
let order_index = 0;
11981206
let min_auction_duration = 0;
1199-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
1207+
let user_can_skip_auction_duration = taker
1208+
.can_skip_auction_duration(&taker_stats, false)
1209+
.unwrap();
12001210
let is_amm_available = get_amm_is_available(
12011211
&taker.orders[order_index],
12021212
min_auction_duration,
@@ -1425,7 +1435,9 @@ pub mod amm_jit {
14251435

14261436
let order_index = 0;
14271437
let min_auction_duration = 10;
1428-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
1438+
let user_can_skip_auction_duration = taker
1439+
.can_skip_auction_duration(&taker_stats, false)
1440+
.unwrap();
14291441
let is_amm_available = get_amm_is_available(
14301442
&taker.orders[order_index],
14311443
min_auction_duration,
@@ -1863,7 +1875,9 @@ pub mod amm_jit {
18631875

18641876
let order_index = 0;
18651877
let min_auction_duration = 0;
1866-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
1878+
let user_can_skip_auction_duration = taker
1879+
.can_skip_auction_duration(&taker_stats, false)
1880+
.unwrap();
18671881
let is_amm_available = get_amm_is_available(
18681882
&taker.orders[order_index],
18691883
min_auction_duration,
@@ -2063,7 +2077,9 @@ pub mod amm_jit {
20632077

20642078
let order_index = 0;
20652079
let min_auction_duration = 10;
2066-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
2080+
let user_can_skip_auction_duration = taker
2081+
.can_skip_auction_duration(&taker_stats, false)
2082+
.unwrap();
20672083
let is_amm_available = get_amm_is_available(
20682084
&taker.orders[order_index],
20692085
min_auction_duration,
@@ -2277,7 +2293,9 @@ pub mod amm_jit {
22772293

22782294
let order_index = 0;
22792295
let min_auction_duration = 10;
2280-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
2296+
let user_can_skip_auction_duration = taker
2297+
.can_skip_auction_duration(&taker_stats, false)
2298+
.unwrap();
22812299
let is_amm_available = get_amm_is_available(
22822300
&taker.orders[order_index],
22832301
min_auction_duration,
@@ -2846,8 +2864,9 @@ pub mod amm_jit {
28462864

28472865
let order_index = 0;
28482866
let min_auction_duration = 10;
2849-
let user_can_skip_auction_duration =
2850-
taker.can_skip_auction_duration(&taker_stats).unwrap();
2867+
let user_can_skip_auction_duration = taker
2868+
.can_skip_auction_duration(&taker_stats, false)
2869+
.unwrap();
28512870
let is_amm_available = get_amm_is_available(
28522871
&taker.orders[order_index],
28532872
min_auction_duration,
@@ -3090,7 +3109,9 @@ pub mod amm_jit {
30903109

30913110
let order_index = 0;
30923111
let min_auction_duration = 0;
3093-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
3112+
let user_can_skip_auction_duration = taker
3113+
.can_skip_auction_duration(&taker_stats, false)
3114+
.unwrap();
30943115
let is_amm_available = get_amm_is_available(
30953116
&taker.orders[order_index],
30963117
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
@@ -278,7 +278,9 @@ pub mod fuel_scoring {
278278

279279
let order_index = 0;
280280
let min_auction_duration = 0;
281-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
281+
let user_can_skip_auction_duration = taker
282+
.can_skip_auction_duration(&taker_stats, false)
283+
.unwrap();
282284
let is_amm_available = get_amm_is_available(
283285
&taker.orders[order_index],
284286
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::{
@@ -239,7 +240,7 @@ pub mod fill_order_protected_maker {
239240
AccountLoader::try_from(&user_account_info).unwrap();
240241

241242
let mut taker_stats = UserStats {
242-
disable_update_perp_bid_ask_twap: true,
243+
paused_operations: UserStatsPausedOperations::AmmAtomicFill as u8,
243244
..UserStats::default()
244245
};
245246

@@ -331,7 +332,7 @@ pub mod fill_order_protected_maker {
331332

332333
// user exempt, no 10 bps applied for pmm
333334
let mut taker_stats = UserStats {
334-
disable_update_perp_bid_ask_twap: false,
335+
paused_operations: 0,
335336
..UserStats::default()
336337
};
337338

@@ -3375,7 +3376,9 @@ pub mod fulfill_order {
33753376

33763377
let order_index = 0;
33773378
let min_auction_duration = 0;
3378-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
3379+
let user_can_skip_auction_duration = taker
3380+
.can_skip_auction_duration(&taker_stats, false)
3381+
.unwrap();
33793382
let is_amm_available = get_amm_is_available(
33803383
&taker.orders[order_index],
33813384
min_auction_duration,
@@ -3633,7 +3636,9 @@ pub mod fulfill_order {
36333636

36343637
let order_index = 0;
36353638
let min_auction_duration = 10;
3636-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
3639+
let user_can_skip_auction_duration = taker
3640+
.can_skip_auction_duration(&taker_stats, false)
3641+
.unwrap();
36373642
let is_amm_available = get_amm_is_available(
36383643
&taker.orders[order_index],
36393644
min_auction_duration,
@@ -3839,7 +3844,9 @@ pub mod fulfill_order {
38393844

38403845
let order_index = 0;
38413846
let min_auction_duration = 0;
3842-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
3847+
let user_can_skip_auction_duration = taker
3848+
.can_skip_auction_duration(&taker_stats, false)
3849+
.unwrap();
38433850
let is_amm_available = get_amm_is_available(
38443851
&taker.orders[order_index],
38453852
min_auction_duration,
@@ -4058,7 +4065,9 @@ pub mod fulfill_order {
40584065

40594066
let order_index = 0;
40604067
let min_auction_duration = 10;
4061-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4068+
let user_can_skip_auction_duration = taker
4069+
.can_skip_auction_duration(&taker_stats, false)
4070+
.unwrap();
40624071
let is_amm_available = get_amm_is_available(
40634072
&taker.orders[order_index],
40644073
min_auction_duration,
@@ -4237,7 +4246,9 @@ pub mod fulfill_order {
42374246

42384247
let order_index = 0;
42394248
let min_auction_duration = 0;
4240-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4249+
let user_can_skip_auction_duration = taker
4250+
.can_skip_auction_duration(&taker_stats, false)
4251+
.unwrap();
42414252
let is_amm_available = get_amm_is_available(
42424253
&taker.orders[order_index],
42434254
min_auction_duration,
@@ -4448,7 +4459,9 @@ pub mod fulfill_order {
44484459

44494460
let order_index = 0;
44504461
let min_auction_duration = 10;
4451-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4462+
let user_can_skip_auction_duration = taker
4463+
.can_skip_auction_duration(&taker_stats, false)
4464+
.unwrap();
44524465
let is_amm_available = get_amm_is_available(
44534466
&taker.orders[order_index],
44544467
min_auction_duration,
@@ -4648,7 +4661,9 @@ pub mod fulfill_order {
46484661

46494662
let order_index = 0;
46504663
let min_auction_duration = 0;
4651-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4664+
let user_can_skip_auction_duration = taker
4665+
.can_skip_auction_duration(&taker_stats, false)
4666+
.unwrap();
46524667
let is_amm_available = get_amm_is_available(
46534668
&taker.orders[order_index],
46544669
min_auction_duration,
@@ -4801,7 +4816,9 @@ pub mod fulfill_order {
48014816

48024817
let order_index = 0;
48034818
let min_auction_duration = 0;
4804-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
4819+
let user_can_skip_auction_duration = taker
4820+
.can_skip_auction_duration(&taker_stats, false)
4821+
.unwrap();
48054822
let is_amm_available = get_amm_is_available(
48064823
&taker.orders[order_index],
48074824
min_auction_duration,
@@ -4981,7 +4998,9 @@ pub mod fulfill_order {
49814998

49824999
let order_index = 0;
49835000
let min_auction_duration = 0;
4984-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
5001+
let user_can_skip_auction_duration = taker
5002+
.can_skip_auction_duration(&taker_stats, false)
5003+
.unwrap();
49855004
let is_amm_available = get_amm_is_available(
49865005
&taker.orders[order_index],
49875006
min_auction_duration,
@@ -5584,7 +5603,9 @@ pub mod fulfill_order {
55845603

55855604
let order_index = 0;
55865605
let min_auction_duration = 10;
5587-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
5606+
let user_can_skip_auction_duration = taker
5607+
.can_skip_auction_duration(&taker_stats, false)
5608+
.unwrap();
55885609
let is_amm_available = get_amm_is_available(
55895610
&taker.orders[order_index],
55905611
min_auction_duration,
@@ -5841,7 +5862,9 @@ pub mod fulfill_order {
58415862

58425863
let order_index = 0;
58435864
let min_auction_duration = 0;
5844-
let user_can_skip_auction_duration = taker.can_skip_auction_duration(&taker_stats).unwrap();
5865+
let user_can_skip_auction_duration = taker
5866+
.can_skip_auction_duration(&taker_stats, false)
5867+
.unwrap();
58455868
let is_amm_available = get_amm_is_available(
58465869
&taker.orders[order_index],
58475870
min_auction_duration,

programs/drift/src/instructions/admin.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4499,19 +4499,19 @@ pub fn handle_update_spot_auction_duration(
44994499
Ok(())
45004500
}
45014501

4502-
pub fn handle_admin_disable_update_perp_bid_ask_twap(
4502+
pub fn handle_admin_update_user_stats_paused_operations(
45034503
ctx: Context<AdminDisableBidAskTwapUpdate>,
4504-
disable: bool,
4504+
paused_operations: u8,
45054505
) -> Result<()> {
45064506
let mut user_stats = load_mut!(ctx.accounts.user_stats)?;
45074507

45084508
msg!(
4509-
"disable_update_perp_bid_ask_twap: {:?} -> {:?}",
4510-
user_stats.disable_update_perp_bid_ask_twap,
4511-
disable
4509+
"user_stats.paused_operations: {:?} -> {:?}",
4510+
user_stats.paused_operations,
4511+
paused_operations
45124512
);
45134513

4514-
user_stats.disable_update_perp_bid_ask_twap = disable;
4514+
user_stats.paused_operations = paused_operations;
45154515
Ok(())
45164516
}
45174517

programs/drift/src/instructions/keeper.rs

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

26242624
let keeper_stats = load!(ctx.accounts.keeper_stats)?;
26252625
validate!(
2626-
!keeper_stats.disable_update_perp_bid_ask_twap,
2626+
keeper_stats.can_update_bid_ask_twap(),
26272627
ErrorCode::CantUpdatePerpBidAskTwap,
2628-
"Keeper stats disable_update_perp_bid_ask_twap is true"
2628+
"Keeper stats can_update_bid_ask_twap is false"
26292629
)?;
26302630

26312631
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
@@ -529,11 +529,11 @@ pub mod drift {
529529
// handle_update_user_open_orders_count(ctx)
530530
// }
531531

532-
pub fn admin_disable_update_perp_bid_ask_twap(
532+
pub fn admin_update_user_stats_paused_operations(
533533
ctx: Context<AdminDisableBidAskTwapUpdate>,
534-
disable: bool,
534+
paused_operations: u8,
535535
) -> Result<()> {
536-
handle_admin_disable_update_perp_bid_ask_twap(ctx, disable)
536+
handle_admin_update_user_stats_paused_operations(ctx, paused_operations)
537537
}
538538

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

0 commit comments

Comments
 (0)