@@ -9115,6 +9115,294 @@ pub(crate) impl StakerV1ChangeBalanceAttestFlowImpl of FlowTrait<StakerV1ChangeB
91159115 }
91169116}
91179117
9118+ /// Flow:
9119+ /// Epoch 0:
9120+ /// Staker stake
9121+ /// Epoch 1:
9122+ /// Staker increase stake
9123+ /// Delegators delegate STRK and BTC
9124+ /// Epoch 2:
9125+ /// Staker increase stake
9126+ /// Delegators increase delegation STRK and BTC
9127+ /// Upgrade
9128+ /// Staker increase stake
9129+ /// Delegators increase delegation STRK and BTC
9130+ /// Test total staking power - according to Epoch 1
9131+ /// Test staker balance with attestation rewards - according to Epoch 1
9132+ /// Epoch 2:
9133+ /// Test delegator balances with attestation rewards - according to Epoch 1
9134+ /// Test total staking power - according to Epoch 2 (pre-upgrade)
9135+ /// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade)
9136+ /// Epoch 3:
9137+ /// Test delegator balances with attestation rewards - according to Epoch 2 (pre-upgrade)
9138+ /// Test total staking power - according to Epoch 2 (post-upgrade)
9139+ /// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade)
9140+ /// Epoch 4:
9141+ /// Test delegator balances with attestation rewards - according to Epoch 2 (post-upgrade)
9142+ #[derive(Drop , Copy )]
9143+ pub (crate ) struct BalancesDelayMoreBalanceChangeFlow {
9144+ pub (crate ) staker : Option <Staker >,
9145+ pub (crate ) stake_amount : Option <Amount >,
9146+ pub (crate ) commission : Option <Commission >,
9147+ pub (crate ) strk_delegated_amount : Option <Amount >,
9148+ pub (crate ) btc_delegated_amount : Option <Amount >,
9149+ pub (crate ) strk_delegator : Option <Delegator >,
9150+ pub (crate ) btc_delegator : Option <Delegator >,
9151+ pub (crate ) strk_pool : Option <ContractAddress >,
9152+ pub (crate ) btc_pool : Option <ContractAddress >,
9153+ }
9154+ pub (crate ) impl BalancesDelayMoreBalanceChangeFlowImpl of FlowTrait <
9155+ BalancesDelayMoreBalanceChangeFlow ,
9156+ > {
9157+ fn setup_v2 (ref self : BalancesDelayMoreBalanceChangeFlow , ref system : SystemState ) {
9158+ let stake_amount = system . staking. get_min_stake ();
9159+ let strk_delegated_amount = STRK_CONFIG . min_for_rewards;
9160+ let btc_delegated_amount = TEST_MIN_BTC_FOR_REWARDS ;
9161+ let staker = system . new_staker (amount : stake_amount * 4 );
9162+ let commission = 200 ;
9163+ let strk_delegator = system . new_delegator (amount : strk_delegated_amount * 3 );
9164+ let btc_delegator = system
9165+ . new_btc_delegator (amount : btc_delegated_amount * 3 , token : system . btc_token);
9166+
9167+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
9168+ let strk_pool = system . staking. get_pool (: staker );
9169+ let btc_pool = system
9170+ . set_open_for_delegation (: staker , token_address : system . btc_token. contract_address ());
9171+
9172+ system . advance_epoch (); // Epoch 0 - > 1
9173+ system . increase_stake (: staker , amount : stake_amount );
9174+ system . delegate (delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount );
9175+ system
9176+ . delegate_btc (
9177+ delegator : btc_delegator ,
9178+ pool : btc_pool ,
9179+ amount : btc_delegated_amount ,
9180+ token : system . btc_token,
9181+ );
9182+
9183+ system . advance_epoch (); // Epoch 1 - > 2
9184+ system . increase_stake (: staker , amount : stake_amount );
9185+ system
9186+ . increase_delegate (
9187+ delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount ,
9188+ );
9189+ system
9190+ . increase_delegate_btc (
9191+ delegator : btc_delegator ,
9192+ pool : btc_pool ,
9193+ amount : btc_delegated_amount ,
9194+ token : system . btc_token,
9195+ );
9196+
9197+ system . set_staker_for_migration (staker_address : staker . staker. address);
9198+ self . staker = Option :: Some (staker );
9199+ self . stake_amount = Option :: Some (stake_amount );
9200+ self . commission = Option :: Some (commission );
9201+ self . strk_delegated_amount = Option :: Some (strk_delegated_amount );
9202+ self . btc_delegated_amount = Option :: Some (btc_delegated_amount );
9203+ self . strk_delegator = Option :: Some (strk_delegator );
9204+ self . btc_delegator = Option :: Some (btc_delegator );
9205+ self . strk_pool = Option :: Some (strk_pool );
9206+ self . btc_pool = Option :: Some (btc_pool );
9207+ }
9208+
9209+ #[feature(" safe_dispatcher" )]
9210+ fn test (self : BalancesDelayMoreBalanceChangeFlow , ref system : SystemState ) {
9211+ let staker = self . staker. unwrap ();
9212+ let stake_amount = self . stake_amount. unwrap ();
9213+ let commission = self . commission. unwrap ();
9214+ let strk_delegated_amount = self . strk_delegated_amount. unwrap ();
9215+ let btc_delegated_amount = self . btc_delegated_amount. unwrap ();
9216+ let strk_delegator = self . strk_delegator. unwrap ();
9217+ let btc_delegator = self . btc_delegator. unwrap ();
9218+ let strk_pool = self . strk_pool. unwrap ();
9219+ let btc_pool = self . btc_pool. unwrap ();
9220+
9221+ let staking_contract = system . staking. address;
9222+ let minting_curve_contract = system . minting_curve. address;
9223+
9224+ // Increase stake and delegations.
9225+ system . increase_stake (: staker , amount : stake_amount );
9226+ system
9227+ . increase_delegate (
9228+ delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount ,
9229+ );
9230+ system
9231+ . increase_delegate_btc (
9232+ delegator : btc_delegator ,
9233+ pool : btc_pool ,
9234+ amount : btc_delegated_amount ,
9235+ token : system . btc_token,
9236+ );
9237+
9238+ // Initialize variables for Epoch 1.
9239+ let mut staker_stake = stake_amount * 2 ;
9240+ let mut strk_pool_balance = strk_delegated_amount ;
9241+ let mut btc_pool_balance = btc_delegated_amount ;
9242+
9243+ // Test total staking power - according to Epoch 1.
9244+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
9245+ let expected_total_staking_power = (
9246+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
9247+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
9248+ );
9249+ assert! (total_staking_power == expected_total_staking_power );
9250+
9251+ // Calculate expected rewards - according to Epoch 1.
9252+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
9253+ calculate_staker_strk_rewards_with_balances_v2 (
9254+ amount_own : staker_stake ,
9255+ pool_amount : strk_pool_balance ,
9256+ : commission ,
9257+ : staking_contract ,
9258+ : minting_curve_contract ,
9259+ );
9260+ assert! (expected_staker_rewards . is_non_zero ());
9261+ assert! (expected_strk_pool_rewards . is_non_zero ());
9262+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
9263+ calculate_staker_btc_pool_rewards_v2 (
9264+ pool_balance : btc_pool_balance ,
9265+ : commission ,
9266+ : staking_contract ,
9267+ : minting_curve_contract ,
9268+ token_address : system . btc_token. contract_address (),
9269+ );
9270+ assert! (expected_btc_commission_rewards . is_non_zero ());
9271+ assert! (expected_btc_pool_rewards . is_non_zero ());
9272+
9273+ // Test staker balance with attestation rewards - according to Epoch 1.
9274+ system
9275+ . advance_block_into_attestation_window_custom_stake (
9276+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
9277+ );
9278+ system . attest (: staker );
9279+ let staker_rewards = system . staker_claim_rewards (: staker );
9280+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
9281+
9282+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 1.
9283+ system . advance_epoch (); // Epoch 2 - > 3
9284+ let strk_delegator_rewards = system
9285+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
9286+ let btc_delegator_rewards = system
9287+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
9288+ assert! (strk_delegator_rewards == expected_strk_pool_rewards );
9289+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
9290+
9291+ // Update variables for Epoch 2 (pre-upgrade).
9292+ staker_stake += stake_amount ;
9293+ strk_pool_balance += strk_delegated_amount ;
9294+ btc_pool_balance += btc_delegated_amount ;
9295+
9296+ // Test total staking power - according to Epoch 2 (pre-upgrade).
9297+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
9298+ let expected_total_staking_power = (
9299+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
9300+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
9301+ );
9302+ assert! (total_staking_power == expected_total_staking_power );
9303+
9304+ // Calculate expected rewards - according to Epoch 2 (pre-upgrade).
9305+ let prev_staker_rewards = expected_staker_rewards ;
9306+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
9307+ calculate_staker_strk_rewards_with_balances_v2 (
9308+ amount_own : staker_stake ,
9309+ pool_amount : strk_pool_balance ,
9310+ : commission ,
9311+ : staking_contract ,
9312+ : minting_curve_contract ,
9313+ );
9314+ assert! (expected_staker_rewards != prev_staker_rewards );
9315+ assert! (expected_strk_pool_rewards . is_non_zero ());
9316+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
9317+ calculate_staker_btc_pool_rewards_v2 (
9318+ pool_balance : btc_pool_balance ,
9319+ : commission ,
9320+ : staking_contract ,
9321+ : minting_curve_contract ,
9322+ token_address : system . btc_token. contract_address (),
9323+ );
9324+ assert! (expected_btc_commission_rewards . is_non_zero ());
9325+ assert! (expected_btc_pool_rewards . is_non_zero ());
9326+
9327+ // Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade).
9328+ system
9329+ . advance_block_into_attestation_window_custom_stake (
9330+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
9331+ );
9332+ system . attest (: staker );
9333+ let staker_rewards = system . staker_claim_rewards (: staker );
9334+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
9335+
9336+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9337+ // (pre-upgrade).
9338+ system . advance_epoch (); // Epoch 3 - > 4
9339+ let strk_delegator_rewards = system
9340+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
9341+ let btc_delegator_rewards = system
9342+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
9343+ assert! (strk_delegator_rewards == expected_strk_pool_rewards );
9344+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
9345+
9346+ // Update variables for Epoch 2 (post-upgrade).
9347+ staker_stake += stake_amount ;
9348+ strk_pool_balance += strk_delegated_amount ;
9349+ btc_pool_balance += btc_delegated_amount ;
9350+
9351+ // Test total staking power - according to Epoch 2 (post-upgrade).
9352+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
9353+ let expected_total_staking_power = (
9354+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
9355+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
9356+ );
9357+ assert! (total_staking_power == expected_total_staking_power );
9358+
9359+ // Calculate expected rewards - according to Epoch 2 (post-upgrade).
9360+ let prev_staker_rewards = expected_staker_rewards ;
9361+ let prev_strk_pool_rewards = expected_strk_pool_rewards ;
9362+ let prev_btc_commission_rewards = expected_btc_commission_rewards ;
9363+ let prev_btc_pool_rewards = expected_btc_pool_rewards ;
9364+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
9365+ calculate_staker_strk_rewards_with_balances_v2 (
9366+ amount_own : staker_stake ,
9367+ pool_amount : strk_pool_balance ,
9368+ : commission ,
9369+ : staking_contract ,
9370+ : minting_curve_contract ,
9371+ );
9372+ assert! (expected_staker_rewards != prev_staker_rewards );
9373+ assert! (expected_strk_pool_rewards != prev_strk_pool_rewards );
9374+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
9375+ calculate_staker_btc_pool_rewards_v2 (
9376+ pool_balance : btc_pool_balance ,
9377+ : commission ,
9378+ : staking_contract ,
9379+ : minting_curve_contract ,
9380+ token_address : system . btc_token. contract_address (),
9381+ );
9382+ assert! (expected_btc_commission_rewards != prev_btc_commission_rewards );
9383+ assert! (expected_btc_pool_rewards != prev_btc_pool_rewards );
9384+
9385+ // Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade).
9386+ system
9387+ . advance_block_into_attestation_window_custom_stake (
9388+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
9389+ );
9390+ system . attest (: staker );
9391+ let staker_rewards = system . staker_claim_rewards (: staker );
9392+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
9393+
9394+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9395+ // (post-upgrade).
9396+ system . advance_epoch (); // Epoch 4 - > 5
9397+ let strk_delegator_rewards = system
9398+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
9399+ let btc_delegator_rewards = system
9400+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
9401+ assert! (wide_abs_diff (strk_delegator_rewards , expected_strk_pool_rewards ) <= 1 );
9402+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
9403+ }
9404+ }
9405+
91189406/// Flow:
91199407/// Add tokens A and B
91209408/// Delegate for both tokens
0 commit comments