@@ -2473,3 +2473,120 @@ fn get_stakers_increase_stake_flow_test() {
24732473 . span ();
24742474 assert! (stakers == expected_stakers );
24752475}
2476+
2477+ /// Flow:
2478+ /// 2 Stakers stake.
2479+ /// Delegate to staker 1.
2480+ /// Test get_stakers.
2481+ /// Delegator full intent.
2482+ /// Test get_stakers.
2483+ /// Delegator switch half of delegation to staker 2.
2484+ /// Test get_stakers.
2485+ /// Delegator switch rest of delegation to staker 2.
2486+ /// Test get_stakers.
2487+ #[test]
2488+ fn get_stakers_switch_delegation_flow_test () {
2489+ let cfg : StakingInitConfig = Default :: default ();
2490+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
2491+ let stake_amount = system . staking. get_min_stake ();
2492+ let staking_consensus = system . staking. consensus_dispatcher ();
2493+ let staker_1 = system . new_staker (amount : stake_amount );
2494+ let staker_2 = system . new_staker (amount : stake_amount );
2495+ system . stake (staker : staker_1 , amount : stake_amount , pool_enabled : true , commission : 200 );
2496+ system . stake (staker : staker_2 , amount : stake_amount , pool_enabled : true , commission : 200 );
2497+ let staker_1_pool = system . staking. get_pool (staker : staker_1 );
2498+ let staker_2_pool = system . staking. get_pool (staker : staker_2 );
2499+
2500+ // Create delegator and delegate to staker 1.
2501+ let delegator = system . new_delegator (amount : stake_amount );
2502+ system . delegate (delegator : delegator , pool : staker_1_pool , amount : stake_amount );
2503+ system . advance_k_epochs ();
2504+
2505+ // Test get_stakers
2506+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2507+ let expected_stakers = array! [
2508+ (staker_1 . staker. address, STRK_WEIGHT_FACTOR * 2 / 3 , Option :: None ),
2509+ (staker_2 . staker. address, STRK_WEIGHT_FACTOR / 3 , Option :: None ),
2510+ ]
2511+ . span ();
2512+ assert! (stakers == expected_stakers );
2513+
2514+ // Delegator exit intent.
2515+ system . delegator_exit_intent (: delegator , pool : staker_1_pool , amount : stake_amount );
2516+
2517+ // Test same epoch.
2518+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2519+ assert! (stakers == expected_stakers );
2520+
2521+ // Test after K epochs.
2522+ system . advance_k_epochs ();
2523+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2524+ let expected_stakers = array! [
2525+ (staker_1 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2526+ (staker_2 . staker. address, STRK_WEIGHT_FACTOR / 2 , Option :: None ),
2527+ ]
2528+ . span ();
2529+ assert! (stakers == expected_stakers );
2530+
2531+ // Switch delegation pool (half of delegation).
2532+ system . advance_exit_wait_window ();
2533+ system
2534+ . switch_delegation_pool (
2535+ : delegator ,
2536+ from_pool : staker_1_pool ,
2537+ to_staker : staker_2 . staker. address,
2538+ to_pool : staker_2_pool ,
2539+ amount : stake_amount / 2 ,
2540+ );
2541+
2542+ // Test same epoch.
2543+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2544+ assert! (stakers == expected_stakers );
2545+
2546+ // Test after K epochs.
2547+ system . advance_k_epochs ();
2548+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2549+ let expected_stakers = array! [
2550+ (
2551+ staker_1 . staker. address,
2552+ mul_wide_and_div (lhs : STRK_WEIGHT_FACTOR , rhs : stake_amount , div : stake_amount * 5 / 2 )
2553+ . unwrap (),
2554+ Option :: None ,
2555+ ),
2556+ (
2557+ staker_2 . staker. address,
2558+ mul_wide_and_div (
2559+ lhs : STRK_WEIGHT_FACTOR , rhs : stake_amount * 3 / 2 , div : stake_amount * 5 / 2 ,
2560+ )
2561+ . unwrap (),
2562+ Option :: None ,
2563+ ),
2564+ ]
2565+ . span ();
2566+ assert! (stakers == expected_stakers );
2567+
2568+ // Switch rest of delegation to staker 2.
2569+ system
2570+ . switch_delegation_pool (
2571+ : delegator ,
2572+ from_pool : staker_1_pool ,
2573+ to_staker : staker_2 . staker. address,
2574+ to_pool : staker_2_pool ,
2575+ amount : stake_amount / 2 ,
2576+ );
2577+
2578+ // Test same epoch.
2579+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2580+ assert! (stakers == expected_stakers );
2581+
2582+ // Test after K epochs.
2583+ system . advance_k_epochs ();
2584+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2585+ let expected_stakers = array! [
2586+ (staker_1 . staker. address, STRK_WEIGHT_FACTOR / 3 , Option :: None ),
2587+ (staker_2 . staker. address, STRK_WEIGHT_FACTOR * 2 / 3 , Option :: None ),
2588+ ]
2589+ . span ();
2590+ assert! (stakers == expected_stakers );
2591+ }
2592+
0 commit comments