@@ -9288,6 +9288,294 @@ pub(crate) impl StakerV1ChangeBalanceAttestFlowImpl of FlowTrait<StakerV1ChangeB
92889288 }
92899289}
92909290
9291+ /// Flow:
9292+ /// Epoch 0:
9293+ /// Staker stake
9294+ /// Epoch 1:
9295+ /// Staker increase stake
9296+ /// Delegators delegate STRK and BTC
9297+ /// Epoch 2:
9298+ /// Staker increase stake
9299+ /// Delegators increase delegation STRK and BTC
9300+ /// Upgrade
9301+ /// Staker increase stake
9302+ /// Delegators increase delegation STRK and BTC
9303+ /// Test total staking power - according to Epoch 1
9304+ /// Test staker balance with attestation rewards - according to Epoch 1
9305+ /// Epoch 2:
9306+ /// Test delegator balances with attestation rewards - according to Epoch 1
9307+ /// Test total staking power - according to Epoch 2 (pre-upgrade)
9308+ /// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade)
9309+ /// Epoch 3:
9310+ /// Test delegator balances with attestation rewards - according to Epoch 2 (pre-upgrade)
9311+ /// Test total staking power - according to Epoch 2 (post-upgrade)
9312+ /// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade)
9313+ /// Epoch 4:
9314+ /// Test delegator balances with attestation rewards - according to Epoch 2 (post-upgrade)
9315+ #[derive(Drop , Copy )]
9316+ pub (crate ) struct BalancesDelayMoreBalanceChangeFlow {
9317+ pub (crate ) staker : Option <Staker >,
9318+ pub (crate ) stake_amount : Option <Amount >,
9319+ pub (crate ) commission : Option <Commission >,
9320+ pub (crate ) strk_delegated_amount : Option <Amount >,
9321+ pub (crate ) btc_delegated_amount : Option <Amount >,
9322+ pub (crate ) strk_delegator : Option <Delegator >,
9323+ pub (crate ) btc_delegator : Option <Delegator >,
9324+ pub (crate ) strk_pool : Option <ContractAddress >,
9325+ pub (crate ) btc_pool : Option <ContractAddress >,
9326+ }
9327+ pub (crate ) impl BalancesDelayMoreBalanceChangeFlowImpl of FlowTrait <
9328+ BalancesDelayMoreBalanceChangeFlow ,
9329+ > {
9330+ fn setup_v2 (ref self : BalancesDelayMoreBalanceChangeFlow , ref system : SystemState ) {
9331+ let stake_amount = system . staking. get_min_stake ();
9332+ let strk_delegated_amount = STRK_CONFIG . min_for_rewards;
9333+ let btc_delegated_amount = TEST_MIN_BTC_FOR_REWARDS ;
9334+ let staker = system . new_staker (amount : stake_amount * 4 );
9335+ let commission = 200 ;
9336+ let strk_delegator = system . new_delegator (amount : strk_delegated_amount * 3 );
9337+ let btc_delegator = system
9338+ . new_btc_delegator (amount : btc_delegated_amount * 3 , token : system . btc_token);
9339+
9340+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
9341+ let strk_pool = system . staking. get_pool (: staker );
9342+ let btc_pool = system
9343+ . set_open_for_delegation (: staker , token_address : system . btc_token. contract_address ());
9344+
9345+ system . advance_epoch (); // Epoch 0 - > 1
9346+ system . increase_stake (: staker , amount : stake_amount );
9347+ system . delegate (delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount );
9348+ system
9349+ . delegate_btc (
9350+ delegator : btc_delegator ,
9351+ pool : btc_pool ,
9352+ amount : btc_delegated_amount ,
9353+ token : system . btc_token,
9354+ );
9355+
9356+ system . advance_epoch (); // Epoch 1 - > 2
9357+ system . increase_stake (: staker , amount : stake_amount );
9358+ system
9359+ . increase_delegate (
9360+ delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount ,
9361+ );
9362+ system
9363+ . increase_delegate_btc (
9364+ delegator : btc_delegator ,
9365+ pool : btc_pool ,
9366+ amount : btc_delegated_amount ,
9367+ token : system . btc_token,
9368+ );
9369+
9370+ system . set_staker_for_migration (staker_address : staker . staker. address);
9371+ self . staker = Option :: Some (staker );
9372+ self . stake_amount = Option :: Some (stake_amount );
9373+ self . commission = Option :: Some (commission );
9374+ self . strk_delegated_amount = Option :: Some (strk_delegated_amount );
9375+ self . btc_delegated_amount = Option :: Some (btc_delegated_amount );
9376+ self . strk_delegator = Option :: Some (strk_delegator );
9377+ self . btc_delegator = Option :: Some (btc_delegator );
9378+ self . strk_pool = Option :: Some (strk_pool );
9379+ self . btc_pool = Option :: Some (btc_pool );
9380+ }
9381+
9382+ #[feature(" safe_dispatcher" )]
9383+ fn test (self : BalancesDelayMoreBalanceChangeFlow , ref system : SystemState ) {
9384+ let staker = self . staker. unwrap ();
9385+ let stake_amount = self . stake_amount. unwrap ();
9386+ let commission = self . commission. unwrap ();
9387+ let strk_delegated_amount = self . strk_delegated_amount. unwrap ();
9388+ let btc_delegated_amount = self . btc_delegated_amount. unwrap ();
9389+ let strk_delegator = self . strk_delegator. unwrap ();
9390+ let btc_delegator = self . btc_delegator. unwrap ();
9391+ let strk_pool = self . strk_pool. unwrap ();
9392+ let btc_pool = self . btc_pool. unwrap ();
9393+
9394+ let staking_contract = system . staking. address;
9395+ let minting_curve_contract = system . minting_curve. address;
9396+
9397+ // Increase stake and delegations.
9398+ system . increase_stake (: staker , amount : stake_amount );
9399+ system
9400+ . increase_delegate (
9401+ delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount ,
9402+ );
9403+ system
9404+ . increase_delegate_btc (
9405+ delegator : btc_delegator ,
9406+ pool : btc_pool ,
9407+ amount : btc_delegated_amount ,
9408+ token : system . btc_token,
9409+ );
9410+
9411+ // Initialize variables for Epoch 1.
9412+ let mut staker_stake = stake_amount * 2 ;
9413+ let mut strk_pool_balance = strk_delegated_amount ;
9414+ let mut btc_pool_balance = btc_delegated_amount ;
9415+
9416+ // Test total staking power - according to Epoch 1.
9417+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
9418+ let expected_total_staking_power = (
9419+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
9420+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
9421+ );
9422+ assert! (total_staking_power == expected_total_staking_power );
9423+
9424+ // Calculate expected rewards - according to Epoch 1.
9425+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
9426+ calculate_staker_strk_rewards_with_balances_v2 (
9427+ amount_own : staker_stake ,
9428+ pool_amount : strk_pool_balance ,
9429+ : commission ,
9430+ : staking_contract ,
9431+ : minting_curve_contract ,
9432+ );
9433+ assert! (expected_staker_rewards . is_non_zero ());
9434+ assert! (expected_strk_pool_rewards . is_non_zero ());
9435+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
9436+ calculate_staker_btc_pool_rewards_v2 (
9437+ pool_balance : btc_pool_balance ,
9438+ : commission ,
9439+ : staking_contract ,
9440+ : minting_curve_contract ,
9441+ token_address : system . btc_token. contract_address (),
9442+ );
9443+ assert! (expected_btc_commission_rewards . is_non_zero ());
9444+ assert! (expected_btc_pool_rewards . is_non_zero ());
9445+
9446+ // Test staker balance with attestation rewards - according to Epoch 1.
9447+ system
9448+ . advance_block_into_attestation_window_custom_stake (
9449+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
9450+ );
9451+ system . attest (: staker );
9452+ let staker_rewards = system . staker_claim_rewards (: staker );
9453+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
9454+
9455+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 1.
9456+ system . advance_epoch (); // Epoch 2 - > 3
9457+ let strk_delegator_rewards = system
9458+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
9459+ let btc_delegator_rewards = system
9460+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
9461+ assert! (strk_delegator_rewards == expected_strk_pool_rewards );
9462+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
9463+
9464+ // Update variables for Epoch 2 (pre-upgrade).
9465+ staker_stake += stake_amount ;
9466+ strk_pool_balance += strk_delegated_amount ;
9467+ btc_pool_balance += btc_delegated_amount ;
9468+
9469+ // Test total staking power - according to Epoch 2 (pre-upgrade).
9470+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
9471+ let expected_total_staking_power = (
9472+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
9473+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
9474+ );
9475+ assert! (total_staking_power == expected_total_staking_power );
9476+
9477+ // Calculate expected rewards - according to Epoch 2 (pre-upgrade).
9478+ let prev_staker_rewards = expected_staker_rewards ;
9479+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
9480+ calculate_staker_strk_rewards_with_balances_v2 (
9481+ amount_own : staker_stake ,
9482+ pool_amount : strk_pool_balance ,
9483+ : commission ,
9484+ : staking_contract ,
9485+ : minting_curve_contract ,
9486+ );
9487+ assert! (expected_staker_rewards != prev_staker_rewards );
9488+ assert! (expected_strk_pool_rewards . is_non_zero ());
9489+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
9490+ calculate_staker_btc_pool_rewards_v2 (
9491+ pool_balance : btc_pool_balance ,
9492+ : commission ,
9493+ : staking_contract ,
9494+ : minting_curve_contract ,
9495+ token_address : system . btc_token. contract_address (),
9496+ );
9497+ assert! (expected_btc_commission_rewards . is_non_zero ());
9498+ assert! (expected_btc_pool_rewards . is_non_zero ());
9499+
9500+ // Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade).
9501+ system
9502+ . advance_block_into_attestation_window_custom_stake (
9503+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
9504+ );
9505+ system . attest (: staker );
9506+ let staker_rewards = system . staker_claim_rewards (: staker );
9507+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
9508+
9509+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9510+ // (pre-upgrade).
9511+ system . advance_epoch (); // Epoch 3 - > 4
9512+ let strk_delegator_rewards = system
9513+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
9514+ let btc_delegator_rewards = system
9515+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
9516+ assert! (strk_delegator_rewards == expected_strk_pool_rewards );
9517+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
9518+
9519+ // Update variables for Epoch 2 (post-upgrade).
9520+ staker_stake += stake_amount ;
9521+ strk_pool_balance += strk_delegated_amount ;
9522+ btc_pool_balance += btc_delegated_amount ;
9523+
9524+ // Test total staking power - according to Epoch 2 (post-upgrade).
9525+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
9526+ let expected_total_staking_power = (
9527+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
9528+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
9529+ );
9530+ assert! (total_staking_power == expected_total_staking_power );
9531+
9532+ // Calculate expected rewards - according to Epoch 2 (post-upgrade).
9533+ let prev_staker_rewards = expected_staker_rewards ;
9534+ let prev_strk_pool_rewards = expected_strk_pool_rewards ;
9535+ let prev_btc_commission_rewards = expected_btc_commission_rewards ;
9536+ let prev_btc_pool_rewards = expected_btc_pool_rewards ;
9537+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
9538+ calculate_staker_strk_rewards_with_balances_v2 (
9539+ amount_own : staker_stake ,
9540+ pool_amount : strk_pool_balance ,
9541+ : commission ,
9542+ : staking_contract ,
9543+ : minting_curve_contract ,
9544+ );
9545+ assert! (expected_staker_rewards != prev_staker_rewards );
9546+ assert! (expected_strk_pool_rewards != prev_strk_pool_rewards );
9547+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
9548+ calculate_staker_btc_pool_rewards_v2 (
9549+ pool_balance : btc_pool_balance ,
9550+ : commission ,
9551+ : staking_contract ,
9552+ : minting_curve_contract ,
9553+ token_address : system . btc_token. contract_address (),
9554+ );
9555+ assert! (expected_btc_commission_rewards != prev_btc_commission_rewards );
9556+ assert! (expected_btc_pool_rewards != prev_btc_pool_rewards );
9557+
9558+ // Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade).
9559+ system
9560+ . advance_block_into_attestation_window_custom_stake (
9561+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
9562+ );
9563+ system . attest (: staker );
9564+ let staker_rewards = system . staker_claim_rewards (: staker );
9565+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
9566+
9567+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9568+ // (post-upgrade).
9569+ system . advance_epoch (); // Epoch 4 - > 5
9570+ let strk_delegator_rewards = system
9571+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
9572+ let btc_delegator_rewards = system
9573+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
9574+ assert! (wide_abs_diff (strk_delegator_rewards , expected_strk_pool_rewards ) <= 1 );
9575+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
9576+ }
9577+ }
9578+
92919579/// Flow:
92929580/// Add tokens A and B
92939581/// Delegate for both tokens
0 commit comments