@@ -35,11 +35,11 @@ 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_v2 ,
39- calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit ,
40- declare_pool_contract, declare_pool_eic_contract, declare_staking_contract ,
41- load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0, to_amount_18_decimals ,
42- upgrade_implementation,
38+ calculate_staker_strk_rewards_v2, calculate_strk_pool_rewards_v1 ,
39+ calculate_strk_pool_rewards_v2, calculate_strk_pool_rewards_with_pool_balance_v2 ,
40+ compute_rewards_per_unit, declare_pool_contract, declare_pool_eic_contract ,
41+ declare_staking_contract, load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0,
42+ to_amount_18_decimals, upgrade_implementation,
4343};
4444use staking :: types :: {Amount , Commission };
4545use starknet :: {ClassHash , ContractAddress , Store };
@@ -7063,3 +7063,282 @@ pub(crate) impl GetStakersAfterUpgradeFlowImpl of FlowTrait<GetStakersAfterUpgra
70637063 assert! (stakers == expected_stakers );
70647064 }
70657065}
7066+
7067+ /// Flow:
7068+ /// Delegator enter in V0
7069+ /// Attest in V1 (pool gets rewards)
7070+ /// Delegator change balance in V1
7071+ /// Attest in V1 (pool gets rewards)
7072+ /// Attest in V3 (pool gets rewards)
7073+ /// Delegator change balance in V3
7074+ /// Attest in V3 (pool gets rewards)
7075+ /// Test delegator rewards
7076+ #[derive(Drop , Copy )]
7077+ pub (crate ) struct DelegatorChangeBalanceOverVersionsFlow {
7078+ pub (crate ) staker : Option <Staker >,
7079+ pub (crate ) pool : Option <ContractAddress >,
7080+ pub (crate ) delegator : Option <Delegator >,
7081+ pub (crate ) expected_rewards : Option <Amount >,
7082+ }
7083+ pub (crate ) impl DelegatorChangeBalanceOverVersionsFlowImpl of FlowTrait <
7084+ DelegatorChangeBalanceOverVersionsFlow ,
7085+ > {
7086+ fn setup (ref self : DelegatorChangeBalanceOverVersionsFlow , ref system : SystemState ) {
7087+ let amount = system . staking. get_min_stake ();
7088+ let staker = system . new_staker (: amount );
7089+ let commission = 200 ;
7090+ system . stake (: staker , : amount , pool_enabled : true , : commission );
7091+ let pool = system . staking. get_pool (: staker );
7092+ let delegator = system . new_delegator (: amount );
7093+ system . delegate (: delegator , : pool , : amount );
7094+ self . staker = Option :: Some (staker );
7095+ self . pool = Option :: Some (pool );
7096+ self . delegator = Option :: Some (delegator );
7097+
7098+ let one_week = Time :: weeks (count : 1 );
7099+ system . advance_time (time : one_week );
7100+ system . staking. update_global_index_if_needed ();
7101+
7102+ let expected_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
7103+ self . expected_rewards = Option :: Some (expected_rewards );
7104+
7105+ system . set_pool_for_upgrade (pool_address : pool );
7106+ system . set_staker_for_migration (staker_address : staker . staker. address);
7107+ }
7108+
7109+ fn setup_v1 (ref self : DelegatorChangeBalanceOverVersionsFlow , ref system : SystemState ) {
7110+ let staker = self . staker. unwrap ();
7111+ let delegator = self . delegator. unwrap ();
7112+ let pool = self . pool. unwrap ();
7113+
7114+ // Pool gets rewards.
7115+ system . advance_k_epochs_and_attest (: staker );
7116+ let mut expected_rewards_v1 = calculate_strk_pool_rewards_v1 (
7117+ staker_address : staker . staker. address,
7118+ staking_contract : system . staking. address,
7119+ minting_curve_contract : system . minting_curve. address,
7120+ );
7121+
7122+ // Partial delegator intent.
7123+ let delegator_amount = system . pool_member_info_v1 (: delegator , : pool ). amount;
7124+ system . delegator_exit_intent (: delegator , : pool , amount : delegator_amount / 2 );
7125+
7126+ // Pool gets rewards.
7127+ system . advance_k_epochs_and_attest (: staker );
7128+ expected_rewards_v1 +=
7129+ calculate_strk_pool_rewards_v1 (
7130+ staker_address : staker . staker. address,
7131+ staking_contract : system . staking. address,
7132+ minting_curve_contract : system . minting_curve. address,
7133+ );
7134+
7135+ let expected_rewards_v0 = self . expected_rewards. unwrap ();
7136+ self . expected_rewards = Option :: Some (expected_rewards_v0 + expected_rewards_v1 );
7137+ }
7138+
7139+ fn test (self : DelegatorChangeBalanceOverVersionsFlow , ref system : SystemState ) {
7140+ let staker = self . staker. unwrap ();
7141+ let delegator = self . delegator. unwrap ();
7142+ let pool = self . pool. unwrap ();
7143+
7144+ // Pool gets rewards.
7145+ system . advance_k_epochs_and_attest (: staker );
7146+ let mut expected_rewards_v3 = calculate_strk_pool_rewards_v2 (
7147+ staker_address : staker . staker. address,
7148+ staking_contract : system . staking. address,
7149+ minting_curve_contract : system . minting_curve. address,
7150+ );
7151+
7152+ // Zero delegator intent.
7153+ system . delegator_exit_intent (: delegator , : pool , amount : Zero :: zero ());
7154+
7155+ // Pool gets rewards.
7156+ system . advance_k_epochs_and_attest (: staker );
7157+ expected_rewards_v3 +=
7158+ calculate_strk_pool_rewards_v2 (
7159+ staker_address : staker . staker. address,
7160+ staking_contract : system . staking. address,
7161+ minting_curve_contract : system . minting_curve. address,
7162+ );
7163+
7164+ // Test rewards.
7165+ system . advance_epoch ();
7166+ let expected_rewards = self . expected_rewards. unwrap () + expected_rewards_v3 ;
7167+ assert! (
7168+ wide_abs_diff (
7169+ system . delegator_unclaimed_rewards (: delegator , : pool ), expected_rewards ,
7170+ ) < 10 ,
7171+ );
7172+ let actual_rewards = system . delegator_claim_rewards (: delegator , : pool );
7173+ let pool_balance = system . token. balance_of (account : pool );
7174+ assert! (pool_balance < 10 );
7175+ assert_eq! (wide_abs_diff (actual_rewards , expected_rewards ), pool_balance . into ());
7176+ assert_eq! (
7177+ system . token. balance_of (account : delegator . reward. address), actual_rewards . into (),
7178+ );
7179+ }
7180+ }
7181+
7182+ /// Flow:
7183+ /// Delegator enter in V0.
7184+ /// Attest in V1 (pool gets rewards).
7185+ /// Attest in V2 (pool gets rewards).
7186+ /// Attest in V3 (pool gets rewards).
7187+ /// test rewards with view function.
7188+ /// Delegator change balance in V3.
7189+ /// Attest in V3 (pool gets rewards).
7190+ /// Test delegator rewards.
7191+ #[derive(Drop , Copy )]
7192+ pub (crate ) struct DelegatorFromV0Flow {
7193+ pub (crate ) staker : Option <Staker >,
7194+ pub (crate ) pool : Option <ContractAddress >,
7195+ pub (crate ) delegator : Option <Delegator >,
7196+ pub (crate ) expected_rewards : Option <Amount >,
7197+ }
7198+ pub (crate ) impl DelegatorFromV0FlowImpl of FlowTrait <DelegatorFromV0Flow > {
7199+ fn setup (ref self : DelegatorFromV0Flow , ref system : SystemState ) {
7200+ let amount = system . staking. get_min_stake ();
7201+ let staker = system . new_staker (: amount );
7202+ let commission = 200 ;
7203+ system . stake (: staker , : amount , pool_enabled : true , : commission );
7204+ let pool = system . staking. get_pool (: staker );
7205+ let delegator = system . new_delegator (: amount );
7206+ system . delegate (: delegator , : pool , : amount );
7207+ self . staker = Option :: Some (staker );
7208+ self . pool = Option :: Some (pool );
7209+ self . delegator = Option :: Some (delegator );
7210+
7211+ let one_week = Time :: weeks (count : 1 );
7212+ system . advance_time (time : one_week );
7213+ system . staking. update_global_index_if_needed ();
7214+
7215+ let expected_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
7216+ self . expected_rewards = Option :: Some (expected_rewards );
7217+
7218+ system . set_pool_for_upgrade (pool_address : pool );
7219+ system . set_staker_for_migration (staker_address : staker . staker. address);
7220+ }
7221+
7222+ fn setup_v1 (ref self : DelegatorFromV0Flow , ref system : SystemState ) {
7223+ let staker = self . staker. unwrap ();
7224+
7225+ // Pool gets rewards.
7226+ system . advance_k_epochs_and_attest (: staker );
7227+ let expected_rewards_v1 = calculate_strk_pool_rewards_v1 (
7228+ staker_address : staker . staker. address,
7229+ staking_contract : system . staking. address,
7230+ minting_curve_contract : system . minting_curve. address,
7231+ );
7232+
7233+ let expected_rewards = self . expected_rewards. unwrap () + expected_rewards_v1 ;
7234+ self . expected_rewards = Option :: Some (expected_rewards );
7235+ }
7236+
7237+ fn test (self : DelegatorFromV0Flow , ref system : SystemState ) {
7238+ let staker = self . staker. unwrap ();
7239+ let delegator = self . delegator. unwrap ();
7240+ let pool = self . pool. unwrap ();
7241+
7242+ // Pool gets rewards.
7243+ system . advance_k_epochs_and_attest (: staker );
7244+ let expected_rewards_v3 = calculate_strk_pool_rewards_v2 (
7245+ staker_address : staker . staker. address,
7246+ staking_contract : system . staking. address,
7247+ minting_curve_contract : system . minting_curve. address,
7248+ );
7249+
7250+ // Test rewards with view function.
7251+ system . advance_epoch ();
7252+ let mut expected_rewards = self . expected_rewards. unwrap () + expected_rewards_v3 ;
7253+ let unclaimed_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
7254+ assert_eq! (unclaimed_rewards , expected_rewards );
7255+
7256+ // Delegator change balance.
7257+ let delegator_amount = system . pool_member_info_v1 (: delegator , : pool ). amount;
7258+ system . delegator_exit_intent (: delegator , : pool , amount : delegator_amount / 2 );
7259+
7260+ // Test rewards with view function.
7261+ let unclaimed_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
7262+ assert_eq! (unclaimed_rewards , expected_rewards );
7263+
7264+ // Pool gets rewards.
7265+ system . advance_k_epochs_and_attest (: staker );
7266+ expected_rewards +=
7267+ calculate_strk_pool_rewards_v2 (
7268+ staker_address : staker . staker. address,
7269+ staking_contract : system . staking. address,
7270+ minting_curve_contract : system . minting_curve. address,
7271+ );
7272+
7273+ // Test delegator rewards.
7274+ system . advance_epoch ();
7275+ let actual_rewards = system . delegator_claim_rewards (: delegator , : pool );
7276+ let pool_balance = system . token. balance_of (account : pool );
7277+ assert! (pool_balance < 10 );
7278+ assert_eq! (actual_rewards , expected_rewards );
7279+ assert_eq! (
7280+ system . token. balance_of (account : delegator . reward. address), actual_rewards . into (),
7281+ );
7282+ }
7283+ }
7284+
7285+ /// Flow:
7286+ /// Delegator enter in V0.
7287+ /// Delegator change balance in V3.
7288+ /// Attest in V3 (pool gets rewards).
7289+ /// Test delegator rewards.
7290+ #[derive(Drop , Copy )]
7291+ pub (crate ) struct DelegatorV0ChangeBalanceBeforeRewardsFlow {
7292+ pub (crate ) staker : Option <Staker >,
7293+ pub (crate ) pool : Option <ContractAddress >,
7294+ pub (crate ) delegator : Option <Delegator >,
7295+ }
7296+ pub (crate ) impl DelegatorV0ChangeBalanceBeforeRewardsFlowImpl of FlowTrait <
7297+ DelegatorV0ChangeBalanceBeforeRewardsFlow ,
7298+ > {
7299+ fn setup (ref self : DelegatorV0ChangeBalanceBeforeRewardsFlow , ref system : SystemState ) {
7300+ let amount = system . staking. get_min_stake ();
7301+ let staker = system . new_staker (: amount );
7302+ let commission = 200 ;
7303+ system . stake (: staker , : amount , pool_enabled : true , : commission );
7304+ let pool = system . staking. get_pool (: staker );
7305+ let delegator = system . new_delegator (: amount );
7306+ system . delegate (: delegator , : pool , : amount );
7307+ self . staker = Option :: Some (staker );
7308+ self . pool = Option :: Some (pool );
7309+ self . delegator = Option :: Some (delegator );
7310+
7311+ system . set_pool_for_upgrade (pool_address : pool );
7312+ system . set_staker_for_migration (staker_address : staker . staker. address);
7313+ }
7314+
7315+ fn test (self : DelegatorV0ChangeBalanceBeforeRewardsFlow , ref system : SystemState ) {
7316+ let staker = self . staker. unwrap ();
7317+ let delegator = self . delegator. unwrap ();
7318+ let pool = self . pool. unwrap ();
7319+
7320+ // Delegator change balance.
7321+ let delegator_amount = system . pool_member_info_v1 (: delegator , : pool ). amount;
7322+ system . delegator_exit_intent (: delegator , : pool , amount : delegator_amount / 2 );
7323+
7324+ // Pool gets rewards.
7325+ system . advance_k_epochs_and_attest (: staker );
7326+ let expected_rewards = calculate_strk_pool_rewards_v2 (
7327+ staker_address : staker . staker. address,
7328+ staking_contract : system . staking. address,
7329+ minting_curve_contract : system . minting_curve. address,
7330+ );
7331+
7332+ // Test delegator rewards.
7333+ system . advance_epoch ();
7334+ let unclaimed_rewards = system . delegator_unclaimed_rewards (: delegator , : pool );
7335+ let actual_rewards = system . delegator_claim_rewards (: delegator , : pool );
7336+ let pool_balance = system . token. balance_of (account : pool );
7337+ assert! (pool_balance < 10 );
7338+ assert_eq! (unclaimed_rewards , actual_rewards );
7339+ assert_eq! (actual_rewards , expected_rewards );
7340+ assert_eq! (
7341+ system . token. balance_of (account : delegator . reward. address), actual_rewards . into (),
7342+ );
7343+ }
7344+ }
0 commit comments