Skip to content

Commit 0cbc327

Browse files
committed
test: delegator from v0 flows
1 parent ca11c5a commit 0cbc327

File tree

3 files changed

+318
-12
lines changed

3 files changed

+318
-12
lines changed

src/flow_test/flow_ideas.md

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,13 @@
5353
- find sigma: Enter V0, change in V1, catch all ifs.
5454
- find sigma: Enter V0, change in V2, catch all ifs.
5555
- find sigma_edge_cases: catch the comments.
56-
- find sigma - cover all branches with member from V0, V1, V2(V2 DONE).
57-
- member from V0, update balance at V3 before getting rewards, pool gets rewards, test rewards.
58-
- member from V0, pool gets rewards at V1, update balance at V3 before getting rewards, pool gets rewards, test rewards.
59-
- member from V0, pool gets rewards at V1, pool gets rewards at V3, update balance, test rewards.
60-
- member from V0, pool gets rewards at V1, pool gets rewards at V3, test rewards without update balance.
56+
- find sigma - cover all branches with member from V0.
6157
- member from V1(+V2), update balance at V3, pool gets rewards at V3, test rewards. (IDX=0)
6258
- member from V1(+V2), update balance at V1, update balance at V3, test rewards. (IDX=1=LEN)
6359
- member from V1(+V2), update balance at V1, pool gets rewards at V1, update balance at V3, test rewards. (IDX=1!=LEN)
6460
- member from V1(+V2), pool gets rewards at V1, pool gets rewards at V1, update balance at V1, update balance at V3, test rewards (IDX=LEN)
6561
- member from V1(+V2), pool gets_rewards at V1, pool gets rewards at V1, update balance at V1, pool gets rewards at V3, update balance at V3, test rewards. (REGULAR CASE)
6662
- member from V1(+V2), pool gets_rewards at V1, pool gets rewards at V1, update balance at V1, pool gets rewards at V1 same epoch, pool gets rewards at V3, update balance at V3, test rewards. (REGULAR CASE)
67-
- V0->V1->V3:
68-
- enter in V0, pool gets rewards in V1, change balance at V1, pool gets rewards in V1, pool gets rewards in V3, update balance at V3, pool gets rewards in V3, test rewards.
6963
more ideas:
7064
- member from V1, pool gets rewards at V1, update balance at V1, update balance at V3, pool gets rewards at V3, test rewards.
7165
- member from V1, pool gets rewards at V1, pool gets rewards at V3, update balance at V3, test rewards.

src/flow_test/flows.cairo

