@@ -22,6 +22,7 @@ use staking::pool::pool::Pool::STRK_CONFIG;
2222use staking :: pool :: utils :: compute_rewards_rounded_down;
2323use staking :: staking :: errors :: Error as StakingError ;
2424use staking :: staking :: interface :: {
25+ IStakingAttestationDispatcher , IStakingAttestationDispatcherTrait ,
2526 IStakingConsensusDispatcherTrait , IStakingConsensusSafeDispatcherTrait , IStakingDispatcherTrait ,
2627 IStakingMigrationSafeDispatcherTrait , IStakingSafeDispatcherTrait , PoolInfo , StakerInfoV1 ,
2728 StakerInfoV1Trait , StakerPoolInfoV2 ,
@@ -7141,3 +7142,111 @@ pub(crate) impl ToggleTokensBeforeAfterUpgradeFlowImpl of FlowTrait<
71417142 assert! (tokens == expected_tokens );
71427143 }
71437144}
7145+
7146+ /// Flow:
7147+ /// Add tokens A and B
7148+ /// Enable token B
7149+ /// Advance epoch
7150+ /// Enable token A, disable token B
7151+ /// Advance epoch
7152+ /// Upgrade - test views and rewards
7153+ #[derive(Drop , Copy )]
7154+ pub (crate ) struct EnableDisableTokenBeforeAfterUpgradeFlow {
7155+ pub (crate ) token_a : Option <Token >,
7156+ pub (crate ) token_b : Option <Token >,
7157+ pub (crate ) staker : Option <Staker >,
7158+ pub (crate ) pool_a : Option <ContractAddress >,
7159+ pub (crate ) pool_b : Option <ContractAddress >,
7160+ pub (crate ) delegator_a : Option <Delegator >,
7161+ pub (crate ) delegator_b : Option <Delegator >,
7162+ pub (crate ) delegation_amount : Option <Amount >,
7163+ }
7164+ pub (crate ) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait <
7165+ EnableDisableTokenBeforeAfterUpgradeFlow ,
7166+ > {
7167+ fn setup_v2 (ref self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
7168+ let token_a = system . deploy_new_btc_token (name : " TOKEN_A" , decimals : TEST_BTC_DECIMALS );
7169+ let token_b = system . deploy_new_btc_token (name : " TOKEN_B" , decimals : TEST_BTC_DECIMALS );
7170+ system . staking. add_token (token_address : token_a . contract_address ());
7171+ system . staking. add_token (token_address : token_b . contract_address ());
7172+ system . staking. enable_token (token_address : token_b . contract_address ());
7173+
7174+ let stake_amount = system . staking. get_min_stake ();
7175+ let delegation_amount = TEST_MIN_BTC_FOR_REWARDS ;
7176+ let staker = system . new_staker (amount : stake_amount );
7177+ system . stake (: staker , amount : stake_amount , pool_enabled : true , commission : 200 );
7178+ let pool_a = system
7179+ . set_open_for_delegation (: staker , token_address : token_a . contract_address ());
7180+ let pool_b = system
7181+ . set_open_for_delegation (: staker , token_address : token_b . contract_address ());
7182+ let delegator_a = system . new_btc_delegator (amount : delegation_amount , token : token_a );
7183+ let delegator_b = system . new_btc_delegator (amount : delegation_amount , token : token_b );
7184+ system
7185+ . delegate_btc (
7186+ delegator : delegator_a , pool : pool_a , amount : delegation_amount , token : token_a ,
7187+ );
7188+ system
7189+ . delegate_btc (
7190+ delegator : delegator_b , pool : pool_b , amount : delegation_amount , token : token_b ,
7191+ );
7192+
7193+ system . advance_epoch ();
7194+ system . staking. disable_token (token_address : token_b . contract_address ());
7195+ system . staking. enable_token (token_address : token_a . contract_address ());
7196+
7197+ system . advance_epoch ();
7198+ system . set_staker_for_migration (staker_address : staker . staker. address);
7199+ self . token_a = Option :: Some (token_a );
7200+ self . token_b = Option :: Some (token_b );
7201+ self . staker = Option :: Some (staker );
7202+ self . pool_a = Option :: Some (pool_a );
7203+ self . pool_b = Option :: Some (pool_b );
7204+ self . delegator_a = Option :: Some (delegator_a );
7205+ self . delegator_b = Option :: Some (delegator_b );
7206+ self . delegation_amount = Option :: Some (delegation_amount );
7207+ }
7208+
7209+ fn test (self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
7210+ let token_a = self . token_a. unwrap ();
7211+ let token_b = self . token_b. unwrap ();
7212+ let staker = self . staker. unwrap ();
7213+ let pool_a = self . pool_a. unwrap ();
7214+ let pool_b = self . pool_b. unwrap ();
7215+ let delegator_a = self . delegator_a. unwrap ();
7216+ let delegator_b = self . delegator_b. unwrap ();
7217+ let delegation_amount = self . delegation_amount. unwrap ();
7218+ let staking_attestation = IStakingAttestationDispatcher {
7219+ contract_address : system . staking. address,
7220+ };
7221+
7222+ // Test get_tokens view.
7223+ let tokens = system . staking. dispatcher (). get_tokens ();
7224+ let expected_tokens = array! [
7225+ (STRK_TOKEN_ADDRESS , true ), (system . btc_token. contract_address (), true ),
7226+ (token_a . contract_address (), true ), (token_b . contract_address (), false ),
7227+ ]
7228+ . span ();
7229+ assert! (tokens == expected_tokens );
7230+
7231+ // Test rewards - only token A.
7232+ cheat_caller_address_once (
7233+ contract_address : system . staking. address,
7234+ caller_address : system . attestation. unwrap (). address,
7235+ );
7236+ staking_attestation
7237+ . update_rewards_from_attestation_contract (staker_address : staker . staker. address);
7238+ system . advance_epoch ();
7239+ let rewards_a = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
7240+ let rewards_b = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
7241+ let (_ , expected_rewards ) = calculate_staker_btc_pool_rewards_v2 (
7242+ pool_balance : delegation_amount ,
7243+ commission : 200 ,
7244+ staking_contract : system . staking. address,
7245+ minting_curve_contract : system . minting_curve. address,
7246+ token_address : token_a . contract_address (),
7247+ );
7248+ assert! (expected_rewards . is_non_zero ());
7249+ assert! (rewards_a == expected_rewards );
7250+ assert! (rewards_b . is_zero ());
7251+ }
7252+ }
0 commit comments