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