@@ -16,13 +16,14 @@ use staking::staking::interface::{
1616 IStakingConsensusDispatcherTrait , IStakingDispatcherTrait ,
1717 IStakingRewardsManagerSafeDispatcherTrait ,
1818};
19+ use staking :: staking :: objects :: NormalizedAmountTrait ;
1920use staking :: staking :: utils :: {BTC_WEIGHT_FACTOR , STAKING_POWER_BASE_VALUE , STRK_WEIGHT_FACTOR };
2021use staking :: test_utils :: constants :: {
2122 BTC_18D_CONFIG , BTC_5D_CONFIG , BTC_8D_CONFIG , PUBLIC_KEY , STRK_BASE_VALUE ,
2223 TEST_MIN_BTC_FOR_REWARDS ,
2324};
2425use staking :: test_utils :: {
25- StakingInitConfig , calculate_staker_btc_pool_rewards_v2,
26+ StakingInitConfig , calculate_staker_btc_pool_rewards_v2, calculate_staker_btc_pool_rewards_v3,
2627 calculate_staker_strk_rewards_with_balances_v2, calculate_staker_strk_rewards_with_balances_v3,
2728 calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit,
2829 custom_decimals_token, deploy_mock_erc20_decimals_contract,
@@ -3029,3 +3030,138 @@ fn enable_disable_btc_tokens_flow_test() {
30293030 . span ();
30303031 assert! (tokens == expected_tokens );
30313032}
3033+
3034+ /// Flow:
3035+ /// Add tokens A and B
3036+ /// Enable token B
3037+ /// Advance K epochs
3038+ /// Enable token A, disable token B
3039+ /// update_rewards
3040+ /// Advance epoch - test rewards only for token B
3041+ /// update_rewards
3042+ /// Advance epoch - test rewards only for token B
3043+ /// update_rewards
3044+ /// Advance epoch - test rewards only for token A
3045+ /// Start consensus rewards
3046+ /// Enable token B, disable token A
3047+ /// update_rewards
3048+ /// Advance epoch - test rewards only for token A
3049+ /// update_rewards
3050+ /// Advance epoch - test rewards only for token A
3051+ /// update_rewards
3052+ /// Advance epoch - test rewards only for token B
3053+ #[test]
3054+ fn update_rewards_token_enable_disable_flow_test () {
3055+ let cfg : StakingInitConfig = Default :: default ();
3056+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
3057+ let token_a_decimals = 8 ;
3058+ let token_b_decimals = 18 ;
3059+ let token_a = system . deploy_new_btc_token (name : " Token A" , decimals : token_a_decimals );
3060+ let token_b = system . deploy_new_btc_token (name : " Token B" , decimals : token_b_decimals );
3061+
3062+ // Setup tokens
3063+ system . staking. add_token (token_address : token_a . contract_address ());
3064+ system . staking. add_token (token_address : token_b . contract_address ());
3065+ system . staking. enable_token (token_address : token_b . contract_address ());
3066+
3067+ // Stake and delegate
3068+ let stake_amount = system . staking. get_min_stake ();
3069+ let delegation_amount_a = BTC_8D_CONFIG . min_for_rewards;
3070+ let delegation_amount_b = BTC_18D_CONFIG . min_for_rewards;
3071+ let staker = system . new_staker (amount : stake_amount );
3072+ let commission = 200 ;
3073+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
3074+ let pool_a = system . set_open_for_delegation (: staker , token_address : token_a . contract_address ());
3075+ let pool_b = system . set_open_for_delegation (: staker , token_address : token_b . contract_address ());
3076+ let delegator_a = system . new_btc_delegator (amount : delegation_amount_a , token : token_a );
3077+ let delegator_b = system . new_btc_delegator (amount : delegation_amount_b , token : token_b );
3078+ system
3079+ . delegate_btc (
3080+ delegator : delegator_a , pool : pool_a , amount : delegation_amount_a , token : token_a ,
3081+ );
3082+ system
3083+ . delegate_btc (
3084+ delegator : delegator_b , pool : pool_b , amount : delegation_amount_b , token : token_b ,
3085+ );
3086+ system . advance_k_epochs ();
3087+
3088+ // Enable token A, disable token B
3089+ system . staking. enable_token (token_address : token_a . contract_address ());
3090+ system . staking. disable_token (token_address : token_b . contract_address ());
3091+
3092+ // update_rewards - test rewards only for token B
3093+ system . advance_block_into_attestation_window (: staker );
3094+ system . attest (: staker );
3095+ system . advance_epoch ();
3096+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3097+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3098+ let (_ , expected_delegator_rewards ) = calculate_staker_btc_pool_rewards_v2 (
3099+ pool_balance : delegation_amount_b ,
3100+ : commission ,
3101+ staking_contract : system . staking. address,
3102+ minting_curve_contract : system . minting_curve. address,
3103+ token_address : token_b . contract_address (),
3104+ );
3105+ assert! (expected_delegator_rewards . is_non_zero ());
3106+ assert! (delegator_a_rewards . is_zero ());
3107+ assert! (delegator_b_rewards == expected_delegator_rewards );
3108+
3109+ // update_rewards - test rewards only for token B
3110+ system . advance_block_into_attestation_window (: staker );
3111+ system . attest (: staker );
3112+ system . advance_epoch ();
3113+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3114+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3115+ assert! (delegator_a_rewards . is_zero ());
3116+ assert! (delegator_b_rewards == expected_delegator_rewards );
3117+
3118+ // update_rewards - test rewards only for token A
3119+ system . advance_block_into_attestation_window (: staker );
3120+ system . attest (: staker );
3121+ system . advance_epoch ();
3122+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3123+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3124+ assert! (delegator_a_rewards == expected_delegator_rewards );
3125+ assert! (delegator_b_rewards . is_zero ());
3126+
3127+ // Start consensus rewards
3128+ system . start_consensus_rewards ();
3129+ system . staking. enable_token (token_address : token_b . contract_address ());
3130+ system . staking. disable_token (token_address : token_a . contract_address ());
3131+
3132+ // Calculate rewards for consensus rewards
3133+ let (_ , expected_delegator_rewards ) = calculate_staker_btc_pool_rewards_v3 (
3134+ normalized_pool_balance : NormalizedAmountTrait :: from_native_amount (
3135+ amount : delegation_amount_a , decimals : token_a_decimals ,
3136+ ),
3137+ normalized_staker_total_btc_balance : NormalizedAmountTrait :: from_native_amount (
3138+ amount : delegation_amount_a , decimals : token_a_decimals ,
3139+ ),
3140+ : commission , staking_contract : system . staking. address, minting_curve_contract : system . minting_curve. address, token_address : token_a . contract_address (),
3141+ );
3142+ assert! (expected_delegator_rewards . is_non_zero ());
3143+
3144+ // update_rewards - test rewards only for token A
3145+ system . update_rewards (: staker , disable_rewards : false );
3146+ system . advance_epoch ();
3147+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3148+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3149+ assert! (delegator_a_rewards == expected_delegator_rewards );
3150+ assert! (delegator_b_rewards . is_zero ());
3151+
3152+ // update_rewards - test rewards only for token A
3153+ system . update_rewards (: staker , disable_rewards : false );
3154+ system . advance_epoch ();
3155+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3156+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3157+ assert! (delegator_a_rewards == expected_delegator_rewards );
3158+ assert! (delegator_b_rewards . is_zero ());
3159+
3160+ // update_rewards - test rewards only for token B
3161+ system . update_rewards (: staker , disable_rewards : false );
3162+ system . advance_epoch ();
3163+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3164+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3165+ assert! (delegator_a_rewards . is_zero ());
3166+ assert! (delegator_b_rewards == expected_delegator_rewards );
3167+ }
0 commit comments