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
2 changes: 1 addition & 1 deletion programs/drift/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -642,7 +642,7 @@ pub enum ErrorCode {
#[msg("Invalid Amm Constituent Mapping argument")]
InvalidAmmConstituentMappingArgument,
#[msg("Invalid update constituent update target weights argument")]
InvalidUpdateConstituentTargetWeightsArgument,
InvalidUpdateConstituentTargetBaseArgument,
#[msg("Constituent not found")]
ConstituentNotFound,
#[msg("Constituent could not load")]
Expand Down
48 changes: 24 additions & 24 deletions programs/drift/src/instructions/admin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ use std::mem::size_of;

use crate::msg;
use crate::state::lp_pool::{
AmmConstituentDatum, AmmConstituentMapping, Constituent, ConstituentTargetWeights, LPPool,
WeightDatum, AMM_MAP_PDA_SEED, CONSTITUENT_PDA_SEED, CONSTITUENT_TARGET_WEIGHT_PDA_SEED,
AmmConstituentDatum, AmmConstituentMapping, Constituent, ConstituentTargetBase, LPPool,
TargetsDatum, AMM_MAP_PDA_SEED, CONSTITUENT_PDA_SEED, CONSTITUENT_TARGET_WEIGHT_PDA_SEED,
CONSTITUENT_VAULT_PDA_SEED,
};
use anchor_lang::prelude::*;
Expand Down Expand Up @@ -4517,12 +4517,12 @@ pub fn handle_initialize_lp_pool(
.resize_with(0 as usize, AmmConstituentDatum::default);
amm_constituent_mapping.validate()?;

let constituent_target_weights = &mut ctx.accounts.constituent_target_weights;
constituent_target_weights.bump = ctx.bumps.constituent_target_weights;
constituent_target_weights
.weights
.resize_with(0 as usize, WeightDatum::default);
constituent_target_weights.validate()?;
let constituent_target_base = &mut ctx.accounts.constituent_target_base;
constituent_target_base.bump = ctx.bumps.constituent_target_base;
constituent_target_base
.targets
.resize_with(0 as usize, TargetsDatum::default);
constituent_target_base.validate()?;

Ok(())
}
Expand Down Expand Up @@ -4734,13 +4734,13 @@ pub fn handle_initialize_constituent<'info>(
let mut constituent = ctx.accounts.constituent.load_init()?;
let mut lp_pool = ctx.accounts.lp_pool.load_mut()?;

let constituent_target_weights = &mut ctx.accounts.constituent_target_weights;
let current_len = constituent_target_weights.weights.len();
let constituent_target_base = &mut ctx.accounts.constituent_target_base;
let current_len = constituent_target_base.targets.len();

constituent_target_weights
.weights
.resize_with((current_len + 1) as usize, WeightDatum::default);
constituent_target_weights.validate()?;
constituent_target_base
.targets
.resize_with((current_len + 1) as usize, TargetsDatum::default);
constituent_target_base.validate()?;

msg!(
"initializing constituent {} with spot market index {}",
Expand All @@ -4759,7 +4759,7 @@ pub fn handle_initialize_constituent<'info>(
constituent.mint = ctx.accounts.spot_market_mint.key();
constituent.bump = ctx.bumps.constituent;
constituent.lp_pool = lp_pool.pubkey;
constituent.constituent_index = (constituent_target_weights.weights.len() - 1) as u16;
constituent.constituent_index = (constituent_target_base.targets.len() - 1) as u16;
lp_pool.constituents += 1;

Ok(())
Expand Down Expand Up @@ -4890,7 +4890,7 @@ pub fn handle_add_amm_constituent_data<'info>(
init_amm_constituent_mapping_data: Vec<AddAmmConstituentMappingDatum>,
) -> Result<()> {
let amm_mapping = &mut ctx.accounts.amm_constituent_mapping;
let constituent_target_weights = &ctx.accounts.constituent_target_weights;
let constituent_target_base = &ctx.accounts.constituent_target_base;
let state = &ctx.accounts.state;
let mut current_len = amm_mapping.weights.len();

Expand All @@ -4904,7 +4904,7 @@ pub fn handle_add_amm_constituent_data<'info>(
)?;

validate!(
(init_datum.constituent_index as usize) < constituent_target_weights.weights.len(),
(init_datum.constituent_index as usize) < constituent_target_base.targets.len(),
ErrorCode::InvalidAmmConstituentMappingArgument,
"constituent_index too large compared to number of constituents in target weights"
)?;
Expand Down Expand Up @@ -5796,10 +5796,10 @@ pub struct InitializeLpPool<'info> {
init,
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
bump,
space = ConstituentTargetWeights::space(0 as usize),
space = ConstituentTargetBase::space(0 as usize),
payer = admin,
)]
pub constituent_target_weights: Box<Account<'info, ConstituentTargetWeights>>,
pub constituent_target_base: Box<Account<'info, ConstituentTargetBase>>,

