Skip to content

Commit 845927c

Browse files
test: add token state after upgrade flow
1 parent 5deab3b commit 845927c

File tree

3 files changed

+168
-4
lines changed

3 files changed

+168
-4
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,3 @@ more ideas:
6868
- Member from V0, change balance at V1, no action at V2, test curr balance
6969
- Member from V2, change balance, upgrade, test curr balance
7070
- Cover all ifs with migration from: V0, V1, V2.
71-
72-
## k=1 -> k=2 token
73-
- enable token A and disable token B, next epoch upgrade, test views and rewards.

src/flow_test/flows.cairo

Lines changed: 152 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ use staking::test_utils::constants::{
3535
};
3636
use staking::test_utils::{
3737
calculate_pool_member_rewards, calculate_staker_btc_pool_rewards_v2,
38-
calculate_staker_strk_rewards_v2, calculate_strk_pool_rewards_v1,
38+
calculate_staker_btc_pool_rewards_v3, calculate_staker_strk_rewards_v2,
39+
calculate_staker_strk_rewards_with_balances_v3, calculate_strk_pool_rewards_v1,
3940
calculate_strk_pool_rewards_v2, calculate_strk_pool_rewards_with_pool_balance_v2,
4041
compute_rewards_per_unit, declare_pool_contract, declare_pool_eic_contract,
4142
declare_staking_contract, load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0,
@@ -7915,3 +7916,153 @@ pub(crate) impl DelegatorRewardsMigrationSecondRegularCaseFlowImpl of MultiVersi
79157916
assert_eq!(actual_rewards, expected_rewards);
79167917
}
79177918
}
7919+
7920+
/// Flow:
7921+
/// Add tokens A and B
7922+
/// Delegate for both tokens
7923+
/// Enable token A, disable token B
7924+
/// Advance epoch
7925+
/// Upgrade - test views and rewards
7926+
/// Start consensus rewards - test rewards
7927+
#[derive(Drop, Copy)]
7928+
pub(crate) struct EnableDisableTokenBeforeAfterUpgradeFlow {
7929+
pub(crate) token_a: Option<Token>,
7930+
pub(crate) token_b: Option<Token>,
7931+
pub(crate) staker: Option<Staker>,
7932+
pub(crate) pool_a: Option<ContractAddress>,
7933+
pub(crate) pool_b: Option<ContractAddress>,
7934+
pub(crate) delegator_a: Option<Delegator>,
7935+
pub(crate) delegator_b: Option<Delegator>,
7936+
pub(crate) delegation_amount: Option<Amount>,
7937+
}
7938+
pub(crate) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait<
7939+
EnableDisableTokenBeforeAfterUpgradeFlow,
7940+
> {
7941+
fn setup_v2(ref self: EnableDisableTokenBeforeAfterUpgradeFlow, ref system: SystemState) {
7942+
let token_a = system.deploy_new_btc_token(name: "TOKEN_A", decimals: TEST_BTC_DECIMALS);
7943+
let token_b = system.deploy_new_btc_token(name: "TOKEN_B", decimals: TEST_BTC_DECIMALS);
7944+
system.staking.add_token(token_address: token_a.contract_address());
7945+
system.staking.add_token(token_address: token_b.contract_address());
7946+
system.staking.enable_token(token_address: token_b.contract_address());
7947+
7948+
let stake_amount = system.staking.get_min_stake();
7949+
let delegation_amount = TEST_MIN_BTC_FOR_REWARDS;
7950+
let staker = system.new_staker(amount: stake_amount);
7951+
system.stake(:staker, amount: stake_amount, pool_enabled: true, commission: 200);
7952+
let pool_a = system
7953+
.set_open_for_delegation(:staker, token_address: token_a.contract_address());
7954+
let pool_b = system
7955+
.set_open_for_delegation(:staker, token_address: token_b.contract_address());
7956+
let delegator_a = system.new_btc_delegator(amount: delegation_amount, token: token_a);
7957+
let delegator_b = system.new_btc_delegator(amount: delegation_amount, token: token_b);
7958+
system
7959+
.delegate_btc(
7960+
delegator: delegator_a, pool: pool_a, amount: delegation_amount, token: token_a,
7961+
);
7962+
system
7963+
.delegate_btc(
7964+
delegator: delegator_b, pool: pool_b, amount: delegation_amount, token: token_b,
7965+
);
7966+
7967+
system.advance_epoch();
7968+
system.staking.disable_token(token_address: token_b.contract_address());
7969+
system.staking.enable_token(token_address: token_a.contract_address());
7970+
7971+
system.advance_epoch();
7972+
system.set_staker_for_migration(staker_address: staker.staker.address);
7973+
self.token_a = Option::Some(token_a);
7974+
self.token_b = Option::Some(token_b);
7975+
self.staker = Option::Some(staker);
7976+
self.pool_a = Option::Some(pool_a);
7977+
self.pool_b = Option::Some(pool_b);
7978+
self.delegator_a = Option::Some(delegator_a);
7979+
self.delegator_b = Option::Some(delegator_b);
7980+
self.delegation_amount = Option::Some(delegation_amount);
7981+
}
7982+
7983+
fn test(self: EnableDisableTokenBeforeAfterUpgradeFlow, ref system: SystemState) {
7984+
let token_a = self.token_a.unwrap();
7985+
let token_b = self.token_b.unwrap();
7986+
let staker = self.staker.unwrap();
7987+
let pool_a = self.pool_a.unwrap();
7988+
let pool_b = self.pool_b.unwrap();
7989+
let delegator_a = self.delegator_a.unwrap();
7990+
let delegator_b = self.delegator_b.unwrap();
7991+
let delegation_amount = self.delegation_amount.unwrap();
7992+
let staker_info = system.staker_info_v1(:staker);
7993+
let commission = staker_info.pool_info.unwrap().commission;
7994+
let stake_amount = staker_info.amount_own;
7995+
7996+
// Test get_tokens view.
7997+
let tokens = system.staking.dispatcher().get_tokens();
7998+
let expected_tokens = array![
7999+
(STRK_TOKEN_ADDRESS, true), (system.btc_token.contract_address(), true),
8000+
(token_a.contract_address(), true), (token_b.contract_address(), false),
8001+
]
8002+
.span();
8003+
assert!(tokens == expected_tokens);
8004+
8005+
// Test rewards - only token A.
8006+
system.advance_block_into_attestation_window(:staker);
8007+
system.attest(:staker);
8008+
system.advance_epoch();
8009+
let staker_rewards = system.staker_claim_rewards(:staker);
8010+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_v2(
8011+
:staker_info,
8012+
staking_contract: system.staking.address,
8013+
minting_curve_contract: system.minting_curve.address,
8014+
);
8015+
assert!(expected_staker_rewards.is_non_zero());
8016+
let rewards_a = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
8017+
let rewards_b = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
8018+
let (expected_commission_rewards, expected_pool_rewards) =
8019+
calculate_staker_btc_pool_rewards_v2(
8020+
pool_balance: delegation_amount,
8021+
:commission,
8022+
staking_contract: system.staking.address,
8023+
minting_curve_contract: system.minting_curve.address,
8024+
token_address: token_a.contract_address(),
8025+
);
8026+
assert!(expected_commission_rewards.is_non_zero());
8027+
assert!(expected_pool_rewards.is_non_zero());
8028+
8029+
assert!(staker_rewards == expected_staker_rewards + expected_commission_rewards);
8030+
assert!(rewards_a == expected_pool_rewards);
8031+
assert!(rewards_b.is_zero());
8032+
8033+
system.start_consensus_rewards();
8034+
system.update_rewards(:staker, disable_rewards: false);
8035+
system.advance_epoch();
8036+
let staker_rewards = system.staker_claim_rewards(:staker);
8037+
let rewards_a = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
8038+
let rewards_b = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
8039+
8040+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_with_balances_v3(
8041+
amount_own: stake_amount,
8042+
pool_amount: Zero::zero(),
8043+
:commission,
8044+
staking_contract: system.staking.address,
8045+
minting_curve_contract: system.minting_curve.address,
8046+
);
8047+
assert!(expected_staker_rewards.is_non_zero());
8048+
let (expected_commission_rewards, expected_pool_rewards) =
8049+
calculate_staker_btc_pool_rewards_v3(
8050+
normalized_pool_balance: NormalizedAmountTrait::from_native_amount(
8051+
amount: delegation_amount, decimals: TEST_BTC_DECIMALS,
8052+
),
8053+
normalized_staker_total_btc_balance: NormalizedAmountTrait::from_native_amount(
8054+
amount: delegation_amount, decimals: TEST_BTC_DECIMALS,
8055+
),
8056+
:commission,
8057+
staking_contract: system.staking.address,
8058+
minting_curve_contract: system.minting_curve.address,
8059+
token_address: token_a.contract_address(),
8060+
);
8061+
assert!(expected_commission_rewards.is_non_zero());
8062+
assert!(expected_pool_rewards.is_non_zero());
8063+
8064+
assert!(staker_rewards == expected_staker_rewards + expected_commission_rewards);
8065+
assert!(rewards_a == expected_pool_rewards);
8066+
assert!(rewards_b.is_zero());
8067+
}
8068+
}

src/flow_test/fork_test.cairo

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,3 +497,19 @@ fn delegator_v0_rewards_v1_change_balance_before_rewards_flow_test() {
497497
};
498498
test_flow_mainnet(ref :flow);
499499
}
500+
501+
#[test]
502+
#[fork("MAINNET_LATEST")]
503+
fn enable_disable_token_before_after_upgrade_flow_test() {
504+
let mut flow = flows::EnableDisableTokenBeforeAfterUpgradeFlow {
505+
token_a: Option::None,
506+
token_b: Option::None,
507+
staker: Option::None,
508+
pool_a: Option::None,
509+
pool_b: Option::None,
510+
delegator_a: Option::None,
511+
delegator_b: Option::None,
512+
delegation_amount: Option::None,
513+
};
514+
test_flow_mainnet(ref :flow);
515+
}

0 commit comments

Comments
 (0)