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