Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
94 changes: 0 additions & 94 deletions programs/drift/src/instructions/admin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1114,84 +1114,6 @@ pub fn handle_initialize_amm_cache(ctx: Context<InitializeAmmCache>) -> Result<(
Ok(())
}

pub fn handle_update_initial_amm_cache_info<'c: 'info, 'info>(
ctx: Context<'_, '_, 'c, 'info, UpdateInitialAmmCacheInfo<'info>>,
) -> Result<()> {
let amm_cache = &mut ctx.accounts.amm_cache;
let slot = Clock::get()?.slot;
let state = &ctx.accounts.state;

let AccountMaps {
perp_market_map,
spot_market_map: _,
mut oracle_map,
} = load_maps(
&mut ctx.remaining_accounts.iter().peekable(),
&MarketSet::new(),
&MarketSet::new(),
Clock::get()?.slot,
None,
)?;

for (_, perp_market_loader) in perp_market_map.0 {
let perp_market = perp_market_loader.load()?;
let oracle_data = oracle_map.get_price_data(&perp_market.oracle_id())?;
let mm_oracle_data = perp_market.get_mm_oracle_price_data(
*oracle_data,
slot,
&ctx.accounts.state.oracle_guard_rails.validity,
)?;

amm_cache.update_perp_market_fields(&perp_market)?;
amm_cache.update_oracle_info(
slot,
perp_market.market_index,
&mm_oracle_data,
&perp_market,
&state.oracle_guard_rails,
)?;
}

Ok(())
}
#[derive(Debug, Clone, Copy, AnchorSerialize, AnchorDeserialize, PartialEq, Eq)]
pub struct OverrideAmmCacheParams {
pub quote_owed_from_lp_pool: Option<i64>,
pub last_settle_slot: Option<u64>,
pub last_fee_pool_token_amount: Option<u128>,
pub last_net_pnl_pool_token_amount: Option<i128>,
}

pub fn handle_override_amm_cache_info<'c: 'info, 'info>(
ctx: Context<'_, '_, 'c, 'info, UpdateInitialAmmCacheInfo<'info>>,
market_index: u16,
override_params: OverrideAmmCacheParams,
) -> Result<()> {
let amm_cache = &mut ctx.accounts.amm_cache;

let cache_entry = amm_cache.cache.get_mut(market_index as usize);
if cache_entry.is_none() {
msg!("No cache entry found for market index {}", market_index);
return Ok(());
}

let cache_entry = cache_entry.unwrap();
if let Some(quote_owed_from_lp_pool) = override_params.quote_owed_from_lp_pool {
cache_entry.quote_owed_from_lp_pool = quote_owed_from_lp_pool;
}
if let Some(last_settle_slot) = override_params.last_settle_slot {
cache_entry.last_settle_slot = last_settle_slot;
}
if let Some(last_fee_pool_token_amount) = override_params.last_fee_pool_token_amount {
cache_entry.last_fee_pool_token_amount = last_fee_pool_token_amount;
}
if let Some(last_net_pnl_pool_token_amount) = override_params.last_net_pnl_pool_token_amount {
cache_entry.last_net_pnl_pool_token_amount = last_net_pnl_pool_token_amount;
}

Ok(())
}

#[access_control(
perp_market_valid(&ctx.accounts.perp_market)
)]
Expand Down Expand Up @@ -5421,22 +5343,6 @@ pub struct InitializeAmmCache<'info> {
pub system_program: Program<'info, System>,
}

#[derive(Accounts)]
pub struct UpdateInitialAmmCacheInfo<'info> {
#[account(
mut,
constraint = admin.key() == admin_hot_wallet::id() || admin.key() == state.admin
)]
pub state: Box<Account<'info, State>>,
pub admin: Signer<'info>,
#[account(
mut,
seeds = [AMM_POSITIONS_CACHE.as_ref()],
bump = amm_cache.bump,
)]
pub amm_cache: Box<Account<'info, AmmCache>>,
}

