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