Skip to content

Commit 8f19f61

Browse files
authored
program: lp-pool-to-use-target-base-vector (#1615)
* init lp pool target-base matrix * working target-base logic * add todos for add/remove liquidity aum * add renames + fix test
1 parent dce2442 commit 8f19f61

File tree

7 files changed

+223
-212
lines changed

7 files changed

+223
-212
lines changed

programs/drift/src/error.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ pub enum ErrorCode {
642642
#[msg("Invalid Amm Constituent Mapping argument")]
643643
InvalidAmmConstituentMappingArgument,
644644
#[msg("Invalid update constituent update target weights argument")]
645-
InvalidUpdateConstituentTargetWeightsArgument,
645+
InvalidUpdateConstituentTargetBaseArgument,
646646
#[msg("Constituent not found")]
647647
ConstituentNotFound,
648648
#[msg("Constituent could not load")]

programs/drift/src/instructions/admin.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use std::mem::size_of;
33

44
use crate::msg;
55
use crate::state::lp_pool::{
6-
AmmConstituentDatum, AmmConstituentMapping, Constituent, ConstituentTargetWeights, LPPool,
7-
WeightDatum, AMM_MAP_PDA_SEED, CONSTITUENT_PDA_SEED, CONSTITUENT_TARGET_WEIGHT_PDA_SEED,
6+
AmmConstituentDatum, AmmConstituentMapping, Constituent, ConstituentTargetBase, LPPool,
7+
TargetsDatum, AMM_MAP_PDA_SEED, CONSTITUENT_PDA_SEED, CONSTITUENT_TARGET_WEIGHT_PDA_SEED,
88
CONSTITUENT_VAULT_PDA_SEED,
99
};
1010
use anchor_lang::prelude::*;
@@ -4517,12 +4517,12 @@ pub fn handle_initialize_lp_pool(
45174517
.resize_with(0 as usize, AmmConstituentDatum::default);
45184518
amm_constituent_mapping.validate()?;
45194519

4520-
let constituent_target_weights = &mut ctx.accounts.constituent_target_weights;
4521-
constituent_target_weights.bump = ctx.bumps.constituent_target_weights;
4522-
constituent_target_weights
4523-
.weights
4524-
.resize_with(0 as usize, WeightDatum::default);
4525-
constituent_target_weights.validate()?;
4520+
let constituent_target_base = &mut ctx.accounts.constituent_target_base;
4521+
constituent_target_base.bump = ctx.bumps.constituent_target_base;
4522+
constituent_target_base
4523+
.targets
4524+
.resize_with(0 as usize, TargetsDatum::default);
4525+
constituent_target_base.validate()?;
45264526

45274527
Ok(())
45284528
}
@@ -4734,13 +4734,13 @@ pub fn handle_initialize_constituent<'info>(
47344734
let mut constituent = ctx.accounts.constituent.load_init()?;
47354735
let mut lp_pool = ctx.accounts.lp_pool.load_mut()?;
47364736

4737-
let constituent_target_weights = &mut ctx.accounts.constituent_target_weights;
4738-
let current_len = constituent_target_weights.weights.len();
4737+
let constituent_target_base = &mut ctx.accounts.constituent_target_base;
4738+
let current_len = constituent_target_base.targets.len();
47394739

4740-
constituent_target_weights
4741-
.weights
4742-
.resize_with((current_len + 1) as usize, WeightDatum::default);
4743-
constituent_target_weights.validate()?;
4740+
constituent_target_base
4741+
.targets
4742+
.resize_with((current_len + 1) as usize, TargetsDatum::default);
4743+
constituent_target_base.validate()?;
47444744

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

47654765
Ok(())
@@ -4890,7 +4890,7 @@ pub fn handle_add_amm_constituent_data<'info>(
48904890
init_amm_constituent_mapping_data: Vec<AddAmmConstituentMappingDatum>,
48914891
) -> Result<()> {
48924892
let amm_mapping = &mut ctx.accounts.amm_constituent_mapping;
4893-
let constituent_target_weights = &ctx.accounts.constituent_target_weights;
4893+
let constituent_target_base = &ctx.accounts.constituent_target_base;
48944894
let state = &ctx.accounts.state;
48954895
let mut current_len = amm_mapping.weights.len();
48964896

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

49064906
validate!(
4907-
(init_datum.constituent_index as usize) < constituent_target_weights.weights.len(),
4907+
(init_datum.constituent_index as usize) < constituent_target_base.targets.len(),
49084908
ErrorCode::InvalidAmmConstituentMappingArgument,
49094909
"constituent_index too large compared to number of constituents in target weights"
49104910
)?;
@@ -5796,10 +5796,10 @@ pub struct InitializeLpPool<'info> {
57965796
init,
57975797
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
57985798
bump,
5799-
space = ConstituentTargetWeights::space(0 as usize),
5799+
space = ConstituentTargetBase::space(0 as usize),
58005800
payer = admin,
58015801
)]
5802-
pub constituent_target_weights: Box<Account<'info, ConstituentTargetWeights>>,
5802+
pub constituent_target_base: Box<Account<'info, ConstituentTargetBase>>,
58035803