#[derive(Accounts)]
pub struct DeleteInitializedPerpMarket<'info> {
#[account(mut)]
Expand Down
108 changes: 105 additions & 3 deletions programs/drift/src/instructions/lp_admin.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
use crate::state::perp_market_map::MarketSet;
use crate::{controller, load_mut};
use crate::controller::token::{receive, send_from_program_vault_with_signature_seeds};
use crate::error::ErrorCode;
use crate::ids::{admin_hot_wallet, lp_pool_swap_wallet};
use crate::instructions::optional_accounts::get_token_mint;
use crate::instructions::optional_accounts::{get_token_mint, load_maps, AccountMaps};
use crate::math::constants::{PRICE_PRECISION_U64, QUOTE_SPOT_MARKET_INDEX};
use crate::math::safe_math::SafeMath;
use crate::state::amm_cache::AmmCache;
use crate::state::amm_cache::{AmmCache, AMM_POSITIONS_CACHE};
use crate::state::lp_pool::{
AmmConstituentDatum, AmmConstituentMapping, Constituent, ConstituentCorrelations,
ConstituentTargetBase, LPPool, TargetsDatum, AMM_MAP_PDA_SEED,
Expand Down Expand Up @@ -896,6 +897,90 @@ pub fn handle_update_perp_market_lp_pool_status(
Ok(())
}

pub fn handle_update_initial_amm_cache_info<'c: 'info, 'info>(
ctx: Context<'_, '_, 'c, 'info, UpdateInitialAmmCacheInfo<'info>>,
) -> Result<()> {
let amm_cache = &mut ctx.accounts.amm_cache;
let slot = Clock::get()?.slot;
let state = &ctx.accounts.state;

let AccountMaps {
perp_market_map,
spot_market_map: _,
mut oracle_map,
} = load_maps(
&mut ctx.remaining_accounts.iter().peekable(),
&MarketSet::new(),
&MarketSet::new(),
Clock::get()?.slot,
None,
)?;

for (_, perp_market_loader) in perp_market_map.0 {
let perp_market = perp_market_loader.load()?;
let oracle_data = oracle_map.get_price_data(&perp_market.oracle_id())?;
let mm_oracle_data = perp_market.get_mm_oracle_price_data(
*oracle_data,
slot,
&ctx.accounts.state.oracle_guard_rails.validity,
)?;

amm_cache.update_perp_market_fields(&perp_market)?;
amm_cache.update_oracle_info(
slot,
perp_market.market_index,
&mm_oracle_data,
&perp_market,
&state.oracle_guard_rails,
)?;
}

Ok(())
}
#[derive(Debug, Clone, Copy, AnchorSerialize, AnchorDeserialize, PartialEq, Eq)]
pub struct OverrideAmmCacheParams {
pub quote_owed_from_lp_pool: Option<i64>,
pub last_settle_slot: Option<u64>,
pub last_fee_pool_token_amount: Option<u128>,
pub last_net_pnl_pool_token_amount: Option<i128>,
pub amm_position_scalar: Option<u8>,
}

pub fn handle_override_amm_cache_info<'c: 'info, 'info>(
ctx: Context<'_, '_, 'c, 'info, UpdateInitialAmmCacheInfo<'info>>,
market_index: u16,
override_params: OverrideAmmCacheParams,
) -> Result<()> {
let amm_cache = &mut ctx.accounts.amm_cache;

let cache_entry = amm_cache.cache.get_mut(market_index as usize);
if cache_entry.is_none() {
msg!("No cache entry found for market index {}", market_index);
return Ok(());
}

let cache_entry = cache_entry.unwrap();
if let Some(quote_owed_from_lp_pool) = override_params.quote_owed_from_lp_pool {
cache_entry.quote_owed_from_lp_pool = quote_owed_from_lp_pool;
}
if let Some(last_settle_slot) = override_params.last_settle_slot {
cache_entry.last_settle_slot = last_settle_slot;
}
if let Some(last_fee_pool_token_amount) = override_params.last_fee_pool_token_amount {
cache_entry.last_fee_pool_token_amount = last_fee_pool_token_amount;
}
if let Some(last_net_pnl_pool_token_amount) = override_params.last_net_pnl_pool_token_amount {
cache_entry.last_net_pnl_pool_token_amount = last_net_pnl_pool_token_amount;
}

if let Some(amm_position_scalar) = override_params.amm_position_scalar {
cache_entry.amm_position_scalar = amm_position_scalar;
}

Ok(())
}


