@@ -245,7 +245,8 @@ pub struct PerpMarket {
245245 pub lp_status : u8 ,
246246 pub padding1 : u16 ,
247247 pub last_fill_price : u64 ,
248- pub padding : [ u8 ; 24 ] ,
248+ pub lp_exchange_fee_excluscion_scalar : u8 ,
249+ pub padding : [ u8 ; 23 ] ,
249250}
250251
251252impl Default for PerpMarket {
@@ -287,11 +288,12 @@ impl Default for PerpMarket {
287288 high_leverage_margin_ratio_maintenance : 0 ,
288289 protected_maker_limit_price_divisor : 0 ,
289290 protected_maker_dynamic_divisor : 0 ,
290- lp_fee_transfer_scalar : 1 ,
291+ lp_fee_transfer_scalar : 0 ,
291292 lp_status : 0 ,
292293 padding1 : 0 ,
293294 last_fill_price : 0 ,
294- padding : [ 0 ; 24 ] ,
295+ lp_exchange_fee_excluscion_scalar : 0 ,
296+ padding : [ 0 ; 23 ] ,
295297 }
296298 }
297299}
@@ -1709,6 +1711,7 @@ pub struct AmmCache {
17091711pub struct CacheInfo {
17101712 pub last_fee_pool_token_amount : u128 ,
17111713 pub last_net_pnl_pool_token_amount : i128 ,
1714+ pub last_exchange_fees : u128 ,
17121715 /// BASE PRECISION
17131716 pub position : i64 ,
17141717 pub slot : u64 ,
@@ -1745,6 +1748,7 @@ impl Default for CacheInfo {
17451748 oracle : Pubkey :: default ( ) ,
17461749 last_fee_pool_token_amount : 0u128 ,
17471750 last_net_pnl_pool_token_amount : 0i128 ,
1751+ last_exchange_fees : 0u128 ,
17481752 last_settle_amount : 0u64 ,
17491753 last_settle_slot : 0u64 ,
17501754 oracle_source : 0u8 ,
@@ -1856,9 +1860,11 @@ impl<'a> AccountZeroCopyMut<'a, CacheInfo, AmmCacheFixed> {
18561860 perp_market : & PerpMarket ,
18571861 quote_market : & SpotMarket ,
18581862 ) -> DriftResult < ( ) > {
1859- if perp_market. lp_fee_transfer_scalar == 0 {
1863+ if perp_market. lp_fee_transfer_scalar == 0
1864+ && perp_market. lp_exchange_fee_excluscion_scalar == 0
1865+ {
18601866 msg ! (
1861- "lp_fee_transfer_scalar is 0 for perp market {}. not updating quote amount owed in cache" ,
1867+ "lp_fee_transfer_scalar and lp_net_pnl_transfer_scalar are 0 for perp market {}. not updating quote amount owed in cache" ,
18621868 perp_market. market_index
18631869 ) ;
18641870 return Ok ( ( ) ) ;
@@ -1888,29 +1894,37 @@ impl<'a> AccountZeroCopyMut<'a, CacheInfo, AmmCacheFixed> {
18881894
18891895 if cached_info. last_net_pnl_pool_token_amount == 0
18901896 && cached_info. last_fee_pool_token_amount == 0
1897+ && cached_info. last_exchange_fees == 0
18911898 {
18921899 cached_info. last_fee_pool_token_amount = fee_pool_token_amount;
18931900 cached_info. last_net_pnl_pool_token_amount = net_pnl_pool_token_amount;
1901+ cached_info. last_exchange_fees = perp_market. amm . total_exchange_fee ;
18941902 return Ok ( ( ) ) ;
18951903 }
18961904
1897- let amount_to_send = amm_amount_available
1898- . abs_diff ( cached_info. get_last_available_amm_balance ( ) ?)
1899- . safe_div_ceil ( perp_market. lp_fee_transfer_scalar as u128 ) ?
1900- . cast :: < u64 > ( ) ?;
1905+ let exchange_fee_delta = perp_market
1906+ . amm
1907+ . total_exchange_fee
1908+ . saturating_sub ( cached_info. last_exchange_fees ) ;
1909+
1910+ let amount_to_send_to_lp_pool = amm_amount_available
1911+ . safe_sub ( cached_info. get_last_available_amm_balance ( ) ?) ?
1912+ . safe_mul ( perp_market. lp_fee_transfer_scalar as i128 ) ?
1913+ . safe_div_ceil ( 100 ) ?
1914+ . safe_sub (
1915+ exchange_fee_delta
1916+ . cast :: < i128 > ( ) ?
1917+ . safe_mul ( perp_market. lp_exchange_fee_excluscion_scalar as i128 ) ?
1918+ . safe_div_ceil ( 100 ) ?,
1919+ ) ?;
19011920
1902- if amm_amount_available < cached_info. get_last_available_amm_balance ( ) ? {
1903- cached_info. quote_owed_from_lp_pool = cached_info
1904- . quote_owed_from_lp_pool
1905- . safe_add ( amount_to_send. cast :: < i64 > ( ) ?) ?;
1906- } else {
1907- cached_info. quote_owed_from_lp_pool = cached_info
1908- . quote_owed_from_lp_pool
1909- . safe_sub ( amount_to_send. cast :: < i64 > ( ) ?) ?;
1910- }
1921+ cached_info. quote_owed_from_lp_pool = cached_info
1922+ . quote_owed_from_lp_pool
1923+ . safe_sub ( amount_to_send_to_lp_pool. cast :: < i64 > ( ) ?) ?;
19111924
19121925 cached_info. last_fee_pool_token_amount = fee_pool_token_amount;
19131926 cached_info. last_net_pnl_pool_token_amount = net_pnl_pool_token_amount;
1927+ cached_info. last_exchange_fees = perp_market. amm . total_exchange_fee ;
19141928
19151929 Ok ( ( ) )
19161930 }
0 commit comments