@@ -7,9 +7,10 @@ use staking::flow_test::utils::{
77 SystemTrait , TokenHelperTrait , test_flow_local,
88};
99use staking :: pool :: pool :: Pool ;
10+ use staking :: pool :: pool :: Pool :: STRK_CONFIG ;
1011use staking :: pool :: utils :: compute_rewards_rounded_down;
1112use staking :: staking :: interface :: {IStakingConsensusDispatcherTrait , IStakingDispatcherTrait };
12- use staking :: staking :: utils :: STRK_WEIGHT_FACTOR ;
13+ use staking :: staking :: utils :: { BTC_WEIGHT_FACTOR , STRK_WEIGHT_FACTOR } ;
1314use 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};
2324use starkware_utils :: math :: abs :: wide_abs_diff;
25+ use starkware_utils :: math :: utils :: mul_wide_and_div;
2426use starkware_utils :: time :: time :: Time ;
2527use starkware_utils_testing :: test_utils :: cheat_caller_address_once;
2628use 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