#[derive(Accounts)]
#[instruction(
name: [u8; 32],
Expand Down Expand Up @@ -1252,6 +1337,23 @@ pub struct UpdatePerpMarketLpPoolStatus<'info> {
pub state: Box<Account<'info, State>>,
#[account(mut)]
pub perp_market: AccountLoader<'info, PerpMarket>,
#[account(mut)]
#[account(mut, seeds = [AMM_POSITIONS_CACHE.as_ref()],
bump = amm_cache.bump,)]
pub amm_cache: Box<Account<'info, AmmCache>>,
}

#[derive(Accounts)]
pub struct UpdateInitialAmmCacheInfo<'info> {
#[account(
mut,
constraint = admin.key() == admin_hot_wallet::id() || admin.key() == state.admin
)]
pub state: Box<Account<'info, State>>,
pub admin: Signer<'info>,
#[account(
mut,
seeds = [AMM_POSITIONS_CACHE.as_ref()],
bump = amm_cache.bump,
)]
pub amm_cache: Box<Account<'info, AmmCache>>,
}
6 changes: 5 additions & 1 deletion programs/drift/src/instructions/lp_pool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,14 @@ pub fn handle_update_constituent_target_base<'c: 'info, 'info>(
}

amm_inventories.push(AmmInventoryAndPrices {
inventory: cache_info.position,
inventory: cache_info
.position
.safe_mul(cache_info.amm_position_scalar as i64)?
.safe_div(100)?,
price: cache_info.oracle_price,
});
}
msg!("amm inventories: {:?}", amm_inventories);

if amm_inventories.is_empty() {
msg!("No valid inventories found for constituent target weights update");
Expand Down
6 changes: 4 additions & 2 deletions programs/drift/src/state/amm_cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ pub struct CacheInfo {
pub oracle_source: u8,
pub oracle_validity: u8,
pub lp_status_for_perp_market: u8,
pub _padding: [u8; 13],
pub amm_position_scalar: u8,
pub _padding: [u8; 12],
}

impl Size for CacheInfo {
Expand All @@ -82,7 +83,8 @@ impl Default for CacheInfo {
oracle_source: 0u8,
quote_owed_from_lp_pool: 0i64,
lp_status_for_perp_market: 0u8,
_padding: [0u8; 13],
amm_position_scalar: 100u8,
_padding: [0u8; 12],
}
}
}
Expand Down
1 change: 1 addition & 0 deletions programs/drift/src/state/lp_pool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1187,6 +1187,7 @@ pub fn calculate_target_weight(
}

/// Update target base based on amm_inventory and mapping
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct AmmInventoryAndPrices {
pub inventory: i64,
pub price: i64,
Expand Down
9 changes: 6 additions & 3 deletions sdk/src/adminClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -712,6 +712,7 @@ export class AdminClient extends DriftClient {
lastSettleTs?: BN;
lastFeePoolTokenAmount?: BN;
lastNetPnlPoolTokenAmount?: BN;
ammPositionScalar?: number;
},
txParams?: TxParams
): Promise<TransactionSignature> {
Expand All @@ -730,20 +731,22 @@ export class AdminClient extends DriftClient {
perpMarketIndex: number,
params: {
quoteOwedFromLpPool?: BN;
lastSettleTs?: BN;
lastSettleSlot?: BN;
lastFeePoolTokenAmount?: BN;
lastNetPnlPoolTokenAmount?: BN;
ammPositionScalar?: number;
}
): Promise<TransactionInstruction> {
return await this.program.instruction.overrideAmmCacheInfo(
return this.program.instruction.overrideAmmCacheInfo(
perpMarketIndex,
Object.assign(
{},
{
quoteOwedFromLpPool: null,
lastSettleTs: null,
lastSettleSlot: null,
lastFeePoolTokenAmount: null,
lastNetPnlPoolTokenAmount: null,
ammPositionScalar: null,
},
params
),
Expand Down
Loading