Skip to content

Commit 81e442a

Browse files
0xbigzmoosecat2
andauthored
program: dlp add upnl for settles to amm cache (#1659)
* program: dlp add-upnl-for-settles-to-amm-cache * finish up lp pool transfer from perp market * add amount_to_transfer using diff * merge * add pnl and fee pool accounting + transfer from dlp to perp market --------- Co-authored-by: Nour Alharithi <[email protected]>
1 parent b1fb7a8 commit 81e442a

File tree

10 files changed

+623
-10
lines changed

10 files changed

+623
-10
lines changed

programs/drift/src/instructions/admin.rs

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use anchor_spl::associated_token::AssociatedToken;
33
use std::convert::identity;
44
use std::mem::size_of;
55

6+
use crate::math::amm::calculate_net_user_pnl;
67
use crate::msg;
78
use crate::state::lp_pool::{
89
AmmConstituentDatum, AmmConstituentMapping, Constituent, ConstituentTargetBase, LPPool,
@@ -72,7 +73,7 @@ use crate::state::perp_market_map::{get_writable_perp_market_set, MarketSet};
7273
use crate::state::protected_maker_mode_config::ProtectedMakerModeConfig;
7374
use crate::state::pyth_lazer_oracle::{PythLazerOracle, PYTH_LAZER_ORACLE_SEED};
7475
use crate::state::spot_market::{
75-
AssetTier, InsuranceFund, SpotBalanceType, SpotFulfillmentConfigStatus, SpotMarket,
76+
AssetTier, InsuranceFund, SpotBalance, SpotBalanceType, SpotFulfillmentConfigStatus, SpotMarket,
7677
};
7778
use crate::state::spot_market_map::get_writable_spot_market_set;
7879
use crate::state::state::{ExchangeStatus, FeeStructure, OracleGuardRails, State};
@@ -965,7 +966,8 @@ pub fn handle_initialize_perp_market(
965966
high_leverage_margin_ratio_maintenance: 0,
966967
protected_maker_limit_price_divisor: 0,
967968
protected_maker_dynamic_divisor: 0,
968-
padding: [0; 36],
969+
lp_fee_transfer_scalar: 1,
970+
padding: [0; 35],
969971
amm: AMM {
970972
oracle: *ctx.accounts.oracle.key,
971973
oracle_source,
@@ -1115,8 +1117,8 @@ pub fn handle_update_init_amm_cache_info<'c: 'info, 'info>(
11151117

11161118
let AccountMaps {
11171119
perp_market_map,
1118-
spot_market_map: _,
1119-
oracle_map: _,
1120+
spot_market_map,
1121+
mut oracle_map,
11201122
} = load_maps(
11211123
&mut ctx.remaining_accounts.iter().peekable(),
11221124
&MarketSet::new(),
@@ -1125,8 +1127,12 @@ pub fn handle_update_init_amm_cache_info<'c: 'info, 'info>(
11251127
None,
11261128
)?;
11271129

1130+
let quote_market = spot_market_map.get_quote_spot_market()?;
1131+
11281132
for (_, perp_market_loader) in perp_market_map.0 {
11291133
let perp_market = perp_market_loader.load()?;
1134+
let oracle_data = oracle_map.get_price_data(&perp_market.oracle_id())?;
1135+
11301136
let market_index = perp_market.market_index as usize;
11311137
let cache = amm_cache.cache.get_mut(market_index).unwrap();
11321138
cache.oracle = perp_market.amm.oracle;
@@ -1135,6 +1141,18 @@ pub fn handle_update_init_amm_cache_info<'c: 'info, 'info>(
11351141
.amm
11361142
.historical_oracle_data
11371143
.last_oracle_price_twap;
1144+
cache.last_fee_pool_balance = get_token_amount(
1145+
perp_market.amm.fee_pool.scaled_balance,
1146+
&quote_market,
1147+
perp_market.amm.fee_pool.balance_type(),
1148+
)?;
1149+
cache.last_net_pnl_pool_balance = get_token_amount(
1150+
perp_market.pnl_pool.scaled_balance,
1151+
&quote_market,
1152+
perp_market.pnl_pool.balance_type(),
1153+
)?
1154+
.cast::<i128>()?
1155+
.safe_sub(calculate_net_user_pnl(&perp_market.amm, oracle_data.price)?)?;
11381156
}
11391157

11401158
Ok(())
@@ -3804,6 +3822,25 @@ pub fn handle_update_perp_market_min_order_size(
38043822
Ok(())
38053823
}
38063824

3825+
#[access_control(
3826+
perp_market_valid(&ctx.accounts.perp_market)
3827+
)]
3828+
pub fn handle_update_perp_market_lp_pool_fee_transfer_scalar(
3829+
ctx: Context<AdminUpdatePerpMarket>,
3830+
lp_fee_transfer_scalar: u8,
3831+
) -> Result<()> {
3832+
let perp_market = &mut load_mut!(ctx.accounts.perp_market)?;
3833+
msg!("perp market {}", perp_market.market_index);
3834+
msg!(
3835+
"perp_market.: {:?} -> {:?}",
3836+
perp_market.lp_fee_transfer_scalar,
3837+
lp_fee_transfer_scalar
3838+
);
3839+
3840+
perp_market.lp_fee_transfer_scalar = lp_fee_transfer_scalar;
3841+
Ok(())
3842+
}
3843+
38073844
#[access_control(
38083845
spot_market_valid(&ctx.accounts.spot_market)
38093846
)]
@@ -4516,6 +4553,8 @@ pub fn handle_initialize_lp_pool(
45164553
revenue_rebalance_period,
45174554
next_mint_redeem_id: 1,
45184555
usdc_consituent_index: 0,
4556+
cumulative_usdc_sent_to_perp_markets: 0,
4557+
cumulative_usdc_received_from_perp_markets: 0,
45194558
_padding: [0; 10],
45204559
};
45214560

0 commit comments

Comments
 (0)