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