@@ -18,11 +18,12 @@ use crate::instructions::optional_accounts::{load_maps, AccountMaps};
1818use crate :: math:: casting:: Cast ;
1919use crate :: math:: constants:: {
2020 AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO , DEFAULT_LIQUIDATION_MARGIN_BUFFER_RATIO ,
21- FEE_POOL_TO_REVENUE_POOL_THRESHOLD , IF_FACTOR_PRECISION , INSURANCE_A_MAX , INSURANCE_B_MAX ,
22- INSURANCE_C_MAX , INSURANCE_SPECULATIVE_MAX , LIQUIDATION_FEE_PRECISION ,
23- MAX_CONCENTRATION_COEFFICIENT , MAX_SQRT_K , MAX_UPDATE_K_PRICE_CHANGE , PERCENTAGE_PRECISION ,
24- PERCENTAGE_PRECISION_I64 , QUOTE_SPOT_MARKET_INDEX , SPOT_CUMULATIVE_INTEREST_PRECISION ,
25- SPOT_IMF_PRECISION , SPOT_WEIGHT_PRECISION , THIRTEEN_DAY , TWENTY_FOUR_HOUR ,
21+ FEE_POOL_TO_REVENUE_POOL_THRESHOLD , GOV_SPOT_MARKET_INDEX , IF_FACTOR_PRECISION ,
22+ INSURANCE_A_MAX , INSURANCE_B_MAX , INSURANCE_C_MAX , INSURANCE_SPECULATIVE_MAX ,
23+ LIQUIDATION_FEE_PRECISION , MAX_CONCENTRATION_COEFFICIENT , MAX_SQRT_K ,
24+ MAX_UPDATE_K_PRICE_CHANGE , PERCENTAGE_PRECISION , PERCENTAGE_PRECISION_I64 ,
25+ QUOTE_SPOT_MARKET_INDEX , SPOT_CUMULATIVE_INTEREST_PRECISION , SPOT_IMF_PRECISION ,
26+ SPOT_WEIGHT_PRECISION , THIRTEEN_DAY , TWENTY_FOUR_HOUR ,
2627} ;
2728use crate :: math:: cp_curve:: get_update_k_result;
2829use crate :: math:: helpers:: get_proportion_u128;
@@ -45,6 +46,7 @@ use crate::state::fulfillment_params::serum::SerumContext;
4546use crate :: state:: fulfillment_params:: serum:: SerumV3FulfillmentConfig ;
4647use crate :: state:: high_leverage_mode_config:: HighLeverageModeConfig ;
4748use crate :: state:: if_rebalance_config:: { IfRebalanceConfig , IfRebalanceConfigParams } ;
49+ use crate :: state:: insurance_fund_stake:: InsuranceFundStake ;
4850use crate :: state:: insurance_fund_stake:: ProtocolIfSharesTransferConfig ;
4951use crate :: state:: oracle:: get_sb_on_demand_price;
5052use crate :: state:: oracle:: {
@@ -4915,6 +4917,39 @@ pub fn handle_update_feature_bit_flags_median_trigger_price(
49154917 Ok ( ( ) )
49164918}
49174919
4920+ pub fn handle_update_delegate_user_gov_token_insurance_stake (
4921+ ctx : Context < UpdateDelegateUserGovTokenInsuranceStake > ,
4922+ ) -> Result < ( ) > {
4923+ let insurance_fund_stake = & mut load_mut ! ( ctx. accounts. insurance_fund_stake) ?;
4924+ let user_stats = & mut load_mut ! ( ctx. accounts. user_stats) ?;
4925+ let spot_market = & mut load_mut ! ( ctx. accounts. spot_market) ?;
4926+
4927+ validate ! (
4928+ insurance_fund_stake. market_index == GOV_SPOT_MARKET_INDEX ,
4929+ ErrorCode :: IncorrectSpotMarketAccountPassed ,
4930+ "insurance_fund_stake is not for governance market index = {}" ,
4931+ GOV_SPOT_MARKET_INDEX
4932+ ) ?;
4933+
4934+ if insurance_fund_stake. market_index == GOV_SPOT_MARKET_INDEX
4935+ && spot_market. market_index == GOV_SPOT_MARKET_INDEX
4936+ {
4937+ let clock = Clock :: get ( ) ?;
4938+ let now = clock. unix_timestamp ;
4939+
4940+ crate :: controller:: insurance:: update_user_stats_if_stake_amount (
4941+ 0 ,
4942+ ctx. accounts . insurance_fund_vault . amount ,
4943+ insurance_fund_stake,
4944+ user_stats,
4945+ spot_market,
4946+ now,
4947+ ) ?;
4948+ }
4949+
4950+ Ok ( ( ) )
4951+ }
4952+
49184953#[ derive( Accounts ) ]
49194954pub struct Initialize < ' info > {
49204955 #[ account( mut ) ]
@@ -5759,3 +5794,27 @@ pub struct UpdateIfRebalanceConfig<'info> {
57595794 ) ]
57605795 pub state : Box < Account < ' info , State > > ,
57615796}
5797+
5798+ #[ derive( Accounts ) ]
5799+ pub struct UpdateDelegateUserGovTokenInsuranceStake < ' info > {
5800+ #[ account(
5801+ mut ,
5802+ seeds = [ b"spot_market" , 15_u16 . to_le_bytes( ) . as_ref( ) ] ,
5803+ bump
5804+ ) ]
5805+ pub spot_market : AccountLoader < ' info , SpotMarket > ,
5806+ pub insurance_fund_stake : AccountLoader < ' info , InsuranceFundStake > ,
5807+ #[ account( mut ) ]
5808+ pub user_stats : AccountLoader < ' info , UserStats > ,
5809+ pub admin : Signer < ' info > ,
5810+ #[ account(
5811+ mut ,
5812+ seeds = [ b"insurance_fund_vault" . as_ref( ) , 15_u16 . to_le_bytes( ) . as_ref( ) ] ,
5813+ bump,
5814+ ) ]
5815+ pub insurance_fund_vault : Box < InterfaceAccount < ' info , TokenAccount > > ,
5816+ #[ account(
5817+ has_one = admin
5818+ ) ]
5819+ pub state : Box < Account < ' info , State > > ,
5820+ }
0 commit comments