Skip to content

Commit a8d6962

Browse files
test: add disable_rewards flow
1 parent d90bd02 commit a8d6962

File tree

3 files changed

+169
-10
lines changed

3 files changed

+169
-10
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@
1616

1717
## v3 flag
1818
- update_rewards_from_attestation, update_rewards (not distribute), set_v3_epoch, update_rewards_from_attestation, update_rewards (not distribute), advance epoch to v3 epoch, update_rewards_from_attestation-panic, update_rewards-distribute, advance epoch, update_rewards_from_attestation-panic, update_rewards-distribute, advance epoch, update_rewards_from_attestation-panic, update_rewards with disable rewards-not distribute.
19-
- disable rewards with v3 off - no rewards, same block - panic
20-
- disable rewards with v3 on - no rewards, same block - panic
21-
- not disable rewards with v3 off - no rewards, same block - panic
22-
- not disable rewards with v3 on - rewards, same block - panic
2319

2420
## k=1 -> k=2 balances
2521
- staker with stake, upgrade, increase stake - before upgrade after 1 epoch, after 2 epochs (check also total stake)

src/flow_test/test.cairo

Lines changed: 141 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use core::num::traits::Zero;
22
use snforge_std::TokenImpl;
3-
use staking::constants::STRK_IN_FRIS;
3+
use staking::constants::{K, STRK_IN_FRIS};
44
use staking::flow_test::flows;
55
use staking::flow_test::utils::{
66
RewardSupplierTrait, StakingTrait, SystemConfigTrait, SystemDelegatorTrait, SystemStakerTrait,
@@ -9,22 +9,27 @@ use staking::flow_test::utils::{
99
use staking::pool::pool::Pool;
1010
use staking::pool::pool::Pool::STRK_CONFIG;
1111
use staking::pool::utils::compute_rewards_rounded_down;
12-
use staking::staking::interface::{IStakingConsensusDispatcherTrait, IStakingDispatcherTrait};
12+
use staking::staking::errors::Error as StakingError;
13+
use staking::staking::interface::{
14+
IStakingConsensusDispatcherTrait, IStakingDispatcherTrait,
15+
IStakingRewardsManagerSafeDispatcherTrait,
16+
};
1317
use staking::staking::utils::{BTC_WEIGHT_FACTOR, STAKING_POWER_BASE_VALUE, STRK_WEIGHT_FACTOR};
1418
use staking::test_utils::constants::{
1519
BTC_18D_CONFIG, BTC_5D_CONFIG, BTC_8D_CONFIG, PUBLIC_KEY, STRK_BASE_VALUE,
1620
TEST_MIN_BTC_FOR_REWARDS,
1721
};
1822
use staking::test_utils::{
1923
StakingInitConfig, calculate_staker_btc_pool_rewards_v2,
20-
calculate_staker_strk_rewards_with_balances_v2,
24+
calculate_staker_strk_rewards_with_balances_v2, calculate_staker_strk_rewards_with_balances_v3,
2125
calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit,
2226
custom_decimals_token, deploy_mock_erc20_decimals_contract,
2327
};
28+
use starkware_utils::errors::{Describable, ErrorDisplay};
2429
use starkware_utils::math::abs::wide_abs_diff;
2530
use starkware_utils::math::utils::mul_wide_and_div;
2631
use starkware_utils::time::time::Time;
27-
use starkware_utils_testing::test_utils::cheat_caller_address_once;
32+
use starkware_utils_testing::test_utils::{assert_panic_with_error, cheat_caller_address_once};
2833
use crate::types::Amount;
2934

3035
#[test]
@@ -2619,3 +2624,135 @@ fn get_stakers_staking_power_100_flow_test() {
26192624
.span();
26202625
assert!(stakers == expected_stakers);
26212626
}
2627+
2628+
/// Flow:
2629+
/// Staker stake
2630+
/// Disable rewards is true with v3 off
2631+
/// Test rewards are not distributed
2632+
/// Attempt again same epoch - panic
2633+
/// Disable rewards is false with v3 off
2634+
/// Test rewards are not distributed
2635+
/// Attempt again same epoch - panic
2636+
/// Enable consensus rewards (in 2 epochs)
2637+
/// Disable rewards is true with v3 before consensus epoch
2638+
/// Test rewards are not distributed
2639+
/// Attempt again same epoch - panic
2640+
/// Disable rewards is false with v3 before consensus epoch
2641+
/// Test rewards are not distributed
2642+
/// Attempt again same epoch - panic
2643+
/// Disable rewards is true with v3 on
2644+
/// Test rewards are not distributed
2645+
/// Attempt again same epoch - panic
2646+
/// Disable rewards is false with v3 on
2647+
/// Test rewards are distributed
2648+
/// Attempt again same epoch - panic
2649+
#[test]
2650+
#[feature("safe_dispatcher")]
2651+
fn update_rewards_disable_rewards_flow_test() {
2652+
let cfg: StakingInitConfig = Default::default();
2653+
let mut system = SystemConfigTrait::basic_stake_flow_cfg(:cfg).deploy();
2654+
let stake_amount = system.staking.get_min_stake();
2655+
let staker = system.new_staker(amount: stake_amount);
2656+
system.stake(:staker, amount: stake_amount, pool_enabled: false, commission: 200);
2657+
system.advance_k_epochs();
2658+
2659+
// Disable rewards is true with v3 off
2660+
system.update_rewards(:staker, disable_rewards: true);
2661+
// Test rewards are not distributed
2662+
let rewards = system.staker_claim_rewards(:staker);
2663+
assert!(rewards == Zero::zero());
2664+
// Attempt again same epoch - panic
2665+
let result = system
2666+
.staking
2667+
.rewards_manager_safe_dispatcher()
2668+
.update_rewards(staker_address: staker.staker.address, disable_rewards: true);
2669+
assert_panic_with_error(
2670+
:result, expected_error: StakingError::REWARDS_ALREADY_UPDATED.describe(),
2671+
);
2672+
system.advance_epoch();
2673+
2674+
// Disable rewards is false with v3 off
2675+
system.update_rewards(:staker, disable_rewards: false);
2676+
// Test rewards are not distributed
2677+
let rewards = system.staker_claim_rewards(:staker);
2678+
assert!(rewards == Zero::zero());
2679+
// Attempt again same epoch - panic
2680+
let result = system
2681+
.staking
2682+
.rewards_manager_safe_dispatcher()
2683+
.update_rewards(staker_address: staker.staker.address, disable_rewards: false);
2684+
assert_panic_with_error(
2685+
:result, expected_error: StakingError::REWARDS_ALREADY_UPDATED.describe(),
2686+
);
2687+
system.advance_epoch();
2688+
2689+
// Enable consensus rewards
2690+
system
2691+
.set_consensus_rewards_first_epoch(epoch_id: system.staking.get_current_epoch() + K.into());
2692+
2693+
// Disable rewards is true with v3 before consensus epoch
2694+
system.update_rewards(:staker, disable_rewards: true);
2695+
// Test rewards are not distributed
2696+
let rewards = system.staker_claim_rewards(:staker);
2697+
assert!(rewards == Zero::zero());
2698+
// Attempt again same epoch - panic
2699+
let result = system
2700+
.staking
2701+
.rewards_manager_safe_dispatcher()
2702+
.update_rewards(staker_address: staker.staker.address, disable_rewards: true);
2703+
assert_panic_with_error(
2704+
:result, expected_error: StakingError::REWARDS_ALREADY_UPDATED.describe(),
2705+
);
2706+
system.advance_epoch();
2707+
2708+
// Disable rewards is false with v3 before consensus epoch
2709+
system.update_rewards(:staker, disable_rewards: false);
2710+
// Test rewards are not distributed
2711+
let rewards = system.staker_claim_rewards(:staker);
2712+
assert!(rewards == Zero::zero());
2713+
// Attempt again same epoch - panic
2714+
let result = system
2715+
.staking
2716+
.rewards_manager_safe_dispatcher()
2717+
.update_rewards(staker_address: staker.staker.address, disable_rewards: false);
2718+
assert_panic_with_error(
2719+
:result, expected_error: StakingError::REWARDS_ALREADY_UPDATED.describe(),
2720+
);
2721+
system.advance_epoch();
2722+
2723+
// Disable rewards is true with v3 on
2724+
system.update_rewards(:staker, disable_rewards: true);
2725+
// Test rewards are not distributed
2726+
let rewards = system.staker_claim_rewards(:staker);
2727+
assert!(rewards == Zero::zero());
2728+
// Attempt again same epoch - panic
2729+
let result = system
2730+
.staking
2731+
.rewards_manager_safe_dispatcher()
2732+
.update_rewards(staker_address: staker.staker.address, disable_rewards: true);
2733+
assert_panic_with_error(
2734+
:result, expected_error: StakingError::REWARDS_ALREADY_UPDATED.describe(),
2735+
);
2736+
system.advance_epoch();
2737+
2738+
// Disable rewards is false with v3 on
2739+
system.update_rewards(:staker, disable_rewards: false);
2740+
// Test rewards are not distributed
2741+
let rewards = system.staker_claim_rewards(:staker);
2742+
let (expected_rewards, _) = calculate_staker_strk_rewards_with_balances_v3(
2743+
amount_own: stake_amount,
2744+
pool_amount: Zero::zero(),
2745+
commission: 200,
2746+
staking_contract: system.staking.address,
2747+
minting_curve_contract: system.minting_curve.address,
2748+
);
2749+
assert!(rewards == expected_rewards);
2750+
// Attempt again same epoch - panic
2751+
let result = system
2752+
.staking
2753+
.rewards_manager_safe_dispatcher()
2754+
.update_rewards(staker_address: staker.staker.address, disable_rewards: false);
2755+
assert_panic_with_error(
2756+
:result, expected_error: StakingError::REWARDS_ALREADY_UPDATED.describe(),
2757+
);
2758+
}

src/flow_test/utils.cairo

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ use staking::staking::interface::{
3939
IStakingConsensusDispatcher, IStakingConsensusSafeDispatcher, IStakingDispatcher,
4040
IStakingDispatcherTrait, IStakingMigrationDispatcher, IStakingMigrationDispatcherTrait,
4141
IStakingMigrationSafeDispatcher, IStakingPauseDispatcher, IStakingPauseDispatcherTrait,
42-
IStakingPoolDispatcher, IStakingPoolSafeDispatcher, IStakingSafeDispatcher,
43-
IStakingSafeDispatcherTrait, IStakingTokenManagerDispatcher,
42+
IStakingPoolDispatcher, IStakingPoolSafeDispatcher, IStakingRewardsManagerDispatcher,
43+
IStakingRewardsManagerDispatcherTrait, IStakingRewardsManagerSafeDispatcher,
44+
IStakingSafeDispatcher, IStakingSafeDispatcherTrait, IStakingTokenManagerDispatcher,
4445
IStakingTokenManagerDispatcherTrait, IStakingTokenManagerSafeDispatcher,
4546
IStakingTokenManagerSafeDispatcherTrait, StakerInfoV1, StakerInfoV1Trait, StakerPoolInfoV2,
4647
};
@@ -338,6 +339,16 @@ pub(crate) impl StakingImpl of StakingTrait {
338339
IStakingPoolSafeDispatcher { contract_address: self.address }
339340
}
340341

342+
fn rewards_manager_dispatcher(self: StakingState) -> IStakingRewardsManagerDispatcher nopanic {
343+
IStakingRewardsManagerDispatcher { contract_address: self.address }
344+
}
345+
346+
fn rewards_manager_safe_dispatcher(
347+
self: StakingState,
348+
) -> IStakingRewardsManagerSafeDispatcher nopanic {
349+
IStakingRewardsManagerSafeDispatcher { contract_address: self.address }
350+
}
351+
341352
fn set_roles(self: StakingState) {
342353
set_account_as_upgrade_governor(
343354
contract: self.address,
@@ -1492,6 +1503,21 @@ pub(crate) impl SystemStakerImpl of SystemStakerTrait {
14921503
self.attestation.unwrap().dispatcher().attest(:block_hash);
14931504
}
14941505

1506+
fn set_consensus_rewards_first_epoch(self: SystemState, epoch_id: Epoch) {
1507+
cheat_caller_address_once(
1508+
contract_address: self.staking.address, caller_address: self.staking.roles.app_governor,
1509+
);
1510+
let config_dispatcher = IStakingConfigDispatcher { contract_address: self.staking.address };
1511+
config_dispatcher.set_consensus_rewards_first_epoch(:epoch_id);
1512+
}
1513+
1514+
fn update_rewards(self: SystemState, staker: Staker, disable_rewards: bool) {
1515+
self
1516+
.staking
1517+
.rewards_manager_dispatcher()
1518+
.update_rewards(staker_address: staker.staker.address, :disable_rewards);
1519+
}
1520+
14951521
#[feature("safe_dispatcher")]
14961522
fn safe_attest(self: SystemState, staker: Staker) -> Result<(), Array<felt252>> {
14971523
let block_hash = Zero::zero();

0 commit comments

Comments
 (0)