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