@@ -2240,3 +2240,185 @@ fn get_stakers_delegation_undelegation_flow_test() {
22402240 let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
22412241 assert! (stakers == expected_stakers );
22422242}
2243+
2244+ /// Flow:
2245+ /// Staker 1 stake
2246+ /// Staker 2 stake
2247+ /// Delegator delegate strk
2248+ /// Delegator delegate btc 8 decimals to staker 1
2249+ /// Delegator delegate btc 18 decimals to staker 2
2250+ /// Advance K epochs
2251+ /// Test get_stakers
2252+ /// Disable btc 8 decimals
2253+ /// Test get_stakers
2254+ /// Enable btc 8 decimals and disable btc 18 decimals
2255+ /// Test get_stakers
2256+ /// Disable both btc tokens
2257+ /// Test get_stakers
2258+ /// Enable both btc tokens
2259+ /// Test get_stakers
2260+ #[test]
2261+ fn get_stakers_enable_disable_btc_tokens_flow_test () {
2262+ let cfg : StakingInitConfig = Default :: default ();
2263+ let mut system = SystemConfigTrait :: basic_stake_flow_cfg (: cfg ). deploy ();
2264+ let stake_amount = system . staking. get_min_stake ();
2265+ let staking_consensus = system . staking. consensus_dispatcher ();
2266+ let strk_delegation_amount = STRK_CONFIG . min_for_rewards;
2267+ let btc_8d_delegation_amount = BTC_8D_CONFIG . min_for_rewards;
2268+ let btc_18d_delegation_amount = BTC_18D_CONFIG . min_for_rewards;
2269+ let staker_1 = system . new_staker (amount : stake_amount );
2270+ let staker_2 = system . new_staker (amount : stake_amount );
2271+ let strk_delegator = system . new_delegator (amount : strk_delegation_amount );
2272+
2273+ // Setup BTC tokens and delegators.
2274+ let btc_8d = system
2275+ . deploy_new_btc_token (name : " BTC 8D Token" , decimals : BTC_8D_CONFIG . decimals);
2276+ let btc_18d = system
2277+ . deploy_new_btc_token (name : " BTC 18D Token" , decimals : BTC_18D_CONFIG . decimals);
2278+ system . staking. add_token (token_address : btc_8d . contract_address ());
2279+ system . staking. add_token (token_address : btc_18d . contract_address ());
2280+ system . staking. enable_token (token_address : btc_8d . contract_address ());
2281+ system . staking. enable_token (token_address : btc_18d . contract_address ());
2282+ let btc_8d_delegator = system
2283+ . new_btc_delegator (amount : btc_8d_delegation_amount , token : btc_8d );
2284+ let btc_18d_delegator = system
2285+ . new_btc_delegator (amount : btc_18d_delegation_amount , token : btc_18d );
2286+
2287+ // Stake and delegate
2288+ system . stake (staker : staker_1 , amount : stake_amount , pool_enabled : true , commission : 200 );
2289+ system . stake (staker : staker_2 , amount : stake_amount , pool_enabled : true , commission : 200 );
2290+ let strk_pool = system . staking. get_pool (staker : staker_1 );
2291+ let btc_8d_pool = system
2292+ . set_open_for_delegation (staker : staker_1 , token_address : btc_8d . contract_address ());
2293+ let btc_18d_pool = system
2294+ . set_open_for_delegation (staker : staker_2 , token_address : btc_18d . contract_address ());
2295+ system . delegate (delegator : strk_delegator , pool : strk_pool , amount : strk_delegation_amount );
2296+ system
2297+ . delegate_btc (
2298+ delegator : btc_8d_delegator ,
2299+ pool : btc_8d_pool ,
2300+ amount : btc_8d_delegation_amount ,
2301+ token : btc_8d ,
2302+ );
2303+ system
2304+ . delegate_btc (
2305+ delegator : btc_18d_delegator ,
2306+ pool : btc_18d_pool ,
2307+ amount : btc_18d_delegation_amount ,
2308+ token : btc_18d ,
2309+ );
2310+ system . advance_k_epochs ();
2311+
2312+ // Test get_stakers
2313+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2314+ let first_staker_strk_staking_power = mul_wide_and_div (
2315+ lhs : STRK_WEIGHT_FACTOR ,
2316+ rhs : stake_amount + strk_delegation_amount ,
2317+ div : stake_amount * 2 + strk_delegation_amount ,
2318+ )
2319+ . unwrap ();
2320+ let second_staker_strk_staking_power = mul_wide_and_div (
2321+ lhs : STRK_WEIGHT_FACTOR , rhs : stake_amount , div : stake_amount * 2 + strk_delegation_amount ,
2322+ )
2323+ . unwrap ();
2324+ let expected_stakers = array! [
2325+ (
2326+ staker_1 . staker. address,
2327+ first_staker_strk_staking_power + BTC_WEIGHT_FACTOR / 2 ,
2328+ Option :: None ,
2329+ ),
2330+ (
2331+ staker_2 . staker. address,
2332+ second_staker_strk_staking_power + BTC_WEIGHT_FACTOR / 2 ,
2333+ Option :: None ,
2334+ ),
2335+ ]
2336+ . span ();
2337+ assert! (stakers == expected_stakers );
2338+
2339+ // Disable btc 8 decimals
2340+ system . staking. disable_token (token_address : btc_8d . contract_address ());
2341+
2342+ // Test same epoch.
2343+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2344+ assert! (stakers == expected_stakers );
2345+
2346+ // Test after K epochs.
2347+ system . advance_k_epochs ();
2348+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2349+ let expected_stakers = array! [
2350+ (staker_1 . staker. address, first_staker_strk_staking_power , Option :: None ),
2351+ (
2352+ staker_2 . staker. address,
2353+ second_staker_strk_staking_power + BTC_WEIGHT_FACTOR ,
2354+ Option :: None ,
2355+ ),
2356+ ]
2357+ . span ();
2358+ assert! (stakers == expected_stakers );
2359+
2360+ // Enable btc 8 decimals and disable btc 18 decimals
2361+ system . staking. enable_token (token_address : btc_8d . contract_address ());
2362+ system . staking. disable_token (token_address : btc_18d . contract_address ());
2363+
2364+ // Test same epoch.
2365+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2366+ assert! (stakers == expected_stakers );
2367+
2368+ // Test after K epochs.
2369+ system . advance_k_epochs ();
2370+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2371+ let expected_stakers = array! [
2372+ (
2373+ staker_1 . staker. address,
2374+ first_staker_strk_staking_power + BTC_WEIGHT_FACTOR ,
2375+ Option :: None ,
2376+ ),
2377+ (staker_2 . staker. address, second_staker_strk_staking_power , Option :: None ),
2378+ ]
2379+ . span ();
2380+ assert! (stakers == expected_stakers );
2381+
2382+ // Disable both btc tokens
2383+ system . staking. disable_token (token_address : btc_8d . contract_address ());
2384+
2385+ // Test same epoch.
2386+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2387+ assert! (stakers == expected_stakers );
2388+
2389+ // Test after K epochs.
2390+ system . advance_k_epochs ();
2391+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2392+ let expected_stakers = array! [
2393+ (staker_1 . staker. address, first_staker_strk_staking_power , Option :: None ),
2394+ (staker_2 . staker. address, second_staker_strk_staking_power , Option :: None ),
2395+ ]
2396+ . span ();
2397+ assert! (stakers == expected_stakers );
2398+
2399+ // Enable both btc tokens
2400+ system . staking. enable_token (token_address : btc_8d . contract_address ());
2401+ system . staking. enable_token (token_address : btc_18d . contract_address ());
2402+
2403+ // Test same epoch.
2404+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2405+ assert! (stakers == expected_stakers );
2406+
2407+ // Test after K epochs.
2408+ system . advance_k_epochs ();
2409+ let stakers = staking_consensus . get_stakers (epoch_id : system . staking. get_current_epoch ());
2410+ let expected_stakers = array! [
2411+ (
2412+ staker_1 . staker. address,
2413+ first_staker_strk_staking_power + BTC_WEIGHT_FACTOR / 2 ,
2414+ Option :: None ,
2415+ ),
2416+ (
2417+ staker_2 . staker. address,
2418+ second_staker_strk_staking_power + BTC_WEIGHT_FACTOR / 2 ,
2419+ Option :: None ,
2420+ ),
2421+ ]
2422+ . span ();
2423+ assert! (stakers == expected_stakers );
2424+ }
0 commit comments