Skip to content

Commit c8d4f20

Browse files
test: k=2 migration member flows (#97)
1 parent 9734730 commit c8d4f20

File tree

3 files changed

+432
-7
lines changed

3 files changed

+432
-7
lines changed

src/flow_test/flow_ideas.md

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,6 @@
1515
- staker change balance, attest, change balance, attest, set_v3, change balance, update_rewards, change_balance, update_rewards, test rewards.
1616
- with member from previous versions.
1717

18-
## k=1 -> k=2 Migration Member
19-
- find sigma: Enter V0, change in V1, catch all ifs.
20-
more ideas:
21-
- member from V1, pool gets rewards at V1, update balance at V1, update balance at V3, pool gets rewards at V3, test rewards.
22-
- member from V1, pool gets rewards at V1, pool gets rewards at V3, update balance at V3, test rewards.
23-
- member from V1, pool gets rewards at V1, pool gets rewards at V3, test rewards.
24-
2518
## k=1 -> k=2 Migration Staker
2619
- staker enter in V0, attest in V1, update balance in V1, attest in V1, attest in V2, update balance in V2, attest in V2, attest in V3, update balance in V3, attest in V3, test rewards.
2720
- staker in V2, update balance staker+update balance pool, upgrade, attest in current epoch, attest in next epoch, attest in next next epoch

src/flow_test/flows.cairo

Lines changed: 360 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9386,3 +9386,363 @@ pub(crate) impl StakerFromV2Flow6Impl of FlowTrait<StakerFromV2Flow6> {
93869386
assert!(system.staker_claim_rewards(:staker) == staker_rewards);
93879387
}
93889388
}
9389+
9390+
/// Flow:
9391+
/// Member from V1
9392+
/// Attest in V1 (pool gets rewards)
9393+
/// Member update balance in V1
9394+
/// Upgrade to V3
9395+
/// Member update balance
9396+
/// Attest (pool gets rewards)
9397+
/// Test rewards
9398+
#[derive(Drop, Copy)]
9399+
pub(crate) struct MemberFromV1Flow1 {
9400+
pub(crate) staker: Option<Staker>,
9401+
pub(crate) pool: Option<ContractAddress>,
9402+
pub(crate) delegator: Option<Delegator>,
9403+
pub(crate) unclaimed_rewards: Option<Amount>,
9404+
}
9405+
pub(crate) impl MemberFromV1Flow1Impl of FlowTrait<MemberFromV1Flow1> {
9406+
fn setup_v1(ref self: MemberFromV1Flow1, ref system: SystemState) {
9407+
let amount = system.staking.get_min_stake();
9408+
let staker = system.new_staker(:amount);
9409+
system.stake(:staker, :amount, pool_enabled: true, commission: 0);
9410+
let pool = system.staking.get_pool(:staker);
9411+
let delegator = system.new_delegator(amount: 2 * amount);
9412+
system.delegate(:delegator, :pool, :amount);
9413+
system.advance_k_epochs_and_attest(:staker);
9414+
system.add_to_delegation_pool(:delegator, :pool, :amount);
9415+
system.advance_epoch();
9416+
let unclaimed_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
9417+
self.staker = Option::Some(staker);
9418+
self.pool = Option::Some(pool);
9419+
self.delegator = Option::Some(delegator);
9420+
self.unclaimed_rewards = Option::Some(unclaimed_rewards);
9421+
system.set_staker_for_migration(staker_address: staker.staker.address);
9422+
}
9423+
9424+
fn test(self: MemberFromV1Flow1, ref system: SystemState) {
9425+
let staker = self.staker.unwrap();
9426+
let pool = self.pool.unwrap();
9427+
let delegator = self.delegator.unwrap();
9428+
let mut unclaimed_rewards = self.unclaimed_rewards.unwrap();
9429+
let amount = system.pool_member_info_v1(:delegator, :pool).amount;
9430+
system.delegator_exit_intent(:delegator, :pool, :amount);
9431+
system.advance_block_custom_and_attest(:staker, stake: amount / 2 * 3);
9432+
let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2(
9433+
staker_address: staker.staker.address,
9434+
staking_contract: system.staking.address,
9435+
minting_curve_contract: system.minting_curve.address,
9436+
pool_balance: amount,
9437+
);
9438+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9439+
unclaimed_rewards += expected_rewards;
9440+
system.advance_epoch();
9441+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9442+
let actual_rewards = system.delegator_claim_rewards(:delegator, :pool);
9443+
assert!(actual_rewards == unclaimed_rewards);
9444+
}
9445+
}
9446+
9447+
/// Flow:
9448+
/// Member from V1
9449+
/// Attest in V1 (pool gets rewards)
9450+
/// Upgrade to V3
9451+
/// Attest (pool gets rewards)
9452+
/// Test rewards
9453+
#[derive(Drop, Copy)]
9454+
pub(crate) struct MemberFromV1Flow2 {
9455+
pub(crate) staker: Option<Staker>,
9456+
pub(crate) pool: Option<ContractAddress>,
9457+
pub(crate) delegator: Option<Delegator>,
9458+
pub(crate) unclaimed_rewards: Option<Amount>,
9459+
}
9460+
pub(crate) impl MemberFromV1Flow2Impl of FlowTrait<MemberFromV1Flow2> {
9461+
fn setup_v1(ref self: MemberFromV1Flow2, ref system: SystemState) {
9462+
let amount = system.staking.get_min_stake();
9463+
let staker = system.new_staker(:amount);
9464+
system.stake(:staker, :amount, pool_enabled: true, commission: 0);
9465+
let pool = system.staking.get_pool(:staker);
9466+
let delegator = system.new_delegator(:amount);
9467+
system.delegate(:delegator, :pool, :amount);
9468+
system.advance_k_epochs_and_attest(:staker);
9469+
system.advance_epoch();
9470+
let unclaimed_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
9471+
self.staker = Option::Some(staker);
9472+
self.pool = Option::Some(pool);
9473+
self.delegator = Option::Some(delegator);
9474+
self.unclaimed_rewards = Option::Some(unclaimed_rewards);
9475+
system.set_staker_for_migration(staker_address: staker.staker.address);
9476+
}
9477+
9478+
fn test(self: MemberFromV1Flow2, ref system: SystemState) {
9479+
let staker = self.staker.unwrap();
9480+
let pool = self.pool.unwrap();
9481+
let delegator = self.delegator.unwrap();
9482+
let mut unclaimed_rewards = self.unclaimed_rewards.unwrap();
9483+
let amount = system.pool_member_info_v1(:delegator, :pool).amount;
9484+
system.advance_block_custom_and_attest(:staker, stake: amount * 2);
9485+
let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2(
9486+
staker_address: staker.staker.address,
9487+
staking_contract: system.staking.address,
9488+
minting_curve_contract: system.minting_curve.address,
9489+
pool_balance: amount,
9490+
);
9491+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9492+
unclaimed_rewards += expected_rewards;
9493+
system.advance_epoch();
9494+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9495+
let actual_rewards = system.delegator_claim_rewards(:delegator, :pool);
9496+
assert!(actual_rewards == unclaimed_rewards);
9497+
}
9498+
}
9499+
9500+
/// Flow:
9501+
/// Member from V1
9502+
/// Attest in V1 (pool gets rewards)
9503+
/// Upgrade to V3
9504+
/// Attest (pool gets rewards)
9505+
/// Member update balance
9506+
/// Test rewards
9507+
#[derive(Drop, Copy)]
9508+
pub(crate) struct MemberFromV1Flow3 {
9509+
pub(crate) staker: Option<Staker>,
9510+
pub(crate) pool: Option<ContractAddress>,
9511+
pub(crate) delegator: Option<Delegator>,
9512+
pub(crate) unclaimed_rewards: Option<Amount>,
9513+
}
9514+
pub(crate) impl MemberFromV1Flow3Impl of FlowTrait<MemberFromV1Flow3> {
9515+
fn setup_v1(ref self: MemberFromV1Flow3, ref system: SystemState) {
9516+
let amount = system.staking.get_min_stake();
9517+
let staker = system.new_staker(amount: amount);
9518+
system.stake(:staker, :amount, pool_enabled: true, commission: 0);
9519+
let pool = system.staking.get_pool(:staker);
9520+
let delegator = system.new_delegator(:amount);
9521+
system.delegate(:delegator, :pool, :amount);
9522+
system.advance_k_epochs_and_attest(:staker);
9523+
system.advance_epoch();
9524+
let unclaimed_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
9525+
self.staker = Option::Some(staker);
9526+
self.pool = Option::Some(pool);
9527+
self.delegator = Option::Some(delegator);
9528+
self.unclaimed_rewards = Option::Some(unclaimed_rewards);
9529+
system.set_staker_for_migration(staker_address: staker.staker.address);
9530+
}
9531+
9532+
fn test(self: MemberFromV1Flow3, ref system: SystemState) {
9533+
let staker = self.staker.unwrap();
9534+
let pool = self.pool.unwrap();
9535+
let delegator = self.delegator.unwrap();
9536+
let mut unclaimed_rewards = self.unclaimed_rewards.unwrap();
9537+
let amount = system.pool_member_info_v1(:delegator, :pool).amount;
9538+
system.advance_block_custom_and_attest(:staker, stake: amount * 2);
9539+
let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2(
9540+
staker_address: staker.staker.address,
9541+
staking_contract: system.staking.address,
9542+
minting_curve_contract: system.minting_curve.address,
9543+
pool_balance: amount,
9544+
);
9545+
system.delegator_exit_intent(:delegator, :pool, :amount);
9546+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9547+
unclaimed_rewards += expected_rewards;
9548+
system.advance_epoch();
9549+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9550+
let actual_rewards = system.delegator_claim_rewards(:delegator, :pool);
9551+
assert!(actual_rewards == unclaimed_rewards);
9552+
}
9553+
}
9554+
9555+
/// Flow:
9556+
/// Delegate in V0
9557+
/// Get rewards in V0
9558+
/// Change balance in V1
9559+
/// Get rewards one time before balance is changed
9560+
/// Test rewards of V0 balance.
9561+
#[derive(Drop, Copy)]
9562+
pub(crate) struct DelegatorV0V1RewardsOnceFlow {
9563+
pub(crate) staker: Option<Staker>,
9564+
pub(crate) pool: Option<ContractAddress>,
9565+
pub(crate) delegator: Option<Delegator>,
9566+
pub(crate) unclaimed_rewards: Option<Amount>,
9567+
}
9568+
pub(crate) impl DelegatorV0V1RewardsOnceFlowImpl of FlowTrait<DelegatorV0V1RewardsOnceFlow> {
9569+
fn setup(ref self: DelegatorV0V1RewardsOnceFlow, ref system: SystemState) {
9570+
let amount = system.staking.get_min_stake();
9571+
let staker = system.new_staker(:amount);
9572+
system.stake(:staker, :amount, pool_enabled: true, commission: 10);
9573+
let pool = system.staking.get_pool(:staker);
9574+
let delegator = system.new_delegator(amount: amount * 2);
9575+
system.delegate(:delegator, :pool, :amount);
9576+
system.accrue_rewards(:staker);
9577+
self.staker = Option::Some(staker);
9578+
self.pool = Option::Some(pool);
9579+
self.delegator = Option::Some(delegator);
9580+
system.set_staker_for_migration(staker_address: staker.staker.address);
9581+
system.set_pool_for_upgrade(pool_address: pool);
9582+
}
9583+
9584+
fn setup_v1(ref self: DelegatorV0V1RewardsOnceFlow, ref system: SystemState) {
9585+
let staker = self.staker.unwrap();
9586+
let pool = self.pool.unwrap();
9587+
let delegator = self.delegator.unwrap();
9588+
let amount = system.pool_member_info_v1(:delegator, :pool).amount;
9589+
system.advance_epoch();
9590+
system.increase_delegate(:delegator, :pool, :amount);
9591+
system.advance_block_custom_and_attest(:staker, stake: amount * 2);
9592+
system.advance_k_epochs_and_attest(:staker);
9593+
system.advance_epoch();
9594+
let unclaimed_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
9595+
self.unclaimed_rewards = Option::Some(unclaimed_rewards);
9596+
}
9597+
9598+
fn test(self: DelegatorV0V1RewardsOnceFlow, ref system: SystemState) {
9599+
let staker = self.staker.unwrap();
9600+
let pool = self.pool.unwrap();
9601+
let delegator = self.delegator.unwrap();
9602+
let mut unclaimed_rewards = self.unclaimed_rewards.unwrap();
9603+
let amount = system.staker_info_v1(:staker).amount_own;
9604+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9605+
system.advance_epoch();
9606+
system.advance_block_custom_and_attest(:staker, stake: amount * 3);
9607+
let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2(
9608+
staker_address: staker.staker.address,
9609+
staking_contract: system.staking.address,
9610+
minting_curve_contract: system.minting_curve.address,
9611+
pool_balance: amount * 2,
9612+
);
9613+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9614+
unclaimed_rewards += expected_rewards;
9615+
system.advance_epoch();
9616+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9617+
}
9618+
}
9619+
9620+
9621+
/// Flow:
9622+
/// Delegate in V0
9623+
/// Get rewards in V0
9624+
/// Change balance in V1
9625+
/// Get rewards 3 times before balance is changed
9626+
/// Test rewards of V0 balance.
9627+
#[derive(Drop, Copy)]
9628+
pub(crate) struct DelegatorV0V1RewardsFlow {
9629+
pub(crate) staker: Option<Staker>,
9630+
pub(crate) pool: Option<ContractAddress>,
9631+
pub(crate) delegator: Option<Delegator>,
9632+
pub(crate) unclaimed_rewards: Option<Amount>,
9633+
}
9634+
pub(crate) impl DelegatorV0V1RewardsFlowImpl of FlowTrait<DelegatorV0V1RewardsFlow> {
9635+
fn setup(ref self: DelegatorV0V1RewardsFlow, ref system: SystemState) {
9636+
let amount = system.staking.get_min_stake();
9637+
let staker = system.new_staker(:amount);
9638+
system.stake(:staker, :amount, pool_enabled: true, commission: 10);
9639+
let pool = system.staking.get_pool(:staker);
9640+
let delegator = system.new_delegator(amount: amount * 2);
9641+
system.delegate(:delegator, :pool, :amount);
9642+
system.accrue_rewards(:staker);
9643+
self.staker = Option::Some(staker);
9644+
self.pool = Option::Some(pool);
9645+
self.delegator = Option::Some(delegator);
9646+
system.set_staker_for_migration(staker_address: staker.staker.address);
9647+
system.set_pool_for_upgrade(pool_address: pool);
9648+
}
9649+
9650+
fn setup_v1(ref self: DelegatorV0V1RewardsFlow, ref system: SystemState) {
9651+
let staker = self.staker.unwrap();
9652+
let pool = self.pool.unwrap();
9653+
let delegator = self.delegator.unwrap();
9654+
let amount = system.pool_member_info_v1(:delegator, :pool).amount;
9655+
system.advance_k_epochs_and_attest(:staker);
9656+
system.advance_k_epochs_and_attest(:staker);
9657+
system.advance_epoch();
9658+
system.increase_delegate(:delegator, :pool, :amount);
9659+
system.advance_block_custom_and_attest(:staker, stake: amount * 2);
9660+
system.advance_k_epochs_and_attest(:staker);
9661+
system.advance_epoch();
9662+
let unclaimed_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
9663+
self.unclaimed_rewards = Option::Some(unclaimed_rewards);
9664+
}
9665+
9666+
fn test(self: DelegatorV0V1RewardsFlow, ref system: SystemState) {
9667+
let staker = self.staker.unwrap();
9668+
let pool = self.pool.unwrap();
9669+
let delegator = self.delegator.unwrap();
9670+
let mut unclaimed_rewards = self.unclaimed_rewards.unwrap();
9671+
let amount = system.staker_info_v1(:staker).amount_own;
9672+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9673+
system.advance_epoch();
9674+
system.advance_block_custom_and_attest(:staker, stake: amount * 3);
9675+
let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2(
9676+
staker_address: staker.staker.address,
9677+
staking_contract: system.staking.address,
9678+
minting_curve_contract: system.minting_curve.address,
9679+
pool_balance: amount * 2,
9680+
);
9681+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9682+
unclaimed_rewards += expected_rewards;
9683+
system.advance_epoch();
9684+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9685+
}
9686+
}
9687+
9688+
/// Flow:
9689+
/// Delegate in V0
9690+
/// Change balance in V1
9691+
/// Test rewards - no rewards of V0 balance.
9692+
#[derive(Drop, Copy)]
9693+
pub(crate) struct DelegatorV0V1NoRewardsFlow {
9694+
pub(crate) staker: Option<Staker>,
9695+
pub(crate) pool: Option<ContractAddress>,
9696+
pub(crate) delegator: Option<Delegator>,
9697+
pub(crate) unclaimed_rewards: Option<Amount>,
9698+
}
9699+
pub(crate) impl DelegatorV0V1NoRewardsFlowImpl of FlowTrait<DelegatorV0V1NoRewardsFlow> {
9700+
fn setup(ref self: DelegatorV0V1NoRewardsFlow, ref system: SystemState) {
9701+
let amount = system.staking.get_min_stake();
9702+
let staker = system.new_staker(:amount);
9703+
system.stake(:staker, :amount, pool_enabled: true, commission: 10);
9704+
let pool = system.staking.get_pool(:staker);
9705+
let delegator = system.new_delegator(amount: amount * 2);
9706+
system.delegate(:delegator, :pool, :amount);
9707+
system.accrue_rewards(:staker);
9708+
self.staker = Option::Some(staker);
9709+
self.pool = Option::Some(pool);
9710+
self.delegator = Option::Some(delegator);
9711+
system.set_staker_for_migration(staker_address: staker.staker.address);
9712+
system.set_pool_for_upgrade(pool_address: pool);
9713+
}
9714+
9715+
fn setup_v1(ref self: DelegatorV0V1NoRewardsFlow, ref system: SystemState) {
9716+
let pool = self.pool.unwrap();
9717+
let delegator = self.delegator.unwrap();
9718+
let amount = system.pool_member_info_v1(:delegator, :pool).amount;
9719+
system.advance_epoch();
9720+
system.increase_delegate(:delegator, :pool, :amount);
9721+
system.advance_epoch();
9722+
// Only rewards from V0 (before upgrade to V1).
9723+
let unclaimed_rewards = system.delegator_unclaimed_rewards(:delegator, :pool);
9724+
self.unclaimed_rewards = Option::Some(unclaimed_rewards);
9725+
}
9726+
9727+
fn test(self: DelegatorV0V1NoRewardsFlow, ref system: SystemState) {
9728+
let staker = self.staker.unwrap();
9729+
let pool = self.pool.unwrap();
9730+
let delegator = self.delegator.unwrap();
9731+
let mut unclaimed_rewards = self.unclaimed_rewards.unwrap();
9732+
let amount = system.staker_info_v1(:staker).amount_own;
9733+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9734+
system.advance_epoch();
9735+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9736+
system.advance_block_custom_and_attest(:staker, stake: amount * 3);
9737+
let expected_rewards = calculate_strk_pool_rewards_with_pool_balance_v2(
9738+
staker_address: staker.staker.address,
9739+
staking_contract: system.staking.address,
9740+
minting_curve_contract: system.minting_curve.address,
9741+
pool_balance: amount * 2,
9742+
);
9743+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9744+
unclaimed_rewards += expected_rewards;
9745+
system.advance_epoch();
9746+
assert!(system.delegator_unclaimed_rewards(:delegator, :pool) == unclaimed_rewards);
9747+
}
9748+
}

0 commit comments

Comments
 (0)