@@ -16,14 +16,16 @@ 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- calculate_staker_strk_rewards_with_balances_v2, calculate_staker_strk_rewards_with_balances_v3,
26+ StakingInitConfig , calculate_staker_btc_pool_rewards_v2, calculate_staker_btc_pool_rewards_v3,
27+ calculate_staker_strk_rewards_v2, calculate_staker_strk_rewards_with_balances_v2,
28+ calculate_staker_strk_rewards_with_balances_v3,
2729 calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit,
2830 custom_decimals_token, deploy_mock_erc20_decimals_contract,
2931};
@@ -3029,3 +3031,176 @@ fn enable_disable_btc_tokens_flow_test() {
30293031 . span ();
30303032 assert! (tokens == expected_tokens );
30313033}
3034+
3035+ /// Flow:
3036+ /// Add tokens A and B
3037+ /// Enable token B
3038+ /// Advance K epochs
3039+ /// Enable token A, disable token B
3040+ /// Attest
3041+ /// Advance epoch - test rewards only for token B
3042+ /// Attest
3043+ /// Advance epoch - test rewards only for token B
3044+ /// Attest
3045+ /// Advance epoch - test rewards only for token A
3046+ /// Start consensus rewards
3047+ /// Enable token B, disable token A
3048+ /// update_rewards
3049+ /// Advance epoch - test rewards only for token A
3050+ /// update_rewards
3051+ /// Advance epoch - test rewards only for token A
3052+ /// update_rewards
3053+ /// Advance epoch - test rewards only for token B
3054+ #[test]
3055+ fn update_rewards_token_enable_disable_flow_test () {
3056+ let cfg : StakingInitConfig = Default :: default ();
3057+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
3058+ let token_a_decimals = 8 ;
3059+ let token_b_decimals = 18 ;
3060+ let token_a = system . deploy_new_btc_token (name : " Token A" , decimals : token_a_decimals );
3061+ let token_b = system . deploy_new_btc_token (name : " Token B" , decimals : token_b_decimals );
3062+ let staking_contract = system . staking. address;
3063+ let minting_curve_contract = system . minting_curve. address;
3064+
3065+ // Setup tokens
3066+ system . staking. add_token (token_address : token_a . contract_address ());
3067+ system . staking. add_token (token_address : token_b . contract_address ());
3068+ system . staking. enable_token (token_address : token_b . contract_address ());
3069+
3070+ // Stake and delegate
3071+ let stake_amount = system . staking. get_min_stake ();
3072+ let delegation_amount_a = BTC_8D_CONFIG . min_for_rewards;
3073+ let delegation_amount_b = BTC_18D_CONFIG . min_for_rewards;
3074+ let staker = system . new_staker (amount : stake_amount );
3075+ let commission = 200 ;
3076+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
3077+ let pool_a = system . set_open_for_delegation (: staker , token_address : token_a . contract_address ());
3078+ let pool_b = system . set_open_for_delegation (: staker , token_address : token_b . contract_address ());
3079+ let delegator_a = system . new_btc_delegator (amount : delegation_amount_a , token : token_a );
3080+ let delegator_b = system . new_btc_delegator (amount : delegation_amount_b , token : token_b );
3081+ system
3082+ . delegate_btc (
3083+ delegator : delegator_a , pool : pool_a , amount : delegation_amount_a , token : token_a ,
3084+ );
3085+ system
3086+ . delegate_btc (
3087+ delegator : delegator_b , pool : pool_b , amount : delegation_amount_b , token : token_b ,
3088+ );
3089+ system . advance_k_epochs ();
3090+
3091+ // Enable token A, disable token B
3092+ system . staking. enable_token (token_address : token_a . contract_address ());
3093+ system . staking. disable_token (token_address : token_b . contract_address ());
3094+
3095+ // Attest
3096+ system . advance_block_into_attestation_window (: staker );
3097+ system . attest (: staker );
3098+ system . advance_epoch ();
3099+
3100+ // Calculate rewards
3101+ let staker_info = system . staker_info_v1 (: staker );
3102+ let staker_rewards = system . staker_claim_rewards (: staker );
3103+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3104+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3105+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_v2 (
3106+ : staker_info , : staking_contract , : minting_curve_contract ,
3107+ );
3108+ assert! (expected_staker_rewards . is_non_zero ());
3109+ let (commission_rewards , expected_delegator_rewards ) = calculate_staker_btc_pool_rewards_v2 (
3110+ pool_balance : delegation_amount_b ,
3111+ : commission ,
3112+ : staking_contract ,
3113+ : minting_curve_contract ,
3114+ token_address : token_b . contract_address (),
3115+ );
3116+ assert! (commission_rewards . is_non_zero ());
3117+ assert! (expected_delegator_rewards . is_non_zero ());
3118+
3119+ // Test rewards
3120+ assert! (staker_rewards == expected_staker_rewards + commission_rewards );
3121+ assert! (delegator_a_rewards . is_zero ());
3122+ assert! (delegator_b_rewards == expected_delegator_rewards );
3123+
3124+ // Attest - test rewards only for token B
3125+ system . advance_block_into_attestation_window (: staker );
3126+ system . attest (: staker );
3127+ system . advance_epoch ();
3128+ let staker_rewards = system . staker_claim_rewards (: staker );
3129+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3130+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3131+ assert! (staker_rewards == expected_staker_rewards + commission_rewards );
3132+ assert! (delegator_a_rewards . is_zero ());
3133+ assert! (delegator_b_rewards == expected_delegator_rewards );
3134+
3135+ // Attest - test rewards only for token A
3136+ system . advance_block_into_attestation_window (: staker );
3137+ system . attest (: staker );
3138+ system . advance_epoch ();
3139+ let staker_rewards = system . staker_claim_rewards (: staker );
3140+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3141+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3142+ assert! (staker_rewards == expected_staker_rewards + commission_rewards );
3143+ assert! (delegator_a_rewards == expected_delegator_rewards );
3144+ assert! (delegator_b_rewards . is_zero ());
3145+
3146+ // Start consensus rewards
3147+ system . start_consensus_rewards ();
3148+
3149+ // Enable token B, disable token A
3150+ system . staking. enable_token (token_address : token_b . contract_address ());
3151+ system . staking. disable_token (token_address : token_a . contract_address ());
3152+
3153+ // Calculate rewards for consensus rewards
3154+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_with_balances_v3 (
3155+ amount_own : stake_amount ,
3156+ pool_amount : Zero :: zero (),
3157+ : commission ,
3158+ : staking_contract ,
3159+ : minting_curve_contract ,
3160+ );
3161+ assert! (expected_staker_rewards . is_non_zero ());
3162+ let (commission_rewards , expected_delegator_rewards ) = calculate_staker_btc_pool_rewards_v3 (
3163+ normalized_pool_balance : NormalizedAmountTrait :: from_native_amount (
3164+ amount : delegation_amount_a , decimals : token_a_decimals ,
3165+ ),
3166+ normalized_staker_total_btc_balance : NormalizedAmountTrait :: from_native_amount (
3167+ amount : delegation_amount_a , decimals : token_a_decimals ,
3168+ ),
3169+ : commission ,
3170+ : staking_contract ,
3171+ : minting_curve_contract ,
3172+ token_address : token_a . contract_address (),
3173+ );
3174+ assert! (commission_rewards . is_non_zero ());
3175+ assert! (expected_delegator_rewards . is_non_zero ());
3176+
3177+ // update_rewards - test rewards only for token A
3178+ system . update_rewards (: staker , disable_rewards : false );
3179+ system . advance_epoch ();
3180+ let staker_rewards = system . staker_claim_rewards (: staker );
3181+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3182+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3183+ assert! (staker_rewards == expected_staker_rewards + commission_rewards );
3184+ assert! (delegator_a_rewards == expected_delegator_rewards );
3185+ assert! (delegator_b_rewards . is_zero ());
3186+
3187+ // update_rewards - test rewards only for token A
3188+ system . update_rewards (: staker , disable_rewards : false );
3189+ system . advance_epoch ();
3190+ let staker_rewards = system . staker_claim_rewards (: staker );
3191+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3192+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3193+ assert! (staker_rewards == expected_staker_rewards + commission_rewards );
3194+ assert! (delegator_a_rewards == expected_delegator_rewards );
3195+ assert! (delegator_b_rewards . is_zero ());
3196+
3197+ // update_rewards - test rewards only for token B
3198+ system . update_rewards (: staker , disable_rewards : false );
3199+ system . advance_epoch ();
3200+ let staker_rewards = system . staker_claim_rewards (: staker );
3201+ let delegator_a_rewards = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
3202+ let delegator_b_rewards = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
3203+ assert! (staker_rewards == expected_staker_rewards + commission_rewards );
3204+ assert! (delegator_a_rewards . is_zero ());
3205+ assert! (delegator_b_rewards == expected_delegator_rewards );
3206+ }
0 commit comments