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