@@ -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,
@@ -8822,3 +8822,153 @@ pub(crate) impl BalancesDelayFlowImpl of FlowTrait<BalancesDelayFlow> {
88228822 assert! (btc_delegator_rewards == expected_btc_pool_rewards );
88238823 }
88248824}
8825+
8826+ /// Flow:
8827+ /// Add tokens A and B
8828+ /// Delegate for both tokens
8829+ /// Enable token A, disable token B
8830+ /// Advance epoch
8831+ /// Upgrade - test views and rewards
8832+ /// Start consensus rewards - test rewards
8833+ #[derive(Drop , Copy )]
8834+ pub (crate ) struct EnableDisableTokenBeforeAfterUpgradeFlow {
8835+ pub (crate ) token_a : Option <Token >,
8836+ pub (crate ) token_b : Option <Token >,
8837+ pub (crate ) staker : Option <Staker >,
8838+ pub (crate ) pool_a : Option <ContractAddress >,
8839+ pub (crate ) pool_b : Option <ContractAddress >,
8840+ pub (crate ) delegator_a : Option <Delegator >,
8841+ pub (crate ) delegator_b : Option <Delegator >,
8842+ pub (crate ) delegation_amount : Option <Amount >,
8843+ }
8844+ pub (crate ) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait <
8845+ EnableDisableTokenBeforeAfterUpgradeFlow ,
8846+ > {
8847+ fn setup_v2 (ref self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
8848+ let token_a = system . deploy_new_btc_token (name : " TOKEN_A" , decimals : TEST_BTC_DECIMALS );
8849+ let token_b = system . deploy_new_btc_token (name : " TOKEN_B" , decimals : TEST_BTC_DECIMALS );
8850+ system . staking. add_token (token_address : token_a . contract_address ());
8851+ system . staking. add_token (token_address : token_b . contract_address ());
8852+ system . staking. enable_token (token_address : token_b . contract_address ());
8853+
8854+ let stake_amount = system . staking. get_min_stake ();
8855+ let delegation_amount = TEST_MIN_BTC_FOR_REWARDS ;
8856+ let staker = system . new_staker (amount : stake_amount );
8857+ system . stake (: staker , amount : stake_amount , pool_enabled : true , commission : 200 );
8858+ let pool_a = system
8859+ . set_open_for_delegation (: staker , token_address : token_a . contract_address ());
8860+ let pool_b = system
8861+ . set_open_for_delegation (: staker , token_address : token_b . contract_address ());
8862+ let delegator_a = system . new_btc_delegator (amount : delegation_amount , token : token_a );
8863+ let delegator_b = system . new_btc_delegator (amount : delegation_amount , token : token_b );
8864+ system
8865+ . delegate_btc (
8866+ delegator : delegator_a , pool : pool_a , amount : delegation_amount , token : token_a ,
8867+ );
8868+ system
8869+ . delegate_btc (
8870+ delegator : delegator_b , pool : pool_b , amount : delegation_amount , token : token_b ,
8871+ );
8872+
8873+ system . advance_epoch ();
8874+ system . staking. disable_token (token_address : token_b . contract_address ());
8875+ system . staking. enable_token (token_address : token_a . contract_address ());
8876+
8877+ system . advance_epoch ();
8878+ system . set_staker_for_migration (staker_address : staker . staker. address);
8879+ self . token_a = Option :: Some (token_a );
8880+ self . token_b = Option :: Some (token_b );
8881+ self . staker = Option :: Some (staker );
8882+ self . pool_a = Option :: Some (pool_a );
8883+ self . pool_b = Option :: Some (pool_b );
8884+ self . delegator_a = Option :: Some (delegator_a );
8885+ self . delegator_b = Option :: Some (delegator_b );
8886+ self . delegation_amount = Option :: Some (delegation_amount );
8887+ }
8888+
8889+ fn test (self : EnableDisableTokenBeforeAfterUpgradeFlow , ref system : SystemState ) {
8890+ let token_a = self . token_a. unwrap ();
8891+ let token_b = self . token_b. unwrap ();
8892+ let staker = self . staker. unwrap ();
8893+ let pool_a = self . pool_a. unwrap ();
8894+ let pool_b = self . pool_b. unwrap ();
8895+ let delegator_a = self . delegator_a. unwrap ();
8896+ let delegator_b = self . delegator_b. unwrap ();
8897+ let delegation_amount = self . delegation_amount. unwrap ();
8898+ let staker_info = system . staker_info_v1 (: staker );
8899+ let commission = staker_info . pool_info. unwrap (). commission;
8900+ let stake_amount = staker_info . amount_own;
8901+
8902+ // Test get_tokens view.
8903+ let tokens = system . staking. dispatcher (). get_tokens ();
8904+ let expected_tokens = array! [
8905+ (STRK_TOKEN_ADDRESS , true ), (system . btc_token. contract_address (), true ),
8906+ (token_a . contract_address (), true ), (token_b . contract_address (), false ),
8907+ ]
8908+ . span ();
8909+ assert! (tokens == expected_tokens );
8910+
8911+ // Test rewards - only token A.
8912+ system . advance_block_into_attestation_window (: staker );
8913+ system . attest (: staker );
8914+ system . advance_epoch ();
8915+ let staker_rewards = system . staker_claim_rewards (: staker );
8916+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_v2 (
8917+ : staker_info ,
8918+ staking_contract : system . staking. address,
8919+ minting_curve_contract : system . minting_curve. address,
8920+ );
8921+ assert! (expected_staker_rewards . is_non_zero ());
8922+ let rewards_a = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
8923+ let rewards_b = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
8924+ let (expected_commission_rewards , expected_pool_rewards ) =
8925+ calculate_staker_btc_pool_rewards_v2 (
8926+ pool_balance : delegation_amount ,
8927+ : commission ,
8928+ staking_contract : system . staking. address,
8929+ minting_curve_contract : system . minting_curve. address,
8930+ token_address : token_a . contract_address (),
8931+ );
8932+ assert! (expected_commission_rewards . is_non_zero ());
8933+ assert! (expected_pool_rewards . is_non_zero ());
8934+
8935+ assert! (staker_rewards == expected_staker_rewards + expected_commission_rewards );
8936+ assert! (rewards_a == expected_pool_rewards );
8937+ assert! (rewards_b . is_zero ());
8938+
8939+ system . start_consensus_rewards ();
8940+ system . update_rewards (: staker , disable_rewards : false );
8941+ system . advance_epoch ();
8942+ let staker_rewards = system . staker_claim_rewards (: staker );
8943+ let rewards_a = system . delegator_claim_rewards (delegator : delegator_a , pool : pool_a );
8944+ let rewards_b = system . delegator_claim_rewards (delegator : delegator_b , pool : pool_b );
8945+
8946+ let (expected_staker_rewards , _ ) = calculate_staker_strk_rewards_with_balances_v3 (
8947+ amount_own : stake_amount ,
8948+ pool_amount : Zero :: zero (),
8949+ : commission ,
8950+ staking_contract : system . staking. address,
8951+ minting_curve_contract : system . minting_curve. address,
8952+ );
8953+ assert! (expected_staker_rewards . is_non_zero ());
8954+ let (expected_commission_rewards , expected_pool_rewards ) =
8955+ calculate_staker_btc_pool_rewards_v3 (
8956+ normalized_pool_balance : NormalizedAmountTrait :: from_native_amount (
8957+ amount : delegation_amount , decimals : TEST_BTC_DECIMALS ,
8958+ ),
8959+ normalized_staker_total_btc_balance : NormalizedAmountTrait :: from_native_amount (
8960+ amount : delegation_amount , decimals : TEST_BTC_DECIMALS ,
8961+ ),
8962+ : commission ,
8963+ staking_contract : system . staking. address,
8964+ minting_curve_contract : system . minting_curve. address,
8965+ token_address : token_a . contract_address (),
8966+ );
8967+ assert! (expected_commission_rewards . is_non_zero ());
8968+ assert! (expected_pool_rewards . is_non_zero ());
8969+
8970+ assert! (staker_rewards == expected_staker_rewards + expected_commission_rewards );
8971+ assert! (rewards_a == expected_pool_rewards );
8972+ assert! (rewards_b . is_zero ());
8973+ }
8974+ }
0 commit comments