Skip to content

Commit 4c26f6d

Browse files
test: add balances delay flow
1 parent 631614f commit 4c26f6d

File tree

3 files changed

+274
-6
lines changed

3 files changed

+274
-6
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ more ideas:
7171
- staker enter in V0, advance epoch, update balance, advance epoch, update balance, upgrade to V3, attest
7272
- staker enter in V1, advance epoch, update balance, advance epoch, update balance, upgrade to V3, attest
7373
- staker in V2, update balance staker+update balance pool, upgrade, attest in current epoch, attest in next epoch, attest in next next epoch
74-
- staker in V2, update balance staker+update balance pool, upgrade, update balance staker+update balance pool, attest in current epoch, attest in next epoch, attest in next next epoch
7574
- staker in V2, advance epoch, update balance staker+update balance pool, advance epoch, update balance staker+update balance pool, upgrade, update balance staker+update balance pool, attest in current epoch, attest in next epoch, attest in next next epoch
7675

7776
## pool member balance at curr epoch migration

src/flow_test/flows.cairo

Lines changed: 257 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ 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_v2,
39-
calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit,
40-
declare_pool_contract, declare_pool_eic_contract, declare_staking_contract,
41-
load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0, to_amount_18_decimals,
42-
upgrade_implementation,
38+
calculate_staker_strk_rewards_v2, calculate_staker_strk_rewards_with_balances_v2,
39+
calculate_strk_pool_rewards_v2, calculate_strk_pool_rewards_with_pool_balance_v2,
40+
compute_rewards_per_unit, declare_pool_contract, declare_pool_eic_contract,
41+
declare_staking_contract, load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0,
42+
to_amount_18_decimals, upgrade_implementation,
4343
};
4444
use staking::types::{Amount, Commission};
4545
use starknet::{ClassHash, ContractAddress, Store};
@@ -7141,3 +7141,255 @@ pub(crate) impl ToggleTokensBeforeAfterUpgradeFlowImpl of FlowTrait<
71417141
assert!(tokens == expected_tokens);
71427142
}
71437143
}
7144+
7145+
/// Flow:
7146+
/// Epoch 0:
7147+
/// Staker stake
7148+
/// Epoch 1:
7149+
/// Staker increase stake
7150+
/// Delegators delegate STRK and BTC
7151+
/// Upgrade
7152+
/// Staker increase stake
7153+
/// Delegators increase delegation STRK and BTC
7154+
/// Test total staking power - according to Epoch 0
7155+
/// Test staker balance with attestation rewards - according to Epoch 0
7156+
/// Epoch 2:
7157+
/// Test delegator balances with attestation rewards - according to Epoch 0
7158+
/// Test total staking power - according to Epoch 1 (pre-upgrade)
7159+
/// Test staker balance with attestation rewards - according to Epoch 1 (pre-upgrade)
7160+
/// Epoch 3:
7161+
/// Test delegator balances with attestation rewards - according to Epoch 1 (pre-upgrade)
7162+
/// Test total staking power - according to Epoch 1 (post-upgrade)
7163+
/// Test staker balance with attestation rewards - according to Epoch 1 (post-upgrade)
7164+
/// Epoch 4:
7165+
/// Test delegator balances with attestation rewards - according to Epoch 1 (post-upgrade)
7166+
#[derive(Drop, Copy)]
7167+
pub(crate) struct BalancesDelayFlow {
7168+
pub(crate) staker: Option<Staker>,
7169+
pub(crate) stake_amount: Option<Amount>,
7170+
pub(crate) commission: Option<Commission>,
7171+
pub(crate) strk_delegated_amount: Option<Amount>,
7172+
pub(crate) btc_delegated_amount: Option<Amount>,
7173+
pub(crate) strk_delegator: Option<Delegator>,
7174+
pub(crate) btc_delegator: Option<Delegator>,
7175+
pub(crate) strk_pool: Option<ContractAddress>,
7176+
pub(crate) btc_pool: Option<ContractAddress>,
7177+
}
7178+
pub(crate) impl BalancesDelayFlowImpl of FlowTrait<BalancesDelayFlow> {
7179+
fn setup_v2(ref self: BalancesDelayFlow, ref system: SystemState) {
7180+
let stake_amount = system.staking.get_min_stake();
7181+
let strk_delegated_amount = STRK_CONFIG.min_for_rewards;
7182+
let btc_delegated_amount = TEST_MIN_BTC_FOR_REWARDS;
7183+
let staker = system.new_staker(amount: stake_amount * 3);
7184+
let commission = 200;
7185+
let strk_delegator = system.new_delegator(amount: strk_delegated_amount * 2);
7186+
let btc_delegator = system
7187+
.new_btc_delegator(amount: btc_delegated_amount * 2, token: system.btc_token);
7188+
7189+
system.stake(:staker, amount: stake_amount, pool_enabled: true, :commission);
7190+
let strk_pool = system.staking.get_pool(:staker);
7191+
let btc_pool = system
7192+
.set_open_for_delegation(:staker, token_address: system.btc_token.contract_address());
7193+
7194+
system.advance_epoch(); // Epoch 0 - > 1
7195+
system.increase_stake(:staker, amount: stake_amount);
7196+
system.delegate(delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount);
7197+
system
7198+
.delegate_btc(
7199+
delegator: btc_delegator,
7200+
pool: btc_pool,
7201+
amount: btc_delegated_amount,
7202+
token: system.btc_token,
7203+
);
7204+
7205+
system.set_staker_for_migration(staker_address: staker.staker.address);
7206+
self.staker = Option::Some(staker);
7207+
self.stake_amount = Option::Some(stake_amount);
7208+
self.commission = Option::Some(commission);
7209+
self.strk_delegated_amount = Option::Some(strk_delegated_amount);
7210+
self.btc_delegated_amount = Option::Some(btc_delegated_amount);
7211+
self.strk_delegator = Option::Some(strk_delegator);
7212+
self.btc_delegator = Option::Some(btc_delegator);
7213+
self.strk_pool = Option::Some(strk_pool);
7214+
self.btc_pool = Option::Some(btc_pool);
7215+
}
7216+
7217+
#[feature("safe_dispatcher")]
7218+
fn test(self: BalancesDelayFlow, ref system: SystemState) {
7219+
let staker = self.staker.unwrap();
7220+
let stake_amount = self.stake_amount.unwrap();
7221+
let commission = self.commission.unwrap();
7222+
let strk_delegated_amount = self.strk_delegated_amount.unwrap();
7223+
let btc_delegated_amount = self.btc_delegated_amount.unwrap();
7224+
let strk_delegator = self.strk_delegator.unwrap();
7225+
let btc_delegator = self.btc_delegator.unwrap();
7226+
let strk_pool = self.strk_pool.unwrap();
7227+
let btc_pool = self.btc_pool.unwrap();
7228+
7229+
let staking_contract = system.staking.address;
7230+
let minting_curve_contract = system.minting_curve.address;
7231+
7232+
// Increase stake and delegations.
7233+
system.increase_stake(:staker, amount: stake_amount);
7234+
system
7235+
.increase_delegate(
7236+
delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount,
7237+
);
7238+
system
7239+
.increase_delegate_btc(
7240+
delegator: btc_delegator,
7241+
pool: btc_pool,
7242+
amount: btc_delegated_amount,
7243+
token: system.btc_token,
7244+
);
7245+
7246+
// Test total staking power - according to Epoch 0.
7247+
let staker_stake = stake_amount;
7248+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
7249+
let expected_total_staking_power = (
7250+
NormalizedAmountTrait::from_strk_native_amount(staker_stake), Zero::zero(),
7251+
);
7252+
assert!(total_staking_power == expected_total_staking_power);
7253+
7254+
// Calculate expected rewards - according to Epoch 0.
7255+
let (expected_staker_rewards, _) = calculate_staker_strk_rewards_with_balances_v2(
7256+
amount_own: staker_stake,
7257+
pool_amount: Zero::zero(),
7258+
:commission,
7259+
:staking_contract,
7260+
:minting_curve_contract,
7261+
);
7262+
assert!(expected_staker_rewards.is_non_zero());
7263+
7264+
// Test staker balance with attestation rewards - according to Epoch 0.
7265+
system
7266+
.advance_block_into_attestation_window_custom_stake(
7267+
staker_address: staker.staker.address, stake: staker_stake,
7268+
);
7269+
system.attest(:staker);
7270+
let staker_rewards = system.staker_claim_rewards(:staker);
7271+
assert!(staker_rewards == expected_staker_rewards);
7272+
7273+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 0.
7274+
system.advance_epoch(); // Epoch 1 - > 2
7275+
let strk_delegator_rewards = system
7276+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
7277+
let btc_delegator_rewards = system
7278+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
7279+
assert!(strk_delegator_rewards == Zero::zero());
7280+
assert!(btc_delegator_rewards == Zero::zero());
7281+
7282+
// Update variables for Epoch 1 (pre-upgrade).
7283+
let staker_stake = staker_stake + stake_amount;
7284+
let strk_pool_balance = strk_delegated_amount;
7285+
let btc_pool_balance = btc_delegated_amount;
7286+
7287+
// Test total staking power - according to Epoch 1 (pre-upgrade).
7288+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
7289+
let expected_total_staking_power = (
7290+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
7291+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
7292+
);
7293+
assert!(total_staking_power == expected_total_staking_power);
7294+
7295+
// Calculate expected rewards - according to Epoch 1 (pre-upgrade).
7296+
let prev_staker_rewards = expected_staker_rewards;
7297+
let (expected_staker_rewards, expected_strk_pool_rewards) =
7298+
calculate_staker_strk_rewards_with_balances_v2(
7299+
amount_own: staker_stake,
7300+
pool_amount: strk_pool_balance,
7301+
:commission,
7302+
:staking_contract,
7303+
:minting_curve_contract,
7304+
);
7305+
assert!(expected_staker_rewards > prev_staker_rewards);
7306+
assert!(expected_strk_pool_rewards.is_non_zero());
7307+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
7308+
calculate_staker_btc_pool_rewards_v2(
7309+
pool_balance: btc_pool_balance,
7310+
:commission,
7311+
:staking_contract,
7312+
:minting_curve_contract,
7313+
token_address: system.btc_token.contract_address(),
7314+
);
7315+
assert!(expected_btc_commission_rewards.is_non_zero());
7316+
assert!(expected_btc_pool_rewards.is_non_zero());
7317+
7318+
// Test staker balance with attestation rewards - according to Epoch 1 (pre-upgrade).
7319+
system
7320+
.advance_block_into_attestation_window_custom_stake(
7321+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
7322+
);
7323+
system.attest(:staker);
7324+
let staker_rewards = system.staker_claim_rewards(:staker);
7325+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
7326+
7327+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 1
7328+
// (pre-upgrade).
7329+
system.advance_epoch(); // Epoch 2 - > 3
7330+
let strk_delegator_rewards = system
7331+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
7332+
let btc_delegator_rewards = system
7333+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
7334+
assert!(strk_delegator_rewards == expected_strk_pool_rewards);
7335+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
7336+
7337+
// Update variables for Epoch 1 (post-upgrade).
7338+
let staker_stake = staker_stake + stake_amount;
7339+
let strk_pool_balance = strk_pool_balance + strk_delegated_amount;
7340+
let btc_pool_balance = btc_pool_balance + btc_delegated_amount;
7341+
7342+
// Test total staking power - according to Epoch 1 (post-upgrade).
7343+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
7344+
let expected_total_staking_power = (
7345+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
7346+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
7347+
);
7348+
assert!(total_staking_power == expected_total_staking_power);
7349+
7350+
// Calculate expected rewards - according to Epoch 1 (post-upgrade).
7351+
let prev_staker_rewards = expected_staker_rewards;
7352+
let prev_strk_pool_rewards = expected_strk_pool_rewards;
7353+
let prev_btc_commission_rewards = expected_btc_commission_rewards;
7354+
let prev_btc_pool_rewards = expected_btc_pool_rewards;
7355+
let (expected_staker_rewards, expected_strk_pool_rewards) =
7356+
calculate_staker_strk_rewards_with_balances_v2(
7357+
amount_own: staker_stake,
7358+
pool_amount: strk_pool_balance,
7359+
:commission,
7360+
:staking_contract,
7361+
:minting_curve_contract,
7362+
);
7363+
assert!(expected_staker_rewards > prev_staker_rewards);
7364+
assert!(expected_strk_pool_rewards > prev_strk_pool_rewards);
7365+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
7366+
calculate_staker_btc_pool_rewards_v2(
7367+
pool_balance: btc_pool_balance,
7368+
:commission,
7369+
:staking_contract,
7370+
:minting_curve_contract,
7371+
token_address: system.btc_token.contract_address(),
7372+
);
7373+
assert!(expected_btc_commission_rewards > prev_btc_commission_rewards);
7374+
assert!(expected_btc_pool_rewards > prev_btc_pool_rewards);
7375+
7376+
// Test staker balance with attestation rewards - according to Epoch 1 (post-upgrade).
7377+
system
7378+
.advance_block_into_attestation_window_custom_stake(
7379+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
7380+
);
7381+
system.attest(:staker);
7382+
let staker_rewards = system.staker_claim_rewards(:staker);
7383+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
7384+
7385+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 1
7386+
// (post-upgrade).
7387+
system.advance_epoch(); // Epoch 3 - > 4
7388+
let strk_delegator_rewards = system
7389+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
7390+
let btc_delegator_rewards = system
7391+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
7392+
assert!(strk_delegator_rewards == expected_strk_pool_rewards);
7393+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
7394+
}
7395+
}

src/flow_test/fork_test.cairo

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,3 +452,20 @@ 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 balances_delay_flow_test() {
459+
let mut flow = flows::BalancesDelayFlow {
460+
staker: Option::None,
461+
stake_amount: Option::None,
462+
commission: Option::None,
463+
strk_delegated_amount: Option::None,
464+
btc_delegated_amount: Option::None,
465+
strk_delegator: Option::None,
466+
btc_delegator: Option::None,
467+
strk_pool: Option::None,
468+
btc_pool: Option::None,
469+
};
470+
test_flow_mainnet(ref :flow);
471+
}

0 commit comments

Comments
 (0)