58045804
#[account(
58055805
has_one = admin
@@ -5838,12 +5838,12 @@ pub struct InitializeConstituent<'info> {
58385838
#[account(
58395839
mut,
58405840
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
5841-
bump = constituent_target_weights.bump,
5842-
realloc = ConstituentTargetWeights::space(constituent_target_weights.weights.len() + 1 as usize),
5841+
bump = constituent_target_base.bump,
5842+
realloc = ConstituentTargetBase::space(constituent_target_base.targets.len() + 1 as usize),
58435843
realloc::payer = admin,
58445844
realloc::zero = false,
58455845
)]
5846-
pub constituent_target_weights: Box<Account<'info, ConstituentTargetWeights>>,
5846+
pub constituent_target_base: Box<Account<'info, ConstituentTargetBase>>,
58475847

58485848
#[account(
58495849
init,
@@ -5923,11 +5923,11 @@ pub struct AddAmmConstituentMappingData<'info> {
59235923
mut,
59245924
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
59255925
bump,
5926-
realloc = ConstituentTargetWeights::space(constituent_target_weights.weights.len() + 1 as usize),
5926+
realloc = ConstituentTargetBase::space(constituent_target_base.targets.len() + 1 as usize),
59275927
realloc::payer = admin,
59285928
realloc::zero = false,
59295929
)]
5930-
pub constituent_target_weights: Box<Account<'info, ConstituentTargetWeights>>,
5930+
pub constituent_target_base: Box<Account<'info, ConstituentTargetBase>>,
59315931
pub state: Box<Account<'info, State>>,
59325932
pub system_program: Program<'info, System>,
59335933
}

programs/drift/src/instructions/lp_pool.rs

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::{
1717
events::{LPMintRedeemRecord, LPSwapRecord},
1818
lp_pool::{
1919
AmmConstituentDatum, AmmConstituentMappingFixed, Constituent,
20-
ConstituentTargetWeightsFixed, LPPool, WeightDatum, WeightValidationFlags,
20+
ConstituentTargetBaseFixed, LPPool, TargetsDatum, WeightValidationFlags,
2121
},
2222
oracle::OraclePriceData,
2323
perp_market::{AmmCacheFixed, CacheInfo, AMM_POSITIONS_CACHE},
@@ -41,8 +41,8 @@ use crate::state::lp_pool::{
4141
LP_POOL_TOKEN_VAULT_PDA_SEED,
4242
};
4343

44-
pub fn handle_update_constituent_target_weights<'c: 'info, 'info>(
45-
ctx: Context<'_, '_, 'c, 'info, UpdateConstituentTargetWeights<'info>>,
44+
pub fn handle_update_constituent_target_base<'c: 'info, 'info>(
45+
ctx: Context<'_, '_, 'c, 'info, UpdateConstituentTargetBase<'info>>,
4646
lp_pool_name: [u8; 32],
4747
constituent_indexes: Vec<u16>,
4848
) -> Result<()> {
@@ -68,7 +68,7 @@ pub fn handle_update_constituent_target_weights<'c: 'info, 'info>(
6868
)?;
6969

7070
let state = &ctx.accounts.state;
71-
let constituent_target_weights_key = &ctx.accounts.constituent_target_weights.key();
71+
let constituent_target_base_key = &ctx.accounts.constituent_target_base.key();
7272
let amm_mapping_key = &ctx.accounts.amm_constituent_mapping.key();
7373

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

90-
let mut constituent_target_weights: AccountZeroCopyMut<
90+
let mut constituent_target_base: AccountZeroCopyMut<
9191
'_,
92-
WeightDatum,
93-
ConstituentTargetWeightsFixed,
94-
> = ctx.accounts.constituent_target_weights.load_zc_mut()?;
92+
TargetsDatum,
93+
ConstituentTargetBaseFixed,
94+
> = ctx.accounts.constituent_target_base.load_zc_mut()?;
9595

