Skip to content

Commit 7f4eda4

Browse files
add get_stakers btc and strk delegations flow
1 parent 599fcf5 commit 7f4eda4

File tree

2 files changed

+118
-2
lines changed

2 files changed

+118
-2
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-
- Delegate STRK and/or BTC, get stakers.
43
- Undelegate, get stakers.
54
- Enable / disable tokens, get stakers.
65
- Stake, get stakers, increase stake, get stakers.

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

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ use staking::flow_test::utils::{
77
SystemTrait, TokenHelperTrait, test_flow_local,
88
};
99
use staking::pool::pool::Pool;
10+
use staking::pool::pool::Pool::STRK_CONFIG;
1011
use staking::pool::utils::compute_rewards_rounded_down;
1112
use staking::staking::interface::{IStakingConsensusDispatcherTrait, IStakingDispatcherTrait};
12-
use staking::staking::utils::STRK_WEIGHT_FACTOR;
13+
use staking::staking::utils::{BTC_WEIGHT_FACTOR, STRK_WEIGHT_FACTOR};
1314
use staking::test_utils::constants::{
1415
BTC_18D_CONFIG, BTC_5D_CONFIG, BTC_8D_CONFIG, PUBLIC_KEY, STRK_BASE_VALUE,
1516
TEST_MIN_BTC_FOR_REWARDS,
@@ -21,6 +22,7 @@ use staking::test_utils::{
2122
custom_decimals_token, deploy_mock_erc20_decimals_contract,
2223
};
2324
use starkware_utils::math::abs::wide_abs_diff;
25+
use starkware_utils::math::utils::mul_wide_and_div;
2426
use starkware_utils::time::time::Time;
2527
use starkware_utils_testing::test_utils::cheat_caller_address_once;
2628
use crate::types::Amount;
@@ -1994,3 +1996,118 @@ fn get_stakers_staker_exit_action_flow_test() {
19941996
let expected_stakers = array![].span();
19951997
assert!(stakers == expected_stakers);
19961998
}
1999+
2000+
/// FLow:
2001+
/// Staker 1 stake
2002+
/// Staker 2 stake
2003+
/// Advance K epochs
2004+
/// Test get_stakers
2005+
/// Delegate STRK to staker 1
2006+
/// Test get_stakers
2007+
/// Advance epoch
2008+
/// Delegate BTC to staker 2
2009+
/// Test get_stakers
2010+
/// Advance epoch
2011+
/// Test get_stakers
2012+
/// Advance epoch
2013+
/// Test get_stakers
2014+
#[test]
2015+
fn get_stakers_delegation_flow_test() {
2016+
let cfg: StakingInitConfig = Default::default();
2017+
let mut system = SystemConfigTrait::basic_stake_flow_cfg(:cfg).deploy();
2018+
let stake_amount = system.staking.get_min_stake();
2019+
let strk_delegation_amount = STRK_CONFIG.min_for_rewards;
2020+
let btc_delegation_amount = TEST_MIN_BTC_FOR_REWARDS;
2021+
let staker_1 = system.new_staker(amount: stake_amount);
2022+
let staker_2 = system.new_staker(amount: stake_amount);
2023+
let staking = system.staking.dispatcher();
2024+
let staking_consensus = system.staking.consensus_dispatcher();
2025+
system.stake(staker: staker_1, amount: stake_amount, pool_enabled: true, commission: 200);
2026+
let strk_pool = system.staking.get_pool(staker: staker_1);
2027+
system.stake(staker: staker_2, amount: stake_amount, pool_enabled: false, commission: 200);
2028+
system.set_commission(staker: staker_2, commission: 200);
2029+
let btc_pool = system
2030+
.set_open_for_delegation(
2031+
staker: staker_2, token_address: system.btc_token.contract_address(),
2032+
);
2033+
system.advance_k_epochs();
2034+
2035+
// Test get_stakers
2036+
let epoch_id = staking.get_current_epoch();
2037+
let stakers = staking_consensus.get_stakers(:epoch_id);
2038+
let expected_stakers = array![
2039+
(staker_1.staker.address, STRK_WEIGHT_FACTOR / 2, Option::None),
2040+
(staker_2.staker.address, STRK_WEIGHT_FACTOR / 2, Option::None),
2041+
]
2042+
.span();
2043+
assert!(stakers == expected_stakers);
2044+
2045+
// Delegate STRK
2046+
let delegator = system.new_delegator(amount: strk_delegation_amount);
2047+
system.delegate(:delegator, pool: strk_pool, amount: strk_delegation_amount);
2048+
2049+
// Test get_stakers
2050+
let stakers = staking_consensus.get_stakers(:epoch_id);
2051+
assert!(stakers == expected_stakers);
2052+
2053+
// Test next epoch.
2054+
let stakers = staking_consensus.get_stakers(epoch_id: epoch_id + 1);
2055+
assert!(stakers == expected_stakers);
2056+
2057+
// Advance epoch and delegate BTC
2058+
system.advance_epoch();
2059+
let btc_delegator = system
2060+
.new_btc_delegator(amount: btc_delegation_amount, token: system.btc_token);
2061+
system
2062+
.delegate_btc(
2063+
delegator: btc_delegator,
2064+
pool: btc_pool,
2065+
amount: btc_delegation_amount,
2066+
token: system.btc_token,
2067+
);
2068+
2069+
// Test get_stakers
2070+
let epoch_id = staking.get_current_epoch();
2071+
let stakers = staking_consensus.get_stakers(:epoch_id);
2072+
assert!(stakers == expected_stakers);
2073+
2074+
// Test next epoch.
2075+
let stakers = staking_consensus.get_stakers(epoch_id: epoch_id + 1);
2076+
let staker_1_strk_staking_power = mul_wide_and_div(
2077+
lhs: STRK_WEIGHT_FACTOR,
2078+
rhs: stake_amount + strk_delegation_amount,
2079+
div: stake_amount * 2 + strk_delegation_amount,
2080+
)
2081+
.unwrap();
2082+
let staker_2_strk_staking_power = mul_wide_and_div(
2083+
lhs: STRK_WEIGHT_FACTOR, rhs: stake_amount, div: stake_amount * 2 + strk_delegation_amount,
2084+
)
2085+
.unwrap();
2086+
let expected_stakers = array![
2087+
(staker_1.staker.address, staker_1_strk_staking_power, Option::None),
2088+
(staker_2.staker.address, staker_2_strk_staking_power, Option::None),
2089+
]
2090+
.span();
2091+
assert!(stakers == expected_stakers);
2092+
2093+
// Advance epoch and test get_stakers
2094+
system.advance_epoch();
2095+
let epoch_id = staking.get_current_epoch();
2096+
let stakers = staking_consensus.get_stakers(:epoch_id);
2097+
assert!(stakers == expected_stakers);
2098+
2099+
// Test next epoch.
2100+
let stakers = staking_consensus.get_stakers(epoch_id: epoch_id + 1);
2101+
let expected_stakers = array![
2102+
(staker_1.staker.address, staker_1_strk_staking_power, Option::None),
2103+
(staker_2.staker.address, staker_2_strk_staking_power + BTC_WEIGHT_FACTOR, Option::None),
2104+
]
2105+
.span();
2106+
assert!(stakers == expected_stakers);
2107+
2108+
// Advance epoch and test get_stakers
2109+
system.advance_epoch();
2110+
let epoch_id = staking.get_current_epoch();
2111+
let stakers = staking_consensus.get_stakers(:epoch_id);
2112+
assert!(stakers == expected_stakers);
2113+
}

0 commit comments

Comments
 (0)