Skip to content

Commit 6f24aa1

Browse files
test: add get_stakers switch flow
1 parent 9f9cf2c commit 6f24aa1

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
@@ -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

Comments
 (0)