Skip to content

Commit 7e67ac8

Browse files
authored
Merge branch 'master' into dlp
2 parents 71dd9c1 + 35586ec commit 7e67ac8

36 files changed

+1769
-118
lines changed

CHANGELOG.md

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

88
## Unreleased
99

10+
### Features
11+
12+
### Fixes
13+
14+
### Breaking
15+
16+
## [2.144.0] - 2025-10-27
17+
18+
### Features
19+
20+
- program: use-5min-for-target-expiry-price ([#1967](https://github.com/drift-labs/protocol-v2/pull/1967))
21+
22+
### Fixes
23+
24+
### Breaking
25+
26+
## [2.143.0] - 2025-10-22
27+
1028
- program: relax filling conditions for low risk orders vs amm ([#1968](https://github.com/drift-labs/protocol-v2/pull/1968))
1129
- sdk: make oracle validity match program and propogate to dlob and math functions ([#1968](https://github.com/drift-labs/protocol-v2/pull/1968))
1230

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.

bun.lock

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"nanoid": "3.3.4",
1616
"rpc-websockets": "7.5.1",
1717
"solana-bankrun": "0.3.0",
18-
"zod": "^4.0.17",
18+
"zod": "4.0.17",
1919
"zstddec": "0.1.0",
2020
},
2121
"devDependencies": {
@@ -43,6 +43,26 @@
4343
},
4444
},
4545
},
46+
"overrides": {
47+
"ansi-regex": "5.0.1",
48+
"ansi-styles": "4.3.0",
49+
"backslash": "<0.2.1",
50+
"chalk": "4.1.2",
51+
"chalk-template": "<1.1.1",
52+
"color-convert": "<3.1.1",
53+
"color-name": "<2.0.1",
54+
"color-string": "<2.1.1",
55+
"debug": "<4.4.2",
56+
"error-ex": "<1.3.3",
57+
"has-ansi": "<6.0.1",
58+
"is-arrayish": "<0.3.3",
59+
"simple-swizzle": "<0.2.3",
60+
"slice-ansi": "3.0.0",
61+
"strip-ansi": "6.0.1",
62+
"supports-color": "7.2.0",
63+
"supports-hyperlinks": "<4.1.1",
64+
"wrap-ansi": "7.0.0",
65+
},
4666
"packages": {
4767
"@babel/runtime": ["@babel/[email protected]", "", {}, "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA=="],
4868

@@ -806,8 +826,6 @@
806826

807827
"@solana/codecs-strings/@solana/errors": ["@solana/[email protected]", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="],
808828

809-
"@solana/errors/chalk": ["[email protected]", "", {}, "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ=="],
810-
811829
"@solana/errors/commander": ["[email protected]", "", {}, "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA=="],
812830

813831
"@solana/options/@solana/codecs-numbers": ["@solana/[email protected]", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="],
@@ -900,22 +918,14 @@
900918

901919
"@solana/buffer-layout-utils/@solana/web3.js/superstruct": ["[email protected]", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="],
902920

903-
"@solana/codecs-core/@solana/errors/chalk": ["[email protected]", "", {}, "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ=="],
904-
905921
"@solana/codecs-core/@solana/errors/commander": ["[email protected]", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
906922

907-
"@solana/codecs-data-structures/@solana/errors/chalk": ["[email protected]", "", {}, "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ=="],
908-
909923
"@solana/codecs-data-structures/@solana/errors/commander": ["[email protected]", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
910924

911-
"@solana/codecs-strings/@solana/errors/chalk": ["[email protected]", "", {}, "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ=="],
912-
913925
"@solana/codecs-strings/@solana/errors/commander": ["[email protected]", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
914926

915927
"@solana/codecs/@solana/codecs-numbers/@solana/errors": ["@solana/[email protected]", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="],
916928

917-
"@solana/options/@solana/errors/chalk": ["[email protected]", "", {}, "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ=="],
918-
919929
"@solana/options/@solana/errors/commander": ["[email protected]", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
920930

921931
"@switchboard-xyz/common/@solana/web3.js/bs58": ["[email protected]", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="],
@@ -1018,8 +1028,6 @@
10181028

10191029
"@solana/buffer-layout-utils/@solana/web3.js/rpc-websockets/eventemitter3": ["[email protected]", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
10201030

1021-
"@solana/codecs/@solana/codecs-numbers/@solana/errors/chalk": ["[email protected]", "", {}, "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ=="],
1022-
10231031
"@solana/codecs/@solana/codecs-numbers/@solana/errors/commander": ["[email protected]", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
10241032

10251033
"@switchboard-xyz/common/@solana/web3.js/jayson/@types/node": ["@types/[email protected]", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="],

package.json

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"@project-serum/common": "0.0.1-beta.3",
1111
"@project-serum/serum": "0.13.65",
1212
"@pythnetwork/client": "2.21.0",
13+
"@pythnetwork/price-service-client": "1.9.0",
1314
"@solana/spl-token": "0.4.13",
1415
"@solana/web3.js": "1.73.2",
1516
"@types/bn.js": "5.1.6",
@@ -24,8 +25,7 @@
2425
"husky": "7.0.4",
2526
"prettier": "3.0.1",
2627
"typedoc": "0.23.23",
27-
"typescript": "5.4.5",
28-
"@pythnetwork/price-service-client": "1.9.0"
28+
"typescript": "5.4.5"
2929
},
3030
"dependencies": {
3131
"@ellipsis-labs/phoenix-sdk": "1.4.2",
@@ -94,6 +94,5 @@
9494
"chalk-template": "<1.1.1",
9595
"supports-hyperlinks": "<4.1.1",
9696
"has-ansi": "<6.0.1"
97-
},
98-
"packageManager": "[email protected]+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
97+
}
9998
}

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.142.0"
3+
version = "2.144.0"
44
description = "Created with Anchor"
55
edition = "2018"
66

programs/drift/src/controller/orders.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3088,8 +3088,9 @@ pub fn trigger_order(
30883088
.historical_oracle_data
30893089
.last_oracle_price_twap,
30903090
perp_market.get_max_confidence_interval_multiplier()?,
3091-
0,
3092-
0,
3091+
perp_market.amm.oracle_slot_delay_override,
3092+
perp_market.amm.oracle_low_risk_slot_delay_override,
3093+
None,
30933094
)?;
30943095

30953096
let is_oracle_valid =
@@ -5388,6 +5389,7 @@ pub fn trigger_spot_order(
53885389
spot_market.get_max_confidence_interval_multiplier()?,
53895390
0,
53905391
0,
5392+
None,
53915393
)?;
53925394
let strict_oracle_price = StrictOraclePrice {
53935395
current: oracle_price_data.price,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2229,6 +2229,7 @@ pub mod fulfill_order_with_maker_order {
22292229
market.get_max_confidence_interval_multiplier().unwrap(),
22302230
0,
22312231
0,
2232+
None,
22322233
)
22332234
.unwrap();
22342235

programs/drift/src/controller/pnl.rs

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ use crate::math::position::calculate_base_asset_value_with_expiry_price;
2020
use crate::math::safe_math::SafeMath;
2121
use crate::math::spot_balance::get_token_amount;
2222

23+
use crate::get_then_update_id;
24+
use crate::math::orders::calculate_existing_position_fields_for_order_action;
2325
use crate::msg;
26+
use crate::state::events::{OrderAction, OrderActionRecord, OrderRecord};
2427
use crate::state::events::{OrderActionExplanation, SettlePnlExplanation, SettlePnlRecord};
2528
use crate::state::oracle_map::OracleMap;
2629
use crate::state::paused_operations::PerpOperation;
@@ -30,7 +33,7 @@ use crate::state::settle_pnl_mode::SettlePnlMode;
3033
use crate::state::spot_market::{SpotBalance, SpotBalanceType};
3134
use crate::state::spot_market_map::SpotMarketMap;
3235
use crate::state::state::State;
33-
use crate::state::user::{MarketType, User};
36+
use crate::state::user::{MarketType, Order, OrderStatus, OrderType, User};
3437
use crate::validate;
3538
use anchor_lang::prelude::Pubkey;
3639
use anchor_lang::prelude::*;
@@ -136,6 +139,7 @@ pub fn settle_pnl(
136139
perp_market.get_max_confidence_interval_multiplier()?,
137140
0,
138141
0,
142+
None,
139143
)?;
140144

141145
if !is_oracle_valid_for_action(oracle_validity, Some(DriftAction::SettlePnl))?
@@ -437,6 +441,11 @@ pub fn settle_expired_position(
437441
let base_asset_amount = user.perp_positions[position_index].base_asset_amount;
438442
let quote_entry_amount = user.perp_positions[position_index].quote_entry_amount;
439443

444+
let user_position_direction_to_close =
445+
user.perp_positions[position_index].get_direction_to_close();
446+
let user_existing_position_params_for_order_action = user.perp_positions[position_index]
447+
.get_existing_position_params_for_order_action(user_position_direction_to_close);
448+
440449
let position_delta = PositionDelta {
441450
quote_asset_amount: base_asset_value,
442451
base_asset_amount: -user.perp_positions[position_index].base_asset_amount,
@@ -469,6 +478,80 @@ pub fn settle_expired_position(
469478
-pnl_to_settle_with_user.cast()?,
470479
)?;
471480

481+
if position_delta.base_asset_amount != 0 {
482+
// get ids for order fills
483+
let user_order_id = get_then_update_id!(user, next_order_id);
484+
let fill_record_id = get_then_update_id!(perp_market, next_fill_record_id);
485+
486+
let base_asset_amount = position_delta.base_asset_amount;
487+
let user_existing_position_direction = user.perp_positions[position_index].get_direction();
488+
489+
let user_order = Order {
490+
slot,
491+
base_asset_amount: base_asset_amount.unsigned_abs(),
492+
order_id: user_order_id,
493+
market_index: perp_market.market_index,
494+
status: OrderStatus::Open,
495+
order_type: OrderType::Market,
496+
market_type: MarketType::Perp,
497+
direction: user_position_direction_to_close,
498+
existing_position_direction: user_existing_position_direction,
499+
..Order::default()
500+
};
501+
502+
emit!(OrderRecord {
503+
ts: now,
504+
user: *user_key,
505+
order: user_order
506+
});
507+
508+
let (taker_existing_quote_entry_amount, taker_existing_base_asset_amount) =
509+
calculate_existing_position_fields_for_order_action(
510+
base_asset_amount.unsigned_abs(),
511+
user_existing_position_params_for_order_action,
512+
)?;
513+
514+
let fill_record = OrderActionRecord {
515+
ts: now,
516+
action: OrderAction::Fill,
517+
action_explanation: OrderActionExplanation::MarketExpired,
518+
market_index: perp_market.market_index,
519+
market_type: MarketType::Perp,
520+
filler: None,
521+
filler_reward: None,
522+
fill_record_id: Some(fill_record_id),
523+
base_asset_amount_filled: Some(base_asset_amount.unsigned_abs()),
524+
quote_asset_amount_filled: Some(base_asset_value.unsigned_abs()),
525+
taker_fee: Some(fee.unsigned_abs()),
526+
maker_fee: None,
527+
referrer_reward: None,
528+
quote_asset_amount_surplus: None,
529+
spot_fulfillment_method_fee: None,
530+
taker: Some(*user_key),
531+
taker_order_id: Some(user_order_id),
532+
taker_order_direction: Some(user_position_direction_to_close),
533+
taker_order_base_asset_amount: Some(base_asset_amount.unsigned_abs()),
534+
taker_order_cumulative_base_asset_amount_filled: Some(base_asset_amount.unsigned_abs()),
535+
taker_order_cumulative_quote_asset_amount_filled: Some(base_asset_value.unsigned_abs()),
536+
maker: None,
537+
maker_order_id: None,
538+
maker_order_direction: None,
539+
maker_order_base_asset_amount: None,
540+
maker_order_cumulative_base_asset_amount_filled: None,
541+
maker_order_cumulative_quote_asset_amount_filled: None,
542+
oracle_price: perp_market.expiry_price,
543+
bit_flags: 0,
544+
taker_existing_quote_entry_amount,
545+
taker_existing_base_asset_amount,
546+
maker_existing_quote_entry_amount: None,
547+
maker_existing_base_asset_amount: None,
548+
trigger_price: None,
549+
builder_idx: None,
550+
builder_fee: None,
551+
};
552+
emit!(fill_record);
553+
}
554+
472555
update_settled_pnl(user, position_index, pnl_to_settle_with_user.cast()?)?;
473556

474557
perp_market.amm.base_asset_amount_with_amm = perp_market

programs/drift/src/controller/pnl/delisting.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ pub mod delisting_test {
209209
amm_jit_intensity: 100,
210210
historical_oracle_data: HistoricalOracleData {
211211
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
212+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
212213
..HistoricalOracleData::default()
213214
},
214215
quote_asset_amount: -(QUOTE_PRECISION_I128 * 50), //longs have $100 cost basis
@@ -318,6 +319,7 @@ pub mod delisting_test {
318319
amm_jit_intensity: 100,
319320
historical_oracle_data: HistoricalOracleData {
320321
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
322+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
321323
..HistoricalOracleData::default()
322324
},
323325
quote_asset_amount: -(QUOTE_PRECISION_I128 * 10), //longs have $20 cost basis
@@ -430,6 +432,7 @@ pub mod delisting_test {
430432
amm_jit_intensity: 100,
431433
historical_oracle_data: HistoricalOracleData {
432434
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
435+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
433436
..HistoricalOracleData::default()
434437
},
435438
total_fee_minus_distributions: -(100000 * QUOTE_PRECISION_I128), // down $100k
@@ -543,6 +546,7 @@ pub mod delisting_test {
543546
amm_jit_intensity: 100,
544547
historical_oracle_data: HistoricalOracleData {
545548
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
549+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
546550
..HistoricalOracleData::default()
547551
},
548552
total_fee_minus_distributions: -(100000 * QUOTE_PRECISION_I128), // down $100k
@@ -652,6 +656,7 @@ pub mod delisting_test {
652656
amm_jit_intensity: 100,
653657
historical_oracle_data: HistoricalOracleData {
654658
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
659+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
655660
..HistoricalOracleData::default()
656661
},
657662
quote_asset_amount: -(QUOTE_PRECISION_I128 * 10), //longs have $20 cost basis
@@ -870,6 +875,8 @@ pub mod delisting_test {
870875
amm_jit_intensity: 100,
871876
historical_oracle_data: HistoricalOracleData {
872877
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
878+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
879+
873880
..HistoricalOracleData::default()
874881
},
875882
quote_asset_amount: (QUOTE_PRECISION_I128 * 10), //longs have -$20 cost basis
@@ -1091,6 +1098,8 @@ pub mod delisting_test {
10911098
amm_jit_intensity: 100,
10921099
historical_oracle_data: HistoricalOracleData {
10931100
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
1101+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
1102+
10941103
..HistoricalOracleData::default()
10951104
},
10961105
quote_asset_amount: (QUOTE_PRECISION_I128 * 20 * 2000), //longs have -$20 cost basis
@@ -1294,6 +1303,8 @@ pub mod delisting_test {
12941303
amm_jit_intensity: 100,
12951304
historical_oracle_data: HistoricalOracleData {
12961305
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
1306+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
1307+
12971308
..HistoricalOracleData::default()
12981309
},
12991310
quote_asset_amount: -(QUOTE_PRECISION_I128 * 20 * 1000 - QUOTE_PRECISION_I128),
@@ -1717,6 +1728,8 @@ pub mod delisting_test {
17171728
amm_jit_intensity: 100,
17181729
historical_oracle_data: HistoricalOracleData {
17191730
last_oracle_price_twap: (99 * PRICE_PRECISION) as i64,
1731+
last_oracle_price_twap_5min: (99 * PRICE_PRECISION) as i64,
1732+
17201733
..HistoricalOracleData::default()
17211734
},
17221735
quote_asset_amount: (QUOTE_PRECISION_I128 * 200)

programs/drift/src/controller/repeg.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,8 @@ pub fn update_amm_and_check_validity(
265265
market.get_max_confidence_interval_multiplier()?,
266266
&market.amm.oracle_source,
267267
LogMode::SafeMMOracle,
268-
0,
269-
0,
268+
market.amm.oracle_slot_delay_override,
269+
market.amm.oracle_low_risk_slot_delay_override,
270270
)?;
271271

272272
validate!(
@@ -431,7 +431,10 @@ pub fn settle_expired_market(
431431
let target_expiry_price = if market.amm.oracle_source == OracleSource::Prelaunch {
432432
market.amm.historical_oracle_data.last_oracle_price
433433
} else {
434-
market.amm.historical_oracle_data.last_oracle_price_twap
434+
market
435+
.amm
436+
.historical_oracle_data
437+
.last_oracle_price_twap_5min
435438
};
436439

437440
crate::dlog!(target_expiry_price);

0 commit comments

Comments
 (0)