Skip to content

Commit 96cb2c9

Browse files
test: add update_rewards toggle tokens flow test
1 parent d3ed532 commit 96cb2c9

File tree

3 files changed

+182
-9
lines changed

3 files changed

+182
-9
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,4 @@ more ideas:
6464
- Cover all ifs with migration from: V0, V1, V2.
6565

6666
## k=1 -> k=2 token
67-
- enable token, update rewards, advance epoch, update rewards, advance epoch, update rewards - token does not get rewards until after 2 epochs
68-
- same as above with disable (can be implemented together as one test)
6967
- enable token A and disable token B, next epoch upgrade, test views and rewards.

src/flow_test/flows.cairo

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8731,7 +8731,7 @@ pub(crate) impl BalancesDelayFlowImpl of FlowTrait<BalancesDelayFlow> {
87318731
:staking_contract,
87328732
:minting_curve_contract,
87338733
);
8734-
assert!(expected_staker_rewards > prev_staker_rewards);
8734+
assert!(expected_staker_rewards != prev_staker_rewards);
87358735
assert!(expected_strk_pool_rewards.is_non_zero());
87368736
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
87378737
calculate_staker_btc_pool_rewards_v2(
@@ -8789,8 +8789,8 @@ pub(crate) impl BalancesDelayFlowImpl of FlowTrait<BalancesDelayFlow> {
87898789
:staking_contract,
87908790
:minting_curve_contract,
87918791
);
8792-
assert!(expected_staker_rewards > prev_staker_rewards);
8793-
assert!(expected_strk_pool_rewards > prev_strk_pool_rewards);
8792+
assert!(expected_staker_rewards != prev_staker_rewards);
8793+
assert!(expected_strk_pool_rewards != prev_strk_pool_rewards);
87948794
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
87958795
calculate_staker_btc_pool_rewards_v2(
87968796
pool_balance: btc_pool_balance,
@@ -8799,8 +8799,8 @@ pub(crate) impl BalancesDelayFlowImpl of FlowTrait<BalancesDelayFlow> {
87998799
:minting_curve_contract,
88008800
token_address: system.btc_token.contract_address(),
88018801
);
8802-
assert!(expected_btc_commission_rewards > prev_btc_commission_rewards);
8803-
assert!(expected_btc_pool_rewards > prev_btc_pool_rewards);
8802+
assert!(expected_btc_commission_rewards != prev_btc_commission_rewards);
8803+
assert!(expected_btc_pool_rewards != prev_btc_pool_rewards);
88048804

88058805
// Test staker balance with attestation rewards - according to Epoch 1 (post-upgrade).
88068806
system

src/flow_test/test.cairo

Lines changed: 177 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@ use staking::staking::interface::{
1616
IStakingConsensusDispatcherTrait, IStakingDispatcherTrait,
1717
IStakingRewardsManagerSafeDispatcherTrait,
1818
};
19+
use staking::staking::objects::NormalizedAmountTrait;
1920
use staking::staking::utils::{BTC_WEIGHT_FACTOR, STAKING_POWER_BASE_VALUE, STRK_WEIGHT_FACTOR};
2021
use staking::test_utils::constants::{
2122
BTC_18D_CONFIG, BTC_5D_CONFIG, BTC_8D_CONFIG, PUBLIC_KEY, STRK_BASE_VALUE,
2223
TEST_MIN_BTC_FOR_REWARDS,
2324
};
2425
use staking::test_utils::{
25-
StakingInitConfig, calculate_staker_btc_pool_rewards_v2,
26-
calculate_staker_strk_rewards_with_balances_v2, calculate_staker_strk_rewards_with_balances_v3,
26+
StakingInitConfig, calculate_staker_btc_pool_rewards_v2, calculate_staker_btc_pool_rewards_v3,
27+
calculate_staker_strk_rewards_v2, calculate_staker_strk_rewards_with_balances_v2,
28+
calculate_staker_strk_rewards_with_balances_v3,
2729
calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit,
2830
custom_decimals_token, deploy_mock_erc20_decimals_contract,
2931
};
@@ -3029,3 +3031,176 @@ fn enable_disable_btc_tokens_flow_test() {
30293031
.span();
30303032
assert!(tokens == expected_tokens);
30313033
}
3034+
3035+
/// Flow:
3036+
/// Add tokens A and B
3037+
/// Enable token B
3038+
/// Advance K epochs
3039+
/// Enable token A, disable token B
3040+
/// Attest
3041+
/// Advance epoch - test rewards only for token B
3042+
/// Attest
3043+
/// Advance epoch - test rewards only for token B
3044+
/// Attest
3045+
/// Advance epoch - test rewards only for token A
3046+
/// Start consensus rewards
3047+
/// Enable token B, disable token A
3048+
/// update_rewards
3049+
/// Advance epoch - test rewards only for token A
3050+
/// update_rewards
3051+
/// Advance epoch - test rewards only for token A
3052+
/// update_rewards
3053+
/// Advance epoch - test rewards only for token B
3054+
#[test]
3055+
fn update_rewards_token_enable_disable_flow_test() {
3056+
let cfg: StakingInitConfig = Default::default();
3057+
let mut system = SystemConfigTrait::basic_stake_flow_cfg(:cfg).deploy();
3058+
let token_a_decimals = 8;
3059+
let token_b_decimals = 18;
3060+
let token_a = system.deploy_new_btc_token(name: "Token A", decimals: token_a_decimals);
3061+
let token_b = system.deploy_new_btc_token(name: "Token B", decimals: token_b_decimals);
3062+
let staking_contract = system.staking.address;
3063+
let minting_curve_contract = system.minting_curve.address;
3064+
3065+
// Setup tokens
3066+
system.staking.add_token(token_address: token_a.contract_address());
3067+
system.staking.add_token(token_address: token_b.contract_address());
3068+
system.staking.enable_token(token_address: token_b.contract_address());
3069+
3070+
// Stake and delegate
3071+
let stake_amount = system.staking.get_min_stake();
3072+
let delegation_amount_a = BTC_8D_CONFIG.min_for_rewards;
3073+
let delegation_amount_b = BTC_18D_CONFIG.min_for_rewards;
3074+
let staker = system.new_staker(amount: stake_amount);
3075+
let commission = 200;
3076+
system.stake(:staker, amount: stake_amount, pool_enabled: true, :commission);
3077+
let pool_a = system.set_open_for_delegation(:staker, token_address: token_a.contract_address());
3078+
let pool_b = system.set_open_for_delegation(:staker, token_address: token_b.contract_address());
3079+
let delegator_a = system.new_btc_delegator(amount: delegation_amount_a, token: token_a);
3080+
let delegator_b = system.new_btc_delegator(amount: delegation_amount_b, token: token_b);
3081+
system
3082+
.delegate_btc(
3083+
delegator: delegator_a, pool: pool_a, amount: delegation_amount_a, token: token_a,
3084+
);
3085+
system
3086+
.delegate_btc(
3087+
delegator: delegator_b, pool: pool_b, amount: delegation_amount_b, token: token_b,
3088+
);
3089+
system.advance_k_epochs();
3090+
3091+
// Enable token A, disable token B
3092+
system.staking.enable_token(token_address: token_a.contract_address());
3093+
system.staking.disable_token(token_address: token_b.contract_address());
3094+
3095+
// Attest
3096+
system.advance_block_into_attestation_window(:staker);
3097+
system.attest(:staker);
3098+
system.advance_epoch();
3099+
3100+
// Calculate rewards
3101+
let staker_info = system.staker_info_v1(:staker);
3102+
let staker_rewards = system.staker_claim_rewards(:staker);
3103+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3104+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3105+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_v2(
3106+
:staker_info, :staking_contract, :minting_curve_contract,
3107+
);
3108+
assert!(expected_staker_rewards.is_non_zero());
3109+
let (commission_rewards, expected_delegator_rewards) = calculate_staker_btc_pool_rewards_v2(
3110+
pool_balance: delegation_amount_b,
3111+
:commission,
3112+
:staking_contract,
3113+
:minting_curve_contract,
3114+
token_address: token_b.contract_address(),
3115+
);
3116+
assert!(commission_rewards.is_non_zero());
3117+
assert!(expected_delegator_rewards.is_non_zero());
3118+
3119+
// Test rewards
3120+
assert!(staker_rewards == expected_staker_rewards + commission_rewards);
3121+
assert!(delegator_a_rewards.is_zero());
3122+
assert!(delegator_b_rewards == expected_delegator_rewards);
3123+
3124+
// Attest - test rewards only for token B
3125+
system.advance_block_into_attestation_window(:staker);
3126+
system.attest(:staker);
3127+
system.advance_epoch();
3128+
let staker_rewards = system.staker_claim_rewards(:staker);
3129+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3130+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3131+
assert!(staker_rewards == expected_staker_rewards + commission_rewards);
3132+
assert!(delegator_a_rewards.is_zero());
3133+
assert!(delegator_b_rewards == expected_delegator_rewards);
3134+
3135+
// Attest - test rewards only for token A
3136+
system.advance_block_into_attestation_window(:staker);
3137+
system.attest(:staker);
3138+
system.advance_epoch();
3139+
let staker_rewards = system.staker_claim_rewards(:staker);
3140+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3141+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3142+
assert!(staker_rewards == expected_staker_rewards + commission_rewards);
3143+
assert!(delegator_a_rewards == expected_delegator_rewards);
3144+
assert!(delegator_b_rewards.is_zero());
3145+
3146+
// Start consensus rewards
3147+
system.start_consensus_rewards();
3148+
3149+
// Enable token B, disable token A
3150+
system.staking.enable_token(token_address: token_b.contract_address());
3151+
system.staking.disable_token(token_address: token_a.contract_address());
3152+
3153+
// Calculate rewards for consensus rewards
3154+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_with_balances_v3(
3155+
amount_own: stake_amount,
3156+
pool_amount: Zero::zero(),
3157+
:commission,
3158+
:staking_contract,
3159+
:minting_curve_contract,
3160+
);
3161+
assert!(expected_staker_rewards.is_non_zero());
3162+
let (commission_rewards, expected_delegator_rewards) = calculate_staker_btc_pool_rewards_v3(
3163+
normalized_pool_balance: NormalizedAmountTrait::from_native_amount(
3164+
amount: delegation_amount_a, decimals: token_a_decimals,
3165+
),
3166+
normalized_staker_total_btc_balance: NormalizedAmountTrait::from_native_amount(
3167+
amount: delegation_amount_a, decimals: token_a_decimals,
3168+
),
3169+
:commission,
3170+
:staking_contract,
3171+
:minting_curve_contract,
3172+
token_address: token_a.contract_address(),
3173+
);
3174+
assert!(commission_rewards.is_non_zero());
3175+
assert!(expected_delegator_rewards.is_non_zero());
3176+
3177+
// update_rewards - test rewards only for token A
3178+
system.update_rewards(:staker, disable_rewards: false);
3179+
system.advance_epoch();
3180+
let staker_rewards = system.staker_claim_rewards(:staker);
3181+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3182+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3183+
assert!(staker_rewards == expected_staker_rewards + commission_rewards);
3184+
assert!(delegator_a_rewards == expected_delegator_rewards);
3185+
assert!(delegator_b_rewards.is_zero());
3186+
3187+
// update_rewards - test rewards only for token A
3188+
system.update_rewards(:staker, disable_rewards: false);
3189+
system.advance_epoch();
3190+
let staker_rewards = system.staker_claim_rewards(:staker);
3191+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3192+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3193+
assert!(staker_rewards == expected_staker_rewards + commission_rewards);
3194+
assert!(delegator_a_rewards == expected_delegator_rewards);
3195+
assert!(delegator_b_rewards.is_zero());
3196+
3197+
// update_rewards - test rewards only for token B
3198+
system.update_rewards(:staker, disable_rewards: false);
3199+
system.advance_epoch();
3200+
let staker_rewards = system.staker_claim_rewards(:staker);
3201+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3202+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3203+
assert!(staker_rewards == expected_staker_rewards + commission_rewards);
3204+
assert!(delegator_a_rewards.is_zero());
3205+
assert!(delegator_b_rewards == expected_delegator_rewards);
3206+
}

0 commit comments

Comments
 (0)