@@ -7915,3 +7915,114 @@ pub(crate) impl DelegatorRewardsMigrationSecondRegularCaseFlowImpl of MultiVersi
79157915 assert_eq! (actual_rewards , expected_rewards );
79167916 }
79177917}
7918+
7919+ /// Flow:
7920+ /// Add tokens A and B
7921+ /// Delegate for both tokens
7922+ /// Enable token A, disable token B
7923+ /// Advance epoch
7924+ /// Upgrade - test views and rewards
7925+ #[derive(Drop , Copy )]
7926+ pub (crate ) struct EnableDisableTokenBeforeAfterUpgradeFlow {
7927+ pub (crate ) token_a : Option <Token >,
7928+ pub (crate ) token_b : Option <Token >,
7929+ pub (crate ) staker : Option <Staker >,
7930+ pub (crate ) pool_a : Option <ContractAddress >,
7931+ pub (crate ) pool_b : Option <ContractAddress >,
7932+ pub (crate ) delegator_a : Option <Delegator >,
7933+ pub (crate ) delegator_b : Option <Delegator >,
7934+ pub (crate ) delegation_amount : Option <Amount >,
7935+ }
7936+ pub (crate ) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait <
7937+ EnableDisableTokenBeforeAfterUpgradeFlow ,
7938+ > {
7939+ fn setup_v2 (ref self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
7940+ let token_a = system . deploy_new_btc_token (name : " TOKEN_A" , decimals : TEST_BTC_DECIMALS );
7941+ let token_b = system . deploy_new_btc_token (name : " TOKEN_B" , decimals : TEST_BTC_DECIMALS );
7942+ system . staking. add_token (token_address : token_a . contract_address ());
7943+ system . staking. add_token (token_address : token_b . contract_address ());
7944+ system . staking. enable_token (token_address : token_b . contract_address ());
7945+
7946+ let stake_amount = system . staking. get_min_stake ();
7947+ let delegation_amount = TEST_MIN_BTC_FOR_REWARDS ;
7948+ let staker = system . new_staker (amount : stake_amount );
7949+ system . stake (: staker , amount : stake_amount , pool_enabled : true , commission : 200 );
7950+ let pool_a = system
7951+ . set_open_for_delegation (: staker , token_address : token_a . contract_address ());
7952+ let pool_b = system
7953+ . set_open_for_delegation (: staker , token_address : token_b . contract_address ());
7954+ let delegator_a = system . new_btc_delegator (amount : delegation_amount , token : token_a );
7955+ let delegator_b = system . new_btc_delegator (amount : delegation_amount , token : token_b );
7956+ system
7957+ . delegate_btc (
7958+ delegator : delegator_a , pool : pool_a , amount : delegation_amount , token : token_a ,
7959+ );
7960+ system
7961+ . delegate_btc (
7962+ delegator : delegator_b , pool : pool_b , amount : delegation_amount , token : token_b ,
7963+ );
7964+
7965+ system . advance_epoch ();
7966+ system . staking. disable_token (token_address : token_b . contract_address ());
7967+ system . staking. enable_token (token_address : token_a . contract_address ());
7968+
7969+ system . advance_epoch ();
7970+ system . set_staker_for_migration (staker_address : staker . staker. address);
7971+ self . token_a = Option :: Some (token_a );
7972+ self . token_b = Option :: Some (token_b );
7973+ self . staker = Option :: Some (staker );
7974+ self . pool_a = Option :: Some (pool_a );
7975+ self . pool_b = Option :: Some (pool_b );
7976+ self . delegator_a = Option :: Some (delegator_a );
7977+ self . delegator_b = Option :: Some (delegator_b );
7978+ self . delegation_amount = Option :: Some (delegation_amount );
7979+ }
7980+
7981+ fn test (self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
7982+ let token_a = self . token_a. unwrap ();
7983+ let token_b = self . token_b. unwrap ();
7984+ let staker = self . staker. unwrap ();
7985+ let pool_a = self . pool_a. unwrap ();
7986+ let pool_b = self . pool_b. unwrap ();
7987+ let delegator_a = self . delegator_a. unwrap ();
7988+ let delegator_b = self . delegator_b. unwrap ();
7989+ let delegation_amount = self . delegation_amount. unwrap ();
7990+
7991+ // Test get_tokens view.
7992+ let tokens = system . staking. dispatcher (). get_tokens ();
7993+ let expected_tokens = array! [
7994+ (STRK_TOKEN_ADDRESS , true ), (system . btc_token. contract_address (), true ),
7995+ (token_a . contract_address (), true ), (token_b . contract_address (), false ),
7996+ ]
7997+ . span ();
7998+ assert! (tokens == expected_tokens );
7999+
8000+ // Test rewards - only token A.
8001+ system . advance_block_into_attestation_window (: staker );
8002+ system . attest (: staker );
8003+ system . advance_epoch ();
8004+ let staker_rewards = system . staker_claim_rewards (: staker );
8005+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_v2 (
8006+ staker_info : system . staker_info_v1 (: staker ),
8007+ staking_contract : system . staking. address,
8008+ minting_curve_contract : system . minting_curve. address,
8009+ );
8010+ assert! (expected_staker_rewards . is_non_zero ());
8011+ let rewards_a = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
8012+ let rewards_b = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
8013+ let (expected_commission_rewards , expected_pool_rewards ) =
8014+ calculate_staker_btc_pool_rewards_v2 (
8015+ pool_balance : delegation_amount ,
8016+ commission : 200 ,
8017+ staking_contract : system . staking. address,
8018+ minting_curve_contract : system . minting_curve. address,
8019+ token_address : token_a . contract_address (),
8020+ );
8021+ assert! (expected_commission_rewards . is_non_zero ());
8022+ assert! (expected_pool_rewards . is_non_zero ());
8023+
8024+ assert! (staker_rewards == expected_staker_rewards + expected_commission_rewards );
8025+ assert! (rewards_a == expected_pool_rewards );
8026+ assert! (rewards_b . is_zero ());
8027+ }
8028+ }
0 commit comments