@@ -2093,3 +2093,86 @@ fn get_stakers_delegation_flow_test() {
20932093 . span ();
20942094 assert! (stakers == expected_stakers );
20952095}
2096+
2097+ /// Flow:
2098+ /// Staker 1 stake
2099+ /// Staker 2 stake
2100+ /// Advance K epochs
2101+ /// Delegator delegate to staker 1
2102+ /// Test get_stakers next few epochs
2103+ /// Delegator undelegate
2104+ /// Test get_stakers next few epochs
2105+ #[test]
2106+ fn get_stakers_delegation_undelegation_flow_test () {
2107+ let cfg : StakingInitConfig = Default :: default ();
2108+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
2109+ let stake_amount = system . staking. get_min_stake ();
2110+ let strk_delegation_amount = STRK_CONFIG . min_for_rewards;
2111+ let staker_1 = system . new_staker (amount : stake_amount );
2112+ let staker_2 = system . new_staker (amount : stake_amount );
2113+ let delegator = system . new_delegator (amount : strk_delegation_amount );
2114+ let staking_consensus = system . staking. consensus_dispatcher ();
2115+
2116+ // Stake and delegate
2117+ system . stake (staker : staker_1 , amount : stake_amount , pool_enabled : true , commission : 200 );
2118+ system . stake (staker : staker_2 , amount : stake_amount , pool_enabled : false , commission : 200 );
2119+ let strk_pool = system . staking. get_pool (staker : staker_1 );
2120+ system . advance_k_epochs ();
2121+ system . delegate (: delegator , pool : strk_pool , amount : strk_delegation_amount );
2122+
2123+ // Test get_stakers
2124+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2125+ let expected_stakers = array! [
2126+ (staker_1 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2127+ (staker_2 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2128+ ]
2129+ . span ();
2130+ assert! (stakers == expected_stakers );
2131+
2132+ // Test next epoch.
2133+ system . advance_epoch ();
2134+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2135+ assert! (stakers == expected_stakers );
2136+
2137+ // Test next next epoch.
2138+ system . advance_epoch ();
2139+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2140+ let expected_stakers = array! [
2141+ (
2142+ staker_1 . staker. address,
2143+ STRK_WEIGHT_FACTOR
2144+ * (stake_amount + strk_delegation_amount )
2145+ / (stake_amount * 2 + strk_delegation_amount ),
2146+ Option :: None ,
2147+ ),
2148+ (
2149+ staker_2 . staker. address,
2150+ STRK_WEIGHT_FACTOR * stake_amount / (stake_amount * 2 + strk_delegation_amount ),
2151+ Option :: None ,
2152+ ),
2153+ ]
2154+ . span ();
2155+ assert! (stakers == expected_stakers );
2156+
2157+ // Undelegate
2158+ system . delegator_exit_intent (: delegator , pool : strk_pool , amount : strk_delegation_amount );
2159+
2160+ // Test get_stakers
2161+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2162+ assert! (stakers == expected_stakers );
2163+
2164+ // Test next epoch.
2165+ system . advance_epoch ();
2166+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2167+ assert! (stakers == expected_stakers );
2168+
2169+ // Test next next epoch.
2170+ system . advance_epoch ();
2171+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2172+ let expected_stakers = array! [
2173+ (staker_1 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2174+ (staker_2 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2175+ ]
2176+ . span ();
2177+ assert! (stakers == expected_stakers );
2178+ }
0 commit comments