@@ -3424,3 +3424,150 @@ fn delegate_increase_delegate_flow_test() {
34243424 system . advance_epoch ();
34253425 assert! (system . delegator_claim_rewards (: delegator , : pool ) == expected_pool_rewards );
34263426}
3427+
3428+ /// Flow:
3429+ /// Delegate
3430+ /// update_rewards
3431+ /// Claim rewards - Zero rewards
3432+ /// Advance epoch
3433+ /// Claim rewards - Zero rewards
3434+ /// Advance epoch
3435+ /// Claim rewards - Zero rewards
3436+ #[test]
3437+ fn delegate_claim_rewards_same_epoch_flow_test () {
3438+ let cfg : StakingInitConfig = Default :: default ();
3439+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
3440+ let min_stake = system . staking. get_min_stake ();
3441+ let stake_amount = min_stake * 2 ;
3442+ let staker = system . new_staker (amount : stake_amount );
3443+ let commission = 200 ;
3444+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
3445+ system . start_consensus_rewards ();
3446+ let pool = system . staking. get_pool (: staker );
3447+ let delegator = system . new_delegator (amount : stake_amount );
3448+ system . delegate (: delegator , : pool , amount : stake_amount );
3449+ system . update_rewards (: staker , disable_rewards : false );
3450+ assert! (system . staker_claim_rewards (: staker ). is_non_zero ());
3451+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_zero ());
3452+ system . advance_epoch ();
3453+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_zero ());
3454+ system . advance_epoch ();
3455+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_zero ());
3456+ }
3457+
3458+ /// Flow:
3459+ /// Delegate
3460+ /// Advance epoch
3461+ /// update_rewards
3462+ /// Claim rewards - Zero rewards
3463+ /// Advance epoch
3464+ /// Claim rewards - Zero rewards
3465+ #[test]
3466+ fn delegate_claim_rewards_next_epoch_flow_test () {
3467+ let cfg : StakingInitConfig = Default :: default ();
3468+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
3469+ let min_stake = system . staking. get_min_stake ();
3470+ let stake_amount = min_stake * 2 ;
3471+ let staker = system . new_staker (amount : stake_amount );
3472+ let commission = 200 ;
3473+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
3474+ system . start_consensus_rewards ();
3475+ let pool = system . staking. get_pool (: staker );
3476+ let delegator = system . new_delegator (amount : stake_amount );
3477+ system . delegate (: delegator , : pool , amount : stake_amount );
3478+ system . advance_epoch ();
3479+ system . update_rewards (: staker , disable_rewards : false );
3480+ assert! (system . staker_claim_rewards (: staker ). is_non_zero ());
3481+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_zero ());
3482+ system . advance_epoch ();
3483+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_zero ());
3484+ }
3485+
3486+ /// Flow:
3487+ /// Delegate
3488+ /// Advance K epochs
3489+ /// update_rewards
3490+ /// Claim rewards - Zero
3491+ /// Advance epoch
3492+ /// Claim rewards - Non zero
3493+ /// Claim rewards - Zero
3494+ /// Update rewards
3495+ /// Advance block
3496+ /// Claim rewards - Zero
3497+ /// Advance epoch
3498+ /// Claim rewards - Non zero
3499+ #[test]
3500+ fn delegate_claim_after_claim_flow_test () {
3501+ let cfg : StakingInitConfig = Default :: default ();
3502+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
3503+ let min_stake = system . staking. get_min_stake ();
3504+ let stake_amount = min_stake * 2 ;
3505+ let staker = system . new_staker (amount : stake_amount );
3506+ let commission = 200 ;
3507+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
3508+ system . start_consensus_rewards ();
3509+ let pool = system . staking. get_pool (: staker );
3510+ let delegator = system . new_delegator (amount : stake_amount );
3511+ system . delegate (: delegator , : pool , amount : stake_amount );
3512+ system . advance_k_epochs ();
3513+ system . update_rewards (: staker , disable_rewards : false );
3514+ assert! (system . staker_claim_rewards (: staker ). is_non_zero ());
3515+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_zero ());
3516+ system . advance_epoch ();
3517+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_non_zero ());
3518+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_zero ());
3519+ system . update_rewards (: staker , disable_rewards : false );
3520+ advance_block_number_global (blocks : 1 );
3521+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_zero ());
3522+ system . advance_epoch ();
3523+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_non_zero ());
3524+ }
3525+
3526+
3527+ /// Flow:
3528+ /// Delegate
3529+ /// Advance K epochs
3530+ /// update_rewards
3531+ /// Claim rewards - Zero
3532+ /// Advance epoch
3533+ /// update_rewards
3534+ /// Advance block
3535+ /// update_rewards
3536+ /// Claim rewards - For prev epoch
3537+ /// Advance epoch
3538+ /// Claim rewards - For prev epoch
3539+ /// Advance epoch
3540+ /// Claim rewards - Zero
3541+ #[test]
3542+ fn delegate_claim_after_claim_with_rewards_flow_test () {
3543+ let cfg : StakingInitConfig = Default :: default ();
3544+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
3545+ let min_stake = system . staking. get_min_stake ();
3546+ let stake_amount = min_stake * 2 ;
3547+ let staker = system . new_staker (amount : stake_amount );
3548+ let commission = 200 ;
3549+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
3550+ system . start_consensus_rewards ();
3551+ let pool = system . staking. get_pool (: staker );
3552+ let delegator = system . new_delegator (amount : stake_amount );
3553+ system . delegate (: delegator , : pool , amount : stake_amount );
3554+ system . advance_k_epochs ();
3555+ system . update_rewards (: staker , disable_rewards : false );
3556+ let (_ , expected_rewards ) = calculate_staker_strk_rewards_with_balances_v3 (
3557+ amount_own : stake_amount ,
3558+ pool_amount : stake_amount ,
3559+ : commission ,
3560+ staking_contract : system . staking. address,
3561+ minting_curve_contract : system . minting_curve. address,
3562+ );
3563+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_zero ());
3564+ system . advance_epoch ();
3565+ system . update_rewards (: staker , disable_rewards : false );
3566+ advance_block_number_global (blocks : 1 );
3567+ system . update_rewards (: staker , disable_rewards : false );
3568+ assert! (system . delegator_claim_rewards (: delegator , : pool ) == expected_rewards );
3569+ system . advance_epoch ();
3570+ assert! (system . delegator_claim_rewards (: delegator , : pool ) == 2 * expected_rewards );
3571+ system . advance_epoch ();
3572+ assert! (system . delegator_claim_rewards (: delegator , : pool ). is_zero ());
3573+ }
0 commit comments