@@ -35,7 +35,8 @@ 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_v1,
38+ calculate_staker_btc_pool_rewards_v3, calculate_staker_strk_rewards_v2,
39+ calculate_staker_strk_rewards_with_balances_v3, calculate_strk_pool_rewards_v1,
3940 calculate_strk_pool_rewards_v2, calculate_strk_pool_rewards_with_pool_balance_v2,
4041 compute_rewards_per_unit, declare_pool_contract, declare_pool_eic_contract,
4142 declare_staking_contract, load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0,
@@ -7915,3 +7916,153 @@ pub(crate) impl DelegatorRewardsMigrationSecondRegularCaseFlowImpl of MultiVersi
79157916 assert_eq! (actual_rewards , expected_rewards );
79167917 }
79177918}
7919+
7920+ /// Flow:
7921+ /// Add tokens A and B
7922+ /// Delegate for both tokens
7923+ /// Enable token A, disable token B
7924+ /// Advance epoch
7925+ /// Upgrade - test views and rewards
7926+ /// Start consensus rewards - test rewards
7927+ #[derive(Drop , Copy )]
7928+ pub (crate ) struct EnableDisableTokenBeforeAfterUpgradeFlow {
7929+ pub (crate ) token_a : Option <Token >,
7930+ pub (crate ) token_b : Option <Token >,
7931+ pub (crate ) staker : Option <Staker >,
7932+ pub (crate ) pool_a : Option <ContractAddress >,
7933+ pub (crate ) pool_b : Option <ContractAddress >,
7934+ pub (crate ) delegator_a : Option <Delegator >,
7935+ pub (crate ) delegator_b : Option <Delegator >,
7936+ pub (crate ) delegation_amount : Option <Amount >,
7937+ }
7938+ pub (crate ) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait <
7939+ EnableDisableTokenBeforeAfterUpgradeFlow ,
7940+ > {
7941+ fn setup_v2 (ref self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
7942+ let token_a = system . deploy_new_btc_token (name : " TOKEN_A" , decimals : TEST_BTC_DECIMALS );
7943+ let token_b = system . deploy_new_btc_token (name : " TOKEN_B" , decimals : TEST_BTC_DECIMALS );
7944+ system . staking. add_token (token_address : token_a . contract_address ());
7945+ system . staking. add_token (token_address : token_b . contract_address ());
7946+ system . staking. enable_token (token_address : token_b . contract_address ());
7947+
7948+ let stake_amount = system . staking. get_min_stake ();
7949+ let delegation_amount = TEST_MIN_BTC_FOR_REWARDS ;
7950+ let staker = system . new_staker (amount : stake_amount );
7951+ system . stake (: staker , amount : stake_amount , pool_enabled : true , commission : 200 );
7952+ let pool_a = system
7953+ . set_open_for_delegation (: staker , token_address : token_a . contract_address ());
7954+ let pool_b = system
7955+ . set_open_for_delegation (: staker , token_address : token_b . contract_address ());
7956+ let delegator_a = system . new_btc_delegator (amount : delegation_amount , token : token_a );
7957+ let delegator_b = system . new_btc_delegator (amount : delegation_amount , token : token_b );
7958+ system
7959+ . delegate_btc (
7960+ delegator : delegator_a , pool : pool_a , amount : delegation_amount , token : token_a ,
7961+ );
7962+ system
7963+ . delegate_btc (
7964+ delegator : delegator_b , pool : pool_b , amount : delegation_amount , token : token_b ,
7965+ );
7966+
7967+ system . advance_epoch ();
7968+ system . staking. disable_token (token_address : token_b . contract_address ());
7969+ system . staking. enable_token (token_address : token_a . contract_address ());
7970+
7971+ system . advance_epoch ();
7972+ system . set_staker_for_migration (staker_address : staker . staker. address);
7973+ self . token_a = Option :: Some (token_a );
7974+ self . token_b = Option :: Some (token_b );
7975+ self . staker = Option :: Some (staker );
7976+ self . pool_a = Option :: Some (pool_a );
7977+ self . pool_b = Option :: Some (pool_b );
7978+ self . delegator_a = Option :: Some (delegator_a );
7979+ self . delegator_b = Option :: Some (delegator_b );
7980+ self . delegation_amount = Option :: Some (delegation_amount );
7981+ }
7982+
7983+ fn test (self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
7984+ let token_a = self . token_a. unwrap ();
7985+ let token_b = self . token_b. unwrap ();
7986+ let staker = self . staker. unwrap ();
7987+ let pool_a = self . pool_a. unwrap ();
7988+ let pool_b = self . pool_b. unwrap ();
7989+ let delegator_a = self . delegator_a. unwrap ();
7990+ let delegator_b = self . delegator_b. unwrap ();
7991+ let delegation_amount = self . delegation_amount. unwrap ();
7992+ let staker_info = system . staker_info_v1 (: staker );
7993+ let commission = staker_info . pool_info. unwrap (). commission;
7994+ let stake_amount = staker_info . amount_own;
7995+
7996+ // Test get_tokens view.
7997+ let tokens = system . staking. dispatcher (). get_tokens ();
7998+ let expected_tokens = array! [
7999+ (STRK_TOKEN_ADDRESS , true ), (system . btc_token. contract_address (), true ),
8000+ (token_a . contract_address (), true ), (token_b . contract_address (), false ),
8001+ ]
8002+ . span ();
8003+ assert! (tokens == expected_tokens );
8004+
8005+ // Test rewards - only token A.
8006+ system . advance_block_into_attestation_window (: staker );
8007+ system . attest (: staker );
8008+ system . advance_epoch ();
8009+ let staker_rewards = system . staker_claim_rewards (: staker );
8010+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_v2 (
8011+ : staker_info ,
8012+ staking_contract : system . staking. address,
8013+ minting_curve_contract : system . minting_curve. address,
8014+ );
8015+ assert! (expected_staker_rewards . is_non_zero ());
8016+ let rewards_a = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
8017+ let rewards_b = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
8018+ let (expected_commission_rewards , expected_pool_rewards ) =
8019+ calculate_staker_btc_pool_rewards_v2 (
8020+ pool_balance : delegation_amount ,
8021+ : commission ,
8022+ staking_contract : system . staking. address,
8023+ minting_curve_contract : system . minting_curve. address,
8024+ token_address : token_a . contract_address (),
8025+ );
8026+ assert! (expected_commission_rewards . is_non_zero ());
8027+ assert! (expected_pool_rewards . is_non_zero ());
8028+
8029+ assert! (staker_rewards == expected_staker_rewards + expected_commission_rewards );
8030+ assert! (rewards_a == expected_pool_rewards );
8031+ assert! (rewards_b . is_zero ());
8032+
8033+ system . start_consensus_rewards ();
8034+ system . update_rewards (: staker , disable_rewards : false );
8035+ system . advance_epoch ();
8036+ let staker_rewards = system . staker_claim_rewards (: staker );
8037+ let rewards_a = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
8038+ let rewards_b = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
8039+
8040+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_with_balances_v3 (
8041+ amount_own : stake_amount ,
8042+ pool_amount : Zero :: zero (),
8043+ : commission ,
8044+ staking_contract : system . staking. address,
8045+ minting_curve_contract : system . minting_curve. address,
8046+ );
8047+ assert! (expected_staker_rewards . is_non_zero ());
8048+ let (expected_commission_rewards , expected_pool_rewards ) =
8049+ calculate_staker_btc_pool_rewards_v3 (
8050+ normalized_pool_balance : NormalizedAmountTrait :: from_native_amount (
8051+ amount : delegation_amount , decimals : TEST_BTC_DECIMALS ,
8052+ ),
8053+ normalized_staker_total_btc_balance : NormalizedAmountTrait :: from_native_amount (
8054+ amount : delegation_amount , decimals : TEST_BTC_DECIMALS ,
8055+ ),
8056+ : commission ,
8057+ staking_contract : system . staking. address,
8058+ minting_curve_contract : system . minting_curve. address,
8059+ token_address : token_a . contract_address (),
8060+ );
8061+ assert! (expected_commission_rewards . is_non_zero ());
8062+ assert! (expected_pool_rewards . is_non_zero ());
8063+
8064+ assert! (staker_rewards == expected_staker_rewards + expected_commission_rewards );
8065+ assert! (rewards_a == expected_pool_rewards );
8066+ assert! (rewards_b . is_zero ());
8067+ }
8068+ }
0 commit comments