@@ -2176,3 +2176,185 @@ fn get_stakers_delegation_undelegation_flow_test() {
21762176 . span ();
21772177 assert! (stakers == expected_stakers );
21782178}
2179+
2180+ /// Flow:
2181+ /// Staker 1 stake
2182+ /// Staker 2 stake
2183+ /// Delegator delegate strk
2184+ /// Delegator delegate btc 8 decimals to staker 1
2185+ /// Delegator delegate btc 18 decimals to staker 2
2186+ /// Advance K epochs
2187+ /// Test get_stakers
2188+ /// Disable btc 8 decimals
2189+ /// Test get_stakers
2190+ /// Enable btc 8 decimals and disable btc 18 decimals
2191+ /// Test get_stakers
2192+ /// Disable both btc tokens
2193+ /// Test get_stakers
2194+ /// Enable both btc tokens
2195+ /// Test get_stakers
2196+ #[test]
2197+ fn get_stakers_enable_disable_btc_tokens_flow_test () {
2198+ let cfg : StakingInitConfig = Default :: default ();
2199+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
2200+ let stake_amount = system . staking. get_min_stake ();
2201+ let staking_consensus = system . staking. consensus_dispatcher ();
2202+ let strk_delegation_amount = STRK_CONFIG . min_for_rewards;
2203+ let btc_8d_delegation_amount = BTC_8D_CONFIG . min_for_rewards;
2204+ let btc_18d_delegation_amount = BTC_18D_CONFIG . min_for_rewards;
2205+ let staker_1 = system . new_staker (amount : stake_amount );
2206+ let staker_2 = system . new_staker (amount : stake_amount );
2207+ let strk_delegator = system . new_delegator (amount : strk_delegation_amount );
2208+
2209+ // Setup BTC tokens and delegators.
2210+ let btc_8d = system
2211+ . deploy_new_btc_token (name : " BTC 8D Token" , decimals : BTC_8D_CONFIG . decimals);
2212+ let btc_18d = system
2213+ . deploy_new_btc_token (name : " BTC 18D Token" , decimals : BTC_18D_CONFIG . decimals);
2214+ system . staking. add_token (token_address : btc_8d . contract_address ());
2215+ system . staking. add_token (token_address : btc_18d . contract_address ());
2216+ system . staking. enable_token (token_address : btc_8d . contract_address ());
2217+ system . staking. enable_token (token_address : btc_18d . contract_address ());
2218+ let btc_8d_delegator = system
2219+ . new_btc_delegator (amount : btc_8d_delegation_amount , token : btc_8d );
2220+ let btc_18d_delegator = system
2221+ . new_btc_delegator (amount : btc_18d_delegation_amount , token : btc_18d );
2222+
2223+ // Stake and delegate
2224+ system . stake (staker : staker_1 , amount : stake_amount , pool_enabled : true , commission : 200 );
2225+ system . stake (staker : staker_2 , amount : stake_amount , pool_enabled : true , commission : 200 );
2226+ let strk_pool = system . staking. get_pool (staker : staker_1 );
2227+ let btc_8d_pool = system
2228+ . set_open_for_delegation (staker : staker_1 , token_address : btc_8d . contract_address ());
2229+ let btc_18d_pool = system
2230+ . set_open_for_delegation (staker : staker_2 , token_address : btc_18d . contract_address ());
2231+ system . delegate (delegator : strk_delegator , pool : strk_pool , amount : strk_delegation_amount );
2232+ system
2233+ . delegate_btc (
2234+ delegator : btc_8d_delegator ,
2235+ pool : btc_8d_pool ,
2236+ amount : btc_8d_delegation_amount ,
2237+ token : btc_8d ,
2238+ );
2239+ system
2240+ . delegate_btc (
2241+ delegator : btc_18d_delegator ,
2242+ pool : btc_18d_pool ,
2243+ amount : btc_18d_delegation_amount ,
2244+ token : btc_18d ,
2245+ );
2246+ system . advance_k_epochs ();
2247+
2248+ // Test get_stakers
2249+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2250+ let first_staker_strk_staking_power = mul_wide_and_div (
2251+ lhs : STRK_WEIGHT_FACTOR ,
2252+ rhs : stake_amount + strk_delegation_amount ,
2253+ div : stake_amount * 2 + strk_delegation_amount ,
2254+ )
2255+ . unwrap ();
2256+ let second_staker_strk_staking_power = mul_wide_and_div (
2257+ lhs : STRK_WEIGHT_FACTOR , rhs : stake_amount , div : stake_amount * 2 + strk_delegation_amount ,
2258+ )
2259+ . unwrap ();
2260+ let expected_stakers = array! [
2261+ (
2262+ staker_1 . staker. address,
2263+ first_staker_strk_staking_power + BTC_WEIGHT_FACTOR / 2 ,
2264+ Option :: None ,
2265+ ),
2266+ (
2267+ staker_2 . staker. address,
2268+ second_staker_strk_staking_power + BTC_WEIGHT_FACTOR / 2 ,
2269+ Option :: None ,
2270+ ),
2271+ ]
2272+ . span ();
2273+ assert! (stakers == expected_stakers );
2274+
2275+ // Disable btc 8 decimals
2276+ system . staking. disable_token (token_address : btc_8d . contract_address ());
2277+
2278+ // Test same epoch.
2279+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2280+ assert! (stakers == expected_stakers );
2281+
2282+ // Test after K epochs.
2283+ system . advance_k_epochs ();
2284+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2285+ let expected_stakers = array! [
2286+ (staker_1 . staker. address, first_staker_strk_staking_power , Option :: None ),
2287+ (
2288+ staker_2 . staker. address,
2289+ second_staker_strk_staking_power + BTC_WEIGHT_FACTOR ,
2290+ Option :: None ,
2291+ ),
2292+ ]
2293+ . span ();
2294+ assert! (stakers == expected_stakers );
2295+
2296+ // Enable btc 8 decimals and disable btc 18 decimals
2297+ system . staking. enable_token (token_address : btc_8d . contract_address ());
2298+ system . staking. disable_token (token_address : btc_18d . contract_address ());
2299+
2300+ // Test same epoch.
2301+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2302+ assert! (stakers == expected_stakers );
2303+
2304+ // Test after K epochs.
2305+ system . advance_k_epochs ();
2306+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2307+ let expected_stakers = array! [
2308+ (
2309+ staker_1 . staker. address,
2310+ first_staker_strk_staking_power + BTC_WEIGHT_FACTOR ,
2311+ Option :: None ,
2312+ ),
2313+ (staker_2 . staker. address, second_staker_strk_staking_power , Option :: None ),
2314+ ]
2315+ . span ();
2316+ assert! (stakers == expected_stakers );
2317+
2318+ // Disable both btc tokens
2319+ system . staking. disable_token (token_address : btc_8d . contract_address ());
2320+
2321+ // Test same epoch.
2322+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2323+ assert! (stakers == expected_stakers );
2324+
2325+ // Test after K epochs.
2326+ system . advance_k_epochs ();
2327+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2328+ let expected_stakers = array! [
2329+ (staker_1 . staker. address, first_staker_strk_staking_power , Option :: None ),
2330+ (staker_2 . staker. address, second_staker_strk_staking_power , Option :: None ),
2331+ ]
2332+ . span ();
2333+ assert! (stakers == expected_stakers );
2334+
2335+ // Enable both btc tokens
2336+ system . staking. enable_token (token_address : btc_8d . contract_address ());
2337+ system . staking. enable_token (token_address : btc_18d . contract_address ());
2338+
2339+ // Test same epoch.
2340+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2341+ assert! (stakers == expected_stakers );
2342+
2343+ // Test after K epochs.
2344+ system . advance_k_epochs ();
2345+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2346+ let expected_stakers = array! [
2347+ (
2348+ staker_1 . staker. address,
2349+ first_staker_strk_staking_power + BTC_WEIGHT_FACTOR / 2 ,
2350+ Option :: None ,
2351+ ),
2352+ (
2353+ staker_2 . staker. address,
2354+ second_staker_strk_staking_power + BTC_WEIGHT_FACTOR / 2 ,
2355+ Option :: None ,
2356+ ),
2357+ ]
2358+ . span ();
2359+ assert! (stakers == expected_stakers );
2360+ }
0 commit comments