96-
let bump = constituent_target_weights.fixed.bump;
96+
let bump = constituent_target_base.fixed.bump;
9797
let expected_pda = &Pubkey::create_program_address(
9898
&[
9999
CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(),
@@ -104,13 +104,13 @@ pub fn handle_update_constituent_target_weights<'c: 'info, 'info>(
104104
)
105105
.map_err(|_| ErrorCode::InvalidPDA)?;
106106
validate!(
107-
expected_pda.eq(constituent_target_weights_key),
107+
expected_pda.eq(constituent_target_base_key),
108108
ErrorCode::InvalidPDA,
109109
"Constituent target weights PDA does not match expected PDA"
110110
)?;
111111

112-
let num_constituents = constituent_target_weights.len();
113-
for datum in constituent_target_weights.iter() {
112+
let num_constituents = constituent_target_base.len();
113+
for datum in constituent_target_base.iter() {
114114
msg!("weight datum: {:?}", datum);
115115
}
116116

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

121121
validate!(
122122
!exists_invalid_constituent_index,
123-
ErrorCode::InvalidUpdateConstituentTargetWeightsArgument,
123+
ErrorCode::InvalidUpdateConstituentTargetBaseArgument,
124124
"Constituent index larger than number of constituent target weights"
125125
)?;
126126

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

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

190-
constituent_target_weights.update_target_weights(
190+
constituent_target_base.update_target_base(
191191
&amm_constituent_mapping,
192192
amm_inventories.as_slice(),
193193
constituent_indexes.as_slice(),
194-
&oracle_prices.as_slice(),
195-
lp_pool.last_aum,
196194
slot,
197-
WeightValidationFlags::NONE,
198195
)?;
199196

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

327-
let constituent_target_weights_key = &ctx.accounts.constituent_target_weights.key();
328-
let constituent_target_weights: AccountZeroCopy<
324+
let constituent_target_base_key = &ctx.accounts.constituent_target_base.key();
325+
let constituent_target_base: AccountZeroCopy<
329326
'_,
330-
WeightDatum,
331-
ConstituentTargetWeightsFixed,
332-
> = ctx.accounts.constituent_target_weights.load_zc()?;
327+
TargetsDatum,
328+
ConstituentTargetBaseFixed,
329+
> = ctx.accounts.constituent_target_base.load_zc()?;
333330
let expected_pda = &Pubkey::create_program_address(
334331
&[
335332
CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(),
336333
lp_pool.pubkey.as_ref(),
337-
constituent_target_weights.fixed.bump.to_le_bytes().as_ref(),
334+
constituent_target_base.fixed.bump.to_le_bytes().as_ref(),
338335
],
339336
&crate::ID,
340337
)
341338
.map_err(|_| ErrorCode::InvalidPDA)?;
342339
validate!(
343-
expected_pda.eq(constituent_target_weights_key),
340+
expected_pda.eq(constituent_target_base_key),
344341
ErrorCode::InvalidPDA,
345342
"Constituent target weights PDA does not match expected PDA"
346343
)?;
@@ -401,10 +398,18 @@ pub fn handle_lp_pool_swap<'c: 'info, 'info>(
401398
update_spot_market_cumulative_interest(&mut in_spot_market, Some(&in_oracle), now)?;
402399
update_spot_market_cumulative_interest(&mut out_spot_market, Some(&out_oracle), now)?;
403400

404-
let in_target_weight =
405-
constituent_target_weights.get_target_weight(in_constituent.constituent_index)?;
406-
let out_target_weight =
407-
constituent_target_weights.get_target_weight(out_constituent.constituent_index)?;
401+
let in_target_weight = constituent_target_base.get_target_weight(
402+
in_constituent.constituent_index,
403+
&in_spot_market,
404+
in_oracle.price,
405+
lp_pool.last_aum,
406+
)?;
407+
let out_target_weight = constituent_target_base.get_target_weight(
408+
out_constituent.constituent_index,
409+
&out_spot_market,
410+
out_oracle.price,
411+
lp_pool.last_aum,
412+
)?;
408413

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

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

517-
let constituent_target_weights = ctx.accounts.constituent_target_weights.load_zc()?;
522+
let constituent_target_base = ctx.accounts.constituent_target_base.load_zc()?;
518523

519524
let AccountMaps {
520525
perp_market_map: _,
@@ -553,8 +558,12 @@ pub fn handle_lp_pool_add_liquidity<'c: 'info, 'info>(
553558

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

556-
let in_target_weight =
557-
constituent_target_weights.get_target_weight(in_constituent.constituent_index)?;
561+
let in_target_weight = constituent_target_base.get_target_weight(
562+
in_constituent.constituent_index,
563+
&in_spot_market,
564+
in_oracle.price,
565+
lp_pool.last_aum, // TODO: add in_amount * in_oracle to est post add_liquidity aum
566+
)?;
558567

559568
let dlp_total_supply = ctx.accounts.lp_mint.supply;
560569

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

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

685-
let constituent_target_weights = ctx.accounts.constituent_target_weights.load_zc()?;
694+
let constituent_target_base = ctx.accounts.constituent_target_base.load_zc()?;
686695

687696
let AccountMaps {
688697
perp_market_map: _,
@@ -723,8 +732,12 @@ pub fn handle_lp_pool_remove_liquidity<'c: 'info, 'info>(
723732

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

726-
let out_target_weight =
727-
constituent_target_weights.get_target_weight(out_constituent.constituent_index)?;
735+
let out_target_weight = constituent_target_base.get_target_weight(
736+
out_constituent.constituent_index,
737+
&out_spot_market,
738+
out_oracle.price,
739+
lp_pool.last_aum, // TODO: remove out_amount * out_oracle to est post remove_liquidity aum
740+
)?;
728741

729742
let dlp_total_supply = ctx.accounts.lp_mint.supply;
730743

@@ -843,14 +856,14 @@ pub fn handle_lp_pool_remove_liquidity<'c: 'info, 'info>(
843856
#[instruction(
844857
lp_pool_name: [u8; 32],
845858
)]
846-
pub struct UpdateConstituentTargetWeights<'info> {
859+
pub struct UpdateConstituentTargetBase<'info> {
847860
pub state: Box<Account<'info, State>>,
848861
#[account(mut)]
849862
pub keeper: Signer<'info>,
850863
/// CHECK: checked in AmmConstituentMappingZeroCopy checks
851864
pub amm_constituent_mapping: AccountInfo<'info>,
852-
/// CHECK: checked in ConstituentTargetWeightsZeroCopy checks
853-
pub constituent_target_weights: AccountInfo<'info>,
865+
/// CHECK: checked in ConstituentTargetBaseZeroCopy checks
866+
pub constituent_target_base: AccountInfo<'info>,
854867
/// CHECK: checked in AmmCacheZeroCopy checks
855868
pub amm_cache: AccountInfo<'info>,
856869
#[account(
@@ -892,8 +905,8 @@ pub struct LPPoolSwap<'info> {
892905
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
893906
bump,
894907
)]
895-
/// CHECK: checked in ConstituentTargetWeightsZeroCopy checks
896-
pub constituent_target_weights: AccountInfo<'info>,
908+
/// CHECK: checked in ConstituentTargetBaseZeroCopy checks
909+
pub constituent_target_base: AccountInfo<'info>,
897910

898911
#[account(mut)]
899912
pub constituent_in_token_account: Box<InterfaceAccount<'info, TokenAccount>>,
@@ -991,8 +1004,8 @@ pub struct LPPoolAddLiquidity<'info> {
9911004
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
9921005
bump,
9931006
)]
994-
/// CHECK: checked in ConstituentTargetWeightsZeroCopy checks
995-
pub constituent_target_weights: AccountInfo<'info>,
1007+
/// CHECK: checked in ConstituentTargetBaseZeroCopy checks
1008+
pub constituent_target_base: AccountInfo<'info>,
9961009

