Skip to content

Commit d4eef5d

Browse files
test: yet another balances delay flow
1 parent 13c90aa commit d4eef5d

File tree

3 files changed

+300
-1
lines changed

3 files changed

+300
-1
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ more ideas:
4747
- staker enter in V1, advance epoch, update balance, upgrade to V3, attest, update balance, advance epoch, attest
4848
- staker enter in V0, advance epoch, update balance, advance epoch, update balance, upgrade to V3, attest
4949
- staker enter in V1, advance epoch, update balance, advance epoch, update balance, upgrade to V3, attest
50-
- 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
5150

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

src/flow_test/flows.cairo

Lines changed: 283 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9046,6 +9046,289 @@ pub(crate) impl BalancesDelayBalanceChangeFlowImpl of FlowTrait<BalancesDelayBal
90469046
}
90479047
}
90489048

9049+
/// Flow:
9050+
/// Epoch 0:
9051+
/// Staker stake
9052+
/// Epoch 1:
9053+
/// Staker increase stake
9054+
/// Delegators delegate STRK and BTC
9055+
/// Epoch 2:
9056+
/// Staker increase stake
9057+
/// Delegators increase delegation STRK and BTC
9058+
/// Upgrade
9059+
/// Staker increase stake
9060+
/// Delegators increase delegation STRK and BTC
9061+
/// Test total staking power - according to Epoch 1
9062+
/// Test staker balance with attestation rewards - according to Epoch 1
9063+
/// Epoch 2:
9064+
/// Test delegator balances with attestation rewards - according to Epoch 1
9065+
/// Test total staking power - according to Epoch 2 (pre-upgrade)
9066+
/// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade)
9067+
/// Epoch 3:
9068+
/// Test delegator balances with attestation rewards - according to Epoch 2 (pre-upgrade)
9069+
/// Test total staking power - according to Epoch 2 (post-upgrade)
9070+
/// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade)
9071+
/// Epoch 4:
9072+
/// Test delegator balances with attestation rewards - according to Epoch 2 (post-upgrade)
9073+
#[derive(Drop, Copy)]
9074+
pub(crate) struct BalancesDelayMoreBalanceChangeFlow {
9075+
pub(crate) staker: Option<Staker>,
9076+
pub(crate) stake_amount: Option<Amount>,
9077+
pub(crate) commission: Option<Commission>,
9078+
pub(crate) strk_delegated_amount: Option<Amount>,
9079+
pub(crate) btc_delegated_amount: Option<Amount>,
9080+
pub(crate) strk_delegator: Option<Delegator>,
9081+
pub(crate) btc_delegator: Option<Delegator>,
9082+
pub(crate) strk_pool: Option<ContractAddress>,
9083+
pub(crate) btc_pool: Option<ContractAddress>,
9084+
}
9085+
pub(crate) impl BalancesDelayMoreBalanceChangeFlowImpl of FlowTrait<BalancesDelayMoreBalanceChangeFlow> {
9086+
fn setup_v2(ref self: BalancesDelayMoreBalanceChangeFlow, ref system: SystemState) {
9087+
let stake_amount = system.staking.get_min_stake();
9088+
let strk_delegated_amount = STRK_CONFIG.min_for_rewards;
9089+
let btc_delegated_amount = TEST_MIN_BTC_FOR_REWARDS;
9090+
let staker = system.new_staker(amount: stake_amount * 4);
9091+
let commission = 200;
9092+
let strk_delegator = system.new_delegator(amount: strk_delegated_amount * 3);
9093+
let btc_delegator = system
9094+
.new_btc_delegator(amount: btc_delegated_amount * 3, token: system.btc_token);
9095+
9096+
system.stake(:staker, amount: stake_amount, pool_enabled: true, :commission);
9097+
let strk_pool = system.staking.get_pool(:staker);
9098+
let btc_pool = system
9099+
.set_open_for_delegation(:staker, token_address: system.btc_token.contract_address());
9100+
9101+
system.advance_epoch(); // Epoch 0 - > 1
9102+
system.increase_stake(:staker, amount: stake_amount);
9103+
system.delegate(delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount);
9104+
system
9105+
.delegate_btc(
9106+
delegator: btc_delegator,
9107+
pool: btc_pool,
9108+
amount: btc_delegated_amount,
9109+
token: system.btc_token,
9110+
);
9111+
9112+
system.advance_epoch(); // Epoch 1 - > 2
9113+
system.increase_stake(:staker, amount: stake_amount);
9114+
system.increase_delegate(delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount);
9115+
system
9116+
.increase_delegate_btc(
9117+
delegator: btc_delegator,
9118+
pool: btc_pool,
9119+
amount: btc_delegated_amount,
9120+
token: system.btc_token,
9121+
);
9122+
9123+
system.set_staker_for_migration(staker_address: staker.staker.address);
9124+
self.staker = Option::Some(staker);
9125+
self.stake_amount = Option::Some(stake_amount);
9126+
self.commission = Option::Some(commission);
9127+
self.strk_delegated_amount = Option::Some(strk_delegated_amount);
9128+
self.btc_delegated_amount = Option::Some(btc_delegated_amount);
9129+
self.strk_delegator = Option::Some(strk_delegator);
9130+
self.btc_delegator = Option::Some(btc_delegator);
9131+
self.strk_pool = Option::Some(strk_pool);
9132+
self.btc_pool = Option::Some(btc_pool);
9133+
}
9134+
9135+
#[feature("safe_dispatcher")]
9136+
fn test(self: BalancesDelayMoreBalanceChangeFlow, ref system: SystemState) {
9137+
let staker = self.staker.unwrap();
9138+
let stake_amount = self.stake_amount.unwrap();
9139+
let commission = self.commission.unwrap();
9140+
let strk_delegated_amount = self.strk_delegated_amount.unwrap();
9141+
let btc_delegated_amount = self.btc_delegated_amount.unwrap();
9142+
let strk_delegator = self.strk_delegator.unwrap();
9143+
let btc_delegator = self.btc_delegator.unwrap();
9144+
let strk_pool = self.strk_pool.unwrap();
9145+
let btc_pool = self.btc_pool.unwrap();
9146+
9147+
let staking_contract = system.staking.address;
9148+
let minting_curve_contract = system.minting_curve.address;
9149+
9150+
// Increase stake and delegations.
9151+
system.increase_stake(:staker, amount: stake_amount);
9152+
system
9153+
.increase_delegate(
9154+
delegator: strk_delegator, pool: strk_pool, amount: strk_delegated_amount,
9155+
);
9156+
system
9157+
.increase_delegate_btc(
9158+
delegator: btc_delegator,
9159+
pool: btc_pool,
9160+
amount: btc_delegated_amount,
9161+
token: system.btc_token,
9162+
);
9163+
9164+
// Initialize variables for Epoch 1.
9165+
let mut staker_stake = stake_amount * 2;
9166+
let mut strk_pool_balance = strk_delegated_amount;
9167+
let mut btc_pool_balance = btc_delegated_amount;
9168+
9169+
// Test total staking power - according to Epoch 1.
9170+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
9171+
let expected_total_staking_power = (
9172+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
9173+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
9174+
);
9175+
assert!(total_staking_power == expected_total_staking_power);
9176+
9177+
// Calculate expected rewards - according to Epoch 1.
9178+
let (expected_staker_rewards, expected_strk_pool_rewards) =
9179+
calculate_staker_strk_rewards_with_balances_v2(
9180+
amount_own: staker_stake,
9181+
pool_amount: strk_pool_balance,
9182+
:commission,
9183+
:staking_contract,
9184+
:minting_curve_contract,
9185+
);
9186+
assert!(expected_staker_rewards.is_non_zero());
9187+
assert!(expected_strk_pool_rewards.is_non_zero());
9188+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
9189+
calculate_staker_btc_pool_rewards_v2(
9190+
pool_balance: btc_pool_balance,
9191+
:commission,
9192+
:staking_contract,
9193+
:minting_curve_contract,
9194+
token_address: system.btc_token.contract_address(),
9195+
);
9196+
assert!(expected_btc_commission_rewards.is_non_zero());
9197+
assert!(expected_btc_pool_rewards.is_non_zero());
9198+
9199+
// Test staker balance with attestation rewards - according to Epoch 1.
9200+
system
9201+
.advance_block_into_attestation_window_custom_stake(
9202+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
9203+
);
9204+
system.attest(:staker);
9205+
let staker_rewards = system.staker_claim_rewards(:staker);
9206+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
9207+
9208+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 1.
9209+
system.advance_epoch(); // Epoch 2 - > 3
9210+
let strk_delegator_rewards = system
9211+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
9212+
let btc_delegator_rewards = system
9213+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
9214+
assert!(strk_delegator_rewards == expected_strk_pool_rewards);
9215+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
9216+
9217+
// Update variables for Epoch 2 (pre-upgrade).
9218+
staker_stake += stake_amount;
9219+
strk_pool_balance += strk_delegated_amount;
9220+
btc_pool_balance += btc_delegated_amount;
9221+
9222+
// Test total staking power - according to Epoch 2 (pre-upgrade).
9223+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
9224+
let expected_total_staking_power = (
9225+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
9226+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
9227+
);
9228+
assert!(total_staking_power == expected_total_staking_power);
9229+
9230+
// Calculate expected rewards - according to Epoch 2 (pre-upgrade).
9231+
let prev_staker_rewards = expected_staker_rewards;
9232+
let (expected_staker_rewards, expected_strk_pool_rewards) =
9233+
calculate_staker_strk_rewards_with_balances_v2(
9234+
amount_own: staker_stake,
9235+
pool_amount: strk_pool_balance,
9236+
:commission,
9237+
:staking_contract,
9238+
:minting_curve_contract,
9239+
);
9240+
assert!(expected_staker_rewards != prev_staker_rewards);
9241+
assert!(expected_strk_pool_rewards.is_non_zero());
9242+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
9243+
calculate_staker_btc_pool_rewards_v2(
9244+
pool_balance: btc_pool_balance,
9245+
:commission,
9246+
:staking_contract,
9247+
:minting_curve_contract,
9248+
token_address: system.btc_token.contract_address(),
9249+
);
9250+
assert!(expected_btc_commission_rewards.is_non_zero());
9251+
assert!(expected_btc_pool_rewards.is_non_zero());
9252+
9253+
// Test staker balance with attestation rewards - according to Epoch 2 (pre-upgrade).
9254+
system
9255+
.advance_block_into_attestation_window_custom_stake(
9256+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
9257+
);
9258+
system.attest(:staker);
9259+
let staker_rewards = system.staker_claim_rewards(:staker);
9260+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
9261+
9262+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9263+
// (pre-upgrade).
9264+
system.advance_epoch(); // Epoch 3 - > 4
9265+
let strk_delegator_rewards = system
9266+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
9267+
let btc_delegator_rewards = system
9268+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
9269+
assert!(strk_delegator_rewards == expected_strk_pool_rewards);
9270+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
9271+
9272+
// Update variables for Epoch 2 (post-upgrade).
9273+
staker_stake += stake_amount;
9274+
strk_pool_balance += strk_delegated_amount;
9275+
btc_pool_balance += btc_delegated_amount;
9276+
9277+
// Test total staking power - according to Epoch 2 (post-upgrade).
9278+
let total_staking_power = system.staking.get_current_total_staking_power_v2();
9279+
let expected_total_staking_power = (
9280+
NormalizedAmountTrait::from_strk_native_amount(staker_stake + strk_pool_balance),
9281+
NormalizedAmountTrait::from_native_amount(btc_pool_balance, TEST_BTC_DECIMALS),
9282+
);
9283+
assert!(total_staking_power == expected_total_staking_power);
9284+
9285+
// Calculate expected rewards - according to Epoch 2 (post-upgrade).
9286+
let prev_staker_rewards = expected_staker_rewards;
9287+
let prev_strk_pool_rewards = expected_strk_pool_rewards;
9288+
let prev_btc_commission_rewards = expected_btc_commission_rewards;
9289+
let prev_btc_pool_rewards = expected_btc_pool_rewards;
9290+
let (expected_staker_rewards, expected_strk_pool_rewards) =
9291+
calculate_staker_strk_rewards_with_balances_v2(
9292+
amount_own: staker_stake,
9293+
pool_amount: strk_pool_balance,
9294+
:commission,
9295+
:staking_contract,
9296+
:minting_curve_contract,
9297+
);
9298+
assert!(expected_staker_rewards != prev_staker_rewards);
9299+
assert!(expected_strk_pool_rewards != prev_strk_pool_rewards);
9300+
let (expected_btc_commission_rewards, expected_btc_pool_rewards) =
9301+
calculate_staker_btc_pool_rewards_v2(
9302+
pool_balance: btc_pool_balance,
9303+
:commission,
9304+
:staking_contract,
9305+
:minting_curve_contract,
9306+
token_address: system.btc_token.contract_address(),
9307+
);
9308+
assert!(expected_btc_commission_rewards != prev_btc_commission_rewards);
9309+
assert!(expected_btc_pool_rewards != prev_btc_pool_rewards);
9310+
9311+
// Test staker balance with attestation rewards - according to Epoch 2 (post-upgrade).
9312+
system
9313+
.advance_block_into_attestation_window_custom_stake(
9314+
staker_address: staker.staker.address, stake: staker_stake + strk_pool_balance,
9315+
);
9316+
system.attest(:staker);
9317+
let staker_rewards = system.staker_claim_rewards(:staker);
9318+
assert!(staker_rewards == expected_staker_rewards + expected_btc_commission_rewards);
9319+
9320+
// Advance epoch - test delegator balances with attestation rewards - according to Epoch 2
9321+
// (post-upgrade).
9322+
system.advance_epoch(); // Epoch 4 - > 5
9323+
let strk_delegator_rewards = system
9324+
.delegator_claim_rewards(delegator: strk_delegator, pool: strk_pool);
9325+
let btc_delegator_rewards = system
9326+
.delegator_claim_rewards(delegator: btc_delegator, pool: btc_pool);
9327+
assert!(wide_abs_diff(strk_delegator_rewards, expected_strk_pool_rewards) <= 1);
9328+
assert!(btc_delegator_rewards == expected_btc_pool_rewards);
9329+
}
9330+
}
9331+
90499332
/// Flow:
90509333
/// Add tokens A and B
90519334
/// Delegate for both tokens

src/flow_test/fork_test.cairo

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,23 @@ fn balances_delay_balance_change_flow_test() {
587587
test_flow_mainnet(ref :flow);
588588
}
589589

590+
#[test]
591+
#[fork("MAINNET_LATEST")]
592+
fn balances_delay_more_balance_change_flow_test() {
593+
let mut flow = flows::BalancesDelayMoreBalanceChangeFlow {
594+
staker: Option::None,
595+
stake_amount: Option::None,
596+
commission: Option::None,
597+
strk_delegated_amount: Option::None,
598+
btc_delegated_amount: Option::None,
599+
strk_delegator: Option::None,
600+
btc_delegator: Option::None,
601+
strk_pool: Option::None,
602+
btc_pool: Option::None,
603+
};
604+
test_flow_mainnet(ref :flow);
605+
}
606+
590607
#[test]
591608
#[fork("MAINNET_LATEST")]
592609
fn enable_disable_token_before_after_upgrade_flow_test() {

0 commit comments

Comments
 (0)