Lines changed: 284 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ use staking::test_utils::constants::{
3535
};
3636
use staking::test_utils::{
3737
calculate_pool_member_rewards, calculate_staker_btc_pool_rewards_v2,
38-
calculate_staker_strk_rewards_v2, calculate_strk_pool_rewards_v2,
39-
calculate_strk_pool_rewards_with_pool_balance_v2, compute_rewards_per_unit,
40-
declare_pool_contract, declare_pool_eic_contract, declare_staking_contract,
41-
load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0, to_amount_18_decimals,
42-
upgrade_implementation,
38+
calculate_staker_strk_rewards_v2, calculate_strk_pool_rewards_v1,
39+
calculate_strk_pool_rewards_v2, calculate_strk_pool_rewards_with_pool_balance_v2,
40+
compute_rewards_per_unit, declare_pool_contract, declare_pool_eic_contract,
41+
declare_staking_contract, load_from_simple_map, load_one_felt, strk_pool_update_rewards_v0,
42+
to_amount_18_decimals, upgrade_implementation,
4343
};
4444
use staking::types::{Amount, Commission};
4545
use starknet::{ClassHash, ContractAddress, Store};
@@ -7063,3 +7063,282 @@ pub(crate) impl GetStakersAfterUpgradeFlowImpl of FlowTrait<GetStakersAfterUpgra
70637063
assert!(stakers == expected_stakers);
70647064
}
70657065
}
7066+
7067+
/// Flow:
7068+
/// Delegator enter in V0
7069+
/// Attest in V1 (pool gets rewards)
7070+
/// Delegator change balance in V1
7071+
/// Attest in V1 (pool gets rewards)
7072+
/// Attest in V3 (pool gets rewards)
7073+
/// Delegator change balance in V3
7074+
/// Attest in V3 (pool gets rewards)
7075+
/// Test delegator rewards
7076+
#[derive(Drop, Copy)]
7077+
pub(crate) struct DelegatorChangeBalanceOverVersionsFlow {
7078+
pub(crate) staker: Option<Staker>,
7079+
pub(crate) pool: Option<ContractAddress>,
7080+
pub(crate) delegator: Option<Delegator>,
7081+
pub(crate) expected_rewards: Option<Amount>,
7082+
}
7083+
pub(crate) impl DelegatorChangeBalanceOverVersionsFlowImpl of FlowTrait<
7084+
DelegatorChangeBalanceOverVersionsFlow,
7085+
> {
7086+
fn setup(ref self: DelegatorChangeBalanceOverVersionsFlow, ref system: SystemState) {
7087+
let amount = system.staking.get_min_stake();
7088+
let staker = system.new_staker(:amount);
7089+
let commission = 200;
7090+
system.stake(:staker, :amount, pool_enabled: true, :commission);
7091+
let pool = system.staking.get_pool(:staker);
7092+
let delegator = system.new_delegator(:amount);
7093+
system.delegate(:delegator, :pool, :amount);
7094+
self.staker = Option::Some(staker);
7095+
self.pool = Option::Some(pool);
7096+
self.delegator = Option::Some(delegator);
7097+
7098+
let one_week = Time::weeks(count: 1);
7099+
system.advance_time(time: one_week);
7100+
system.staking.update_global_index_if_needed();
7101+
7102+
let expected_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
7103+
self.expected_rewards = Option::Some(expected_rewards);
7104+
7105+
system.set_pool_for_upgrade(pool_address: pool);
7106+
system.set_staker_for_migration(staker_address: staker.staker.address);
7107+
}
7108+
7109+
fn setup_v1(ref self: DelegatorChangeBalanceOverVersionsFlow, ref system: SystemState) {
7110+
let staker = self.staker.unwrap();
7111+
let delegator = self.delegator.unwrap();
7112+
let pool = self.pool.unwrap();
7113+
7114+
// Pool gets rewards.
7115+
system.advance_k_epochs_and_attest(:staker);
7116+
let mut expected_rewards_v1 = calculate_strk_pool_rewards_v1(
7117+
staker_address: staker.staker.address,
7118+
staking_contract: system.staking.address,
7119+
minting_curve_contract: system.minting_curve.address,
7120+
);
7121+
7122+
// Partial delegator intent.
7123+
let delegator_amount = system.pool_member_info_v1(:delegator, :pool).amount;
7124+
system.delegator_exit_intent(:delegator, :pool, amount: delegator_amount / 2);
7125+
7126+
// Pool gets rewards.
7127+
system.advance_k_epochs_and_attest(:staker);
7128+
expected_rewards_v1 +=
7129+
calculate_strk_pool_rewards_v1(
7130+
staker_address: staker.staker.address,
7131+
staking_contract: system.staking.address,
7132+
minting_curve_contract: system.minting_curve.address,
7133+
);
7134+
7135+
let expected_rewards_v0 = self.expected_rewards.unwrap();
7136+
self.expected_rewards = Option::Some(expected_rewards_v0 + expected_rewards_v1);
7137+
}
7138+
7139+
fn test(self: DelegatorChangeBalanceOverVersionsFlow, ref system: SystemState) {
7140+
let staker = self.staker.unwrap();
7141+
let delegator = self.delegator.unwrap();
7142+
let pool = self.pool.unwrap();
7143+
7144+
// Pool gets rewards.
7145+
system.advance_k_epochs_and_attest(:staker);
7146+
let mut expected_rewards_v3 = calculate_strk_pool_rewards_v2(
7147+
staker_address: staker.staker.address,
7148+
staking_contract: system.staking.address,
7149+
minting_curve_contract: system.minting_curve.address,
7150+
);
7151+
7152+
// Zero delegator intent.
7153+
system.delegator_exit_intent(:delegator, :pool, amount: Zero::zero());
7154+
7155+
// Pool gets rewards.
7156+
system.advance_k_epochs_and_attest(:staker);
7157+
expected_rewards_v3 +=
7158+
calculate_strk_pool_rewards_v2(
7159+
staker_address: staker.staker.address,
7160+
staking_contract: system.staking.address,
7161+
minting_curve_contract: system.minting_curve.address,
7162+
);
7163+
7164+
// Test rewards.
7165+
system.advance_epoch();
7166+
let expected_rewards = self.expected_rewards.unwrap() + expected_rewards_v3;
7167+
assert!(
7168+
wide_abs_diff(
7169+
system.delegator_unclaimed_rewards(:delegator, :pool), expected_rewards,
7170+
) < 10,
7171+
);
7172+
let actual_rewards = system.delegator_claim_rewards(:delegator, :pool);
7173+
let pool_balance = system.token.balance_of(account: pool);
7174+
assert!(pool_balance < 10);
7175+
assert_eq!(wide_abs_diff(actual_rewards, expected_rewards), pool_balance.into());
7176+
assert_eq!(
7177+
system.token.balance_of(account: delegator.reward.address), actual_rewards.into(),
7178+
);
7179+
}
7180+
}
7181+
7182+
/// Flow:
7183+
/// Delegator enter in V0.
7184+
/// Attest in V1 (pool gets rewards).
7185+
/// Attest in V2 (pool gets rewards).
7186+
/// Attest in V3 (pool gets rewards).
7187+
/// test rewards with view function.
7188+
/// Delegator change balance in V3.
7189+
/// Attest in V3 (pool gets rewards).
7190+
/// Test delegator rewards.
7191+
#[derive(Drop, Copy)]
7192+
pub(crate) struct DelegatorFromV0Flow {
7193+
pub(crate) staker: Option<Staker>,
7194+
pub(crate) pool: Option<ContractAddress>,
7195+
pub(crate) delegator: Option<Delegator>,
7196+
pub(crate) expected_rewards: Option<Amount>,
7197+
}
7198+
pub(crate) impl DelegatorFromV0FlowImpl of FlowTrait<DelegatorFromV0Flow> {
7199+
fn setup(ref self: DelegatorFromV0Flow, ref system: SystemState) {
7200+
let amount = system.staking.get_min_stake();
7201+
let staker = system.new_staker(:amount);
7202+
let commission = 200;
7203+
system.stake(:staker, :amount, pool_enabled: true, :commission);
7204+
let pool = system.staking.get_pool(:staker);
7205+
let delegator = system.new_delegator(:amount);
7206+
system.delegate(:delegator, :pool, :amount);
7207+
self.staker = Option::Some(staker);
7208+
self.pool = Option::Some(pool);
7209+
self.delegator = Option::Some(delegator);
7210+
7211+
let one_week = Time::weeks(count: 1);
7212+
system.advance_time(time: one_week);
7213+
system.staking.update_global_index_if_needed();
7214+
7215+
let expected_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
7216+
self.expected_rewards = Option::Some(expected_rewards);
7217+
7218+
system.set_pool_for_upgrade(pool_address: pool);
7219+
system.set_staker_for_migration(staker_address: staker.staker.address);
7220+
}
7221+
7222+
fn setup_v1(ref self: DelegatorFromV0Flow, ref system: SystemState) {
7223+
let staker = self.staker.unwrap();
7224+
7225+
// Pool gets rewards.
7226+
system.advance_k_epochs_and_attest(:staker);
7227+
let expected_rewards_v1 = calculate_strk_pool_rewards_v1(
7228+
staker_address: staker.staker.address,
7229+
staking_contract: system.staking.address,
7230+
minting_curve_contract: system.minting_curve.address,
7231+
);
7232+
7233+
let expected_rewards = self.expected_rewards.unwrap() + expected_rewards_v1;
7234+
self.expected_rewards = Option::Some(expected_rewards);
7235+
}
7236+
7237+
fn test(self: DelegatorFromV0Flow, ref system: SystemState) {
7238+
let staker = self.staker.unwrap();
7239+
let delegator = self.delegator.unwrap();
7240+
let pool = self.pool.unwrap();
7241+
7242+
// Pool gets rewards.
7243+
system.advance_k_epochs_and_attest(:staker);
7244+
let expected_rewards_v3 = calculate_strk_pool_rewards_v2(
7245+
staker_address: staker.staker.address,
7246+
staking_contract: system.staking.address,
7247+
minting_curve_contract: system.minting_curve.address,
7248+
);
7249+
7250+
// Test rewards with view function.
7251+
system.advance_epoch();
7252+
let mut expected_rewards = self.expected_rewards.unwrap() + expected_rewards_v3;
7253+
let unclaimed_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
7254+
assert_eq!(unclaimed_rewards, expected_rewards);
7255+
7256+
// Delegator change balance.
7257+
let delegator_amount = system.pool_member_info_v1(:delegator, :pool).amount;
7258+
system.delegator_exit_intent(:delegator, :pool, amount: delegator_amount / 2);
7259+
7260+
// Test rewards with view function.
7261+
let unclaimed_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
7262+
assert_eq!(unclaimed_rewards, expected_rewards);
7263+
7264+
// Pool gets rewards.
7265+
system.advance_k_epochs_and_attest(:staker);
7266+
expected_rewards +=
7267+
calculate_strk_pool_rewards_v2(
7268+
staker_address: staker.staker.address,
7269+
staking_contract: system.staking.address,
7270+
minting_curve_contract: system.minting_curve.address,
7271+
);
7272+
7273+
// Test delegator rewards.
7274+
system.advance_epoch();
7275+
let actual_rewards = system.delegator_claim_rewards(:delegator, :pool);
7276+
let pool_balance = system.token.balance_of(account: pool);
7277+
assert!(pool_balance < 10);
7278+
assert_eq!(actual_rewards, expected_rewards);
7279+
assert_eq!(
7280+
system.token.balance_of(account: delegator.reward.address), actual_rewards.into(),
7281+
);
7282+
}
7283+
}
7284+
7285+
/// Flow:
7286+
/// Delegator enter in V0.
7287+
/// Delegator change balance in V3.
7288+
/// Attest in V3 (pool gets rewards).
7289+
/// Test delegator rewards.
7290+
#[derive(Drop, Copy)]
7291+
pub(crate) struct DelegatorV0ChangeBalanceBeforeRewardsFlow {
7292+
pub(crate) staker: Option<Staker>,
7293+
pub(crate) pool: Option<ContractAddress>,
7294+
pub(crate) delegator: Option<Delegator>,
7295+
}
7296+
pub(crate) impl DelegatorV0ChangeBalanceBeforeRewardsFlowImpl of FlowTrait<
7297+
DelegatorV0ChangeBalanceBeforeRewardsFlow,
7298+
> {
7299+
fn setup(ref self: DelegatorV0ChangeBalanceBeforeRewardsFlow, ref system: SystemState) {
7300+
let amount = system.staking.get_min_stake();
7301+
let staker = system.new_staker(:amount);
7302+
let commission = 200;
7303+
system.stake(:staker, :amount, pool_enabled: true, :commission);
7304+
let pool = system.staking.get_pool(:staker);
7305+
let delegator = system.new_delegator(:amount);
7306+
system.delegate(:delegator, :pool, :amount);
7307+
self.staker = Option::Some(staker);
7308+
self.pool = Option::Some(pool);
7309+
self.delegator = Option::Some(delegator);
7310+
7311+
system.set_pool_for_upgrade(pool_address: pool);
7312+
system.set_staker_for_migration(staker_address: staker.staker.address);
7313+
}
7314+
7315+
fn test(self: DelegatorV0ChangeBalanceBeforeRewardsFlow, ref system: SystemState) {
7316+
let staker = self.staker.unwrap();
7317+
let delegator = self.delegator.unwrap();
7318+
let pool = self.pool.unwrap();
7319+
7320+
// Delegator change balance.
7321+
let delegator_amount = system.pool_member_info_v1(:delegator, :pool).amount;
7322+
system.delegator_exit_intent(:delegator, :pool, amount: delegator_amount / 2);
7323+
7324+
// Pool gets rewards.
7325+
system.advance_k_epochs_and_attest(:staker);
7326+
let expected_rewards = calculate_strk_pool_rewards_v2(
7327+
staker_address: staker.staker.address,
7328+
staking_contract: system.staking.address,
7329+
minting_curve_contract: system.minting_curve.address,
7330+
);
7331+
7332+
// Test delegator rewards.
7333+
system.advance_epoch();
7334+
let unclaimed_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
7335+
let actual_rewards = system.delegator_claim_rewards(:delegator, :pool);
7336+
let pool_balance = system.token.balance_of(account: pool);
7337+
assert!(pool_balance < 10);
7338+
assert_eq!(unclaimed_rewards, actual_rewards);
7339+
assert_eq!(actual_rewards, expected_rewards);
7340+
assert_eq!(
7341+
system.token.balance_of(account: delegator.reward.address), actual_rewards.into(),
7342+
);
7343+
}
7344+
}

