Skip to content

Commit 6fa473d

Browse files
test: add token state after upgrade flow
1 parent ddcbf57 commit 6fa473d

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
@@ -48,6 +48,3 @@ more ideas:
4848
- Member from V0, change balance at V1, no action at V2, test curr balance
4949
- Member from V2, change balance, upgrade, test curr balance
5050
- Cover all ifs with migration from: V0, V1, V2.
51-
52-
## k=1 -> k=2 token
53-
- 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,
@@ -9064,3 +9064,153 @@ pub(crate) impl StakerV1ChangeBalanceAttestFlowImpl of FlowTrait<StakerV1ChangeB
90649064
assert!(system.staker_claim_rewards(:staker) == expected_rewards);
90659065
}
90669066
}
9067+
9068+
/// Flow:
9069+
/// Add tokens A and B
9070+
/// Delegate for both tokens
9071+
/// Enable token A, disable token B
9072+
/// Advance epoch
9073+
/// Upgrade - test views and rewards
9074+
/// Start consensus rewards - test rewards
9075+
#[derive(Drop, Copy)]
9076+
pub(crate) struct EnableDisableTokenBeforeAfterUpgradeFlow {
9077+
pub(crate) token_a: Option<Token>,
9078+
pub(crate) token_b: Option<Token>,
9079+
pub(crate) staker: Option<Staker>,
9080+
pub(crate) pool_a: Option<ContractAddress>,
9081+
pub(crate) pool_b: Option<ContractAddress>,
9082+
pub(crate) delegator_a: Option<Delegator>,
9083+
pub(crate) delegator_b: Option<Delegator>,
9084+
pub(crate) delegation_amount: Option<Amount>,
9085+
}
9086+
pub(crate) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait<
9087+
EnableDisableTokenBeforeAfterUpgradeFlow,
9088+
> {
9089+
fn setup_v2(ref self: EnableDisableTokenBeforeAfterUpgradeFlow, ref system: SystemState) {
9090+
let token_a = system.deploy_new_btc_token(name: "TOKEN_A", decimals: TEST_BTC_DECIMALS);
9091+
let token_b = system.deploy_new_btc_token(name: "TOKEN_B", decimals: TEST_BTC_DECIMALS);
9092+
system.staking.add_token(token_address: token_a.contract_address());
9093+
system.staking.add_token(token_address: token_b.contract_address());
9094+
system.staking.enable_token(token_address: token_b.contract_address());
9095+
9096+
let stake_amount = system.staking.get_min_stake();
9097+
let delegation_amount = TEST_MIN_BTC_FOR_REWARDS;
9098+
let staker = system.new_staker(amount: stake_amount);
9099+
system.stake(:staker, amount: stake_amount, pool_enabled: true, commission: 200);
9100+
let pool_a = system
9101+
.set_open_for_delegation(:staker, token_address: token_a.contract_address());
9102+
let pool_b = system
9103+
.set_open_for_delegation(:staker, token_address: token_b.contract_address());
9104+
let delegator_a = system.new_btc_delegator(amount: delegation_amount, token: token_a);
9105+
let delegator_b = system.new_btc_delegator(amount: delegation_amount, token: token_b);
9106+
system
9107+
.delegate_btc(
9108+
delegator: delegator_a, pool: pool_a, amount: delegation_amount, token: token_a,
9109+
);
9110+
system
9111+
.delegate_btc(
9112+
delegator: delegator_b, pool: pool_b, amount: delegation_amount, token: token_b,
9113+
);
9114+
9115+
system.advance_epoch();
9116+
system.staking.disable_token(token_address: token_b.contract_address());
9117+
system.staking.enable_token(token_address: token_a.contract_address());
9118+
9119+
system.advance_epoch();
9120+
system.set_staker_for_migration(staker_address: staker.staker.address);
9121+
self.token_a = Option::Some(token_a);
9122+
self.token_b = Option::Some(token_b);
9123+
self.staker = Option::Some(staker);
9124+
self.pool_a = Option::Some(pool_a);
9125+
self.pool_b = Option::Some(pool_b);
9126+
self.delegator_a = Option::Some(delegator_a);
9127+
self.delegator_b = Option::Some(delegator_b);
9128+
self.delegation_amount = Option::Some(delegation_amount);
9129+
}
9130+
9131+
fn test(self: EnableDisableTokenBeforeAfterUpgradeFlow, ref system: SystemState) {
9132+
let token_a = self.token_a.unwrap();
9133+
let token_b = self.token_b.unwrap();
9134+
let staker = self.staker.unwrap();
9135+
let pool_a = self.pool_a.unwrap();
9136+
let pool_b = self.pool_b.unwrap();
9137+
let delegator_a = self.delegator_a.unwrap();
9138+
let delegator_b = self.delegator_b.unwrap();
9139+
let delegation_amount = self.delegation_amount.unwrap();
9140+
let staker_info = system.staker_info_v1(:staker);
9141+
let commission = staker_info.pool_info.unwrap().commission;
9142+
let stake_amount = staker_info.amount_own;
9143+
9144+
// Test get_tokens view.
9145+
let tokens = system.staking.dispatcher().get_tokens();
9146+
let expected_tokens = array![
9147+
(STRK_TOKEN_ADDRESS, true), (system.btc_token.contract_address(), true),
9148+
(token_a.contract_address(), true), (token_b.contract_address(), false),
9149+
]
9150+
.span();
9151+
assert!(tokens == expected_tokens);
9152+
9153+
// Test rewards - only token A.
9154+
system.advance_block_into_attestation_window(:staker);
9155+
system.attest(:staker);
9156+
system.advance_epoch();
9157+
let staker_rewards = system.staker_claim_rewards(:staker);
9158+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_v2(
9159+
:staker_info,
9160+
staking_contract: system.staking.address,
9161+
minting_curve_contract: system.minting_curve.address,
9162+
);
9163+
assert!(expected_staker_rewards.is_non_zero());
9164+
let rewards_a = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
9165+
let rewards_b = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
9166+
let (expected_commission_rewards, expected_pool_rewards) =
9167+
calculate_staker_btc_pool_rewards_v2(
9168+
pool_balance: delegation_amount,
9169+
:commission,
9170+
staking_contract: system.staking.address,
9171+
minting_curve_contract: system.minting_curve.address,
9172+
token_address: token_a.contract_address(),
9173+
);
9174+
assert!(expected_commission_rewards.is_non_zero());
9175+
assert!(expected_pool_rewards.is_non_zero());
9176+
9177+
assert!(staker_rewards == expected_staker_rewards + expected_commission_rewards);
9178+
assert!(rewards_a == expected_pool_rewards);
9179+
assert!(rewards_b.is_zero());
9180+
9181+
system.start_consensus_rewards();
9182+
system.update_rewards(:staker, disable_rewards: false);
9183+
system.advance_epoch();
9184+
let staker_rewards = system.staker_claim_rewards(:staker);
9185+
let rewards_a = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
9186+
let rewards_b = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
9187+
9188+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_with_balances_v3(
9189+
amount_own: stake_amount,
9190+
pool_amount: Zero::zero(),
9191+
:commission,
9192+
staking_contract: system.staking.address,
9193+
minting_curve_contract: system.minting_curve.address,
9194+
);
9195+
assert!(expected_staker_rewards.is_non_zero());
9196+
let (expected_commission_rewards, expected_pool_rewards) =
9197+
calculate_staker_btc_pool_rewards_v3(
9198+
normalized_pool_balance: NormalizedAmountTrait::from_native_amount(
9199+
amount: delegation_amount, decimals: TEST_BTC_DECIMALS,
9200+
),
9201+
normalized_staker_total_btc_balance: NormalizedAmountTrait::from_native_amount(
9202+
amount: delegation_amount, decimals: TEST_BTC_DECIMALS,
9203+
),
9204+
:commission,
9205+
staking_contract: system.staking.address,
9206+
minting_curve_contract: system.minting_curve.address,
9207+
token_address: token_a.contract_address(),
9208+
);
9209+
assert!(expected_commission_rewards.is_non_zero());
9210+
assert!(expected_pool_rewards.is_non_zero());
9211+
9212+
assert!(staker_rewards == expected_staker_rewards + expected_commission_rewards);
9213+
assert!(rewards_a == expected_pool_rewards);
9214+
assert!(rewards_b.is_zero());
9215+
}
9216+
}

src/flow_test/fork_test.cairo

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,3 +604,19 @@ fn delegator_rewards_v0_find_sigma_flow_test() {
604604
};
605605
test_flow_mainnet(ref :flow);
606606
}
607+
608+
#[test]
609+
#[fork("MAINNET_LATEST")]
610+
fn enable_disable_token_before_after_upgrade_flow_test() {
611+
let mut flow = flows::EnableDisableTokenBeforeAfterUpgradeFlow {
612+
token_a: Option::None,
613+
token_b: Option::None,
614+
staker: Option::None,
615+
pool_a: Option::None,
616+
pool_b: Option::None,
617+
delegator_a: Option::None,
618+
delegator_b: Option::None,
619+
delegation_amount: Option::None,
620+
};
621+
test_flow_mainnet(ref :flow);
622+
}

0 commit comments

Comments
 (0)