Skip to content

Commit a1b33ff

Browse files
test: yet another balances delay flow
1 parent db7bd8c commit a1b33ff

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