9971010
#[account(
9981011
mut,
@@ -1052,8 +1065,8 @@ pub struct LPPoolRemoveLiquidity<'info> {
10521065
seeds = [CONSTITUENT_TARGET_WEIGHT_PDA_SEED.as_ref(), lp_pool.key().as_ref()],
10531066
bump,
10541067
)]
1055-
/// CHECK: checked in ConstituentTargetWeightsZeroCopy checks
1056-
pub constituent_target_weights: AccountInfo<'info>,
1068+
/// CHECK: checked in ConstituentTargetBaseZeroCopy checks
1069+
pub constituent_target_base: AccountInfo<'info>,
10571070

10581071
#[account(
10591072
mut,

programs/drift/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1790,12 +1790,12 @@ pub mod drift {
17901790
handle_remove_amm_constituent_mapping_data(ctx, perp_market_index, constituent_index)
17911791
}
17921792

1793-
pub fn update_lp_constituent_target_weights<'c: 'info, 'info>(
1794-
ctx: Context<'_, '_, 'c, 'info, UpdateConstituentTargetWeights<'info>>,
1793+
pub fn update_lp_constituent_target_base<'c: 'info, 'info>(
1794+
ctx: Context<'_, '_, 'c, 'info, UpdateConstituentTargetBase<'info>>,
17951795
lp_pool_name: [u8; 32],
17961796
constituent_indexes: Vec<u16>,
17971797
) -> Result<()> {
1798-
handle_update_constituent_target_weights(ctx, lp_pool_name, constituent_indexes)
1798+
handle_update_constituent_target_base(ctx, lp_pool_name, constituent_indexes)
17991799
}
18001800

18011801
pub fn update_lp_pool_aum<'c: 'info, 'info>(

0 commit comments

Comments
 (0)