Skip to content

Commit 317aefb

Browse files
test: add get stakers delegation undelegation flow
1 parent a28d60e commit 317aefb

File tree

2 files changed

+149
-1
lines changed

2 files changed

+149
-1
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Flow Ideas
22
## `get_stakers`
3-
- Undelegate, get stakers.
43
- Enable / disable tokens, get stakers.
54
- Stake, get stakers, increase stake, get stakers.
65
- Stake with delegation, get stakers, switch pool, get stakers.

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

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

Comments
 (0)