@@ -40,9 +40,9 @@ use starkware_utils_testing::test_utils::{
4040 advance_block_number_global, assert_panic_with_error, cheat_caller_address_once, check_identity,
4141};
4242use test_utils :: {
43- StakingInitConfig , advance_epoch_global, advance_k_epochs_global, advance_time_global, fund ,
44- general_contract_system_deployment, initialize_reward_supplier_state_from_cfg, load_one_felt ,
45- stake_for_testing_using_dispatcher,
43+ StakingInitConfig , advance_epoch_global, advance_epoch_global_custom_time ,
44+ advance_k_epochs_global, advance_time_global, fund, general_contract_system_deployment ,
45+ initialize_reward_supplier_state_from_cfg, load_one_felt, stake_for_testing_using_dispatcher,
4646};
4747
4848#[test]
@@ -602,3 +602,89 @@ fn test_set_block_duration_config_assertions() {
602602 : result , expected_error : Error :: INVALID_MIN_MAX_BLOCK_DURATION . describe (),
603603 );
604604}
605+
606+ #[test]
607+ fn test_update_current_epoch_block_rewards_with_adjustments () {
608+ let mut cfg : StakingInitConfig = Default :: default ();
609+ general_contract_system_deployment (ref : cfg );
610+ stake_for_testing_using_dispatcher (: cfg );
611+ advance_k_epochs_global ();
612+ let reward_supplier = cfg . staking_contract_info. reward_supplier;
613+ let reward_supplier_dispatcher = IRewardSupplierDispatcher {
614+ contract_address : reward_supplier ,
615+ };
616+ let minting_curve_dispatcher = IMintingCurveDispatcher {
617+ contract_address : cfg . reward_supplier. minting_curve_contract,
618+ };
619+ let staking_contract = cfg . test_info. staking_contract;
620+ // First snapshot, not update avg_block_time. Rewards are calculated using the default avg block
621+ // time.
622+ cheat_caller_address_once (contract_address : reward_supplier , caller_address : staking_contract );
623+ let (_ , _ ) = reward_supplier_dispatcher . update_current_epoch_block_rewards ();
624+ let mut curr_avg_block_time = DEFAULT_AVG_BLOCK_DURATION ;
625+ // Adjust avg_block_time to MIN (avg is less than min).
626+ let min_block_time = DEFAULT_BLOCK_DURATION_CONFIG . min_block_duration;
627+ advance_epoch_global_custom_time (
628+ block_time : TimeDelta { seconds : min_block_time / BLOCK_DURATION_SCALE - 1 },
629+ );
630+ cheat_caller_address_once (contract_address : reward_supplier , caller_address : staking_contract );
631+ let (strk_rewards , btc_rewards ) = reward_supplier_dispatcher
632+ . update_current_epoch_block_rewards ();
633+ // Test avg_block_time.
634+ curr_avg_block_time = min_block_time ;
635+ let avg_block_time = load_one_felt (
636+ target : reward_supplier , storage_address : selector! (" avg_block_duration" ),
637+ )
638+ . try_into ()
639+ . unwrap ();
640+ assert! (avg_block_time == curr_avg_block_time );
641+ // Test rewards.
642+ let yearly_mint = minting_curve_dispatcher . yearly_mint ();
643+ let expected_rewards = mul_wide_and_div (
644+ lhs : yearly_mint ,
645+ rhs : curr_avg_block_time . into (),
646+ div : BLOCK_DURATION_SCALE . into () * SECONDS_IN_YEAR . into (),
647+ )
648+ . expect_with_err (err : InternalError :: REWARDS_COMPUTATION_OVERFLOW );
649+ let expected_btc_rewards = mul_wide_and_div (
650+ lhs : expected_rewards , rhs : ALPHA , div : ALPHA_DENOMINATOR ,
651+ )
652+ . unwrap ();
653+ let expected_strk_rewards = expected_rewards - expected_btc_rewards ;
654+ assert! (expected_strk_rewards . is_non_zero ());
655+ assert! (expected_btc_rewards . is_non_zero ());
656+ assert! (strk_rewards == expected_strk_rewards );
657+ assert! (btc_rewards == expected_btc_rewards );
658+ // Adjust avg_block_time to MAX (avg is more than max).
659+ let max_block_time = DEFAULT_BLOCK_DURATION_CONFIG . max_block_duration;
660+ advance_epoch_global_custom_time (
661+ block_time : TimeDelta { seconds : max_block_time / BLOCK_DURATION_SCALE + 1 },
662+ );
663+ cheat_caller_address_once (contract_address : reward_supplier , caller_address : staking_contract );
664+ let (strk_rewards , btc_rewards ) = reward_supplier_dispatcher
665+ . update_current_epoch_block_rewards ();
666+ // Test avg_block_time.
667+ curr_avg_block_time = max_block_time ;
668+ let avg_block_time = load_one_felt (
669+ target : reward_supplier , storage_address : selector! (" avg_block_duration" ),
670+ )
671+ . try_into ()
672+ . unwrap ();
673+ assert! (avg_block_time == curr_avg_block_time );
674+ // Test rewards.
675+ let expected_rewards = mul_wide_and_div (
676+ lhs : yearly_mint ,
677+ rhs : curr_avg_block_time . into (),
678+ div : BLOCK_DURATION_SCALE . into () * SECONDS_IN_YEAR . into (),
679+ )
680+ . expect_with_err (err : InternalError :: REWARDS_COMPUTATION_OVERFLOW );
681+ let expected_btc_rewards = mul_wide_and_div (
682+ lhs : expected_rewards , rhs : ALPHA , div : ALPHA_DENOMINATOR ,
683+ )
684+ . unwrap ();
685+ let expected_strk_rewards = expected_rewards - expected_btc_rewards ;
686+ assert! (expected_strk_rewards . is_non_zero ());
687+ assert! (expected_btc_rewards . is_non_zero ());
688+ assert! (strk_rewards == expected_strk_rewards );
689+ assert! (btc_rewards == expected_btc_rewards );
690+ }
0 commit comments