#[account(
has_one = admin
Expand Down Expand Up @@ -5838,12 +5838,12 @@ pub struct InitializeConstituent<'info> {
#[account(
mut,
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
bump = constituent_target_weights.bump,
realloc = ConstituentTargetWeights::space(constituent_target_weights.weights.len() + 1 as usize),
bump = constituent_target_base.bump,
realloc = ConstituentTargetBase::space(constituent_target_base.targets.len() + 1 as usize),
realloc::payer = admin,
realloc::zero = false,
)]
pub constituent_target_weights: Box<Account<'info, ConstituentTargetWeights>>,
pub constituent_target_base: Box<Account<'info, ConstituentTargetBase>>,

#[account(
init,
Expand Down Expand Up @@ -5923,11 +5923,11 @@ pub struct AddAmmConstituentMappingData<'info> {
mut,
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
bump,
realloc = ConstituentTargetWeights::space(constituent_target_weights.weights.len() + 1 as usize),
realloc = ConstituentTargetBase::space(constituent_target_base.targets.len() + 1 as usize),
realloc::payer = admin,
realloc::zero = false,
)]
pub constituent_target_weights: Box<Account<'info, ConstituentTargetWeights>>,
pub constituent_target_base: Box<Account<'info, ConstituentTargetBase>>,
pub state: Box<Account<'info, State>>,
pub system_program: Program<'info, System>,
}
Expand Down
101 changes: 57 additions & 44 deletions programs/drift/src/instructions/lp_pool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use crate::{
events::{LPMintRedeemRecord, LPSwapRecord},
lp_pool::{
AmmConstituentDatum, AmmConstituentMappingFixed, Constituent,
ConstituentTargetWeightsFixed, LPPool, WeightDatum, WeightValidationFlags,
ConstituentTargetBaseFixed, LPPool, TargetsDatum, WeightValidationFlags,
},
oracle::OraclePriceData,
perp_market::{AmmCacheFixed, CacheInfo, AMM_POSITIONS_CACHE},
Expand All @@ -41,8 +41,8 @@ use crate::state::lp_pool::{
LP_POOL_TOKEN_VAULT_PDA_SEED,
};

pub fn handle_update_constituent_target_weights<'c: 'info, 'info>(
ctx: Context<'_, '_, 'c, 'info, UpdateConstituentTargetWeights<'info>>,
pub fn handle_update_constituent_target_base<'c: 'info, 'info>(
ctx: Context<'_, '_, 'c, 'info, UpdateConstituentTargetBase<'info>>,
lp_pool_name: [u8; 32],
constituent_indexes: Vec<u16>,
) -> Result<()> {
Expand All @@ -68,7 +68,7 @@ pub fn handle_update_constituent_target_weights<'c: 'info, 'info>(
)?;

let state = &ctx.accounts.state;
let constituent_target_weights_key = &ctx.accounts.constituent_target_weights.key();
let constituent_target_base_key = &ctx.accounts.constituent_target_base.key();
let amm_mapping_key = &ctx.accounts.amm_constituent_mapping.key();

// Validate lp pool pda
Expand All @@ -87,13 +87,13 @@ pub fn handle_update_constituent_target_weights<'c: 'info, 'info>(
"Lp pool PDA does not match expected PDA"
)?;

let mut constituent_target_weights: AccountZeroCopyMut<
let mut constituent_target_base: AccountZeroCopyMut<
'_,
WeightDatum,
ConstituentTargetWeightsFixed,
> = ctx.accounts.constituent_target_weights.load_zc_mut()?;
TargetsDatum,
ConstituentTargetBaseFixed,
> = ctx.accounts.constituent_target_base.load_zc_mut()?;

