@@ -2111,3 +2111,91 @@ fn get_stakers_delegation_flow_test() {
21112111 let stakers = staking_consensus . get_stakers (: epoch_id );
21122112 assert! (stakers == expected_stakers );
21132113}
2114+
2115+ /// Flow:
2116+ /// Staker 1 stake
2117+ /// Staker 2 stake
2118+ /// Advance K epochs
2119+ /// Delegator delegate to staker 1
2120+ /// Test get_stakers next few epochs
2121+ /// Delegator undelegate
2122+ /// Test get_stakers next few epochs
2123+ #[test]
2124+ fn get_stakers_delegation_undelegation_flow_test () {
2125+ let cfg : StakingInitConfig = Default :: default ();
2126+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
2127+ let stake_amount = system . staking. get_min_stake ();
2128+ let strk_delegation_amount = STRK_CONFIG . min_for_rewards;
2129+ let staker_1 = system . new_staker (amount : stake_amount );
2130+ let staker_2 = system . new_staker (amount : stake_amount );
2131+ let delegator = system . new_delegator (amount : strk_delegation_amount );
2132+ let staking_consensus = system . staking. consensus_dispatcher ();
2133+
2134+ // Stake and delegate
2135+ system . stake (staker : staker_1 , amount : stake_amount , pool_enabled : true , commission : 200 );
2136+ system . stake (staker : staker_2 , amount : stake_amount , pool_enabled : false , commission : 200 );
2137+ let strk_pool = system . staking. get_pool (staker : staker_1 );
2138+ system . advance_k_epochs ();
2139+ system . delegate (: delegator , pool : strk_pool , amount : strk_delegation_amount );
2140+
2141+ // Test get_stakers
2142+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2143+ let expected_stakers = array! [
2144+ (staker_1 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2145+ (staker_2 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2146+ ]
2147+ . span ();
2148+ assert! (stakers == expected_stakers );
2149+
2150+ // Test next epoch.
2151+ system . advance_epoch ();
2152+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2153+ let expected_stakers = array! [
2154+ (staker_1 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2155+ (staker_2 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2156+ ]
2157+ . span ();
2158+ assert! (stakers == expected_stakers );
2159+
2160+ // Test next next epoch.
2161+ system . advance_epoch ();
2162+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2163+ let expected_stakers = array! [
2164+ (
2165+ staker_1 . staker. address,
2166+ STRK_WEIGHT_FACTOR
2167+ * (stake_amount + strk_delegation_amount )
2168+ / (stake_amount * 2 + strk_delegation_amount ),
2169+ Option :: None ,
2170+ ),
2171+ (
2172+ staker_2 . staker. address,
2173+ STRK_WEIGHT_FACTOR * stake_amount / (stake_amount * 2 + strk_delegation_amount ),
2174+ Option :: None ,
2175+ ),
2176+ ]
2177+ . span ();
2178+ assert! (stakers == expected_stakers );
2179+
2180+ // Undelegate
2181+ system . delegator_exit_intent (: delegator , pool : strk_pool , amount : strk_delegation_amount );
2182+
2183+ // Test get_stakers
2184+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2185+ assert! (stakers == expected_stakers );
2186+
2187+ // Test next epoch.
2188+ system . advance_epoch ();
2189+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2190+ assert! (stakers == expected_stakers );
2191+
2192+ // Test next next epoch.
2193+ system . advance_epoch ();
2194+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2195+ let expected_stakers = array! [
2196+ (staker_1 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2197+ (staker_2 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2198+ ]
2199+ . span ();
2200+ assert! (stakers == expected_stakers );
2201+ }
0 commit comments