Skip to content

Commit 878cc79

Browse files
test: add token state after upgrade flow
1 parent 625acb6 commit 878cc79

File tree

3 files changed

+169
-6
lines changed

3 files changed

+169
-6
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,3 @@ more ideas:
6262
- Member from V0, change balance at V1, no action at V2, test curr balance
6363
- Member from V2, change balance, upgrade, test curr balance
6464
- Cover all ifs with migration from: V0, V1, V2.
65-
66-
## k=1 -> k=2 token
67-
- enable token A and disable token B, next epoch upgrade, test views and rewards.

src/flow_test/flows.cairo

Lines changed: 153 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ 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_staker_strk_rewards_with_balances_v2,
39-
calculate_staker_strk_rewards_with_balances_v3, calculate_strk_pool_rewards_v1,
40-
calculate_strk_pool_rewards_v2, calculate_strk_pool_rewards_v3,
38+
calculate_staker_btc_pool_rewards_v3, calculate_staker_strk_rewards_v2,
39+
calculate_staker_strk_rewards_with_balances_v2, calculate_staker_strk_rewards_with_balances_v3,
40+
calculate_strk_pool_rewards_v1, calculate_strk_pool_rewards_v2, calculate_strk_pool_rewards_v3,
4141
calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit,
4242
declare_pool_contract, declare_pool_eic_contract, declare_staking_contract,
4343
load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0, to_amount_18_decimals,
@@ -8822,3 +8822,153 @@ pub(crate) impl BalancesDelayFlowImpl of FlowTrait<BalancesDelayFlow> {
88228822
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
88238823
}
88248824
}
8825+
8826+
/// Flow:
8827+
/// Add tokens A and B
8828+
/// Delegate for both tokens
8829+
/// Enable token A, disable token B
8830+
/// Advance epoch
8831+
/// Upgrade - test views and rewards
8832+
/// Start consensus rewards - test rewards
8833+
#[derive(Drop, Copy)]
8834+
pub(crate) struct EnableDisableTokenBeforeAfterUpgradeFlow {
8835+
pub(crate) token_a: Option<Token>,
8836+
pub(crate) token_b: Option<Token>,
8837+
pub(crate) staker: Option<Staker>,
8838+
pub(crate) pool_a: Option<ContractAddress>,
8839+
pub(crate) pool_b: Option<ContractAddress>,
8840+
pub(crate) delegator_a: Option<Delegator>,
8841+
pub(crate) delegator_b: Option<Delegator>,
8842+
pub(crate) delegation_amount: Option<Amount>,
8843+
}
8844+
pub(crate) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait<
8845+
EnableDisableTokenBeforeAfterUpgradeFlow,
8846+
> {
8847+
fn setup_v2(ref self: EnableDisableTokenBeforeAfterUpgradeFlow, ref system: SystemState) {
8848+
let token_a = system.deploy_new_btc_token(name: "TOKEN_A", decimals: TEST_BTC_DECIMALS);
8849+
let token_b = system.deploy_new_btc_token(name: "TOKEN_B", decimals: TEST_BTC_DECIMALS);
8850+
system.staking.add_token(token_address: token_a.contract_address());
8851+
system.staking.add_token(token_address: token_b.contract_address());
8852+
system.staking.enable_token(token_address: token_b.contract_address());
8853+
8854+
let stake_amount = system.staking.get_min_stake();
8855+
let delegation_amount = TEST_MIN_BTC_FOR_REWARDS;
8856+
let staker = system.new_staker(amount: stake_amount);
8857+
system.stake(:staker, amount: stake_amount, pool_enabled: true, commission: 200);
8858+
let pool_a = system
8859+
.set_open_for_delegation(:staker, token_address: token_a.contract_address());
8860+
let pool_b = system
8861+
.set_open_for_delegation(:staker, token_address: token_b.contract_address());
8862+
let delegator_a = system.new_btc_delegator(amount: delegation_amount, token: token_a);
8863+
let delegator_b = system.new_btc_delegator(amount: delegation_amount, token: token_b);
8864+
system
8865+
.delegate_btc(
8866+
delegator: delegator_a, pool: pool_a, amount: delegation_amount, token: token_a,
8867+
);
8868+
system
8869+
.delegate_btc(
8870+
delegator: delegator_b, pool: pool_b, amount: delegation_amount, token: token_b,
8871+
);
8872+
8873+
system.advance_epoch();
8874+
system.staking.disable_token(token_address: token_b.contract_address());
8875+
system.staking.enable_token(token_address: token_a.contract_address());
8876+
8877+
system.advance_epoch();
8878+
system.set_staker_for_migration(staker_address: staker.staker.address);
8879+
self.token_a = Option::Some(token_a);
8880+
self.token_b = Option::Some(token_b);
8881+
self.staker = Option::Some(staker);
8882+
self.pool_a = Option::Some(pool_a);
8883+
self.pool_b = Option::Some(pool_b);
8884+
self.delegator_a = Option::Some(delegator_a);
8885+
self.delegator_b = Option::Some(delegator_b);
8886+
self.delegation_amount = Option::Some(delegation_amount);
8887+
}
8888+
8889+
fn test(self: EnableDisableTokenBeforeAfterUpgradeFlow, ref system: SystemState) {
8890+
let token_a = self.token_a.unwrap();
8891+
let token_b = self.token_b.unwrap();
8892+
let staker = self.staker.unwrap();
8893+
let pool_a = self.pool_a.unwrap();
8894+
let pool_b = self.pool_b.unwrap();
8895+
let delegator_a = self.delegator_a.unwrap();
8896+
let delegator_b = self.delegator_b.unwrap();
8897+
let delegation_amount = self.delegation_amount.unwrap();
8898+
let staker_info = system.staker_info_v1(:staker);
8899+
let commission = staker_info.pool_info.unwrap().commission;
8900+
let stake_amount = staker_info.amount_own;
8901+
8902+
// Test get_tokens view.
8903+
let tokens = system.staking.dispatcher().get_tokens();
8904+
let expected_tokens = array![
8905+
(STRK_TOKEN_ADDRESS, true), (system.btc_token.contract_address(), true),
8906+
(token_a.contract_address(), true), (token_b.contract_address(), false),
8907+
]
8908+
.span();
8909+
assert!(tokens == expected_tokens);
8910+
8911+
// Test rewards - only token A.
8912+
system.advance_block_into_attestation_window(:staker);
8913+
system.attest(:staker);
8914+
system.advance_epoch();
8915+
let staker_rewards = system.staker_claim_rewards(:staker);
8916+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_v2(
8917+
:staker_info,
8918+
staking_contract: system.staking.address,
8919+
minting_curve_contract: system.minting_curve.address,
8920+
);
8921+
assert!(expected_staker_rewards.is_non_zero());
8922+
let rewards_a = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
8923+
let rewards_b = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
8924+
let (expected_commission_rewards, expected_pool_rewards) =
8925+
calculate_staker_btc_pool_rewards_v2(
8926+
pool_balance: delegation_amount,
8927+
:commission,
8928+
staking_contract: system.staking.address,
8929+
minting_curve_contract: system.minting_curve.address,
8930+
token_address: token_a.contract_address(),
8931+
);
8932+
assert!(expected_commission_rewards.is_non_zero());
8933+
assert!(expected_pool_rewards.is_non_zero());
8934+
8935+
assert!(staker_rewards == expected_staker_rewards + expected_commission_rewards);
8936+
assert!(rewards_a == expected_pool_rewards);
8937+
assert!(rewards_b.is_zero());
8938+
8939+
system.start_consensus_rewards();
8940+
system.update_rewards(:staker, disable_rewards: false);
8941+
system.advance_epoch();
8942+
let staker_rewards = system.staker_claim_rewards(:staker);
8943+
let rewards_a = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
8944+
let rewards_b = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
8945+
8946+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_with_balances_v3(
8947+
amount_own: stake_amount,
8948+
pool_amount: Zero::zero(),
8949+
:commission,
8950+
staking_contract: system.staking.address,
8951+
minting_curve_contract: system.minting_curve.address,
8952+
);
8953+
assert!(expected_staker_rewards.is_non_zero());
8954+
let (expected_commission_rewards, expected_pool_rewards) =
8955+
calculate_staker_btc_pool_rewards_v3(
8956+
normalized_pool_balance: NormalizedAmountTrait::from_native_amount(
8957+
amount: delegation_amount, decimals: TEST_BTC_DECIMALS,
8958+
),
8959+
normalized_staker_total_btc_balance: NormalizedAmountTrait::from_native_amount(
8960+
amount: delegation_amount, decimals: TEST_BTC_DECIMALS,
8961+
),
8962+
:commission,
8963+
staking_contract: system.staking.address,
8964+
minting_curve_contract: system.minting_curve.address,
8965+
token_address: token_a.contract_address(),
8966+
);
8967+
assert!(expected_commission_rewards.is_non_zero());
8968+
assert!(expected_pool_rewards.is_non_zero());
8969+
8970+
assert!(staker_rewards == expected_staker_rewards + expected_commission_rewards);
8971+
assert!(rewards_a == expected_pool_rewards);
8972+
assert!(rewards_b.is_zero());
8973+
}
8974+
}

src/flow_test/fork_test.cairo

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,3 +562,19 @@ fn balances_delay_flow_test() {
562562
};
563563
test_flow_mainnet(ref :flow);
564564
}
565+
566+
#[test]
567+
#[fork("MAINNET_LATEST")]
568+
fn enable_disable_token_before_after_upgrade_flow_test() {
569+
let mut flow = flows::EnableDisableTokenBeforeAfterUpgradeFlow {
570+
token_a: Option::None,
571+
token_b: Option::None,
572+
staker: Option::None,
573+
pool_a: Option::None,
574+
pool_b: Option::None,
575+
delegator_a: Option::None,
576+
delegator_b: Option::None,
577+
delegation_amount: Option::None,
578+
};
579+
test_flow_mainnet(ref :flow);
580+
}

0 commit comments

Comments
 (0)