@@ -7388,3 +7388,284 @@ pub(crate) impl BalancesDelayFlowImpl of FlowTrait<BalancesDelayFlow> {
73887388 assert! (btc_delegator_rewards == expected_btc_pool_rewards );
73897389 }
73907390}
7391+
7392+ /// Flow:
7393+ /// Epoch 0:
7394+ /// Staker stake
7395+ /// Epoch 1:
7396+ /// Staker increase stake
7397+ /// Delegators delegate STRK and BTC
7398+ /// Epoch 2:
7399+ /// Staker increase stake
7400+ /// Delegators delegate STRK and BTC
7401+ /// Upgrade
7402+ /// Staker increase stake
7403+ /// Delegators increase delegation STRK and BTC
7404+ /// Test total staking power - according to Epoch 1
7405+ /// Test staker balance with attestation rewards - according to Epoch 1
7406+ /// Epoch 2:
7407+ /// Test delegator balances with attestation rewards - according to Epoch 1
7408+ /// Test total staking power - according to Epoch 2 (pre-upgrade)
7409+ /// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade)
7410+ /// Epoch 3:
7411+ /// Test delegator balances with attestation rewards - according to Epoch 2 (pre-upgrade)
7412+ /// Test total staking power - according to Epoch 2 (post-upgrade)
7413+ /// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade)
7414+ /// Epoch 4:
7415+ /// Test delegator balances with attestation rewards - according to Epoch 2 (post-upgrade)
7416+ #[derive(Drop , Copy )]
7417+ pub (crate ) struct BalanceChangeUpgradeBalancesDelayFlow {
7418+ pub (crate ) staker : Option <Staker >,
7419+ pub (crate ) stake_amount : Option <Amount >,
7420+ pub (crate ) commission : Option <Commission >,
7421+ pub (crate ) strk_delegated_amount : Option <Amount >,
7422+ pub (crate ) btc_delegated_amount : Option <Amount >,
7423+ pub (crate ) strk_delegator : Option <Delegator >,
7424+ pub (crate ) btc_delegator : Option <Delegator >,
7425+ pub (crate ) strk_pool : Option <ContractAddress >,
7426+ pub (crate ) btc_pool : Option <ContractAddress >,
7427+ }
7428+ pub (crate ) impl BalanceChangeUpgradeBalancesDelayFlowImpl of FlowTrait <
7429+ BalanceChangeUpgradeBalancesDelayFlow ,
7430+ > {
7431+ fn setup_v2 (ref self : BalanceChangeUpgradeBalancesDelayFlow , ref system : SystemState ) {
7432+ let stake_amount = system . staking. get_min_stake ();
7433+ let strk_delegated_amount = STRK_CONFIG . min_for_rewards;
7434+ let btc_delegated_amount = TEST_MIN_BTC_FOR_REWARDS ;
7435+ let staker = system . new_staker (amount : stake_amount * 4 );
7436+ let commission = 200 ;
7437+ let strk_delegator = system . new_delegator (amount : strk_delegated_amount * 3 );
7438+ let btc_delegator = system
7439+ . new_btc_delegator (amount : btc_delegated_amount * 3 , token : system . btc_token);
7440+
7441+ system . stake (: staker , amount : stake_amount , pool_enabled : true , : commission );
7442+ let strk_pool = system . staking. get_pool (: staker );
7443+ let btc_pool = system
7444+ . set_open_for_delegation (: staker , token_address : system . btc_token. contract_address ());
7445+
7446+ system . advance_epoch (); // Epoch 0 - > 1
7447+ system . increase_stake (: staker , amount : stake_amount );
7448+ system . delegate (delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount );
7449+ system
7450+ . delegate_btc (
7451+ delegator : btc_delegator ,
7452+ pool : btc_pool ,
7453+ amount : btc_delegated_amount ,
7454+ token : system . btc_token,
7455+ );
7456+
7457+ system . advance_epoch (); // Epoch 1 - > 2
7458+ system . increase_stake (: staker , amount : stake_amount );
7459+ system
7460+ . increase_delegate (
7461+ delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount ,
7462+ );
7463+ system
7464+ . increase_delegate_btc (
7465+ delegator : btc_delegator ,
7466+ pool : btc_pool ,
7467+ amount : btc_delegated_amount ,
7468+ token : system . btc_token,
7469+ );
7470+
7471+ system . set_staker_for_migration (staker_address : staker . staker. address);
7472+ self . staker = Option :: Some (staker );
7473+ self . stake_amount = Option :: Some (stake_amount );
7474+ self . commission = Option :: Some (commission );
7475+ self . strk_delegated_amount = Option :: Some (strk_delegated_amount );
7476+ self . btc_delegated_amount = Option :: Some (btc_delegated_amount );
7477+ self . strk_delegator = Option :: Some (strk_delegator );
7478+ self . btc_delegator = Option :: Some (btc_delegator );
7479+ self . strk_pool = Option :: Some (strk_pool );
7480+ self . btc_pool = Option :: Some (btc_pool );
7481+ }
7482+
7483+ #[feature(" safe_dispatcher" )]
7484+ fn test (self : BalanceChangeUpgradeBalancesDelayFlow , ref system : SystemState ) {
7485+ let staker = self . staker. unwrap ();
7486+ let stake_amount = self . stake_amount. unwrap ();
7487+ let commission = self . commission. unwrap ();
7488+ let strk_delegated_amount = self . strk_delegated_amount. unwrap ();
7489+ let btc_delegated_amount = self . btc_delegated_amount. unwrap ();
7490+ let strk_delegator = self . strk_delegator. unwrap ();
7491+ let btc_delegator = self . btc_delegator. unwrap ();
7492+ let strk_pool = self . strk_pool. unwrap ();
7493+ let btc_pool = self . btc_pool. unwrap ();
7494+
7495+ let staking_contract = system . staking. address;
7496+ let minting_curve_contract = system . minting_curve. address;
7497+
7498+ // Increase stake and delegations.
7499+ system . increase_stake (: staker , amount : stake_amount );
7500+ system
7501+ . increase_delegate (
7502+ delegator : strk_delegator , pool : strk_pool , amount : strk_delegated_amount ,
7503+ );
7504+ system
7505+ . increase_delegate_btc (
7506+ delegator : btc_delegator ,
7507+ pool : btc_pool ,
7508+ amount : btc_delegated_amount ,
7509+ token : system . btc_token,
7510+ );
7511+
7512+ // Test total staking power - according to Epoch 1.
7513+ let staker_stake = stake_amount * 2 ;
7514+ let strk_pool_balance = strk_delegated_amount ;
7515+ let btc_pool_balance = btc_delegated_amount ;
7516+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
7517+ let expected_total_staking_power = (
7518+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
7519+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
7520+ );
7521+ assert! (total_staking_power == expected_total_staking_power );
7522+
7523+ // Calculate expected rewards - according to Epoch 1.
7524+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
7525+ calculate_staker_strk_rewards_with_balances_v2 (
7526+ amount_own : staker_stake ,
7527+ pool_amount : strk_pool_balance ,
7528+ : commission ,
7529+ : staking_contract ,
7530+ : minting_curve_contract ,
7531+ );
7532+ assert! (expected_staker_rewards . is_non_zero ());
7533+ assert! (expected_strk_pool_rewards . is_non_zero ());
7534+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
7535+ calculate_staker_btc_pool_rewards_v2 (
7536+ pool_balance : btc_pool_balance ,
7537+ : commission ,
7538+ : staking_contract ,
7539+ : minting_curve_contract ,
7540+ token_address : system . btc_token. contract_address (),
7541+ );
7542+ assert! (expected_btc_commission_rewards . is_non_zero ());
7543+ assert! (expected_btc_pool_rewards . is_non_zero ());
7544+
7545+ // Test staker balance with attestation rewards - according to Epoch 1.
7546+ system
7547+ . advance_block_into_attestation_window_custom_stake (
7548+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
7549+ );
7550+ system . attest (: staker );
7551+ let staker_rewards = system . staker_claim_rewards (: staker );
7552+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
7553+
7554+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 1.
7555+ system . advance_epoch (); // Epoch 2 - > 3
7556+ let strk_delegator_rewards = system
7557+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
7558+ let btc_delegator_rewards = system
7559+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
7560+ assert! (strk_delegator_rewards == expected_strk_pool_rewards );
7561+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
7562+
7563+ // Update variables for Epoch 2 (pre-upgrade).
7564+ let staker_stake = stake_amount * 3 ;
7565+ let strk_pool_balance = strk_delegated_amount * 2 ;
7566+ let btc_pool_balance = btc_delegated_amount * 2 ;
7567+
7568+ // Test total staking power - according to Epoch 2 (pre-upgrade).
7569+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
7570+ let expected_total_staking_power = (
7571+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
7572+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
7573+ );
7574+ assert! (total_staking_power == expected_total_staking_power );
7575+
7576+ // Calculate expected rewards - according to Epoch 2 (pre-upgrade).
7577+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
7578+ calculate_staker_strk_rewards_with_balances_v2 (
7579+ amount_own : staker_stake ,
7580+ pool_amount : strk_pool_balance ,
7581+ : commission ,
7582+ : staking_contract ,
7583+ : minting_curve_contract ,
7584+ );
7585+ assert! (expected_staker_rewards . is_non_zero ());
7586+ assert! (expected_strk_pool_rewards . is_non_zero ());
7587+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
7588+ calculate_staker_btc_pool_rewards_v2 (
7589+ pool_balance : btc_pool_balance ,
7590+ : commission ,
7591+ : staking_contract ,
7592+ : minting_curve_contract ,
7593+ token_address : system . btc_token. contract_address (),
7594+ );
7595+ assert! (expected_btc_commission_rewards . is_non_zero ());
7596+ assert! (expected_btc_pool_rewards . is_non_zero ());
7597+
7598+ // Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade).
7599+ system
7600+ . advance_block_into_attestation_window_custom_stake (
7601+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
7602+ );
7603+ system . attest (: staker );
7604+ let staker_rewards = system . staker_claim_rewards (: staker );
7605+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
7606+
7607+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
7608+ // (pre-upgrade).
7609+ system . advance_epoch (); // Epoch 3 - > 4
7610+ let strk_delegator_rewards = system
7611+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
7612+ let btc_delegator_rewards = system
7613+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
7614+ assert! (strk_delegator_rewards == expected_strk_pool_rewards );
7615+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
7616+
7617+ // Update variables for Epoch 2 (post-upgrade).
7618+ let staker_stake = stake_amount * 4 ;
7619+ let strk_pool_balance = strk_delegated_amount * 3 ;
7620+ let btc_pool_balance = btc_delegated_amount * 3 ;
7621+
7622+ // Test total staking power - according to Epoch 2 (post-upgrade).
7623+ let total_staking_power = system . staking. get_current_total_staking_power_v2 ();
7624+ let expected_total_staking_power = (
7625+ NormalizedAmountTrait :: from_strk_native_amount (staker_stake + strk_pool_balance ),
7626+ NormalizedAmountTrait :: from_native_amount (btc_pool_balance , TEST_BTC_DECIMALS ),
7627+ );
7628+ assert! (total_staking_power == expected_total_staking_power );
7629+
7630+ // Calculate expected rewards - according to Epoch 2 (post-upgrade).
7631+ let (expected_staker_rewards , expected_strk_pool_rewards ) =
7632+ calculate_staker_strk_rewards_with_balances_v2 (
7633+ amount_own : staker_stake ,
7634+ pool_amount : strk_pool_balance ,
7635+ : commission ,
7636+ : staking_contract ,
7637+ : minting_curve_contract ,
7638+ );
7639+ assert! (expected_staker_rewards . is_non_zero ());
7640+ assert! (expected_strk_pool_rewards . is_non_zero ());
7641+ let (expected_btc_commission_rewards , expected_btc_pool_rewards ) =
7642+ calculate_staker_btc_pool_rewards_v2 (
7643+ pool_balance : btc_pool_balance ,
7644+ : commission ,
7645+ : staking_contract ,
7646+ : minting_curve_contract ,
7647+ token_address : system . btc_token. contract_address (),
7648+ );
7649+ assert! (expected_btc_commission_rewards . is_non_zero ());
7650+ assert! (expected_btc_pool_rewards . is_non_zero ());
7651+
7652+ // Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade).
7653+ system
7654+ . advance_block_into_attestation_window_custom_stake (
7655+ staker_address : staker . staker. address, stake : staker_stake + strk_pool_balance ,
7656+ );
7657+ system . attest (: staker );
7658+ let staker_rewards = system . staker_claim_rewards (: staker );
7659+ assert! (staker_rewards == expected_staker_rewards + expected_btc_commission_rewards );
7660+
7661+ // Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
7662+ // (post-upgrade).
7663+ system . advance_epoch (); // Epoch 4 - > 5
7664+ let strk_delegator_rewards = system
7665+ . delegator_claim_rewards (delegator : strk_delegator , pool : strk_pool );
7666+ let btc_delegator_rewards = system
7667+ . delegator_claim_rewards (delegator : btc_delegator , pool : btc_pool );
7668+ assert! (wide_abs_diff (strk_delegator_rewards , expected_strk_pool_rewards ) <= 1 );
7669+ assert! (btc_delegator_rewards == expected_btc_pool_rewards );
7670+ }
7671+ }
0 commit comments