@@ -9386,3 +9386,363 @@ pub(crate) impl StakerFromV2Flow6Impl of FlowTrait<StakerFromV2Flow6> {
93869386 assert! (system . staker_claim_rewards (: staker ) == staker_rewards );
93879387 }
93889388}
9389+
9390+ /// Flow:
9391+ /// Member from V1
9392+ /// Attest in V1 (pool gets rewards)
9393+ /// Member update balance in V1
9394+ /// Upgrade to V3
9395+ /// Member update balance
9396+ /// Attest (pool gets rewards)
9397+ /// Test rewards
9398+ #[derive(Drop , Copy )]
9399+ pub (crate ) struct MemberFromV1Flow1 {
9400+ pub (crate ) staker : Option <Staker >,
9401+ pub (crate ) pool : Option <ContractAddress >,
9402+ pub (crate ) delegator : Option <Delegator >,
9403+ pub (crate ) unclaimed_rewards : Option <Amount >,
9404+ }
9405+ pub (crate ) impl MemberFromV1Flow1Impl of FlowTrait <MemberFromV1Flow1 > {
9406+ fn setup_v1 (ref self : MemberFromV1Flow1 , ref system : SystemState ) {
9407+ let amount = system . staking. get_min_stake ();
9408+ let staker = system . new_staker (: amount );
9409+ system . stake (: staker , : amount , pool_enabled : true , commission : 0 );
9410+ let pool = system . staking. get_pool (: staker );
9411+ let delegator = system . new_delegator (amount : 2 * amount );
9412+ system . delegate (: delegator , : pool , : amount );
9413+ system . advance_k_epochs_and_attest (: staker );
9414+ system . add_to_delegation_pool (: delegator , : pool , : amount );
9415+ system . advance_epoch ();
9416+ let unclaimed_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
9417+ self . staker = Option :: Some (staker );
9418+ self . pool = Option :: Some (pool );
9419+ self . delegator = Option :: Some (delegator );
9420+ self . unclaimed_rewards = Option :: Some (unclaimed_rewards );
9421+ system . set_staker_for_migration (staker_address : staker . staker. address);
9422+ }
9423+
9424+ fn test (self : MemberFromV1Flow1 , ref system : SystemState ) {
9425+ let staker = self . staker. unwrap ();
9426+ let pool = self . pool. unwrap ();
9427+ let delegator = self . delegator. unwrap ();
9428+ let mut unclaimed_rewards = self . unclaimed_rewards. unwrap ();
9429+ let amount = system . pool_member_info_v1 (: delegator , : pool ). amount;
9430+ system . delegator_exit_intent (: delegator , : pool , : amount );
9431+ system . advance_block_custom_and_attest (: staker , stake : amount / 2 * 3 );
9432+ let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2 (
9433+ staker_address : staker . staker. address,
9434+ staking_contract : system . staking. address,
9435+ minting_curve_contract : system . minting_curve. address,
9436+ pool_balance : amount ,
9437+ );
9438+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9439+ unclaimed_rewards += expected_rewards ;
9440+ system . advance_epoch ();
9441+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9442+ let actual_rewards = system . delegator_claim_rewards (: delegator , : pool );
9443+ assert! (actual_rewards == unclaimed_rewards );
9444+ }
9445+ }
9446+
9447+ /// Flow:
9448+ /// Member from V1
9449+ /// Attest in V1 (pool gets rewards)
9450+ /// Upgrade to V3
9451+ /// Attest (pool gets rewards)
9452+ /// Test rewards
9453+ #[derive(Drop , Copy )]
9454+ pub (crate ) struct MemberFromV1Flow2 {
9455+ pub (crate ) staker : Option <Staker >,
9456+ pub (crate ) pool : Option <ContractAddress >,
9457+ pub (crate ) delegator : Option <Delegator >,
9458+ pub (crate ) unclaimed_rewards : Option <Amount >,
9459+ }
9460+ pub (crate ) impl MemberFromV1Flow2Impl of FlowTrait <MemberFromV1Flow2 > {
9461+ fn setup_v1 (ref self : MemberFromV1Flow2 , ref system : SystemState ) {
9462+ let amount = system . staking. get_min_stake ();
9463+ let staker = system . new_staker (: amount );
9464+ system . stake (: staker , : amount , pool_enabled : true , commission : 0 );
9465+ let pool = system . staking. get_pool (: staker );
9466+ let delegator = system . new_delegator (: amount );
9467+ system . delegate (: delegator , : pool , : amount );
9468+ system . advance_k_epochs_and_attest (: staker );
9469+ system . advance_epoch ();
9470+ let unclaimed_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
9471+ self . staker = Option :: Some (staker );
9472+ self . pool = Option :: Some (pool );
9473+ self . delegator = Option :: Some (delegator );
9474+ self . unclaimed_rewards = Option :: Some (unclaimed_rewards );
9475+ system . set_staker_for_migration (staker_address : staker . staker. address);
9476+ }
9477+
9478+ fn test (self : MemberFromV1Flow2 , ref system : SystemState ) {
9479+ let staker = self . staker. unwrap ();
9480+ let pool = self . pool. unwrap ();
9481+ let delegator = self . delegator. unwrap ();
9482+ let mut unclaimed_rewards = self . unclaimed_rewards. unwrap ();
9483+ let amount = system . pool_member_info_v1 (: delegator , : pool ). amount;
9484+ system . advance_block_custom_and_attest (: staker , stake : amount * 2 );
9485+ let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2 (
9486+ staker_address : staker . staker. address,
9487+ staking_contract : system . staking. address,
9488+ minting_curve_contract : system . minting_curve. address,
9489+ pool_balance : amount ,
9490+ );
9491+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9492+ unclaimed_rewards += expected_rewards ;
9493+ system . advance_epoch ();
9494+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9495+ let actual_rewards = system . delegator_claim_rewards (: delegator , : pool );
9496+ assert! (actual_rewards == unclaimed_rewards );
9497+ }
9498+ }
9499+
9500+ /// Flow:
9501+ /// Member from V1
9502+ /// Attest in V1 (pool gets rewards)
9503+ /// Upgrade to V3
9504+ /// Attest (pool gets rewards)
9505+ /// Member update balance
9506+ /// Test rewards
9507+ #[derive(Drop , Copy )]
9508+ pub (crate ) struct MemberFromV1Flow3 {
9509+ pub (crate ) staker : Option <Staker >,
9510+ pub (crate ) pool : Option <ContractAddress >,
9511+ pub (crate ) delegator : Option <Delegator >,
9512+ pub (crate ) unclaimed_rewards : Option <Amount >,
9513+ }
9514+ pub (crate ) impl MemberFromV1Flow3Impl of FlowTrait <MemberFromV1Flow3 > {
9515+ fn setup_v1 (ref self : MemberFromV1Flow3 , ref system : SystemState ) {
9516+ let amount = system . staking. get_min_stake ();
9517+ let staker = system . new_staker (amount : amount );
9518+ system . stake (: staker , : amount , pool_enabled : true , commission : 0 );
9519+ let pool = system . staking. get_pool (: staker );
9520+ let delegator = system . new_delegator (: amount );
9521+ system . delegate (: delegator , : pool , : amount );
9522+ system . advance_k_epochs_and_attest (: staker );
9523+ system . advance_epoch ();
9524+ let unclaimed_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
9525+ self . staker = Option :: Some (staker );
9526+ self . pool = Option :: Some (pool );
9527+ self . delegator = Option :: Some (delegator );
9528+ self . unclaimed_rewards = Option :: Some (unclaimed_rewards );
9529+ system . set_staker_for_migration (staker_address : staker . staker. address);
9530+ }
9531+
9532+ fn test (self : MemberFromV1Flow3 , ref system : SystemState ) {
9533+ let staker = self . staker. unwrap ();
9534+ let pool = self . pool. unwrap ();
9535+ let delegator = self . delegator. unwrap ();
9536+ let mut unclaimed_rewards = self . unclaimed_rewards. unwrap ();
9537+ let amount = system . pool_member_info_v1 (: delegator , : pool ). amount;
9538+ system . advance_block_custom_and_attest (: staker , stake : amount * 2 );
9539+ let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2 (
9540+ staker_address : staker . staker. address,
9541+ staking_contract : system . staking. address,
9542+ minting_curve_contract : system . minting_curve. address,
9543+ pool_balance : amount ,
9544+ );
9545+ system . delegator_exit_intent (: delegator , : pool , : amount );
9546+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9547+ unclaimed_rewards += expected_rewards ;
9548+ system . advance_epoch ();
9549+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9550+ let actual_rewards = system . delegator_claim_rewards (: delegator , : pool );
9551+ assert! (actual_rewards == unclaimed_rewards );
9552+ }
9553+ }
9554+
9555+ /// Flow:
9556+ /// Delegate in V0
9557+ /// Get rewards in V0
9558+ /// Change balance in V1
9559+ /// Get rewards one time before balance is changed
9560+ /// Test rewards of V0 balance.
9561+ #[derive(Drop , Copy )]
9562+ pub (crate ) struct DelegatorV0V1RewardsOnceFlow {
9563+ pub (crate ) staker : Option <Staker >,
9564+ pub (crate ) pool : Option <ContractAddress >,
9565+ pub (crate ) delegator : Option <Delegator >,
9566+ pub (crate ) unclaimed_rewards : Option <Amount >,
9567+ }
9568+ pub (crate ) impl DelegatorV0V1RewardsOnceFlowImpl of FlowTrait <DelegatorV0V1RewardsOnceFlow > {
9569+ fn setup (ref self : DelegatorV0V1RewardsOnceFlow , ref system : SystemState ) {
9570+ let amount = system . staking. get_min_stake ();
9571+ let staker = system . new_staker (: amount );
9572+ system . stake (: staker , : amount , pool_enabled : true , commission : 10 );
9573+ let pool = system . staking. get_pool (: staker );
9574+ let delegator = system . new_delegator (amount : amount * 2 );
9575+ system . delegate (: delegator , : pool , : amount );
9576+ system . accrue_rewards (: staker );
9577+ self . staker = Option :: Some (staker );
9578+ self . pool = Option :: Some (pool );
9579+ self . delegator = Option :: Some (delegator );
9580+ system . set_staker_for_migration (staker_address : staker . staker. address);
9581+ system . set_pool_for_upgrade (pool_address : pool );
9582+ }
9583+
9584+ fn setup_v1 (ref self : DelegatorV0V1RewardsOnceFlow , ref system : SystemState ) {
9585+ let staker = self . staker. unwrap ();
9586+ let pool = self . pool. unwrap ();
9587+ let delegator = self . delegator. unwrap ();
9588+ let amount = system . pool_member_info_v1 (: delegator , : pool ). amount;
9589+ system . advance_epoch ();
9590+ system . increase_delegate (: delegator , : pool , : amount );
9591+ system . advance_block_custom_and_attest (: staker , stake : amount * 2 );
9592+ system . advance_k_epochs_and_attest (: staker );
9593+ system . advance_epoch ();
9594+ let unclaimed_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
9595+ self . unclaimed_rewards = Option :: Some (unclaimed_rewards );
9596+ }
9597+
9598+ fn test (self : DelegatorV0V1RewardsOnceFlow , ref system : SystemState ) {
9599+ let staker = self . staker. unwrap ();
9600+ let pool = self . pool. unwrap ();
9601+ let delegator = self . delegator. unwrap ();
9602+ let mut unclaimed_rewards = self . unclaimed_rewards. unwrap ();
9603+ let amount = system . staker_info_v1 (: staker ). amount_own;
9604+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9605+ system . advance_epoch ();
9606+ system . advance_block_custom_and_attest (: staker , stake : amount * 3 );
9607+ let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2 (
9608+ staker_address : staker . staker. address,
9609+ staking_contract : system . staking. address,
9610+ minting_curve_contract : system . minting_curve. address,
9611+ pool_balance : amount * 2 ,
9612+ );
9613+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9614+ unclaimed_rewards += expected_rewards ;
9615+ system . advance_epoch ();
9616+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9617+ }
9618+ }
9619+
9620+
9621+ /// Flow:
9622+ /// Delegate in V0
9623+ /// Get rewards in V0
9624+ /// Change balance in V1
9625+ /// Get rewards 3 times before balance is changed
9626+ /// Test rewards of V0 balance.
9627+ #[derive(Drop , Copy )]
9628+ pub (crate ) struct DelegatorV0V1RewardsFlow {
9629+ pub (crate ) staker : Option <Staker >,
9630+ pub (crate ) pool : Option <ContractAddress >,
9631+ pub (crate ) delegator : Option <Delegator >,
9632+ pub (crate ) unclaimed_rewards : Option <Amount >,
9633+ }
9634+ pub (crate ) impl DelegatorV0V1RewardsFlowImpl of FlowTrait <DelegatorV0V1RewardsFlow > {
9635+ fn setup (ref self : DelegatorV0V1RewardsFlow , ref system : SystemState ) {
9636+ let amount = system . staking. get_min_stake ();
9637+ let staker = system . new_staker (: amount );
9638+ system . stake (: staker , : amount , pool_enabled : true , commission : 10 );
9639+ let pool = system . staking. get_pool (: staker );
9640+ let delegator = system . new_delegator (amount : amount * 2 );
9641+ system . delegate (: delegator , : pool , : amount );
9642+ system . accrue_rewards (: staker );
9643+ self . staker = Option :: Some (staker );
9644+ self . pool = Option :: Some (pool );
9645+ self . delegator = Option :: Some (delegator );
9646+ system . set_staker_for_migration (staker_address : staker . staker. address);
9647+ system . set_pool_for_upgrade (pool_address : pool );
9648+ }
9649+
9650+ fn setup_v1 (ref self : DelegatorV0V1RewardsFlow , ref system : SystemState ) {
9651+ let staker = self . staker. unwrap ();
9652+ let pool = self . pool. unwrap ();
9653+ let delegator = self . delegator. unwrap ();
9654+ let amount = system . pool_member_info_v1 (: delegator , : pool ). amount;
9655+ system . advance_k_epochs_and_attest (: staker );
9656+ system . advance_k_epochs_and_attest (: staker );
9657+ system . advance_epoch ();
9658+ system . increase_delegate (: delegator , : pool , : amount );
9659+ system . advance_block_custom_and_attest (: staker , stake : amount * 2 );
9660+ system . advance_k_epochs_and_attest (: staker );
9661+ system . advance_epoch ();
9662+ let unclaimed_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
9663+ self . unclaimed_rewards = Option :: Some (unclaimed_rewards );
9664+ }
9665+
9666+ fn test (self : DelegatorV0V1RewardsFlow , ref system : SystemState ) {
9667+ let staker = self . staker. unwrap ();
9668+ let pool = self . pool. unwrap ();
9669+ let delegator = self . delegator. unwrap ();
9670+ let mut unclaimed_rewards = self . unclaimed_rewards. unwrap ();
9671+ let amount = system . staker_info_v1 (: staker ). amount_own;
9672+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9673+ system . advance_epoch ();
9674+ system . advance_block_custom_and_attest (: staker , stake : amount * 3 );
9675+ let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2 (
9676+ staker_address : staker . staker. address,
9677+ staking_contract : system . staking. address,
9678+ minting_curve_contract : system . minting_curve. address,
9679+ pool_balance : amount * 2 ,
9680+ );
9681+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9682+ unclaimed_rewards += expected_rewards ;
9683+ system . advance_epoch ();
9684+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9685+ }
9686+ }
9687+
9688+ /// Flow:
9689+ /// Delegate in V0
9690+ /// Change balance in V1
9691+ /// Test rewards - no rewards of V0 balance.
9692+ #[derive(Drop , Copy )]
9693+ pub (crate ) struct DelegatorV0V1NoRewardsFlow {
9694+ pub (crate ) staker : Option <Staker >,
9695+ pub (crate ) pool : Option <ContractAddress >,
9696+ pub (crate ) delegator : Option <Delegator >,
9697+ pub (crate ) unclaimed_rewards : Option <Amount >,
9698+ }
9699+ pub (crate ) impl DelegatorV0V1NoRewardsFlowImpl of FlowTrait <DelegatorV0V1NoRewardsFlow > {
9700+ fn setup (ref self : DelegatorV0V1NoRewardsFlow , ref system : SystemState ) {
9701+ let amount = system . staking. get_min_stake ();
9702+ let staker = system . new_staker (: amount );
9703+ system . stake (: staker , : amount , pool_enabled : true , commission : 10 );
9704+ let pool = system . staking. get_pool (: staker );
9705+ let delegator = system . new_delegator (amount : amount * 2 );
9706+ system . delegate (: delegator , : pool , : amount );
9707+ system . accrue_rewards (: staker );
9708+ self . staker = Option :: Some (staker );
9709+ self . pool = Option :: Some (pool );
9710+ self . delegator = Option :: Some (delegator );
9711+ system . set_staker_for_migration (staker_address : staker . staker. address);
9712+ system . set_pool_for_upgrade (pool_address : pool );
9713+ }
9714+
9715+ fn setup_v1 (ref self : DelegatorV0V1NoRewardsFlow , ref system : SystemState ) {
9716+ let pool = self . pool. unwrap ();
9717+ let delegator = self . delegator. unwrap ();
9718+ let amount = system . pool_member_info_v1 (: delegator , : pool ). amount;
9719+ system . advance_epoch ();
9720+ system . increase_delegate (: delegator , : pool , : amount );
9721+ system . advance_epoch ();
9722+ // Only rewards from V0 (before upgrade to V1).
9723+ let unclaimed_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
9724+ self . unclaimed_rewards = Option :: Some (unclaimed_rewards );
9725+ }
9726+
9727+ fn test (self : DelegatorV0V1NoRewardsFlow , ref system : SystemState ) {
9728+ let staker = self . staker. unwrap ();
9729+ let pool = self . pool. unwrap ();
9730+ let delegator = self . delegator. unwrap ();
9731+ let mut unclaimed_rewards = self . unclaimed_rewards. unwrap ();
9732+ let amount = system . staker_info_v1 (: staker ). amount_own;
9733+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9734+ system . advance_epoch ();
9735+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9736+ system . advance_block_custom_and_attest (: staker , stake : amount * 3 );
9737+ let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2 (
9738+ staker_address : staker . staker. address,
9739+ staking_contract : system . staking. address,
9740+ minting_curve_contract : system . minting_curve. address,
9741+ pool_balance : amount * 2 ,
9742+ );
9743+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9744+ unclaimed_rewards += expected_rewards ;
9745+ system . advance_epoch ();
9746+ assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
9747+ }
9748+ }
0 commit comments