@@ -35,11 +35,11 @@ use staking::test_utils::constants::{
3535};
3636use staking :: test_utils :: {
3737 calculate_pool_member_rewards, calculate_staker_btc_pool_rewards_v2,
38- calculate_staker_strk_rewards_v2, calculate_strk_pool_rewards_v2 ,
39- calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit ,
40- declare_pool_contract, declare_pool_eic_contract, declare_staking_contract ,
41- load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0, to_amount_18_decimals ,
42- upgrade_implementation,
38+ calculate_staker_strk_rewards_v2, calculate_staker_strk_rewards_with_balances_v2 ,
39+ calculate_strk_pool_rewards_v2, calculate_strk_pool_rewards_with_pool_balance_v2 ,
40+ compute_rewards_per_unit, declare_pool_contract, declare_pool_eic_contract ,
41+ declare_staking_contract, load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0,
42+ to_amount_18_decimals, upgrade_implementation,
4343};
4444use staking :: types :: {Amount , Commission };
4545use starknet :: {ClassHash , ContractAddress , Store };
@@ -7141,3 +7141,255 @@ pub(crate) impl ToggleTokensBeforeAfterUpgradeFlowImpl of FlowTrait<
71417141 assert! (tokens == expected_tokens );
71427142 }
71437143}
7144+
7145+ /// Flow:
7146+ /// Epoch 0:
7147+ /// Staker stake
7148+ /// Epoch 1:
7149+ /// Staker increase stake
7150+ /// Delegators delegate STRK and BTC
7151+ /// Upgrade
7152+ /// Staker increase stake
7153+ /// Delegators increase delegation STRK and BTC
7154+ /// Test total staking power - according to Epoch 0
7155+ /// Test staker balance with attestation rewards - according to Epoch 0
7156+ /// Epoch 2:
7157+ /// Test delegator balances with attestation rewards - according to Epoch 0
7158+ /// Test total staking power - according to Epoch 1 (pre-upgrade)
7159+ /// Test staker balance with attestation rewards - according to Epoch 1 (pre-upgrade)
7160+ /// Epoch 3:
7161+ /// Test delegator balances with attestation rewards - according to Epoch 1 (pre-upgrade)
7162+ /// Test total staking power - according to Epoch 1 (post-upgrade)
7163+ /// Test staker balance with attestation rewards - according to Epoch 1 (post-upgrade)
7164+ /// Epoch 4:
7165+ /// Test delegator balances with attestation rewards - according to Epoch 1 (post-upgrade)
7166+ #[derive(Drop , Copy )]
7167+ pub (crate ) struct BalancesDelayFlow {
7168+ pub (crate ) staker : Option <Staker >,
7169+ pub (crate ) stake_amount : Option <Amount >,
7170+ pub (crate ) commission : Option <Commission >,
7171+ pub (crate ) strk_delegated_amount : Option <Amount >,
7172+ pub (crate ) btc_delegated_amount : Option <Amount >,
7173+ pub (crate ) strk_delegator : Option <Delegator >,
7174+ pub (crate ) btc_delegator : Option <Delegator >,
7175+ pub (crate ) strk_pool : Option <ContractAddress >,
7176+ pub (crate ) btc_pool : Option <ContractAddress >,
7177+ }
7178+ pub (crate ) impl BalancesDelayFlowImpl of FlowTrait <BalancesDelayFlow > {
7179+ fn setup_v2 (ref self : BalancesDelayFlow , ref system : SystemState ) {
7180+ let stake_amount = system . staking. get_min_stake ();
7181+ let strk_delegated_amount = STRK_CONFIG . min_for_rewards;
7182+ let btc_delegated_amount = TEST_MIN_BTC_FOR_REWARDS ;
7183+ let staker = system . new_staker (amount : stake_amount * 3 );
7184+ let commission = 200 ;
7185+ let strk_delegator = system . new_delegator (amount : strk_delegated_amount * 2 );
7186+ let btc_delegator = system
7187+ . new_btc_delegator (amount : btc_delegated_amount * 2 , token : system . btc_token);
7188+
7189+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
7190+ let strk_pool = system . staking. get_pool (: staker );
7191+ let btc_pool = system
7192+ . set_open_for_delegation (: staker , token_address : system . btc_token. contract_address ());
7193+
7194+ system . advance_epoch (); // Epoch 0 - > 1
7195+ system . increase_stake (: staker , amount : stake_amount );
7196+ system . delegate (delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount );
7197+ system
7198+ . delegate_btc (
7199+ delegator : btc_delegator ,
7200+ pool : btc_pool ,
7201+ amount : btc_delegated_amount ,
7202+ token : system . btc_token,
7203+ );
7204+
7205+ system . set_staker_for_migration (staker_address : staker . staker. address);
7206+ self . staker = Option :: Some (staker );
7207+ self . stake_amount = Option :: Some (stake_amount );
7208+ self . commission = Option :: Some (commission );
7209+ self . strk_delegated_amount = Option :: Some (strk_delegated_amount );
7210+ self . btc_delegated_amount = Option :: Some (btc_delegated_amount );
7211+ self . strk_delegator = Option :: Some (strk_delegator );
7212+ self . btc_delegator = Option :: Some (btc_delegator );
7213+ self . strk_pool = Option :: Some (strk_pool );
7214+ self . btc_pool = Option :: Some (btc_pool );
7215+ }
7216+
7217+ #[feature(" safe_dispatcher" )]
7218+ fn test (self : BalancesDelayFlow , ref system : SystemState ) {
7219+ let staker = self . staker. unwrap ();
7220+ let stake_amount = self . stake_amount. unwrap ();
7221+ let commission = self . commission. unwrap ();
7222+ let strk_delegated_amount = self . strk_delegated_amount. unwrap ();
7223+ let btc_delegated_amount = self . btc_delegated_amount. unwrap ();
7224+ let strk_delegator = self . strk_delegator. unwrap ();
7225+ let btc_delegator = self . btc_delegator. unwrap ();
7226+ let strk_pool = self . strk_pool. unwrap ();
7227+ let btc_pool = self . btc_pool. unwrap ();
7228+
7229+ let staking_contract = system . staking. address;
7230+ let minting_curve_contract = system . minting_curve. address;
7231+
7232+ // Increase stake and delegations.
7233+ system . increase_stake (: staker , amount : stake_amount );
7234+ system
7235+ . increase_delegate (
7236+ delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount ,
7237+ );
7238+ system
7239+ . increase_delegate_btc (
7240+ delegator : btc_delegator ,
7241+ pool : btc_pool ,
7242+ amount : btc_delegated_amount ,
7243+ token : system . btc_token,
7244+ );
7245+
7246+ // Test total staking power - according to Epoch 0.
7247+ let staker_stake = stake_amount ;
7248+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
7249+ let expected_total_staking_power = (
7250+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake ), Zero :: zero (),
7251+ );
7252+ assert! (total_staking_power == expected_total_staking_power );
7253+
7254+ // Calculate expected rewards - according to Epoch 0.
7255+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_with_balances_v2 (
7256+ amount_own : staker_stake ,
7257+ pool_amount : Zero :: zero (),
7258+ : commission ,
7259+ : staking_contract ,
7260+ : minting_curve_contract ,
7261+ );
7262+ assert! (expected_staker_rewards . is_non_zero ());
7263+
7264+ // Test staker balance with attestation rewards - according to Epoch 0.
7265+ system
7266+ . advance_block_into_attestation_window_custom_stake (
7267+ staker_address : staker . staker. address, stake : staker_stake ,
7268+ );
7269+ system . attest (: staker );
7270+ let staker_rewards = system . staker_claim_rewards (: staker );
7271+ assert! (staker_rewards == expected_staker_rewards );
7272+
7273+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 0.
7274+ system . advance_epoch (); // Epoch 1 - > 2
7275+ let strk_delegator_rewards = system
7276+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
7277+ let btc_delegator_rewards = system
7278+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
7279+ assert! (strk_delegator_rewards == Zero :: zero ());
7280+ assert! (btc_delegator_rewards == Zero :: zero ());
7281+
7282+ // Update variables for Epoch 1 (pre-upgrade).
7283+ let staker_stake = staker_stake + stake_amount ;
7284+ let strk_pool_balance = strk_delegated_amount ;
7285+ let btc_pool_balance = btc_delegated_amount ;
7286+
7287+ // Test total staking power - according to Epoch 1 (pre-upgrade).
7288+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
7289+ let expected_total_staking_power = (
7290+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
7291+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
7292+ );
7293+ assert! (total_staking_power == expected_total_staking_power );
7294+
7295+ // Calculate expected rewards - according to Epoch 1 (pre-upgrade).
7296+ let prev_staker_rewards = expected_staker_rewards ;
7297+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
7298+ calculate_staker_strk_rewards_with_balances_v2 (
7299+ amount_own : staker_stake ,
7300+ pool_amount : strk_pool_balance ,
7301+ : commission ,
7302+ : staking_contract ,
7303+ : minting_curve_contract ,
7304+ );
7305+ assert! (expected_staker_rewards > prev_staker_rewards );
7306+ assert! (expected_strk_pool_rewards . is_non_zero ());
7307+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
7308+ calculate_staker_btc_pool_rewards_v2 (
7309+ pool_balance : btc_pool_balance ,
7310+ : commission ,
7311+ : staking_contract ,
7312+ : minting_curve_contract ,
7313+ token_address : system . btc_token. contract_address (),
7314+ );
7315+ assert! (expected_btc_commission_rewards . is_non_zero ());
7316+ assert! (expected_btc_pool_rewards . is_non_zero ());
7317+
7318+ // Test staker balance with attestation rewards - according to Epoch 1 (pre-upgrade).
7319+ system
7320+ . advance_block_into_attestation_window_custom_stake (
7321+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
7322+ );
7323+ system . attest (: staker );
7324+ let staker_rewards = system . staker_claim_rewards (: staker );
7325+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
7326+
7327+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 1
7328+ // (pre-upgrade).
7329+ system . advance_epoch (); // Epoch 2 - > 3
7330+ let strk_delegator_rewards = system
7331+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
7332+ let btc_delegator_rewards = system
7333+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
7334+ assert! (strk_delegator_rewards == expected_strk_pool_rewards );
7335+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
7336+
7337+ // Update variables for Epoch 1 (post-upgrade).
7338+ let staker_stake = staker_stake + stake_amount ;
7339+ let strk_pool_balance = strk_pool_balance + strk_delegated_amount ;
7340+ let btc_pool_balance = btc_pool_balance + btc_delegated_amount ;
7341+
7342+ // Test total staking power - according to Epoch 1 (post-upgrade).
7343+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
7344+ let expected_total_staking_power = (
7345+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
7346+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
7347+ );
7348+ assert! (total_staking_power == expected_total_staking_power );
7349+
7350+ // Calculate expected rewards - according to Epoch 1 (post-upgrade).
7351+ let prev_staker_rewards = expected_staker_rewards ;
7352+ let prev_strk_pool_rewards = expected_strk_pool_rewards ;
7353+ let prev_btc_commission_rewards = expected_btc_commission_rewards ;
7354+ let prev_btc_pool_rewards = expected_btc_pool_rewards ;
7355+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
7356+ calculate_staker_strk_rewards_with_balances_v2 (
7357+ amount_own : staker_stake ,
7358+ pool_amount : strk_pool_balance ,
7359+ : commission ,
7360+ : staking_contract ,
7361+ : minting_curve_contract ,
7362+ );
7363+ assert! (expected_staker_rewards > prev_staker_rewards );
7364+ assert! (expected_strk_pool_rewards > prev_strk_pool_rewards );
7365+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
7366+ calculate_staker_btc_pool_rewards_v2 (
7367+ pool_balance : btc_pool_balance ,
7368+ : commission ,
7369+ : staking_contract ,
7370+ : minting_curve_contract ,
7371+ token_address : system . btc_token. contract_address (),
7372+ );
7373+ assert! (expected_btc_commission_rewards > prev_btc_commission_rewards );
7374+ assert! (expected_btc_pool_rewards > prev_btc_pool_rewards );
7375+
7376+ // Test staker balance with attestation rewards - according to Epoch 1 (post-upgrade).
7377+ system
7378+ . advance_block_into_attestation_window_custom_stake (
7379+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
7380+ );
7381+ system . attest (: staker );
7382+ let staker_rewards = system . staker_claim_rewards (: staker );
7383+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
7384+
7385+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 1
7386+ // (post-upgrade).
7387+ system . advance_epoch (); // Epoch 3 - > 4
7388+ let strk_delegator_rewards = system
7389+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
7390+ let btc_delegator_rewards = system
7391+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
7392+ assert! (strk_delegator_rewards == expected_strk_pool_rewards );
7393+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
7394+ }
7395+ }
0 commit comments