@@ -9046,6 +9046,294 @@ pub(crate) impl BalancesDelayBalanceChangeFlowImpl of FlowTrait<BalancesDelayBal
90469046 }
90479047}
90489048
9049+ /// Flow:
9050+ /// Epoch 0:
9051+ /// Staker stake
9052+ /// Epoch 1:
9053+ /// Staker increase stake
9054+ /// Delegators delegate STRK and BTC
9055+ /// Epoch 2:
9056+ /// Staker increase stake
9057+ /// Delegators increase delegation STRK and BTC
9058+ /// Upgrade
9059+ /// Staker increase stake
9060+ /// Delegators increase delegation STRK and BTC
9061+ /// Test total staking power - according to Epoch 1
9062+ /// Test staker balance with attestation rewards - according to Epoch 1
9063+ /// Epoch 2:
9064+ /// Test delegator balances with attestation rewards - according to Epoch 1
9065+ /// Test total staking power - according to Epoch 2 (pre-upgrade)
9066+ /// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade)
9067+ /// Epoch 3:
9068+ /// Test delegator balances with attestation rewards - according to Epoch 2 (pre-upgrade)
9069+ /// Test total staking power - according to Epoch 2 (post-upgrade)
9070+ /// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade)
9071+ /// Epoch 4:
9072+ /// Test delegator balances with attestation rewards - according to Epoch 2 (post-upgrade)
9073+ #[derive(Drop , Copy )]
9074+ pub (crate ) struct BalancesDelayMoreBalanceChangeFlow {
9075+ pub (crate ) staker : Option <Staker >,
9076+ pub (crate ) stake_amount : Option <Amount >,
9077+ pub (crate ) commission : Option <Commission >,
9078+ pub (crate ) strk_delegated_amount : Option <Amount >,
9079+ pub (crate ) btc_delegated_amount : Option <Amount >,
9080+ pub (crate ) strk_delegator : Option <Delegator >,
9081+ pub (crate ) btc_delegator : Option <Delegator >,
9082+ pub (crate ) strk_pool : Option <ContractAddress >,
9083+ pub (crate ) btc_pool : Option <ContractAddress >,
9084+ }
9085+ pub (crate ) impl BalancesDelayMoreBalanceChangeFlowImpl of FlowTrait <
9086+ BalancesDelayMoreBalanceChangeFlow ,
9087+ > {
9088+ fn setup_v2 (ref self : BalancesDelayMoreBalanceChangeFlow , ref system : SystemState ) {
9089+ let stake_amount = system . staking. get_min_stake ();
9090+ let strk_delegated_amount = STRK_CONFIG . min_for_rewards;
9091+ let btc_delegated_amount = TEST_MIN_BTC_FOR_REWARDS ;
9092+ let staker = system . new_staker (amount : stake_amount * 4 );
9093+ let commission = 200 ;
9094+ let strk_delegator = system . new_delegator (amount : strk_delegated_amount * 3 );
9095+ let btc_delegator = system
9096+ . new_btc_delegator (amount : btc_delegated_amount * 3 , token : system . btc_token);
9097+
9098+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
9099+ let strk_pool = system . staking. get_pool (: staker );
9100+ let btc_pool = system
9101+ . set_open_for_delegation (: staker , token_address : system . btc_token. contract_address ());
9102+
9103+ system . advance_epoch (); // Epoch 0 - > 1
9104+ system . increase_stake (: staker , amount : stake_amount );
9105+ system . delegate (delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount );
9106+ system
9107+ . delegate_btc (
9108+ delegator : btc_delegator ,
9109+ pool : btc_pool ,
9110+ amount : btc_delegated_amount ,
9111+ token : system . btc_token,
9112+ );
9113+
9114+ system . advance_epoch (); // Epoch 1 - > 2
9115+ system . increase_stake (: staker , amount : stake_amount );
9116+ system
9117+ . increase_delegate (
9118+ delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount ,
9119+ );
9120+ system
9121+ . increase_delegate_btc (
9122+ delegator : btc_delegator ,
9123+ pool : btc_pool ,
9124+ amount : btc_delegated_amount ,
9125+ token : system . btc_token,
9126+ );
9127+
9128+ system . set_staker_for_migration (staker_address : staker . staker. address);
9129+ self . staker = Option :: Some (staker );
9130+ self . stake_amount = Option :: Some (stake_amount );
9131+ self . commission = Option :: Some (commission );
9132+ self . strk_delegated_amount = Option :: Some (strk_delegated_amount );
9133+ self . btc_delegated_amount = Option :: Some (btc_delegated_amount );
9134+ self . strk_delegator = Option :: Some (strk_delegator );
9135+ self . btc_delegator = Option :: Some (btc_delegator );
9136+ self . strk_pool = Option :: Some (strk_pool );
9137+ self . btc_pool = Option :: Some (btc_pool );
9138+ }
9139+
9140+ #[feature(" safe_dispatcher" )]
9141+ fn test (self : BalancesDelayMoreBalanceChangeFlow , ref system : SystemState ) {
9142+ let staker = self . staker. unwrap ();
9143+ let stake_amount = self . stake_amount. unwrap ();
9144+ let commission = self . commission. unwrap ();
9145+ let strk_delegated_amount = self . strk_delegated_amount. unwrap ();
9146+ let btc_delegated_amount = self . btc_delegated_amount. unwrap ();
9147+ let strk_delegator = self . strk_delegator. unwrap ();
9148+ let btc_delegator = self . btc_delegator. unwrap ();
9149+ let strk_pool = self . strk_pool. unwrap ();
9150+ let btc_pool = self . btc_pool. unwrap ();
9151+
9152+ let staking_contract = system . staking. address;
9153+ let minting_curve_contract = system . minting_curve. address;
9154+
9155+ // Increase stake and delegations.
9156+ system . increase_stake (: staker , amount : stake_amount );
9157+ system
9158+ . increase_delegate (
9159+ delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount ,
9160+ );
9161+ system
9162+ . increase_delegate_btc (
9163+ delegator : btc_delegator ,
9164+ pool : btc_pool ,
9165+ amount : btc_delegated_amount ,
9166+ token : system . btc_token,
9167+ );
9168+
9169+ // Initialize variables for Epoch 1.
9170+ let mut staker_stake = stake_amount * 2 ;
9171+ let mut strk_pool_balance = strk_delegated_amount ;
9172+ let mut btc_pool_balance = btc_delegated_amount ;
9173+
9174+ // Test total staking power - according to Epoch 1.
9175+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
9176+ let expected_total_staking_power = (
9177+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
9178+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
9179+ );
9180+ assert! (total_staking_power == expected_total_staking_power );
9181+
9182+ // Calculate expected rewards - according to Epoch 1.
9183+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
9184+ calculate_staker_strk_rewards_with_balances_v2 (
9185+ amount_own : staker_stake ,
9186+ pool_amount : strk_pool_balance ,
9187+ : commission ,
9188+ : staking_contract ,
9189+ : minting_curve_contract ,
9190+ );
9191+ assert! (expected_staker_rewards . is_non_zero ());
9192+ assert! (expected_strk_pool_rewards . is_non_zero ());
9193+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
9194+ calculate_staker_btc_pool_rewards_v2 (
9195+ pool_balance : btc_pool_balance ,
9196+ : commission ,
9197+ : staking_contract ,
9198+ : minting_curve_contract ,
9199+ token_address : system . btc_token. contract_address (),
9200+ );
9201+ assert! (expected_btc_commission_rewards . is_non_zero ());
9202+ assert! (expected_btc_pool_rewards . is_non_zero ());
9203+
9204+ // Test staker balance with attestation rewards - according to Epoch 1.
9205+ system
9206+ . advance_block_into_attestation_window_custom_stake (
9207+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
9208+ );
9209+ system . attest (: staker );
9210+ let staker_rewards = system . staker_claim_rewards (: staker );
9211+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
9212+
9213+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 1.
9214+ system . advance_epoch (); // Epoch 2 - > 3
9215+ let strk_delegator_rewards = system
9216+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
9217+ let btc_delegator_rewards = system
9218+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
9219+ assert! (strk_delegator_rewards == expected_strk_pool_rewards );
9220+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
9221+
9222+ // Update variables for Epoch 2 (pre-upgrade).
9223+ staker_stake += stake_amount ;
9224+ strk_pool_balance += strk_delegated_amount ;
9225+ btc_pool_balance += btc_delegated_amount ;
9226+
9227+ // Test total staking power - according to Epoch 2 (pre-upgrade).
9228+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
9229+ let expected_total_staking_power = (
9230+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
9231+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
9232+ );
9233+ assert! (total_staking_power == expected_total_staking_power );
9234+
9235+ // Calculate expected rewards - according to Epoch 2 (pre-upgrade).
9236+ let prev_staker_rewards = expected_staker_rewards ;
9237+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
9238+ calculate_staker_strk_rewards_with_balances_v2 (
9239+ amount_own : staker_stake ,
9240+ pool_amount : strk_pool_balance ,
9241+ : commission ,
9242+ : staking_contract ,
9243+ : minting_curve_contract ,
9244+ );
9245+ assert! (expected_staker_rewards != prev_staker_rewards );
9246+ assert! (expected_strk_pool_rewards . is_non_zero ());
9247+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
9248+ calculate_staker_btc_pool_rewards_v2 (
9249+ pool_balance : btc_pool_balance ,
9250+ : commission ,
9251+ : staking_contract ,
9252+ : minting_curve_contract ,
9253+ token_address : system . btc_token. contract_address (),
9254+ );
9255+ assert! (expected_btc_commission_rewards . is_non_zero ());
9256+ assert! (expected_btc_pool_rewards . is_non_zero ());
9257+
9258+ // Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade).
9259+ system
9260+ . advance_block_into_attestation_window_custom_stake (
9261+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
9262+ );
9263+ system . attest (: staker );
9264+ let staker_rewards = system . staker_claim_rewards (: staker );
9265+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
9266+
9267+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9268+ // (pre-upgrade).
9269+ system . advance_epoch (); // Epoch 3 - > 4
9270+ let strk_delegator_rewards = system
9271+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
9272+ let btc_delegator_rewards = system
9273+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
9274+ assert! (strk_delegator_rewards == expected_strk_pool_rewards );
9275+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
9276+
9277+ // Update variables for Epoch 2 (post-upgrade).
9278+ staker_stake += stake_amount ;
9279+ strk_pool_balance += strk_delegated_amount ;
9280+ btc_pool_balance += btc_delegated_amount ;
9281+
9282+ // Test total staking power - according to Epoch 2 (post-upgrade).
9283+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
9284+ let expected_total_staking_power = (
9285+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
9286+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
9287+ );
9288+ assert! (total_staking_power == expected_total_staking_power );
9289+
9290+ // Calculate expected rewards - according to Epoch 2 (post-upgrade).
9291+ let prev_staker_rewards = expected_staker_rewards ;
9292+ let prev_strk_pool_rewards = expected_strk_pool_rewards ;
9293+ let prev_btc_commission_rewards = expected_btc_commission_rewards ;
9294+ let prev_btc_pool_rewards = expected_btc_pool_rewards ;
9295+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
9296+ calculate_staker_strk_rewards_with_balances_v2 (
9297+ amount_own : staker_stake ,
9298+ pool_amount : strk_pool_balance ,
9299+ : commission ,
9300+ : staking_contract ,
9301+ : minting_curve_contract ,
9302+ );
9303+ assert! (expected_staker_rewards != prev_staker_rewards );
9304+ assert! (expected_strk_pool_rewards != prev_strk_pool_rewards );
9305+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
9306+ calculate_staker_btc_pool_rewards_v2 (
9307+ pool_balance : btc_pool_balance ,
9308+ : commission ,
9309+ : staking_contract ,
9310+ : minting_curve_contract ,
9311+ token_address : system . btc_token. contract_address (),
9312+ );
9313+ assert! (expected_btc_commission_rewards != prev_btc_commission_rewards );
9314+ assert! (expected_btc_pool_rewards != prev_btc_pool_rewards );
9315+
9316+ // Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade).
9317+ system
9318+ . advance_block_into_attestation_window_custom_stake (
9319+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
9320+ );
9321+ system . attest (: staker );
9322+ let staker_rewards = system . staker_claim_rewards (: staker );
9323+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
9324+
9325+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9326+ // (post-upgrade).
9327+ system . advance_epoch (); // Epoch 4 - > 5
9328+ let strk_delegator_rewards = system
9329+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
9330+ let btc_delegator_rewards = system
9331+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
9332+ assert! (wide_abs_diff (strk_delegator_rewards , expected_strk_pool_rewards ) <= 1 );
9333+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
9334+ }
9335+ }
9336+
90499337/// Flow:
90509338/// Add tokens A and B
90519339/// Delegate for both tokens
0 commit comments