Skip to content

Commit 65039fa

Browse files
test: add another balances delay flow
1 parent 33b6d35 commit 65039fa

File tree

3 files changed

+298
-1
lines changed

3 files changed

+298
-1
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ more ideas:
7070
- staker enter in V1, advance epoch, update balance, upgrade to V3, attest, update balance, advance epoch, attest
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
73-
- 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
7473

7574
## pool member balance at curr epoch migration
7675
- Member from V0, no actions in V1 or V2, test curr balance

src/flow_test/flows.cairo

Lines changed: 281 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7388,3 +7388,284 @@ pub(crate) impl BalancesDelayFlowImpl of FlowTrait<BalancesDelayFlow> {
73887388
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
73897389
}
73907390
}
7391+
7392+
/// Flow:
7393+
/// Epoch 0:
7394+
/// Staker stake
7395+
/// Epoch 1:
7396+
/// Staker increase stake
7397+
/// Delegators delegate STRK and BTC
7398+
/// Epoch 2:
7399+
/// Staker increase stake
7400+
/// Delegators delegate STRK and BTC
7401+
/// Upgrade
7402+
/// Staker increase stake
7403+
/// Delegators increase delegation STRK and BTC
7404+
/// Test total staking power - according to Epoch 1
7405+
/// Test staker balance with attestation rewards - according to Epoch 1
7406+
/// Epoch 2:
7407+
/// Test delegator balances with attestation rewards - according to Epoch 1
7408+
/// Test total staking power - according to Epoch 2 (pre-upgrade)
7409+
/// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade)
7410+
/// Epoch 3:
7411+
/// Test delegator balances with attestation rewards - according to Epoch 2 (pre-upgrade)
7412+
/// Test total staking power - according to Epoch 2 (post-upgrade)
7413+
/// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade)
7414+
/// Epoch 4:
7415+
/// Test delegator balances with attestation rewards - according to Epoch 2 (post-upgrade)
7416+
#[derive(Drop, Copy)]
7417+
pub(crate) struct BalanceChangeUpgradeBalancesDelayFlow {
7418+
pub(crate) staker: Option<Staker>,
7419+
pub(crate) stake_amount: Option<Amount>,
7420+
pub(crate) commission: Option<Commission>,
7421+
pub(crate) strk_delegated_amount: Option<Amount>,
7422+
pub(crate) btc_delegated_amount: Option<Amount>,
7423+
pub(crate) strk_delegator: Option<Delegator>,
7424+
pub(crate) btc_delegator: Option<Delegator>,
7425+
pub(crate) strk_pool: Option<ContractAddress>,
7426+
pub(crate) btc_pool: Option<ContractAddress>,
7427+
}
7428+
pub(crate) impl BalanceChangeUpgradeBalancesDelayFlowImpl of FlowTrait<
7429+
BalanceChangeUpgradeBalancesDelayFlow,
7430+
> {
7431+
fn setup_v2(ref self: BalanceChangeUpgradeBalancesDelayFlow, ref system: SystemState) {
7432+
let stake_amount = system.staking.get_min_stake();
7433+
let strk_delegated_amount = STRK_CONFIG.min_for_rewards;
7434+
let btc_delegated_amount = TEST_MIN_BTC_FOR_REWARDS;
7435+
let staker = system.new_staker(amount: stake_amount * 4);
7436+
let commission = 200;
7437+
let strk_delegator = system.new_delegator(amount: strk_delegated_amount * 3);
7438+
let btc_delegator = system
7439+
.new_btc_delegator(amount: btc_delegated_amount * 3, token: system.btc_token);
7440+
7441+
system.stake(:staker, amount: stake_amount, pool_enabled: true, :commission);
7442+
let strk_pool = system.staking.get_pool(:staker);
7443+
let btc_pool = system
7444+
.set_open_for_delegation(:staker, token_address: system.btc_token.contract_address());
7445+
7446+
system.advance_epoch(); // Epoch 0 - > 1
7447+
system.increase_stake(:staker, amount: stake_amount);
7448+
system.delegate(delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount);
7449+
system
7450+
.delegate_btc(
7451+
delegator: btc_delegator,
7452+
pool: btc_pool,
7453+
amount: btc_delegated_amount,
7454+
token: system.btc_token,
7455+
);
7456+
7457+
system.advance_epoch(); // Epoch 1 - > 2
7458+
system.increase_stake(:staker, amount: stake_amount);
7459+
system
7460+
.increase_delegate(
7461+
delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount,
7462+
);
7463+
system
7464+
.increase_delegate_btc(
7465+
delegator: btc_delegator,
7466+
pool: btc_pool,
7467+
amount: btc_delegated_amount,
7468+
token: system.btc_token,
7469+
);
7470+
7471+
system.set_staker_for_migration(staker_address: staker.staker.address);
7472+
self.staker = Option::Some(staker);
7473+
self.stake_amount = Option::Some(stake_amount);
7474+
self.commission = Option::Some(commission);
7475+
self.strk_delegated_amount = Option::Some(strk_delegated_amount);
7476+
self.btc_delegated_amount = Option::Some(btc_delegated_amount);
7477+
self.strk_delegator = Option::Some(strk_delegator);
7478+
self.btc_delegator = Option::Some(btc_delegator);
7479+
self.strk_pool = Option::Some(strk_pool);
7480+
self.btc_pool = Option::Some(btc_pool);
7481+
}
7482+
7483+
#[feature("safe_dispatcher")]
7484+
fn test(self: BalanceChangeUpgradeBalancesDelayFlow, ref system: SystemState) {
7485+
let staker = self.staker.unwrap();
7486+
let stake_amount = self.stake_amount.unwrap();
7487+
let commission = self.commission.unwrap();
7488+
let strk_delegated_amount = self.strk_delegated_amount.unwrap();
7489+
let btc_delegated_amount = self.btc_delegated_amount.unwrap();
7490+
let strk_delegator = self.strk_delegator.unwrap();
7491+
let btc_delegator = self.btc_delegator.unwrap();
7492+
let strk_pool = self.strk_pool.unwrap();
7493+
let btc_pool = self.btc_pool.unwrap();
7494+
7495+
let staking_contract = system.staking.address;
7496+
let minting_curve_contract = system.minting_curve.address;
7497+
7498+
// Increase stake and delegations.
7499+
system.increase_stake(:staker, amount: stake_amount);
7500+
system
7501+
.increase_delegate(
7502+
delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount,
7503+
);
7504+
system
7505+
.increase_delegate_btc(
7506+
delegator: btc_delegator,
7507+
pool: btc_pool,
7508+
amount: btc_delegated_amount,
7509+
token: system.btc_token,
7510+
);
7511+
7512+
// Test total staking power - according to Epoch 1.
7513+
let staker_stake = stake_amount * 2;
7514+
let strk_pool_balance = strk_delegated_amount;
7515+
let btc_pool_balance = btc_delegated_amount;
7516+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
7517+
let expected_total_staking_power = (
7518+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
7519+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
7520+
);
7521+
assert!(total_staking_power == expected_total_staking_power);
7522+
7523+
// Calculate expected rewards - according to Epoch 1.
7524+
let (expected_staker_rewards, expected_strk_pool_rewards) =
7525+
calculate_staker_strk_rewards_with_balances_v2(
7526+
amount_own: staker_stake,
7527+
pool_amount: strk_pool_balance,
7528+
:commission,
7529+
:staking_contract,
7530+
:minting_curve_contract,
7531+
);
7532+
assert!(expected_staker_rewards.is_non_zero());
7533+
assert!(expected_strk_pool_rewards.is_non_zero());
7534+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
7535+
calculate_staker_btc_pool_rewards_v2(
7536+
pool_balance: btc_pool_balance,
7537+
:commission,
7538+
:staking_contract,
7539+
:minting_curve_contract,
7540+
token_address: system.btc_token.contract_address(),
7541+
);
7542+
assert!(expected_btc_commission_rewards.is_non_zero());
7543+
assert!(expected_btc_pool_rewards.is_non_zero());
7544+
7545+
// Test staker balance with attestation rewards - according to Epoch 1.
7546+
system
7547+
.advance_block_into_attestation_window_custom_stake(
7548+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
7549+
);
7550+
system.attest(:staker);
7551+
let staker_rewards = system.staker_claim_rewards(:staker);
7552+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
7553+
7554+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 1.
7555+
system.advance_epoch(); // Epoch 2 - > 3
7556+
let strk_delegator_rewards = system
7557+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
7558+
let btc_delegator_rewards = system
7559+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
7560+
assert!(strk_delegator_rewards == expected_strk_pool_rewards);
7561+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
7562+
7563+
// Update variables for Epoch 2 (pre-upgrade).
7564+
let staker_stake = stake_amount * 3;
7565+
let strk_pool_balance = strk_delegated_amount * 2;
7566+
let btc_pool_balance = btc_delegated_amount * 2;
7567+
7568+
// Test total staking power - according to Epoch 2 (pre-upgrade).
7569+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
7570+
let expected_total_staking_power = (
7571+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
7572+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
7573+
);
7574+
assert!(total_staking_power == expected_total_staking_power);
7575+
7576+
// Calculate expected rewards - according to Epoch 2 (pre-upgrade).
7577+
let (expected_staker_rewards, expected_strk_pool_rewards) =
7578+
calculate_staker_strk_rewards_with_balances_v2(
7579+
amount_own: staker_stake,
7580+
pool_amount: strk_pool_balance,
7581+
:commission,
7582+
:staking_contract,
7583+
:minting_curve_contract,
7584+
);
7585+
assert!(expected_staker_rewards.is_non_zero());
7586+
assert!(expected_strk_pool_rewards.is_non_zero());
7587+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
7588+
calculate_staker_btc_pool_rewards_v2(
7589+
pool_balance: btc_pool_balance,
7590+
:commission,
7591+
:staking_contract,
7592+
:minting_curve_contract,
7593+
token_address: system.btc_token.contract_address(),
7594+
);
7595+
assert!(expected_btc_commission_rewards.is_non_zero());
7596+
assert!(expected_btc_pool_rewards.is_non_zero());
7597+
7598+
// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade).
7599+
system
7600+
.advance_block_into_attestation_window_custom_stake(
7601+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
7602+
);
7603+
system.attest(:staker);
7604+
let staker_rewards = system.staker_claim_rewards(:staker);
7605+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
7606+
7607+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
7608+
// (pre-upgrade).
7609+
system.advance_epoch(); // Epoch 3 - > 4
7610+
let strk_delegator_rewards = system
7611+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
7612+
let btc_delegator_rewards = system
7613+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
7614+
assert!(strk_delegator_rewards == expected_strk_pool_rewards);
7615+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
7616+
7617+
// Update variables for Epoch 2 (post-upgrade).
7618+
let staker_stake = stake_amount * 4;
7619+
let strk_pool_balance = strk_delegated_amount * 3;
7620+
let btc_pool_balance = btc_delegated_amount * 3;
7621+
7622+
// Test total staking power - according to Epoch 2 (post-upgrade).
7623+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
7624+
let expected_total_staking_power = (
7625+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
7626+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
7627+
);
7628+
assert!(total_staking_power == expected_total_staking_power);
7629+
7630+
// Calculate expected rewards - according to Epoch 2 (post-upgrade).
7631+
let (expected_staker_rewards, expected_strk_pool_rewards) =
7632+
calculate_staker_strk_rewards_with_balances_v2(
7633+
amount_own: staker_stake,
7634+
pool_amount: strk_pool_balance,
7635+
:commission,
7636+
:staking_contract,
7637+
:minting_curve_contract,
7638+
);
7639+
assert!(expected_staker_rewards.is_non_zero());
7640+
assert!(expected_strk_pool_rewards.is_non_zero());
7641+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
7642+
calculate_staker_btc_pool_rewards_v2(
7643+
pool_balance: btc_pool_balance,
7644+
:commission,
7645+
:staking_contract,
7646+
:minting_curve_contract,
7647+
token_address: system.btc_token.contract_address(),
7648+
);
7649+
assert!(expected_btc_commission_rewards.is_non_zero());
7650+
assert!(expected_btc_pool_rewards.is_non_zero());
7651+
7652+
// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade).
7653+
system
7654+
.advance_block_into_attestation_window_custom_stake(
7655+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
7656+
);
7657+
system.attest(:staker);
7658+
let staker_rewards = system.staker_claim_rewards(:staker);
7659+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
7660+
7661+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
7662+
// (post-upgrade).
7663+
system.advance_epoch(); // Epoch 4 - > 5
7664+
let strk_delegator_rewards = system
7665+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
7666+
let btc_delegator_rewards = system
7667+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
7668+
assert!(wide_abs_diff(strk_delegator_rewards, expected_strk_pool_rewards) <= 1);
7669+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
7670+
}
7671+
}

src/flow_test/fork_test.cairo

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,3 +469,20 @@ fn balances_delay_flow_test() {
469469
};
470470
test_flow_mainnet(ref :flow);
471471
}
472+
473+
#[test]
474+
#[fork("MAINNET_LATEST")]
475+
fn balance_change_upgrade_balances_delay_flow_test() {
476+
let mut flow = flows::BalanceChangeUpgradeBalancesDelayFlow {
477+
staker: Option::None,
478+
stake_amount: Option::None,
479+
commission: Option::None,
480+
strk_delegated_amount: Option::None,
481+
btc_delegated_amount: Option::None,
482+
strk_delegator: Option::None,
483+
btc_delegator: Option::None,
484+
strk_pool: Option::None,
485+
btc_pool: Option::None,
486+
};
487+
test_flow_mainnet(ref :flow);
488+
}

0 commit comments

Comments
 (0)