@@ -2093,3 +2093,152 @@ 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 intent partial amount
2104+ /// Test get_stakers next few epochs
2105+ /// Delegator undelegate action
2106+ /// Test get_stakers next few epochs
2107+ /// Delegator undelegate intent full amount
2108+ /// Test get_stakers next few epochs
2109+ /// Delegator undelegate action
2110+ /// Test get_stakers next few epochs
2111+ #[test]
2112+ fn get_stakers_delegation_undelegation_flow_test () {
2113+ let cfg : StakingInitConfig = Default :: default ();
2114+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
2115+ let stake_amount = system . staking. get_min_stake ();
2116+ let strk_delegation_amount = STRK_CONFIG . min_for_rewards * 3 ;
2117+ let staker_1 = system . new_staker (amount : stake_amount );
2118+ let staker_2 = system . new_staker (amount : stake_amount );
2119+ let delegator = system . new_delegator (amount : strk_delegation_amount );
2120+ let staking_consensus = system . staking. consensus_dispatcher ();
2121+
2122+ // Stake and delegate
2123+ system . stake (staker : staker_1 , amount : stake_amount , pool_enabled : true , commission : 200 );
2124+ system . stake (staker : staker_2 , amount : stake_amount , pool_enabled : false , commission : 200 );
2125+ let strk_pool = system . staking. get_pool (staker : staker_1 );
2126+ system . advance_k_epochs ();
2127+ system . delegate (: delegator , pool : strk_pool , amount : strk_delegation_amount );
2128+
2129+ // Test current epoch.
2130+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2131+ let expected_stakers = array! [
2132+ (staker_1 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2133+ (staker_2 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2134+ ]
2135+ . span ();
2136+ assert! (stakers == expected_stakers );
2137+
2138+ // Test after K epochs.
2139+ system . advance_k_epochs ();
2140+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2141+ let expected_stakers = array! [
2142+ (
2143+ staker_1 . staker. address,
2144+ mul_wide_and_div (
2145+ lhs : STRK_WEIGHT_FACTOR ,
2146+ rhs : stake_amount + strk_delegation_amount ,
2147+ div : stake_amount * 2 + strk_delegation_amount ,
2148+ )
2149+ . unwrap (),
2150+ Option :: None ,
2151+ ),
2152+ (
2153+ staker_2 . staker. address,
2154+ mul_wide_and_div (
2155+ lhs : STRK_WEIGHT_FACTOR ,
2156+ rhs : stake_amount ,
2157+ div : stake_amount * 2 + strk_delegation_amount ,
2158+ )
2159+ . unwrap (),
2160+ Option :: None ,
2161+ ),
2162+ ]
2163+ . span ();
2164+ assert! (stakers == expected_stakers );
2165+
2166+ // Undelegate partial amount
2167+ system . delegator_exit_intent (: delegator , pool : strk_pool , amount : strk_delegation_amount / 3 );
2168+
2169+ // Test current epoch.
2170+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2171+ assert! (stakers == expected_stakers );
2172+
2173+ // Test after K epochs.
2174+ system . advance_k_epochs ();
2175+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2176+ let expected_stakers = array! [
2177+ (
2178+ staker_1 . staker. address,
2179+ mul_wide_and_div (
2180+ lhs : STRK_WEIGHT_FACTOR ,
2181+ rhs : stake_amount + strk_delegation_amount * 2 / 3 ,
2182+ div : stake_amount * 2 + strk_delegation_amount * 2 / 3 ,
2183+ )
2184+ . unwrap (),
2185+ Option :: None ,
2186+ ),
2187+ (
2188+ staker_2 . staker. address,
2189+ mul_wide_and_div (
2190+ lhs : STRK_WEIGHT_FACTOR ,
2191+ rhs : stake_amount ,
2192+ div : stake_amount * 2 + strk_delegation_amount * 2 / 3 ,
2193+ )
2194+ . unwrap (),
2195+ Option :: None ,
2196+ ),
2197+ ]
2198+ . span ();
2199+ assert! (stakers == expected_stakers );
2200+
2201+ // Undelegate action
2202+ system . advance_exit_wait_window ();
2203+ system . delegator_exit_action (: delegator , pool : strk_pool );
2204+
2205+ // Test current epoch.
2206+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2207+ assert! (stakers == expected_stakers );
2208+
2209+ // Test after K epochs.
2210+ system . advance_k_epochs ();
2211+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2212+ assert! (stakers == expected_stakers );
2213+
2214+ // Undelegate full amount
2215+ system
2216+ . delegator_exit_intent (: delegator , pool : strk_pool , amount : strk_delegation_amount * 2 / 3 );
2217+
2218+ // Test current epoch.
2219+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2220+ assert! (stakers == expected_stakers );
2221+
2222+ // Test after K epochs.
2223+ system . advance_k_epochs ();
2224+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2225+ let expected_stakers = array! [
2226+ (staker_1 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2227+ (staker_2 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2228+ ]
2229+ . span ();
2230+ assert! (stakers == expected_stakers );
2231+
2232+ // Undelegate action
2233+ system . advance_exit_wait_window ();
2234+ system . delegator_exit_action (: delegator , pool : strk_pool );
2235+
2236+ // Test current epoch.
2237+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2238+ assert! (stakers == expected_stakers );
2239+
2240+ // Test after K epochs.
2241+ system . advance_k_epochs ();
2242+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2243+ assert! (stakers == expected_stakers );
2244+ }
0 commit comments