Skip to content

Commit 447b707

Browse files
committed
merge in dlp
2 parents 4baaa3b + af376f2 commit 447b707

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1433
-311
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.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+
1626
## [2.143.0] - 2025-10-22
1727

1828
- program: relax filling conditions for low risk orders vs amm ([#1968](https://github.com/drift-labs/protocol-v2/pull/1968))

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: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
},
3030
"dependencies": {
3131
"@ellipsis-labs/phoenix-sdk": "1.4.2",
32-
"@msgpack/msgpack": "^3.1.2",
3332
"@pythnetwork/pyth-solana-receiver": "0.8.0",
3433
"@switchboard-xyz/common": "3.0.14",
3534
"@switchboard-xyz/on-demand": "2.4.1",
@@ -95,6 +94,5 @@
9594
"chalk-template": "<1.1.1",
9695
"supports-hyperlinks": "<4.1.1",
9796
"has-ansi": "<6.0.1"
98-
},
99-
"packageManager": "[email protected]+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
97+
}
10098
}

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

programs/drift/src/controller/pnl.rs

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::controller::amm::{update_pnl_pool_and_user_balance, update_pool_balances};
22
use crate::controller::funding::settle_funding_payment;
3-
use crate::controller::isolated_position::transfer_isolated_perp_position_deposit;
43
use crate::controller::orders::{cancel_orders, validate_market_within_price_band};
54
use crate::controller::position::{
65
get_position_index, update_position_and_market, update_quote_asset_amount,
@@ -21,7 +20,10 @@ use crate::math::position::calculate_base_asset_value_with_expiry_price;
2120
use crate::math::safe_math::SafeMath;
2221
use crate::math::spot_balance::get_token_amount;
2322

23+
use crate::get_then_update_id;
24+
use crate::math::orders::calculate_existing_position_fields_for_order_action;
2425
use crate::msg;
26+
use crate::state::events::{OrderAction, OrderActionRecord, OrderRecord};
2527

2628
use crate::state::events::{OrderActionExplanation, SettlePnlExplanation, SettlePnlRecord};
2729
use crate::state::oracle_map::OracleMap;
@@ -32,7 +34,7 @@ use crate::state::settle_pnl_mode::SettlePnlMode;
3234
use crate::state::spot_market::{SpotBalance, SpotBalanceType};
3335
use crate::state::spot_market_map::SpotMarketMap;
3436
use crate::state::state::State;
35-
use crate::state::user::{MarketType, User, UserStats};
37+
use crate::state::user::{MarketType, Order, OrderStatus, OrderType, User, UserStats};
3638
use crate::validate;
3739
use anchor_lang::prelude::Pubkey;
3840
use anchor_lang::prelude::*;
@@ -484,6 +486,11 @@ pub fn settle_expired_position(
484486
let base_asset_amount = user.perp_positions[position_index].base_asset_amount;
485487
let quote_entry_amount = user.perp_positions[position_index].quote_entry_amount;
486488

489+
let user_position_direction_to_close =
490+
user.perp_positions[position_index].get_direction_to_close();
491+
let user_existing_position_params_for_order_action = user.perp_positions[position_index]
492+
.get_existing_position_params_for_order_action(user_position_direction_to_close);
493+
487494
let position_delta = PositionDelta {
488495
quote_asset_amount: base_asset_value,
489496
base_asset_amount: -user.perp_positions[position_index].base_asset_amount,
@@ -516,6 +523,80 @@ pub fn settle_expired_position(
516523
-pnl_to_settle_with_user.cast()?,
517524
)?;
518525

526+
if position_delta.base_asset_amount != 0 {
527+
// get ids for order fills
528+
let user_order_id = get_then_update_id!(user, next_order_id);
529+
let fill_record_id = get_then_update_id!(perp_market, next_fill_record_id);
530+
531+
let base_asset_amount = position_delta.base_asset_amount;
532+
let user_existing_position_direction = user.perp_positions[position_index].get_direction();
533+
534+
let user_order = Order {
535+
slot,
536+
base_asset_amount: base_asset_amount.unsigned_abs(),
537+
order_id: user_order_id,
538+
market_index: perp_market.market_index,
539+
status: OrderStatus::Open,
540+
order_type: OrderType::Market,
541+
market_type: MarketType::Perp,
542+
direction: user_position_direction_to_close,
543+
existing_position_direction: user_existing_position_direction,
544+
..Order::default()
545+
};
546+
547+
emit!(OrderRecord {
548+
ts: now,
549+
user: *user_key,
550+
order: user_order
551+
});
552+
553+
let (taker_existing_quote_entry_amount, taker_existing_base_asset_amount) =
554+
calculate_existing_position_fields_for_order_action(
555+
base_asset_amount.unsigned_abs(),
556+
user_existing_position_params_for_order_action,
557+
)?;
558+
559+
let fill_record = OrderActionRecord {
560+
ts: now,
561+
action: OrderAction::Fill,
562+
action_explanation: OrderActionExplanation::MarketExpired,
563+
market_index: perp_market.market_index,
564+
market_type: MarketType::Perp,
565+
filler: None,
566+
filler_reward: None,
567+
fill_record_id: Some(fill_record_id),
568+
base_asset_amount_filled: Some(base_asset_amount.unsigned_abs()),
569+
quote_asset_amount_filled: Some(base_asset_value.unsigned_abs()),
570+
taker_fee: Some(fee.unsigned_abs()),
571+
maker_fee: None,
572+
referrer_reward: None,
573+
quote_asset_amount_surplus: None,
574+
spot_fulfillment_method_fee: None,
575+
taker: Some(*user_key),
576+
taker_order_id: Some(user_order_id),
577+
taker_order_direction: Some(user_position_direction_to_close),
578+
taker_order_base_asset_amount: Some(base_asset_amount.unsigned_abs()),
579+
taker_order_cumulative_base_asset_amount_filled: Some(base_asset_amount.unsigned_abs()),
580+
taker_order_cumulative_quote_asset_amount_filled: Some(base_asset_value.unsigned_abs()),
581+
maker: None,
582+
maker_order_id: None,
583+
maker_order_direction: None,
584+
maker_order_base_asset_amount: None,
585+
maker_order_cumulative_base_asset_amount_filled: None,
586+
maker_order_cumulative_quote_asset_amount_filled: None,
587+
oracle_price: perp_market.expiry_price,
588+
bit_flags: 0,
589+
taker_existing_quote_entry_amount,
590+
taker_existing_base_asset_amount,
591+
maker_existing_quote_entry_amount: None,
592+
maker_existing_base_asset_amount: None,
593+
trigger_price: None,
594+
builder_idx: None,
595+
builder_fee: None,
596+
};
597+
emit!(fill_record);
598+
}
599+
519600
update_settled_pnl(user, position_index, pnl_to_settle_with_user.cast()?)?;
520601

521602
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: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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);

programs/drift/src/ids.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,17 @@ pub mod titan_mainnet_argos_v1 {
122122
use solana_program::declare_id;
123123
declare_id!("T1TANpTeScyeqVzzgNViGDNrkQ6qHz9KrSBS4aNXvGT");
124124
}
125+
126+
pub mod lp_pool_hot_wallet {
127+
use solana_program::declare_id;
128+
declare_id!("GP9qHLX8rx4BgRULGPV1poWQPdGuzbxGbvTB12DfmwFk");
129+
}
130+
131+
pub const WHITELISTED_SWAP_PROGRAMS: &[solana_program::pubkey::Pubkey] = &[
132+
serum_program::id(),
133+
jupiter_mainnet_3::id(),
134+
jupiter_mainnet_4::id(),
135+
jupiter_mainnet_6::id(),
136+
dflow_mainnet_aggregator_4::id(),
137+
titan_mainnet_argos_v1::id(),
138+
];

programs/drift/src/instructions/admin.rs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3362,11 +3362,10 @@ pub fn handle_update_perp_market_paused_operations(
33623362
perp_market_valid(&ctx.accounts.perp_market)
33633363
)]
33643364
pub fn handle_update_perp_market_contract_tier(
3365-
ctx: Context<AdminUpdatePerpMarketContractTier>,
3365+
ctx: Context<AdminUpdatePerpMarket>,
33663366
contract_tier: ContractTier,
33673367
) -> Result<()> {
33683368
let perp_market = &mut load_mut!(ctx.accounts.perp_market)?;
3369-
let amm_cache = &mut ctx.accounts.amm_cache;
33703369
msg!("perp market {}", perp_market.market_index);
33713370

33723371
msg!(
@@ -3376,7 +3375,6 @@ pub fn handle_update_perp_market_contract_tier(
33763375
);
33773376

33783377
perp_market.contract_tier = contract_tier;
3379-
amm_cache.update_perp_market_fields(perp_market)?;
33803378

33813379
Ok(())
33823380
}
@@ -5557,23 +5555,6 @@ pub struct HotAdminUpdatePerpMarket<'info> {
55575555
pub perp_market: AccountLoader<'info, PerpMarket>,
55585556
}
55595557

5560-
#[derive(Accounts)]
5561-
pub struct AdminUpdatePerpMarketContractTier<'info> {
5562-
pub admin: Signer<'info>,
5563-
#[account(
5564-
has_one = admin
5565-
)]
5566-
pub state: Box<Account<'info, State>>,
5567-
#[account(mut)]
5568-
pub perp_market: AccountLoader<'info, PerpMarket>,
5569-
#[account(
5570-
mut,
5571-
seeds = [AMM_POSITIONS_CACHE.as_ref()],
5572-
bump = amm_cache.bump,
5573-
)]
5574-
pub amm_cache: Box<Account<'info, AmmCache>>,
5575-
}
5576-
55775558
#[derive(Accounts)]
55785559
pub struct AdminUpdatePerpMarketAmmSummaryStats<'info> {
55795560
#[account(

0 commit comments

Comments
 (0)