Skip to content

Commit c42088b

Browse files
test: add get_stakers switch flow
1 parent 93ede53 commit c42088b

File tree

2 files changed

+117
-4
lines changed

2 files changed

+117
-4
lines changed

workspace/apps/staking/contracts/src/flow_test/flow_ideas.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
# Flow Ideas
2-
## `get_stakers`
3-
- Stake with delegation, get stakers, switch pool, get stakers.
4-
- Staker without public key.
5-
62
## `get_current_staker_info` (name is WIP)
73
- Get staker info while staker has zero balance.
84

workspace/apps/staking/contracts/src/flow_test/test.cairo

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)