Skip to content

Commit 87dd152

Browse files
test: add token state after upgrade flow
1 parent 1765bb9 commit 87dd152

File tree

3 files changed

+125
-3
lines changed

3 files changed

+125
-3
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,3 @@ more ideas:
8787
- Member from V0, no action at V1, change balance at V2, test curr balance
8888
- Member from V2, change balance, upgrade, test curr balance
8989
- Cover all ifs with migration from: V0, V1, V2.
90-
91-
## k=1 -> k=2 token
92-
- enable token A and disable token B, next epoch upgrade, test views and rewards.

src/flow_test/flows.cairo

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use staking::pool::pool::Pool::STRK_CONFIG;
2222
use staking::pool::utils::compute_rewards_rounded_down;
2323
use staking::staking::errors::Error as StakingError;
2424
use staking::staking::interface::{
25+
IStakingAttestationDispatcher, IStakingAttestationDispatcherTrait,
2526
IStakingConsensusDispatcherTrait, IStakingConsensusSafeDispatcherTrait, IStakingDispatcherTrait,
2627
IStakingMigrationSafeDispatcherTrait, IStakingSafeDispatcherTrait, PoolInfo, StakerInfoV1,
2728
StakerInfoV1Trait, StakerPoolInfoV2,
@@ -7141,3 +7142,111 @@ pub(crate) impl ToggleTokensBeforeAfterUpgradeFlowImpl of FlowTrait<
71417142
assert!(tokens == expected_tokens);
71427143
}
71437144
}
7145+
7146+
/// Flow:
7147+
/// Add tokens A and B
7148+
/// Enable token B
7149+
/// Advance epoch
7150+
/// Enable token A, disable token B
7151+
/// Advance epoch
7152+
/// Upgrade - test views and rewards
7153+
#[derive(Drop, Copy)]
7154+
pub(crate) struct EnableDisableTokenBeforeAfterUpgradeFlow {
7155+
pub(crate) token_a: Option<Token>,
7156+
pub(crate) token_b: Option<Token>,
7157+
pub(crate) staker: Option<Staker>,
7158+
pub(crate) pool_a: Option<ContractAddress>,
7159+
pub(crate) pool_b: Option<ContractAddress>,
7160+
pub(crate) delegator_a: Option<Delegator>,
7161+
pub(crate) delegator_b: Option<Delegator>,
7162+
pub(crate) delegation_amount: Option<Amount>,
7163+
}
7164+
pub(crate) impl EnableDisableTokenBeforeAfterUpgradeFlowImpl of FlowTrait<
7165+
EnableDisableTokenBeforeAfterUpgradeFlow,
7166+
> {
7167+
fn setup_v2(ref self: EnableDisableTokenBeforeAfterUpgradeFlow, ref system: SystemState) {
7168+
let token_a = system.deploy_new_btc_token(name: "TOKEN_A", decimals: TEST_BTC_DECIMALS);
7169+
let token_b = system.deploy_new_btc_token(name: "TOKEN_B", decimals: TEST_BTC_DECIMALS);
7170+
system.staking.add_token(token_address: token_a.contract_address());
7171+
system.staking.add_token(token_address: token_b.contract_address());
7172+
system.staking.enable_token(token_address: token_b.contract_address());
7173+
7174+
let stake_amount = system.staking.get_min_stake();
7175+
let delegation_amount = TEST_MIN_BTC_FOR_REWARDS;
7176+
let staker = system.new_staker(amount: stake_amount);
7177+
system.stake(:staker, amount: stake_amount, pool_enabled: true, commission: 200);
7178+
let pool_a = system
7179+
.set_open_for_delegation(:staker, token_address: token_a.contract_address());
7180+
let pool_b = system
7181+
.set_open_for_delegation(:staker, token_address: token_b.contract_address());
7182+
let delegator_a = system.new_btc_delegator(amount: delegation_amount, token: token_a);
7183+
let delegator_b = system.new_btc_delegator(amount: delegation_amount, token: token_b);
7184+
system
7185+
.delegate_btc(
7186+
delegator: delegator_a, pool: pool_a, amount: delegation_amount, token: token_a,
7187+
);
7188+
system
7189+
.delegate_btc(
7190+
delegator: delegator_b, pool: pool_b, amount: delegation_amount, token: token_b,
7191+
);
7192+
7193+
system.advance_epoch();
7194+
system.staking.disable_token(token_address: token_b.contract_address());
7195+
system.staking.enable_token(token_address: token_a.contract_address());
7196+
7197+
system.advance_epoch();
7198+
system.set_staker_for_migration(staker_address: staker.staker.address);
7199+
self.token_a = Option::Some(token_a);
7200+
self.token_b = Option::Some(token_b);
7201+
self.staker = Option::Some(staker);
7202+
self.pool_a = Option::Some(pool_a);
7203+
self.pool_b = Option::Some(pool_b);
7204+
self.delegator_a = Option::Some(delegator_a);
7205+
self.delegator_b = Option::Some(delegator_b);
7206+
self.delegation_amount = Option::Some(delegation_amount);
7207+
}
7208+
7209+
fn test(self: EnableDisableTokenBeforeAfterUpgradeFlow, ref system: SystemState) {
7210+
let token_a = self.token_a.unwrap();
7211+
let token_b = self.token_b.unwrap();
7212+
let staker = self.staker.unwrap();
7213+
let pool_a = self.pool_a.unwrap();
7214+
let pool_b = self.pool_b.unwrap();
7215+
let delegator_a = self.delegator_a.unwrap();
7216+
let delegator_b = self.delegator_b.unwrap();
7217+
let delegation_amount = self.delegation_amount.unwrap();
7218+
let staking_attestation = IStakingAttestationDispatcher {
7219+
contract_address: system.staking.address,
7220+
};
7221+
7222+
// Test get_tokens view.
7223+
let tokens = system.staking.dispatcher().get_tokens();
7224+
let expected_tokens = array![
7225+
(STRK_TOKEN_ADDRESS, true), (system.btc_token.contract_address(), true),
7226+
(token_a.contract_address(), true), (token_b.contract_address(), false),
7227+
]
7228+
.span();
7229+
assert!(tokens == expected_tokens);
7230+
7231+
// Test rewards - only token A.
7232+
cheat_caller_address_once(
7233+
contract_address: system.staking.address,
7234+
caller_address: system.attestation.unwrap().address,
7235+
);
7236+
staking_attestation
7237+
.update_rewards_from_attestation_contract(staker_address: staker.staker.address);
7238+
system.advance_epoch();
7239+
let rewards_a = system.delegator_claim_rewards(delegator: delegator_a, pool: pool_a);
7240+
let rewards_b = system.delegator_claim_rewards(delegator: delegator_b, pool: pool_b);
7241+
let (_, expected_rewards) = calculate_staker_btc_pool_rewards_v2(
7242+
pool_balance: delegation_amount,
7243+
commission: 200,
7244+
staking_contract: system.staking.address,
7245+
minting_curve_contract: system.minting_curve.address,
7246+
token_address: token_a.contract_address(),
7247+
);
7248+
assert!(expected_rewards.is_non_zero());
7249+
assert!(rewards_a == expected_rewards);
7250+
assert!(rewards_b.is_zero());
7251+
}
7252+
}

src/flow_test/fork_test.cairo

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,3 +452,19 @@ fn toggle_tokens_before_after_upgrade_flow_test() {
452452
};
453453
test_flow_mainnet(ref :flow);
454454
}
455+
456+
#[test]
457+
#[fork("MAINNET_LATEST")]
458+
fn enable_disable_token_before_after_upgrade_flow_test() {
459+
let mut flow = flows::EnableDisableTokenBeforeAfterUpgradeFlow {
460+
token_a: Option::None,
461+
token_b: Option::None,
462+
staker: Option::None,
463+
pool_a: Option::None,
464+
pool_b: Option::None,
465+
delegator_a: Option::None,
466+
delegator_b: Option::None,
467+
delegation_amount: Option::None,
468+
};
469+
test_flow_mainnet(ref :flow);
470+
}

0 commit comments

Comments
 (0)