@@ -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,
@@ -9064,3 +9064,153 @@ pub(crate) impl StakerV1ChangeBalanceAttestFlowImpl of FlowTrait<StakerV1ChangeB
90649064 assert! (system . staker_claim_rewards (: staker ) == expected_rewards );
90659065 }
90669066}
9067+
9068+ /// Flow:
9069+ /// Add tokens A and B
9070+ /// Delegate for both tokens
9071+ /// Enable token A, disable token B
9072+ /// Advance epoch
9073+ /// Upgrade - test views and rewards
9074+ /// Start consensus rewards - test rewards
9075+ #[derive(Drop , Copy )]
9076+ pub (crate ) struct EnableDisableTokenBeforeAfterUpgradeFlow {
9077+ pub (crate ) token_a : Option <Token >,
9078+ pub (crate ) token_b : Option <Token >,
9079+ pub (crate ) staker : Option <Staker >,
9080+ pub (crate ) pool_a : Option <ContractAddress >,
9081+ pub (crate ) pool_b : Option <ContractAddress >,
9082+ pub (crate ) delegator_a : Option <Delegator >,
9083+ pub (crate ) delegator_b : Option <Delegator >,
9084+ pub (crate ) delegation_amount : Option <Amount >,
9085+ }
9086+ pub (crate ) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait <
9087+ EnableDisableTokenBeforeAfterUpgradeFlow ,
9088+ > {
9089+ fn setup_v2 (ref self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
9090+ let token_a = system . deploy_new_btc_token (name : " TOKEN_A" , decimals : TEST_BTC_DECIMALS );
9091+ let token_b = system . deploy_new_btc_token (name : " TOKEN_B" , decimals : TEST_BTC_DECIMALS );
9092+ system . staking. add_token (token_address : token_a . contract_address ());
9093+ system . staking. add_token (token_address : token_b . contract_address ());
9094+ system . staking. enable_token (token_address : token_b . contract_address ());
9095+
9096+ let stake_amount = system . staking. get_min_stake ();
9097+ let delegation_amount = TEST_MIN_BTC_FOR_REWARDS ;
9098+ let staker = system . new_staker (amount : stake_amount );
9099+ system . stake (: staker , amount : stake_amount , pool_enabled : true , commission : 200 );
9100+ let pool_a = system
9101+ . set_open_for_delegation (: staker , token_address : token_a . contract_address ());
9102+ let pool_b = system
9103+ . set_open_for_delegation (: staker , token_address : token_b . contract_address ());
9104+ let delegator_a = system . new_btc_delegator (amount : delegation_amount , token : token_a );
9105+ let delegator_b = system . new_btc_delegator (amount : delegation_amount , token : token_b );
9106+ system
9107+ . delegate_btc (
9108+ delegator : delegator_a , pool : pool_a , amount : delegation_amount , token : token_a ,
9109+ );
9110+ system
9111+ . delegate_btc (
9112+ delegator : delegator_b , pool : pool_b , amount : delegation_amount , token : token_b ,
9113+ );
9114+
9115+ system . advance_epoch ();
9116+ system . staking. disable_token (token_address : token_b . contract_address ());
9117+ system . staking. enable_token (token_address : token_a . contract_address ());
9118+
9119+ system . advance_epoch ();
9120+ system . set_staker_for_migration (staker_address : staker . staker. address);
9121+ self . token_a = Option :: Some (token_a );
9122+ self . token_b = Option :: Some (token_b );
9123+ self . staker = Option :: Some (staker );
9124+ self . pool_a = Option :: Some (pool_a );
9125+ self . pool_b = Option :: Some (pool_b );
9126+ self . delegator_a = Option :: Some (delegator_a );
9127+ self . delegator_b = Option :: Some (delegator_b );
9128+ self . delegation_amount = Option :: Some (delegation_amount );
9129+ }
9130+
9131+ fn test (self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
9132+ let token_a = self . token_a. unwrap ();
9133+ let token_b = self . token_b. unwrap ();
9134+ let staker = self . staker. unwrap ();
9135+ let pool_a = self . pool_a. unwrap ();
9136+ let pool_b = self . pool_b. unwrap ();
9137+ let delegator_a = self . delegator_a. unwrap ();
9138+ let delegator_b = self . delegator_b. unwrap ();
9139+ let delegation_amount = self . delegation_amount. unwrap ();
9140+ let staker_info = system . staker_info_v1 (: staker );
9141+ let commission = staker_info . pool_info. unwrap (). commission;
9142+ let stake_amount = staker_info . amount_own;
9143+
9144+ // Test get_tokens view.
9145+ let tokens = system . staking. dispatcher (). get_tokens ();
9146+ let expected_tokens = array! [
9147+ (STRK_TOKEN_ADDRESS , true ), (system . btc_token. contract_address (), true ),
9148+ (token_a . contract_address (), true ), (token_b . contract_address (), false ),
9149+ ]
9150+ . span ();
9151+ assert! (tokens == expected_tokens );
9152+
9153+ // Test rewards - only token A.
9154+ system . advance_block_into_attestation_window (: staker );
9155+ system . attest (: staker );
9156+ system . advance_epoch ();
9157+ let staker_rewards = system . staker_claim_rewards (: staker );
9158+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_v2 (
9159+ : staker_info ,
9160+ staking_contract : system . staking. address,
9161+ minting_curve_contract : system . minting_curve. address,
9162+ );
9163+ assert! (expected_staker_rewards . is_non_zero ());
9164+ let rewards_a = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
9165+ let rewards_b = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
9166+ let (expected_commission_rewards , expected_pool_rewards ) =
9167+ calculate_staker_btc_pool_rewards_v2 (
9168+ pool_balance : delegation_amount ,
9169+ : commission ,
9170+ staking_contract : system . staking. address,
9171+ minting_curve_contract : system . minting_curve. address,
9172+ token_address : token_a . contract_address (),
9173+ );
9174+ assert! (expected_commission_rewards . is_non_zero ());
9175+ assert! (expected_pool_rewards . is_non_zero ());
9176+
9177+ assert! (staker_rewards == expected_staker_rewards + expected_commission_rewards );
9178+ assert! (rewards_a == expected_pool_rewards );
9179+ assert! (rewards_b . is_zero ());
9180+
9181+ system . start_consensus_rewards ();
9182+ system . update_rewards (: staker , disable_rewards : false );
9183+ system . advance_epoch ();
9184+ let staker_rewards = system . staker_claim_rewards (: staker );
9185+ let rewards_a = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
9186+ let rewards_b = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
9187+
9188+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_with_balances_v3 (
9189+ amount_own : stake_amount ,
9190+ pool_amount : Zero :: zero (),
9191+ : commission ,
9192+ staking_contract : system . staking. address,
9193+ minting_curve_contract : system . minting_curve. address,
9194+ );
9195+ assert! (expected_staker_rewards . is_non_zero ());
9196+ let (expected_commission_rewards , expected_pool_rewards ) =
9197+ calculate_staker_btc_pool_rewards_v3 (
9198+ normalized_pool_balance : NormalizedAmountTrait :: from_native_amount (
9199+ amount : delegation_amount , decimals : TEST_BTC_DECIMALS ,
9200+ ),
9201+ normalized_staker_total_btc_balance : NormalizedAmountTrait :: from_native_amount (
9202+ amount : delegation_amount , decimals : TEST_BTC_DECIMALS ,
9203+ ),
9204+ : commission ,
9205+ staking_contract : system . staking. address,
9206+ minting_curve_contract : system . minting_curve. address,
9207+ token_address : token_a . contract_address (),
9208+ );
9209+ assert! (expected_commission_rewards . is_non_zero ());
9210+ assert! (expected_pool_rewards . is_non_zero ());
9211+
9212+ assert! (staker_rewards == expected_staker_rewards + expected_commission_rewards );
9213+ assert! (rewards_a == expected_pool_rewards );
9214+ assert! (rewards_b . is_zero ());
9215+ }
9216+ }
0 commit comments