Skip to content

Commit b3861f8

Browse files
test: yet another balances delay flow
1 parent dbfa1a6 commit b3861f8

File tree

3 files changed

+305
-2
lines changed

3 files changed

+305
-2
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ more ideas:
3434
- staker enter in V2, advance epoch, advance epoch, upgrade to V3, attest, update balance,advance epoch, attest, advance epoch, attest, test rewards
3535
- staker enter in V2, advance epoch, update balance, upgrade to V3, attest, advance epoch, attest, advance epoch, attest, test rewards
3636
- staker enter in V2, advance epoch, upgrade to V3, advance epoch, attest,
37-
- staker in V2, update balance staker+update balance pool, upgrade, attest in current epoch, attest in next epoch, attest in next next epoch
38-
- 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
3937

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

src/flow_test/flows.cairo

Lines changed: 288 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9115,6 +9115,294 @@ pub(crate) impl StakerV1ChangeBalanceAttestFlowImpl of FlowTrait<StakerV1ChangeB
91159115
}
91169116
}
91179117

9118+
/// Flow:
9119+
/// Epoch 0:
9120+
/// Staker stake
9121+
/// Epoch 1:
9122+
/// Staker increase stake
9123+
/// Delegators delegate STRK and BTC
9124+
/// Epoch 2:
9125+
/// Staker increase stake
9126+
/// Delegators increase delegation STRK and BTC
9127+
/// Upgrade
9128+
/// Staker increase stake
9129+
/// Delegators increase delegation STRK and BTC
9130+
/// Test total staking power - according to Epoch 1
9131+
/// Test staker balance with attestation rewards - according to Epoch 1
9132+
/// Epoch 2:
9133+
/// Test delegator balances with attestation rewards - according to Epoch 1
9134+
/// Test total staking power - according to Epoch 2 (pre-upgrade)
9135+
/// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade)
9136+
/// Epoch 3:
9137+
/// Test delegator balances with attestation rewards - according to Epoch 2 (pre-upgrade)
9138+
/// Test total staking power - according to Epoch 2 (post-upgrade)
9139+
/// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade)
9140+
/// Epoch 4:
9141+
/// Test delegator balances with attestation rewards - according to Epoch 2 (post-upgrade)
9142+
#[derive(Drop, Copy)]
9143+
pub(crate) struct BalancesDelayMoreBalanceChangeFlow {
9144+
pub(crate) staker: Option<Staker>,
9145+
pub(crate) stake_amount: Option<Amount>,
9146+
pub(crate) commission: Option<Commission>,
9147+
pub(crate) strk_delegated_amount: Option<Amount>,
9148+
pub(crate) btc_delegated_amount: Option<Amount>,
9149+
pub(crate) strk_delegator: Option<Delegator>,
9150+
pub(crate) btc_delegator: Option<Delegator>,
9151+
pub(crate) strk_pool: Option<ContractAddress>,
9152+
pub(crate) btc_pool: Option<ContractAddress>,
9153+
}
9154+
pub(crate) impl BalancesDelayMoreBalanceChangeFlowImpl of FlowTrait<
9155+
BalancesDelayMoreBalanceChangeFlow,
9156+
> {
9157+
fn setup_v2(ref self: BalancesDelayMoreBalanceChangeFlow, ref system: SystemState) {
9158+
let stake_amount = system.staking.get_min_stake();
9159+
let strk_delegated_amount = STRK_CONFIG.min_for_rewards;
9160+
let btc_delegated_amount = TEST_MIN_BTC_FOR_REWARDS;
9161+
let staker = system.new_staker(amount: stake_amount * 4);
9162+
let commission = 200;
9163+
let strk_delegator = system.new_delegator(amount: strk_delegated_amount * 3);
9164+
let btc_delegator = system
9165+
.new_btc_delegator(amount: btc_delegated_amount * 3, token: system.btc_token);
9166+
9167+
system.stake(:staker, amount: stake_amount, pool_enabled: true, :commission);
9168+
let strk_pool = system.staking.get_pool(:staker);
9169+
let btc_pool = system
9170+
.set_open_for_delegation(:staker, token_address: system.btc_token.contract_address());
9171+
9172+
system.advance_epoch(); // Epoch 0 - > 1
9173+
system.increase_stake(:staker, amount: stake_amount);
9174+
system.delegate(delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount);
9175+
system
9176+
.delegate_btc(
9177+
delegator: btc_delegator,
9178+
pool: btc_pool,
9179+
amount: btc_delegated_amount,
9180+
token: system.btc_token,
9181+
);
9182+
9183+
system.advance_epoch(); // Epoch 1 - > 2
9184+
system.increase_stake(:staker, amount: stake_amount);
9185+
system
9186+
.increase_delegate(
9187+
delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount,
9188+
);
9189+
system
9190+
.increase_delegate_btc(
9191+
delegator: btc_delegator,
9192+
pool: btc_pool,
9193+
amount: btc_delegated_amount,
9194+
token: system.btc_token,
9195+
);
9196+
9197+
system.set_staker_for_migration(staker_address: staker.staker.address);
9198+
self.staker = Option::Some(staker);
9199+
self.stake_amount = Option::Some(stake_amount);
9200+
self.commission = Option::Some(commission);
9201+
self.strk_delegated_amount = Option::Some(strk_delegated_amount);
9202+
self.btc_delegated_amount = Option::Some(btc_delegated_amount);
9203+
self.strk_delegator = Option::Some(strk_delegator);
9204+
self.btc_delegator = Option::Some(btc_delegator);
9205+
self.strk_pool = Option::Some(strk_pool);
9206+
self.btc_pool = Option::Some(btc_pool);
9207+
}
9208+
9209+
#[feature("safe_dispatcher")]
9210+
fn test(self: BalancesDelayMoreBalanceChangeFlow, ref system: SystemState) {
9211+
let staker = self.staker.unwrap();
9212+
let stake_amount = self.stake_amount.unwrap();
9213+
let commission = self.commission.unwrap();
9214+
let strk_delegated_amount = self.strk_delegated_amount.unwrap();
9215+
let btc_delegated_amount = self.btc_delegated_amount.unwrap();
9216+
let strk_delegator = self.strk_delegator.unwrap();
9217+
let btc_delegator = self.btc_delegator.unwrap();
9218+
let strk_pool = self.strk_pool.unwrap();
9219+
let btc_pool = self.btc_pool.unwrap();
9220+
9221+
let staking_contract = system.staking.address;
9222+
let minting_curve_contract = system.minting_curve.address;
9223+
9224+
// Increase stake and delegations.
9225+
system.increase_stake(:staker, amount: stake_amount);
9226+
system
9227+
.increase_delegate(
9228+
delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount,
9229+
);
9230+
system
9231+
.increase_delegate_btc(
9232+
delegator: btc_delegator,
9233+
pool: btc_pool,
9234+
amount: btc_delegated_amount,
9235+
token: system.btc_token,
9236+
);
9237+
9238+
// Initialize variables for Epoch 1.
9239+
let mut staker_stake = stake_amount * 2;
9240+
let mut strk_pool_balance = strk_delegated_amount;
9241+
let mut btc_pool_balance = btc_delegated_amount;
9242+
9243+
// Test total staking power - according to Epoch 1.
9244+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
9245+
let expected_total_staking_power = (
9246+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
9247+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
9248+
);
9249+
assert!(total_staking_power == expected_total_staking_power);
9250+
9251+
// Calculate expected rewards - according to Epoch 1.
9252+
let (expected_staker_rewards, expected_strk_pool_rewards) =
9253+
calculate_staker_strk_rewards_with_balances_v2(
9254+
amount_own: staker_stake,
9255+
pool_amount: strk_pool_balance,
9256+
:commission,
9257+
:staking_contract,
9258+
:minting_curve_contract,
9259+
);
9260+
assert!(expected_staker_rewards.is_non_zero());
9261+
assert!(expected_strk_pool_rewards.is_non_zero());
9262+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
9263+
calculate_staker_btc_pool_rewards_v2(
9264+
pool_balance: btc_pool_balance,
9265+
:commission,
9266+
:staking_contract,
9267+
:minting_curve_contract,
9268+
token_address: system.btc_token.contract_address(),
9269+
);
9270+
assert!(expected_btc_commission_rewards.is_non_zero());
9271+
assert!(expected_btc_pool_rewards.is_non_zero());
9272+
9273+
// Test staker balance with attestation rewards - according to Epoch 1.
9274+
system
9275+
.advance_block_into_attestation_window_custom_stake(
9276+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
9277+
);
9278+
system.attest(:staker);
9279+
let staker_rewards = system.staker_claim_rewards(:staker);
9280+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
9281+
9282+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 1.
9283+
system.advance_epoch(); // Epoch 2 - > 3
9284+
let strk_delegator_rewards = system
9285+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
9286+
let btc_delegator_rewards = system
9287+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
9288+
assert!(strk_delegator_rewards == expected_strk_pool_rewards);
9289+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
9290+
9291+
// Update variables for Epoch 2 (pre-upgrade).
9292+
staker_stake += stake_amount;
9293+
strk_pool_balance += strk_delegated_amount;
9294+
btc_pool_balance += btc_delegated_amount;
9295+
9296+
// Test total staking power - according to Epoch 2 (pre-upgrade).
9297+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
9298+
let expected_total_staking_power = (
9299+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
9300+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
9301+
);
9302+
assert!(total_staking_power == expected_total_staking_power);
9303+
9304+
// Calculate expected rewards - according to Epoch 2 (pre-upgrade).
9305+
let prev_staker_rewards = expected_staker_rewards;
9306+
let (expected_staker_rewards, expected_strk_pool_rewards) =
9307+
calculate_staker_strk_rewards_with_balances_v2(
9308+
amount_own: staker_stake,
9309+
pool_amount: strk_pool_balance,
9310+
:commission,
9311+
:staking_contract,
9312+
:minting_curve_contract,
9313+
);
9314+
assert!(expected_staker_rewards != prev_staker_rewards);
9315+
assert!(expected_strk_pool_rewards.is_non_zero());
9316+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
9317+
calculate_staker_btc_pool_rewards_v2(
9318+
pool_balance: btc_pool_balance,
9319+
:commission,
9320+
:staking_contract,
9321+
:minting_curve_contract,
9322+
token_address: system.btc_token.contract_address(),
9323+
);
9324+
assert!(expected_btc_commission_rewards.is_non_zero());
9325+
assert!(expected_btc_pool_rewards.is_non_zero());
9326+
9327+
// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade).
9328+
system
9329+
.advance_block_into_attestation_window_custom_stake(
9330+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
9331+
);
9332+
system.attest(:staker);
9333+
let staker_rewards = system.staker_claim_rewards(:staker);
9334+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
9335+
9336+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9337+
// (pre-upgrade).
9338+
system.advance_epoch(); // Epoch 3 - > 4
9339+
let strk_delegator_rewards = system
9340+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
9341+
let btc_delegator_rewards = system
9342+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
9343+
assert!(strk_delegator_rewards == expected_strk_pool_rewards);
9344+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
9345+
9346+
// Update variables for Epoch 2 (post-upgrade).
9347+
staker_stake += stake_amount;
9348+
strk_pool_balance += strk_delegated_amount;
9349+
btc_pool_balance += btc_delegated_amount;
9350+
9351+
// Test total staking power - according to Epoch 2 (post-upgrade).
9352+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
9353+
let expected_total_staking_power = (
9354+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
9355+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
9356+
);
9357+
assert!(total_staking_power == expected_total_staking_power);
9358+
9359+
// Calculate expected rewards - according to Epoch 2 (post-upgrade).
9360+
let prev_staker_rewards = expected_staker_rewards;
9361+
let prev_strk_pool_rewards = expected_strk_pool_rewards;
9362+
let prev_btc_commission_rewards = expected_btc_commission_rewards;
9363+
let prev_btc_pool_rewards = expected_btc_pool_rewards;
9364+
let (expected_staker_rewards, expected_strk_pool_rewards) =
9365+
calculate_staker_strk_rewards_with_balances_v2(
9366+
amount_own: staker_stake,
9367+
pool_amount: strk_pool_balance,
9368+
:commission,
9369+
:staking_contract,
9370+
:minting_curve_contract,
9371+
);
9372+
assert!(expected_staker_rewards != prev_staker_rewards);
9373+
assert!(expected_strk_pool_rewards != prev_strk_pool_rewards);
9374+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
9375+
calculate_staker_btc_pool_rewards_v2(
9376+
pool_balance: btc_pool_balance,
9377+
:commission,
9378+
:staking_contract,
9379+
:minting_curve_contract,
9380+
token_address: system.btc_token.contract_address(),
9381+
);
9382+
assert!(expected_btc_commission_rewards != prev_btc_commission_rewards);
9383+
assert!(expected_btc_pool_rewards != prev_btc_pool_rewards);
9384+
9385+
// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade).
9386+
system
9387+
.advance_block_into_attestation_window_custom_stake(
9388+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
9389+
);
9390+
system.attest(:staker);
9391+
let staker_rewards = system.staker_claim_rewards(:staker);
9392+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
9393+
9394+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9395+
// (post-upgrade).
9396+
system.advance_epoch(); // Epoch 4 - > 5
9397+
let strk_delegator_rewards = system
9398+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
9399+
let btc_delegator_rewards = system
9400+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
9401+
assert!(wide_abs_diff(strk_delegator_rewards, expected_strk_pool_rewards) <= 1);
9402+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
9403+
}
9404+
}
9405+
91189406
/// Flow:
91199407
/// Add tokens A and B
91209408
/// Delegate for both tokens

src/flow_test/fork_test.cairo

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,23 @@ fn delegator_rewards_v0_find_sigma_flow_test() {
612612
test_flow_mainnet(ref :flow);
613613
}
614614

615+
#[test]
616+
#[fork("MAINNET_LATEST")]
617+
fn balances_delay_more_balance_change_flow_test() {
618+
let mut flow = flows::BalancesDelayMoreBalanceChangeFlow {
619+
staker: Option::None,
620+
stake_amount: Option::None,
621+
commission: Option::None,
622+
strk_delegated_amount: Option::None,
623+
btc_delegated_amount: Option::None,
624+
strk_delegator: Option::None,
625+
btc_delegator: Option::None,
626+
strk_pool: Option::None,
627+
btc_pool: Option::None,
628+
};
629+
test_flow_mainnet(ref :flow);
630+
}
631+
615632
#[test]
616633
#[fork("MAINNET_LATEST")]
617634
fn enable_disable_token_before_after_upgrade_flow_test() {

0 commit comments

Comments
 (0)