Skip to content

Commit 550520d

Browse files
test: add update_rewards toggle tokens flow test
1 parent a64f3df commit 550520d

File tree

2 files changed

+137
-3
lines changed

2 files changed

+137
-3
lines changed

src/flow_test/flow_ideas.md

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

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

src/flow_test/test.cairo

Lines changed: 137 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ 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+
StakingInitConfig, calculate_staker_btc_pool_rewards_v2, calculate_staker_btc_pool_rewards_v3,
2627
calculate_staker_strk_rewards_with_balances_v2, calculate_staker_strk_rewards_with_balances_v3,
2728
calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit,
2829
custom_decimals_token, deploy_mock_erc20_decimals_contract,
@@ -3029,3 +3030,138 @@ fn enable_disable_btc_tokens_flow_test() {
30293030
.span();
30303031
assert!(tokens == expected_tokens);
30313032
}
3033+
3034+
/// Flow:
3035+
/// Add tokens A and B
3036+
/// Enable token B
3037+
/// Advance K epochs
3038+
/// Enable token A, disable token B
3039+
/// update_rewards
3040+
/// Advance epoch - test rewards only for token B
3041+
/// update_rewards
3042+
/// Advance epoch - test rewards only for token B
3043+
/// update_rewards
3044+
/// Advance epoch - test rewards only for token A
3045+
/// Start consensus rewards
3046+
/// Enable token B, disable token A
3047+
/// update_rewards
3048+
/// Advance epoch - test rewards only for token A
3049+
/// update_rewards
3050+
/// Advance epoch - test rewards only for token A
3051+
/// update_rewards
3052+
/// Advance epoch - test rewards only for token B
3053+
#[test]
3054+
fn update_rewards_token_enable_disable_flow_test() {
3055+
let cfg: StakingInitConfig = Default::default();
3056+
let mut system = SystemConfigTrait::basic_stake_flow_cfg(:cfg).deploy();
3057+
let token_a_decimals = 8;
3058+
let token_b_decimals = 18;
3059+
let token_a = system.deploy_new_btc_token(name: "Token A", decimals: token_a_decimals);
3060+
let token_b = system.deploy_new_btc_token(name: "Token B", decimals: token_b_decimals);
3061+
3062+
// Setup tokens
3063+
system.staking.add_token(token_address: token_a.contract_address());
3064+
system.staking.add_token(token_address: token_b.contract_address());
3065+
system.staking.enable_token(token_address: token_b.contract_address());
3066+
3067+
// Stake and delegate
3068+
let stake_amount = system.staking.get_min_stake();
3069+
let delegation_amount_a = BTC_8D_CONFIG.min_for_rewards;
3070+
let delegation_amount_b = BTC_18D_CONFIG.min_for_rewards;
3071+
let staker = system.new_staker(amount: stake_amount);
3072+
let commission = 200;
3073+
system.stake(:staker, amount: stake_amount, pool_enabled: true, :commission);
3074+
let pool_a = system.set_open_for_delegation(:staker, token_address: token_a.contract_address());
3075+
let pool_b = system.set_open_for_delegation(:staker, token_address: token_b.contract_address());
3076+
let delegator_a = system.new_btc_delegator(amount: delegation_amount_a, token: token_a);
3077+
let delegator_b = system.new_btc_delegator(amount: delegation_amount_b, token: token_b);
3078+
system
3079+
.delegate_btc(
3080+
delegator: delegator_a, pool: pool_a, amount: delegation_amount_a, token: token_a,
3081+
);
3082+
system
3083+
.delegate_btc(
3084+
delegator: delegator_b, pool: pool_b, amount: delegation_amount_b, token: token_b,
3085+
);
3086+
system.advance_k_epochs();
3087+
3088+
// Enable token A, disable token B
3089+
system.staking.enable_token(token_address: token_a.contract_address());
3090+
system.staking.disable_token(token_address: token_b.contract_address());
3091+
3092+
// update_rewards - test rewards only for token B
3093+
system.advance_block_into_attestation_window(:staker);
3094+
system.attest(:staker);
3095+
system.advance_epoch();
3096+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3097+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3098+
let (_, expected_delegator_rewards) = calculate_staker_btc_pool_rewards_v2(
3099+
pool_balance: delegation_amount_b,
3100+
:commission,
3101+
staking_contract: system.staking.address,
3102+
minting_curve_contract: system.minting_curve.address,
3103+
token_address: token_b.contract_address(),
3104+
);
3105+
assert!(expected_delegator_rewards.is_non_zero());
3106+
assert!(delegator_a_rewards.is_zero());
3107+
assert!(delegator_b_rewards == expected_delegator_rewards);
3108+
3109+
// update_rewards - test rewards only for token B
3110+
system.advance_block_into_attestation_window(:staker);
3111+
system.attest(:staker);
3112+
system.advance_epoch();
3113+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3114+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3115+
assert!(delegator_a_rewards.is_zero());
3116+
assert!(delegator_b_rewards == expected_delegator_rewards);
3117+
3118+
// update_rewards - test rewards only for token A
3119+
system.advance_block_into_attestation_window(:staker);
3120+
system.attest(:staker);
3121+
system.advance_epoch();
3122+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3123+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3124+
assert!(delegator_a_rewards == expected_delegator_rewards);
3125+
assert!(delegator_b_rewards.is_zero());
3126+
3127+
// Start consensus rewards
3128+
system.start_consensus_rewards();
3129+
system.staking.enable_token(token_address: token_b.contract_address());
3130+
system.staking.disable_token(token_address: token_a.contract_address());
3131+
3132+
// Calculate rewards for consensus rewards
3133+
let (_, expected_delegator_rewards) = calculate_staker_btc_pool_rewards_v3(
3134+
normalized_pool_balance: NormalizedAmountTrait::from_native_amount(
3135+
amount: delegation_amount_a, decimals: token_a_decimals,
3136+
),
3137+
normalized_staker_total_btc_balance: NormalizedAmountTrait::from_native_amount(
3138+
amount: delegation_amount_a, decimals: token_a_decimals,
3139+
),
3140+
:commission, staking_contract: system.staking.address, minting_curve_contract: system.minting_curve.address, token_address: token_a.contract_address(),
3141+
);
3142+
assert!(expected_delegator_rewards.is_non_zero());
3143+
3144+
// update_rewards - test rewards only for token A
3145+
system.update_rewards(:staker, disable_rewards: false);
3146+
system.advance_epoch();
3147+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3148+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3149+
assert!(delegator_a_rewards == expected_delegator_rewards);
3150+
assert!(delegator_b_rewards.is_zero());
3151+
3152+
// update_rewards - test rewards only for token A
3153+
system.update_rewards(:staker, disable_rewards: false);
3154+
system.advance_epoch();
3155+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3156+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3157+
assert!(delegator_a_rewards == expected_delegator_rewards);
3158+
assert!(delegator_b_rewards.is_zero());
3159+
3160+
// update_rewards - test rewards only for token B
3161+
system.update_rewards(:staker, disable_rewards: false);
3162+
system.advance_epoch();
3163+
let delegator_a_rewards = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
3164+
let delegator_b_rewards = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
3165+
assert!(delegator_a_rewards.is_zero());
3166+
assert!(delegator_b_rewards == expected_delegator_rewards);
3167+
}

0 commit comments

Comments
 (0)