let bump = constituent_target_weights.fixed.bump;
let bump = constituent_target_base.fixed.bump;
let expected_pda = &Pubkey::create_program_address(
&[
CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(),
Expand All @@ -104,13 +104,13 @@ pub fn handle_update_constituent_target_weights<'c: 'info, 'info>(
)
.map_err(|_| ErrorCode::InvalidPDA)?;
validate!(
expected_pda.eq(constituent_target_weights_key),
expected_pda.eq(constituent_target_base_key),
ErrorCode::InvalidPDA,
"Constituent target weights PDA does not match expected PDA"
)?;

let num_constituents = constituent_target_weights.len();
for datum in constituent_target_weights.iter() {
let num_constituents = constituent_target_base.len();
for datum in constituent_target_base.iter() {
msg!("weight datum: {:?}", datum);
}

Expand All @@ -120,7 +120,7 @@ pub fn handle_update_constituent_target_weights<'c: 'info, 'info>(

validate!(
!exists_invalid_constituent_index,
ErrorCode::InvalidUpdateConstituentTargetWeightsArgument,
ErrorCode::InvalidUpdateConstituentTargetBaseArgument,
"Constituent index larger than number of constituent target weights"
)?;

Expand Down Expand Up @@ -171,7 +171,7 @@ pub fn handle_update_constituent_target_weights<'c: 'info, 'info>(

if !is_oracle_valid_for_action(
oracle_validity,
Some(DriftAction::UpdateLpConstituentTargetWeights),
Some(DriftAction::UpdateLpConstituentTargetBase),
)? {
msg!("Oracle data for perp market {} and constituent index {} is invalid. Skipping update",
datum.perp_market_index, datum.constituent_index);
Expand All @@ -187,14 +187,11 @@ pub fn handle_update_constituent_target_weights<'c: 'info, 'info>(
return Ok(());
}

constituent_target_weights.update_target_weights(
constituent_target_base.update_target_base(
&amm_constituent_mapping,
amm_inventories.as_slice(),
constituent_indexes.as_slice(),
&oracle_prices.as_slice(),
lp_pool.last_aum,
slot,
WeightValidationFlags::NONE,
)?;

Ok(())
Expand Down Expand Up @@ -324,23 +321,23 @@ pub fn handle_lp_pool_swap<'c: 'info, 'info>(
let mut in_constituent = ctx.accounts.in_constituent.load_mut()?;
let mut out_constituent = ctx.accounts.out_constituent.load_mut()?;

let constituent_target_weights_key = &ctx.accounts.constituent_target_weights.key();
let constituent_target_weights: AccountZeroCopy<
let constituent_target_base_key = &ctx.accounts.constituent_target_base.key();
let constituent_target_base: AccountZeroCopy<
'_,
WeightDatum,
ConstituentTargetWeightsFixed,
> = ctx.accounts.constituent_target_weights.load_zc()?;
TargetsDatum,
ConstituentTargetBaseFixed,
> = ctx.accounts.constituent_target_base.load_zc()?;
let expected_pda = &Pubkey::create_program_address(
&[
CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(),
lp_pool.pubkey.as_ref(),
constituent_target_weights.fixed.bump.to_le_bytes().as_ref(),
constituent_target_base.fixed.bump.to_le_bytes().as_ref(),
],
&crate::ID,
)
.map_err(|_| ErrorCode::InvalidPDA)?;
validate!(
expected_pda.eq(constituent_target_weights_key),
expected_pda.eq(constituent_target_base_key),
ErrorCode::InvalidPDA,
"Constituent target weights PDA does not match expected PDA"
)?;
Expand Down Expand Up @@ -401,10 +398,18 @@ pub fn handle_lp_pool_swap<'c: 'info, 'info>(
update_spot_market_cumulative_interest(&mut in_spot_market, Some(&in_oracle), now)?;
update_spot_market_cumulative_interest(&mut out_spot_market, Some(&out_oracle), now)?;

let in_target_weight =
constituent_target_weights.get_target_weight(in_constituent.constituent_index)?;
let out_target_weight =
constituent_target_weights.get_target_weight(out_constituent.constituent_index)?;
let in_target_weight = constituent_target_base.get_target_weight(
in_constituent.constituent_index,
&in_spot_market,
in_oracle.price,
lp_pool.last_aum,
)?;
let out_target_weight = constituent_target_base.get_target_weight(
out_constituent.constituent_index,
&out_spot_market,
out_oracle.price,
lp_pool.last_aum,
)?;

let (in_amount, out_amount, in_fee, out_fee) = lp_pool.get_swap_amount(
&in_oracle,
Expand Down Expand Up @@ -514,7 +519,7 @@ pub fn handle_lp_pool_add_liquidity<'c: 'info, 'info>(

let mut in_constituent = ctx.accounts.in_constituent.load_mut()?;

let constituent_target_weights = ctx.accounts.constituent_target_weights.load_zc()?;
let constituent_target_base = ctx.accounts.constituent_target_base.load_zc()?;

let AccountMaps {
perp_market_map: _,
Expand Down Expand Up @@ -553,8 +558,12 @@ pub fn handle_lp_pool_add_liquidity<'c: 'info, 'info>(

update_spot_market_cumulative_interest(&mut in_spot_market, Some(&in_oracle), now)?;

let in_target_weight =
constituent_target_weights.get_target_weight(in_constituent.constituent_index)?;
let in_target_weight = constituent_target_base.get_target_weight(
in_constituent.constituent_index,
&in_spot_market,
in_oracle.price,
lp_pool.last_aum, // TODO: add in_amount * in_oracle to est post add_liquidity aum
)?;

let dlp_total_supply = ctx.accounts.lp_mint.supply;

Expand Down Expand Up @@ -682,7 +691,7 @@ pub fn handle_lp_pool_remove_liquidity<'c: 'info, 'info>(

let mut out_constituent = ctx.accounts.out_constituent.load_mut()?;

let constituent_target_weights = ctx.accounts.constituent_target_weights.load_zc()?;
let constituent_target_base = ctx.accounts.constituent_target_base.load_zc()?;

let AccountMaps {
perp_market_map: _,
Expand Down Expand Up @@ -723,8 +732,12 @@ pub fn handle_lp_pool_remove_liquidity<'c: 'info, 'info>(

update_spot_market_cumulative_interest(&mut out_spot_market, Some(&out_oracle), now)?;

let out_target_weight =
constituent_target_weights.get_target_weight(out_constituent.constituent_index)?;
let out_target_weight = constituent_target_base.get_target_weight(
out_constituent.constituent_index,
&out_spot_market,
out_oracle.price,
lp_pool.last_aum, // TODO: remove out_amount * out_oracle to est post remove_liquidity aum
)?;

let dlp_total_supply = ctx.accounts.lp_mint.supply;

Expand Down Expand Up @@ -843,14 +856,14 @@ pub fn handle_lp_pool_remove_liquidity<'c: 'info, 'info>(
#[instruction(
lp_pool_name: [u8; 32],
)]
pub struct UpdateConstituentTargetWeights<'info> {
pub struct UpdateConstituentTargetBase<'info> {
pub state: Box<Account<'info, State>>,
#[account(mut)]
pub keeper: Signer<'info>,
/// CHECK: checked in AmmConstituentMappingZeroCopy checks
pub amm_constituent_mapping: AccountInfo<'info>,
/// CHECK: checked in ConstituentTargetWeightsZeroCopy checks
pub constituent_target_weights: AccountInfo<'info>,
/// CHECK: checked in ConstituentTargetBaseZeroCopy checks
pub constituent_target_base: AccountInfo<'info>,
/// CHECK: checked in AmmCacheZeroCopy checks
pub amm_cache: AccountInfo<'info>,
#[account(
Expand Down Expand Up @@ -892,8 +905,8 @@ pub struct LPPoolSwap<'info> {
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
bump,
)]
/// CHECK: checked in ConstituentTargetWeightsZeroCopy checks
pub constituent_target_weights: AccountInfo<'info>,
/// CHECK: checked in ConstituentTargetBaseZeroCopy checks
pub constituent_target_base: AccountInfo<'info>,

#[account(mut)]
pub constituent_in_token_account: Box<InterfaceAccount<'info, TokenAccount>>,
Expand Down Expand Up @@ -991,8 +1004,8 @@ pub struct LPPoolAddLiquidity<'info> {
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
bump,
)]
/// CHECK: checked in ConstituentTargetWeightsZeroCopy checks
pub constituent_target_weights: AccountInfo<'info>,
/// CHECK: checked in ConstituentTargetBaseZeroCopy checks
pub constituent_target_base: AccountInfo<'info>,