src/flow_test/fork_test.cairo

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,3 +443,36 @@ fn get_stakers_after_upgrade_flow_test() {
443443
let mut flow = flows::GetStakersAfterUpgradeFlow { staker: Option::None };
444444
test_flow_mainnet(ref :flow);
445445
}
446+
447+
#[test]
448+
#[fork("MAINNET_LATEST")]
449+
fn delegator_change_balance_over_versions_flow_test() {
450+
let mut flow = flows::DelegatorChangeBalanceOverVersionsFlow {
451+
staker: Option::None,
452+
pool: Option::None,
453+
delegator: Option::None,
454+
expected_rewards: Option::None,
455+
};
456+
test_flow_mainnet(ref :flow);
457+
}
458+
459+
#[test]
460+
#[fork("MAINNET_LATEST")]
461+
fn delegator_from_v0_flow_test() {
462+
let mut flow = flows::DelegatorFromV0Flow {
463+
staker: Option::None,
464+
pool: Option::None,
465+
delegator: Option::None,
466+
expected_rewards: Option::None,
467+
};
468+
test_flow_mainnet(ref :flow);
469+
}
470+
471+
#[test]
472+
#[fork("MAINNET_LATEST")]
473+
fn delegator_v0_change_balance_before_rewards_flow_test() {
474+
let mut flow = flows::DelegatorV0ChangeBalanceBeforeRewardsFlow {
475+
staker: Option::None, pool: Option::None, delegator: Option::None,
476+
};
477+
test_flow_mainnet(ref :flow);
478+
}

0 commit comments

Comments
 (0)