@@ -35,9 +35,9 @@ 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_staker_strk_rewards_with_balances_v2 ,
39- calculate_staker_strk_rewards_with_balances_v3, calculate_strk_pool_rewards_v1 ,
40- calculate_strk_pool_rewards_v2, calculate_strk_pool_rewards_v3,
38+ calculate_staker_btc_pool_rewards_v3, calculate_staker_strk_rewards_v2 ,
39+ calculate_staker_strk_rewards_with_balances_v2, calculate_staker_strk_rewards_with_balances_v3 ,
40+ calculate_strk_pool_rewards_v1, calculate_strk_pool_rewards_v2, calculate_strk_pool_rewards_v3,
4141 calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit,
4242 declare_pool_contract, declare_pool_eic_contract, declare_staking_contract,
4343 load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0, to_amount_18_decimals,
@@ -9746,3 +9746,153 @@ pub(crate) impl DelegatorV0V1NoRewardsFlowImpl of FlowTrait<DelegatorV0V1NoRewar
97469746 assert! (system . delegator_unclaimed_rewards (: delegator , : pool ) == unclaimed_rewards );
97479747 }
97489748}
9749+
9750+ /// Flow:
9751+ /// Add tokens A and B
9752+ /// Delegate for both tokens
9753+ /// Enable token A, disable token B
9754+ /// Advance epoch
9755+ /// Upgrade - test views and rewards
9756+ /// Start consensus rewards - test rewards
9757+ #[derive(Drop , Copy )]
9758+ pub (crate ) struct EnableDisableTokenBeforeAfterUpgradeFlow {
9759+ pub (crate ) token_a : Option <Token >,
9760+ pub (crate ) token_b : Option <Token >,
9761+ pub (crate ) staker : Option <Staker >,
9762+ pub (crate ) pool_a : Option <ContractAddress >,
9763+ pub (crate ) pool_b : Option <ContractAddress >,
9764+ pub (crate ) delegator_a : Option <Delegator >,
9765+ pub (crate ) delegator_b : Option <Delegator >,
9766+ pub (crate ) delegation_amount : Option <Amount >,
9767+ }
9768+ pub (crate ) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait <
9769+ EnableDisableTokenBeforeAfterUpgradeFlow ,
9770+ > {
9771+ fn setup_v2 (ref self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
9772+ let token_a = system . deploy_new_btc_token (name : " TOKEN_A" , decimals : TEST_BTC_DECIMALS );
9773+ let token_b = system . deploy_new_btc_token (name : " TOKEN_B" , decimals : TEST_BTC_DECIMALS );
9774+ system . staking. add_token (token_address : token_a . contract_address ());
9775+ system . staking. add_token (token_address : token_b . contract_address ());
9776+ system . staking. enable_token (token_address : token_b . contract_address ());
9777+
9778+ let stake_amount = system . staking. get_min_stake ();
9779+ let delegation_amount = TEST_MIN_BTC_FOR_REWARDS ;
9780+ let staker = system . new_staker (amount : stake_amount );
9781+ system . stake (: staker , amount : stake_amount , pool_enabled : true , commission : 200 );
9782+ let pool_a = system
9783+ . set_open_for_delegation (: staker , token_address : token_a . contract_address ());
9784+ let pool_b = system
9785+ . set_open_for_delegation (: staker , token_address : token_b . contract_address ());
9786+ let delegator_a = system . new_btc_delegator (amount : delegation_amount , token : token_a );
9787+ let delegator_b = system . new_btc_delegator (amount : delegation_amount , token : token_b );
9788+ system
9789+ . delegate_btc (
9790+ delegator : delegator_a , pool : pool_a , amount : delegation_amount , token : token_a ,
9791+ );
9792+ system
9793+ . delegate_btc (
9794+ delegator : delegator_b , pool : pool_b , amount : delegation_amount , token : token_b ,
9795+ );
9796+
9797+ system . advance_epoch ();
9798+ system . staking. disable_token (token_address : token_b . contract_address ());
9799+ system . staking. enable_token (token_address : token_a . contract_address ());
9800+
9801+ system . advance_epoch ();
9802+ system . set_staker_for_migration (staker_address : staker . staker. address);
9803+ self . token_a = Option :: Some (token_a );
9804+ self . token_b = Option :: Some (token_b );
9805+ self . staker = Option :: Some (staker );
9806+ self . pool_a = Option :: Some (pool_a );
9807+ self . pool_b = Option :: Some (pool_b );
9808+ self . delegator_a = Option :: Some (delegator_a );
9809+ self . delegator_b = Option :: Some (delegator_b );
9810+ self . delegation_amount = Option :: Some (delegation_amount );
9811+ }
9812+
9813+ fn test (self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
9814+ let token_a = self . token_a. unwrap ();
9815+ let token_b = self . token_b. unwrap ();
9816+ let staker = self . staker. unwrap ();
9817+ let pool_a = self . pool_a. unwrap ();
9818+ let pool_b = self . pool_b. unwrap ();
9819+ let delegator_a = self . delegator_a. unwrap ();
9820+ let delegator_b = self . delegator_b. unwrap ();
9821+ let delegation_amount = self . delegation_amount. unwrap ();
9822+ let staker_info = system . staker_info_v1 (: staker );
9823+ let commission = staker_info . pool_info. unwrap (). commission;
9824+ let stake_amount = staker_info . amount_own;
9825+
9826+ // Test get_tokens view.
9827+ let tokens = system . staking. dispatcher (). get_tokens ();
9828+ let expected_tokens = array! [
9829+ (STRK_TOKEN_ADDRESS , true ), (system . btc_token. contract_address (), true ),
9830+ (token_a . contract_address (), true ), (token_b . contract_address (), false ),
9831+ ]
9832+ . span ();
9833+ assert! (tokens == expected_tokens );
9834+
9835+ // Test rewards - only token A.
9836+ system . advance_block_into_attestation_window (: staker );
9837+ system . attest (: staker );
9838+ system . advance_epoch ();
9839+ let staker_rewards = system . staker_claim_rewards (: staker );
9840+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_v2 (
9841+ : staker_info ,
9842+ staking_contract : system . staking. address,
9843+ minting_curve_contract : system . minting_curve. address,
9844+ );
9845+ assert! (expected_staker_rewards . is_non_zero ());
9846+ let rewards_a = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
9847+ let rewards_b = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
9848+ let (expected_commission_rewards , expected_pool_rewards ) =
9849+ calculate_staker_btc_pool_rewards_v2 (
9850+ pool_balance : delegation_amount ,
9851+ : commission ,
9852+ staking_contract : system . staking. address,
9853+ minting_curve_contract : system . minting_curve. address,
9854+ token_address : token_a . contract_address (),
9855+ );
9856+ assert! (expected_commission_rewards . is_non_zero ());
9857+ assert! (expected_pool_rewards . is_non_zero ());
9858+
9859+ assert! (staker_rewards == expected_staker_rewards + expected_commission_rewards );
9860+ assert! (rewards_a == expected_pool_rewards );
9861+ assert! (rewards_b . is_zero ());
9862+
9863+ system . start_consensus_rewards ();
9864+ system . update_rewards (: staker , disable_rewards : false );
9865+ system . advance_epoch ();
9866+ let staker_rewards = system . staker_claim_rewards (: staker );
9867+ let rewards_a = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
9868+ let rewards_b = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
9869+
9870+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_with_balances_v3 (
9871+ amount_own : stake_amount ,
9872+ pool_amount : Zero :: zero (),
9873+ : commission ,
9874+ staking_contract : system . staking. address,
9875+ minting_curve_contract : system . minting_curve. address,
9876+ );
9877+ assert! (expected_staker_rewards . is_non_zero ());
9878+ let (expected_commission_rewards , expected_pool_rewards ) =
9879+ calculate_staker_btc_pool_rewards_v3 (
9880+ normalized_pool_balance : NormalizedAmountTrait :: from_native_amount (
9881+ amount : delegation_amount , decimals : TEST_BTC_DECIMALS ,
9882+ ),
9883+ normalized_staker_total_btc_balance : NormalizedAmountTrait :: from_native_amount (
9884+ amount : delegation_amount , decimals : TEST_BTC_DECIMALS ,
9885+ ),
9886+ : commission ,
9887+ staking_contract : system . staking. address,
9888+ minting_curve_contract : system . minting_curve. address,
9889+ token_address : token_a . contract_address (),
9890+ );
9891+ assert! (expected_commission_rewards . is_non_zero ());
9892+ assert! (expected_pool_rewards . is_non_zero ());
9893+
9894+ assert! (staker_rewards == expected_staker_rewards + expected_commission_rewards );
9895+ assert! (rewards_a == expected_pool_rewards );
9896+ assert! (rewards_b . is_zero ());
9897+ }
9898+ }
0 commit comments