#[account(
mut,
Expand Down Expand Up @@ -1052,8 +1065,8 @@ pub struct LPPoolRemoveLiquidity<'info> {
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
bump,
)]
/// CHECK: checked in ConstituentTargetWeightsZeroCopy checks
pub constituent_target_weights: AccountInfo<'info>,
/// CHECK: checked in ConstituentTargetBaseZeroCopy checks
pub constituent_target_base: AccountInfo<'info>,

#[account(
mut,
Expand Down
6 changes: 3 additions & 3 deletions programs/drift/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1790,12 +1790,12 @@ pub mod drift {
handle_remove_amm_constituent_mapping_data(ctx, perp_market_index, constituent_index)
}

pub fn update_lp_constituent_target_weights<'c: 'info, 'info>(
ctx: Context<'_, '_, 'c, 'info, UpdateConstituentTargetWeights<'info>>,
pub fn update_lp_constituent_target_base<'c: 'info, 'info>(
ctx: Context<'_, '_, 'c, 'info, UpdateConstituentTargetBase<'info>>,
lp_pool_name: [u8; 32],
constituent_indexes: Vec<u16>,
) -> Result<()> {
handle_update_constituent_target_weights(ctx, lp_pool_name, constituent_indexes)
handle_update_constituent_target_base(ctx, lp_pool_name, constituent_indexes)
}

pub fn update_lp_pool_aum<'c: 'info, 'info>(
Expand Down
Loading