Skip to content

Commit 0b9ed88

Browse files
test: add token state after upgrade flow
1 parent 129a1c6 commit 0b9ed88

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
@@ -26,6 +26,3 @@
2626
- Member from V0, change balance at V1, no action at V2, test curr balance
2727
- Member from V2, change balance, upgrade, test curr balance
2828
- Cover all ifs with migration from: V0, V1, V2.
29-
30-
## k=1 -> k=2 token
31-
- 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,
@@ -9746,3 +9746,153 @@ pub(crate) impl DelegatorV0V1NoRewardsFlowImpl of FlowTrait<DelegatorV0V1NoRewar
97469746
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
97479747
}
97489748
}
9749+
9750+
/// Flow:
9751+
/// Add tokens A and B
9752+
/// Delegate for both tokens
9753+
/// Enable token A, disable token B
9754+
/// Advance epoch
9755+
/// Upgrade - test views and rewards
9756+
/// Start consensus rewards - test rewards
9757+
#[derive(Drop, Copy)]
9758+
pub(crate) struct EnableDisableTokenBeforeAfterUpgradeFlow {
9759+
pub(crate) token_a: Option<Token>,
9760+
pub(crate) token_b: Option<Token>,
9761+
pub(crate) staker: Option<Staker>,
9762+
pub(crate) pool_a: Option<ContractAddress>,
9763+
pub(crate) pool_b: Option<ContractAddress>,
9764+
pub(crate) delegator_a: Option<Delegator>,
9765+
pub(crate) delegator_b: Option<Delegator>,
9766+
pub(crate) delegation_amount: Option<Amount>,
9767+
}
9768+
pub(crate) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait<
9769+
EnableDisableTokenBeforeAfterUpgradeFlow,
9770+
> {
9771+
fn setup_v2(ref self: EnableDisableTokenBeforeAfterUpgradeFlow, ref system: SystemState) {
9772+
let token_a = system.deploy_new_btc_token(name: "TOKEN_A", decimals: TEST_BTC_DECIMALS);
9773+
let token_b = system.deploy_new_btc_token(name: "TOKEN_B", decimals: TEST_BTC_DECIMALS);
9774+
system.staking.add_token(token_address: token_a.contract_address());
9775+
system.staking.add_token(token_address: token_b.contract_address());
9776+
system.staking.enable_token(token_address: token_b.contract_address());
9777+
9778+
let stake_amount = system.staking.get_min_stake();
9779+
let delegation_amount = TEST_MIN_BTC_FOR_REWARDS;
9780+
let staker = system.new_staker(amount: stake_amount);
9781+
system.stake(:staker, amount: stake_amount, pool_enabled: true, commission: 200);
9782+
let pool_a = system
9783+
.set_open_for_delegation(:staker, token_address: token_a.contract_address());
9784+
let pool_b = system
9785+
.set_open_for_delegation(:staker, token_address: token_b.contract_address());
9786+
let delegator_a = system.new_btc_delegator(amount: delegation_amount, token: token_a);
9787+
let delegator_b = system.new_btc_delegator(amount: delegation_amount, token: token_b);
9788+
system
9789+
.delegate_btc(
9790+
delegator: delegator_a, pool: pool_a, amount: delegation_amount, token: token_a,
9791+
);
9792+
system
9793+
.delegate_btc(
9794+
delegator: delegator_b, pool: pool_b, amount: delegation_amount, token: token_b,
9795+
);
9796+
9797+
system.advance_epoch();
9798+
system.staking.disable_token(token_address: token_b.contract_address());
9799+
system.staking.enable_token(token_address: token_a.contract_address());
9800+
9801+
system.advance_epoch();
9802+
system.set_staker_for_migration(staker_address: staker.staker.address);
9803+
self.token_a = Option::Some(token_a);
9804+
self.token_b = Option::Some(token_b);
9805+
self.staker = Option::Some(staker);
9806+
self.pool_a = Option::Some(pool_a);
9807+
self.pool_b = Option::Some(pool_b);
9808+
self.delegator_a = Option::Some(delegator_a);
9809+
self.delegator_b = Option::Some(delegator_b);
9810+
self.delegation_amount = Option::Some(delegation_amount);
9811+
}
9812+
9813+
fn test(self: EnableDisableTokenBeforeAfterUpgradeFlow, ref system: SystemState) {
9814+
let token_a = self.token_a.unwrap();
9815+
let token_b = self.token_b.unwrap();
9816+
let staker = self.staker.unwrap();
9817+
let pool_a = self.pool_a.unwrap();
9818+
let pool_b = self.pool_b.unwrap();
9819+
let delegator_a = self.delegator_a.unwrap();
9820+
let delegator_b = self.delegator_b.unwrap();
9821+
let delegation_amount = self.delegation_amount.unwrap();
9822+
let staker_info = system.staker_info_v1(:staker);
9823+
let commission = staker_info.pool_info.unwrap().commission;
9824+
let stake_amount = staker_info.amount_own;
9825+
9826+
// Test get_tokens view.
9827+
let tokens = system.staking.dispatcher().get_tokens();
9828+
let expected_tokens = array![
9829+
(STRK_TOKEN_ADDRESS, true), (system.btc_token.contract_address(), true),
9830+
(token_a.contract_address(), true), (token_b.contract_address(), false),
9831+
]
9832+
.span();
9833+
assert!(tokens == expected_tokens);
9834+
9835+
// Test rewards - only token A.
9836+
system.advance_block_into_attestation_window(:staker);
9837+
system.attest(:staker);
9838+
system.advance_epoch();
9839+
let staker_rewards = system.staker_claim_rewards(:staker);
9840+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_v2(
9841+
:staker_info,
9842+
staking_contract: system.staking.address,
9843+
minting_curve_contract: system.minting_curve.address,
9844+
);
9845+
assert!(expected_staker_rewards.is_non_zero());
9846+
let rewards_a = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
9847+
let rewards_b = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
9848+
let (expected_commission_rewards, expected_pool_rewards) =
9849+
calculate_staker_btc_pool_rewards_v2(
9850+
pool_balance: delegation_amount,
9851+
:commission,
9852+
staking_contract: system.staking.address,
9853+
minting_curve_contract: system.minting_curve.address,
9854+
token_address: token_a.contract_address(),
9855+
);
9856+
assert!(expected_commission_rewards.is_non_zero());
9857+
assert!(expected_pool_rewards.is_non_zero());
9858+
9859+
assert!(staker_rewards == expected_staker_rewards + expected_commission_rewards);
9860+
assert!(rewards_a == expected_pool_rewards);
9861+
assert!(rewards_b.is_zero());
9862+
9863+
system.start_consensus_rewards();
9864+
system.update_rewards(:staker, disable_rewards: false);
9865+
system.advance_epoch();
9866+
let staker_rewards = system.staker_claim_rewards(:staker);
9867+
let rewards_a = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
9868+
let rewards_b = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
9869+
9870+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_with_balances_v3(
9871+
amount_own: stake_amount,
9872+
pool_amount: Zero::zero(),
9873+
:commission,
9874+
staking_contract: system.staking.address,
9875+
minting_curve_contract: system.minting_curve.address,
9876+
);
9877+
assert!(expected_staker_rewards.is_non_zero());
9878+
let (expected_commission_rewards, expected_pool_rewards) =
9879+
calculate_staker_btc_pool_rewards_v3(
9880+
normalized_pool_balance: NormalizedAmountTrait::from_native_amount(
9881+
amount: delegation_amount, decimals: TEST_BTC_DECIMALS,
9882+
),
9883+
normalized_staker_total_btc_balance: NormalizedAmountTrait::from_native_amount(
9884+
amount: delegation_amount, decimals: TEST_BTC_DECIMALS,
9885+
),
9886+
:commission,
9887+
staking_contract: system.staking.address,
9888+
minting_curve_contract: system.minting_curve.address,
9889+
token_address: token_a.contract_address(),
9890+
);
9891+
assert!(expected_commission_rewards.is_non_zero());
9892+
assert!(expected_pool_rewards.is_non_zero());
9893+
9894+
assert!(staker_rewards == expected_staker_rewards + expected_commission_rewards);
9895+
assert!(rewards_a == expected_pool_rewards);
9896+
assert!(rewards_b.is_zero());
9897+
}
9898+
}

src/flow_test/fork_test.cairo

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,3 +718,19 @@ fn delegator_v0_v1_no_rewards_flow_test() {
718718
};
719719
test_flow_mainnet(ref :flow);
720720
}
721+
722+
#[test]
723+
#[fork("MAINNET_LATEST")]
724+
fn enable_disable_token_before_after_upgrade_flow_test() {
725+
let mut flow = flows::EnableDisableTokenBeforeAfterUpgradeFlow {
726+
token_a: Option::None,
727+
token_b: Option::None,
728+
staker: Option::None,
729+
pool_a: Option::None,
730+
pool_b: Option::None,
731+
delegator_a: Option::None,
732+
delegator_b: Option::None,
733+
delegation_amount: Option::None,
734+
};
735+
test_flow_mainnet(ref :flow);
736+
}

0 commit comments

Comments
 (0)