Skip to content

Commit 8c226f7

Browse files
test: yet another balances delay flow
1 parent b5c1e5a commit 8c226f7

File tree

3 files changed

+305
-1
lines changed

3 files changed

+305
-1
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ more ideas:
3838
- staker enter in V2, advance epoch, advance epoch, upgrade to V3, attest, update balance,advance epoch, attest, advance epoch, attest, test rewards
3939
- staker enter in V2, advance epoch, update balance, upgrade to V3, attest, advance epoch, attest, advance epoch, attest, test rewards
4040
- staker enter in V2, advance epoch, upgrade to V3, advance epoch, attest,
41-
- 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
4241

4342
## pool member balance at curr epoch migration
4443
- 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
@@ -9288,6 +9288,294 @@ pub(crate) impl StakerV1ChangeBalanceAttestFlowImpl of FlowTrait<StakerV1ChangeB
92889288
}
92899289
}
92909290

9291+
/// Flow:
9292+
/// Epoch 0:
9293+
/// Staker stake
9294+
/// Epoch 1:
9295+
/// Staker increase stake
9296+
/// Delegators delegate STRK and BTC
9297+
/// Epoch 2:
9298+
/// Staker increase stake
9299+
/// Delegators increase delegation STRK and BTC
9300+
/// Upgrade
9301+
/// Staker increase stake
9302+
/// Delegators increase delegation STRK and BTC
9303+
/// Test total staking power - according to Epoch 1
9304+
/// Test staker balance with attestation rewards - according to Epoch 1
9305+
/// Epoch 2:
9306+
/// Test delegator balances with attestation rewards - according to Epoch 1
9307+
/// Test total staking power - according to Epoch 2 (pre-upgrade)
9308+
/// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade)
9309+
/// Epoch 3:
9310+
/// Test delegator balances with attestation rewards - according to Epoch 2 (pre-upgrade)
9311+
/// Test total staking power - according to Epoch 2 (post-upgrade)
9312+
/// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade)
9313+
/// Epoch 4:
9314+
/// Test delegator balances with attestation rewards - according to Epoch 2 (post-upgrade)
9315+
#[derive(Drop, Copy)]
9316+
pub(crate) struct BalancesDelayMoreBalanceChangeFlow {
9317+
pub(crate) staker: Option<Staker>,
9318+
pub(crate) stake_amount: Option<Amount>,
9319+
pub(crate) commission: Option<Commission>,
9320+
pub(crate) strk_delegated_amount: Option<Amount>,
9321+
pub(crate) btc_delegated_amount: Option<Amount>,
9322+
pub(crate) strk_delegator: Option<Delegator>,
9323+
pub(crate) btc_delegator: Option<Delegator>,
9324+
pub(crate) strk_pool: Option<ContractAddress>,
9325+
pub(crate) btc_pool: Option<ContractAddress>,
9326+
}
9327+
pub(crate) impl BalancesDelayMoreBalanceChangeFlowImpl of FlowTrait<
9328+
BalancesDelayMoreBalanceChangeFlow,
9329+
> {
9330+
fn setup_v2(ref self: BalancesDelayMoreBalanceChangeFlow, ref system: SystemState) {
9331+
let stake_amount = system.staking.get_min_stake();
9332+
let strk_delegated_amount = STRK_CONFIG.min_for_rewards;
9333+
let btc_delegated_amount = TEST_MIN_BTC_FOR_REWARDS;
9334+
let staker = system.new_staker(amount: stake_amount * 4);
9335+
let commission = 200;
9336+
let strk_delegator = system.new_delegator(amount: strk_delegated_amount * 3);
9337+
let btc_delegator = system
9338+
.new_btc_delegator(amount: btc_delegated_amount * 3, token: system.btc_token);
9339+
9340+
system.stake(:staker, amount: stake_amount, pool_enabled: true, :commission);
9341+
let strk_pool = system.staking.get_pool(:staker);
9342+
let btc_pool = system
9343+
.set_open_for_delegation(:staker, token_address: system.btc_token.contract_address());
9344+
9345+
system.advance_epoch(); // Epoch 0 - > 1
9346+
system.increase_stake(:staker, amount: stake_amount);
9347+
system.delegate(delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount);
9348+
system
9349+
.delegate_btc(
9350+
delegator: btc_delegator,
9351+
pool: btc_pool,
9352+
amount: btc_delegated_amount,
9353+
token: system.btc_token,
9354+
);
9355+
9356+
system.advance_epoch(); // Epoch 1 - > 2
9357+
system.increase_stake(:staker, amount: stake_amount);
9358+
system
9359+
.increase_delegate(
9360+
delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount,
9361+
);
9362+
system
9363+
.increase_delegate_btc(
9364+
delegator: btc_delegator,
9365+
pool: btc_pool,
9366+
amount: btc_delegated_amount,
9367+
token: system.btc_token,
9368+
);
9369+
9370+
system.set_staker_for_migration(staker_address: staker.staker.address);
9371+
self.staker = Option::Some(staker);
9372+
self.stake_amount = Option::Some(stake_amount);
9373+
self.commission = Option::Some(commission);
9374+
self.strk_delegated_amount = Option::Some(strk_delegated_amount);
9375+
self.btc_delegated_amount = Option::Some(btc_delegated_amount);
9376+
self.strk_delegator = Option::Some(strk_delegator);
9377+
self.btc_delegator = Option::Some(btc_delegator);
9378+
self.strk_pool = Option::Some(strk_pool);
9379+
self.btc_pool = Option::Some(btc_pool);
9380+
}
9381+
9382+
#[feature("safe_dispatcher")]
9383+
fn test(self: BalancesDelayMoreBalanceChangeFlow, ref system: SystemState) {
9384+
let staker = self.staker.unwrap();
9385+
let stake_amount = self.stake_amount.unwrap();
9386+
let commission = self.commission.unwrap();
9387+
let strk_delegated_amount = self.strk_delegated_amount.unwrap();
9388+
let btc_delegated_amount = self.btc_delegated_amount.unwrap();
9389+
let strk_delegator = self.strk_delegator.unwrap();
9390+
let btc_delegator = self.btc_delegator.unwrap();
9391+
let strk_pool = self.strk_pool.unwrap();
9392+
let btc_pool = self.btc_pool.unwrap();
9393+
9394+
let staking_contract = system.staking.address;
9395+
let minting_curve_contract = system.minting_curve.address;
9396+
9397+
// Increase stake and delegations.
9398+
system.increase_stake(:staker, amount: stake_amount);
9399+
system
9400+
.increase_delegate(
9401+
delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount,
9402+
);
9403+
system
9404+
.increase_delegate_btc(
9405+
delegator: btc_delegator,
9406+
pool: btc_pool,
9407+
amount: btc_delegated_amount,
9408+
token: system.btc_token,
9409+
);
9410+
9411+
// Initialize variables for Epoch 1.
9412+
let mut staker_stake = stake_amount * 2;
9413+
let mut strk_pool_balance = strk_delegated_amount;
9414+
let mut btc_pool_balance = btc_delegated_amount;
9415+
9416+
// Test total staking power - according to Epoch 1.
9417+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
9418+
let expected_total_staking_power = (
9419+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
9420+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
9421+
);
9422+
assert!(total_staking_power == expected_total_staking_power);
9423+
9424+
// Calculate expected rewards - according to Epoch 1.
9425+
let (expected_staker_rewards, expected_strk_pool_rewards) =
9426+
calculate_staker_strk_rewards_with_balances_v2(
9427+
amount_own: staker_stake,
9428+
pool_amount: strk_pool_balance,
9429+
:commission,
9430+
:staking_contract,
9431+
:minting_curve_contract,
9432+
);
9433+
assert!(expected_staker_rewards.is_non_zero());
9434+
assert!(expected_strk_pool_rewards.is_non_zero());
9435+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
9436+
calculate_staker_btc_pool_rewards_v2(
9437+
pool_balance: btc_pool_balance,
9438+
:commission,
9439+
:staking_contract,
9440+
:minting_curve_contract,
9441+
token_address: system.btc_token.contract_address(),
9442+
);
9443+
assert!(expected_btc_commission_rewards.is_non_zero());
9444+
assert!(expected_btc_pool_rewards.is_non_zero());
9445+
9446+
// Test staker balance with attestation rewards - according to Epoch 1.
9447+
system
9448+
.advance_block_into_attestation_window_custom_stake(
9449+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
9450+
);
9451+
system.attest(:staker);
9452+
let staker_rewards = system.staker_claim_rewards(:staker);
9453+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
9454+
9455+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 1.
9456+
system.advance_epoch(); // Epoch 2 - > 3
9457+
let strk_delegator_rewards = system
9458+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
9459+
let btc_delegator_rewards = system
9460+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
9461+
assert!(strk_delegator_rewards == expected_strk_pool_rewards);
9462+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
9463+
9464+
// Update variables for Epoch 2 (pre-upgrade).
9465+
staker_stake += stake_amount;
9466+
strk_pool_balance += strk_delegated_amount;
9467+
btc_pool_balance += btc_delegated_amount;
9468+
9469+
// Test total staking power - according to Epoch 2 (pre-upgrade).
9470+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
9471+
let expected_total_staking_power = (
9472+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
9473+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
9474+
);
9475+
assert!(total_staking_power == expected_total_staking_power);
9476+
9477+
// Calculate expected rewards - according to Epoch 2 (pre-upgrade).
9478+
let prev_staker_rewards = expected_staker_rewards;
9479+
let (expected_staker_rewards, expected_strk_pool_rewards) =
9480+
calculate_staker_strk_rewards_with_balances_v2(
9481+
amount_own: staker_stake,
9482+
pool_amount: strk_pool_balance,
9483+
:commission,
9484+
:staking_contract,
9485+
:minting_curve_contract,
9486+
);
9487+
assert!(expected_staker_rewards != prev_staker_rewards);
9488+
assert!(expected_strk_pool_rewards.is_non_zero());
9489+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
9490+
calculate_staker_btc_pool_rewards_v2(
9491+
pool_balance: btc_pool_balance,
9492+
:commission,
9493+
:staking_contract,
9494+
:minting_curve_contract,
9495+
token_address: system.btc_token.contract_address(),
9496+
);
9497+
assert!(expected_btc_commission_rewards.is_non_zero());
9498+
assert!(expected_btc_pool_rewards.is_non_zero());
9499+
9500+
// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade).
9501+
system
9502+
.advance_block_into_attestation_window_custom_stake(
9503+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
9504+
);
9505+
system.attest(:staker);
9506+
let staker_rewards = system.staker_claim_rewards(:staker);
9507+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
9508+
9509+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9510+
// (pre-upgrade).
9511+
system.advance_epoch(); // Epoch 3 - > 4
9512+
let strk_delegator_rewards = system
9513+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
9514+
let btc_delegator_rewards = system
9515+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
9516+
assert!(strk_delegator_rewards == expected_strk_pool_rewards);
9517+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
9518+
9519+
// Update variables for Epoch 2 (post-upgrade).
9520+
staker_stake += stake_amount;
9521+
strk_pool_balance += strk_delegated_amount;
9522+
btc_pool_balance += btc_delegated_amount;
9523+
9524+
// Test total staking power - according to Epoch 2 (post-upgrade).
9525+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
9526+
let expected_total_staking_power = (
9527+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
9528+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
9529+
);
9530+
assert!(total_staking_power == expected_total_staking_power);
9531+
9532+
// Calculate expected rewards - according to Epoch 2 (post-upgrade).
9533+
let prev_staker_rewards = expected_staker_rewards;
9534+
let prev_strk_pool_rewards = expected_strk_pool_rewards;
9535+
let prev_btc_commission_rewards = expected_btc_commission_rewards;
9536+
let prev_btc_pool_rewards = expected_btc_pool_rewards;
9537+
let (expected_staker_rewards, expected_strk_pool_rewards) =
9538+
calculate_staker_strk_rewards_with_balances_v2(
9539+
amount_own: staker_stake,
9540+
pool_amount: strk_pool_balance,
9541+
:commission,
9542+
:staking_contract,
9543+
:minting_curve_contract,
9544+
);
9545+
assert!(expected_staker_rewards != prev_staker_rewards);
9546+
assert!(expected_strk_pool_rewards != prev_strk_pool_rewards);
9547+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
9548+
calculate_staker_btc_pool_rewards_v2(
9549+
pool_balance: btc_pool_balance,
9550+
:commission,
9551+
:staking_contract,
9552+
:minting_curve_contract,
9553+
token_address: system.btc_token.contract_address(),
9554+
);
9555+
assert!(expected_btc_commission_rewards != prev_btc_commission_rewards);
9556+
assert!(expected_btc_pool_rewards != prev_btc_pool_rewards);
9557+
9558+
// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade).
9559+
system
9560+
.advance_block_into_attestation_window_custom_stake(
9561+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
9562+
);
9563+
system.attest(:staker);
9564+
let staker_rewards = system.staker_claim_rewards(:staker);
9565+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
9566+
9567+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9568+
// (post-upgrade).
9569+
system.advance_epoch(); // Epoch 4 - > 5
9570+
let strk_delegator_rewards = system
9571+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
9572+
let btc_delegator_rewards = system
9573+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
9574+
assert!(wide_abs_diff(strk_delegator_rewards, expected_strk_pool_rewards) <= 1);
9575+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
9576+
}
9577+
}
9578+
92919579
/// Flow:
92929580
/// Add tokens A and B
92939581
/// Delegate for both tokens

src/flow_test/fork_test.cairo

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,23 @@ fn balances_delay_balance_change_flow_test() {
629629
test_flow_mainnet(ref :flow);
630630
}
631631

632+
#[test]
633+
#[fork("MAINNET_LATEST")]
634+
fn balances_delay_more_balance_change_flow_test() {
635+
let mut flow = flows::BalancesDelayMoreBalanceChangeFlow {
636+
staker: Option::None,
637+
stake_amount: Option::None,
638+
commission: Option::None,
639+
strk_delegated_amount: Option::None,
640+
btc_delegated_amount: Option::None,
641+
strk_delegator: Option::None,
642+
btc_delegator: Option::None,
643+
strk_pool: Option::None,
644+
btc_pool: Option::None,
645+
};
646+
test_flow_mainnet(ref :flow);
647+
}
648+
632649
#[test]
633650
#[fork("MAINNET_LATEST")]
634651
fn enable_disable_token_before_after_upgrade_flow_test() {

0 commit comments

Comments
 (0)