11use core :: num :: traits :: Zero ;
22use snforge_std :: TokenImpl ;
3- use staking :: constants :: STRK_IN_FRIS ;
3+ use staking :: constants :: { K , STRK_IN_FRIS } ;
44use staking :: flow_test :: flows;
55use staking :: flow_test :: utils :: {
66 RewardSupplierTrait , StakingTrait , SystemConfigTrait , SystemDelegatorTrait , SystemStakerTrait ,
@@ -9,22 +9,27 @@ use staking::flow_test::utils::{
99use staking :: pool :: pool :: Pool ;
1010use staking :: pool :: pool :: Pool :: STRK_CONFIG ;
1111use staking :: pool :: utils :: compute_rewards_rounded_down;
12- use staking :: staking :: interface :: {IStakingConsensusDispatcherTrait , IStakingDispatcherTrait };
12+ use staking :: staking :: errors :: Error as StakingError ;
13+ use staking :: staking :: interface :: {
14+ IStakingConsensusDispatcherTrait , IStakingDispatcherTrait ,
15+ IStakingRewardsManagerSafeDispatcherTrait ,
16+ };
1317use staking :: staking :: utils :: {BTC_WEIGHT_FACTOR , STAKING_POWER_BASE_VALUE , STRK_WEIGHT_FACTOR };
1418use staking :: test_utils :: constants :: {
1519 BTC_18D_CONFIG , BTC_5D_CONFIG , BTC_8D_CONFIG , PUBLIC_KEY , STRK_BASE_VALUE ,
1620 TEST_MIN_BTC_FOR_REWARDS ,
1721};
1822use staking :: test_utils :: {
1923 StakingInitConfig , calculate_staker_btc_pool_rewards_v2,
20- calculate_staker_strk_rewards_with_balances_v2,
24+ calculate_staker_strk_rewards_with_balances_v2, calculate_staker_strk_rewards_with_balances_v3,
2125 calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit,
2226 custom_decimals_token, deploy_mock_erc20_decimals_contract,
2327};
28+ use starkware_utils :: errors :: {Describable , ErrorDisplay };
2429use starkware_utils :: math :: abs :: wide_abs_diff;
2530use starkware_utils :: math :: utils :: mul_wide_and_div;
2631use starkware_utils :: time :: time :: Time ;
27- use starkware_utils_testing :: test_utils :: cheat_caller_address_once;
32+ use starkware_utils_testing :: test_utils :: {assert_panic_with_error, cheat_caller_address_once} ;
2833use crate :: types :: Amount ;
2934
3035#[test]
@@ -2619,3 +2624,135 @@ fn get_stakers_staking_power_100_flow_test() {
26192624 . span ();
26202625 assert! (stakers == expected_stakers );
26212626}
2627+
2628+ /// Flow:
2629+ /// Staker stake
2630+ /// Disable rewards is true with v3 off
2631+ /// Test rewards are not distributed
2632+ /// Attempt again same epoch - panic
2633+ /// Disable rewards is false with v3 off
2634+ /// Test rewards are not distributed
2635+ /// Attempt again same epoch - panic
2636+ /// Enable consensus rewards (in 2 epochs)
2637+ /// Disable rewards is true with v3 before consensus epoch
2638+ /// Test rewards are not distributed
2639+ /// Attempt again same epoch - panic
2640+ /// Disable rewards is false with v3 before consensus epoch
2641+ /// Test rewards are not distributed
2642+ /// Attempt again same epoch - panic
2643+ /// Disable rewards is true with v3 on
2644+ /// Test rewards are not distributed
2645+ /// Attempt again same epoch - panic
2646+ /// Disable rewards is false with v3 on
2647+ /// Test rewards are distributed
2648+ /// Attempt again same epoch - panic
2649+ #[test]
2650+ #[feature(" safe_dispatcher" )]
2651+ fn update_rewards_disable_rewards_flow_test () {
2652+ let cfg : StakingInitConfig = Default :: default ();
2653+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
2654+ let stake_amount = system . staking. get_min_stake ();
2655+ let staker = system . new_staker (amount : stake_amount );
2656+ system . stake (: staker , amount : stake_amount , pool_enabled : false , commission : 200 );
2657+ system . advance_k_epochs ();
2658+
2659+ // Disable rewards is true with v3 off
2660+ system . update_rewards (: staker , disable_rewards : true );
2661+ // Test rewards are not distributed
2662+ let rewards = system . staker_claim_rewards (: staker );
2663+ assert! (rewards == Zero :: zero ());
2664+ // Attempt again same epoch - panic
2665+ let result = system
2666+ . staking
2667+ . rewards_manager_safe_dispatcher ()
2668+ . update_rewards (staker_address : staker . staker. address, disable_rewards : true );
2669+ assert_panic_with_error (
2670+ : result , expected_error : StakingError :: REWARDS_ALREADY_UPDATED . describe (),
2671+ );
2672+ system . advance_epoch ();
2673+
2674+ // Disable rewards is false with v3 off
2675+ system . update_rewards (: staker , disable_rewards : false );
2676+ // Test rewards are not distributed
2677+ let rewards = system . staker_claim_rewards (: staker );
2678+ assert! (rewards == Zero :: zero ());
2679+ // Attempt again same epoch - panic
2680+ let result = system
2681+ . staking
2682+ . rewards_manager_safe_dispatcher ()
2683+ . update_rewards (staker_address : staker . staker. address, disable_rewards : false );
2684+ assert_panic_with_error (
2685+ : result , expected_error : StakingError :: REWARDS_ALREADY_UPDATED . describe (),
2686+ );
2687+ system . advance_epoch ();
2688+
2689+ // Enable consensus rewards
2690+ system
2691+ . set_consensus_rewards_first_epoch (epoch_id : system . staking. get_current_epoch () + K . into ());
2692+
2693+ // Disable rewards is true with v3 before consensus epoch
2694+ system . update_rewards (: staker , disable_rewards : true );
2695+ // Test rewards are not distributed
2696+ let rewards = system . staker_claim_rewards (: staker );
2697+ assert! (rewards == Zero :: zero ());
2698+ // Attempt again same epoch - panic
2699+ let result = system
2700+ . staking
2701+ . rewards_manager_safe_dispatcher ()
2702+ . update_rewards (staker_address : staker . staker. address, disable_rewards : true );
2703+ assert_panic_with_error (
2704+ : result , expected_error : StakingError :: REWARDS_ALREADY_UPDATED . describe (),
2705+ );
2706+ system . advance_epoch ();
2707+
2708+ // Disable rewards is false with v3 before consensus epoch
2709+ system . update_rewards (: staker , disable_rewards : false );
2710+ // Test rewards are not distributed
2711+ let rewards = system . staker_claim_rewards (: staker );
2712+ assert! (rewards == Zero :: zero ());
2713+ // Attempt again same epoch - panic
2714+ let result = system
2715+ . staking
2716+ . rewards_manager_safe_dispatcher ()
2717+ . update_rewards (staker_address : staker . staker. address, disable_rewards : false );
2718+ assert_panic_with_error (
2719+ : result , expected_error : StakingError :: REWARDS_ALREADY_UPDATED . describe (),
2720+ );
2721+ system . advance_epoch ();
2722+
2723+ // Disable rewards is true with v3 on
2724+ system . update_rewards (: staker , disable_rewards : true );
2725+ // Test rewards are not distributed
2726+ let rewards = system . staker_claim_rewards (: staker );
2727+ assert! (rewards == Zero :: zero ());
2728+ // Attempt again same epoch - panic
2729+ let result = system
2730+ . staking
2731+ . rewards_manager_safe_dispatcher ()
2732+ . update_rewards (staker_address : staker . staker. address, disable_rewards : true );
2733+ assert_panic_with_error (
2734+ : result , expected_error : StakingError :: REWARDS_ALREADY_UPDATED . describe (),
2735+ );
2736+ system . advance_epoch ();
2737+
2738+ // Disable rewards is false with v3 on
2739+ system . update_rewards (: staker , disable_rewards : false );
2740+ // Test rewards are not distributed
2741+ let rewards = system . staker_claim_rewards (: staker );
2742+ let (expected_rewards , _ ) = calculate_staker_strk_rewards_with_balances_v3 (
2743+ amount_own : stake_amount ,
2744+ pool_amount : Zero :: zero (),
2745+ commission : 200 ,
2746+ staking_contract : system . staking. address,
2747+ minting_curve_contract : system . minting_curve. address,
2748+ );
2749+ assert! (rewards == expected_rewards );
2750+ // Attempt again same epoch - panic
2751+ let result = system
2752+ . staking
2753+ . rewards_manager_safe_dispatcher ()
2754+ . update_rewards (staker_address : staker . staker. address, disable_rewards : false );
2755+ assert_panic_with_error (
2756+ : result , expected_error : StakingError :: REWARDS_ALREADY_UPDATED . describe (),
2757+ );
2758+ }
0 commit comments