Skip to content

Commit

Permalink
zero position claim farm staking farm supply fix
Browse files Browse the repository at this point in the history
  • Loading branch information
psorinionut committed Aug 2, 2024
1 parent 6c0d6b6 commit f5d2593
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -465,3 +465,66 @@ fn claim_rewards_per_week_test() {
None,
);
}

#[test]
fn claim_boosted_rewards_with_zero_position_test() {
DebugApi::dummy();
let mut farm_setup = FarmSetup::new(
farm_with_locked_rewards::contract_obj,
energy_factory::contract_obj,
);

farm_setup.set_boosted_yields_rewards_percentage(BOOSTED_YIELDS_PERCENTAGE);
farm_setup.set_boosted_yields_factors();
farm_setup.b_mock.set_block_epoch(2);

let temp_user = farm_setup.third_user.clone();

// first user enter farm
let farm_in_amount = 100_000_000;
let first_user = farm_setup.first_user.clone();
farm_setup.set_user_energy(&first_user, 1_000, 2, 1);
farm_setup.enter_farm(&first_user, farm_in_amount);

farm_setup.check_farm_token_supply(farm_in_amount);
farm_setup.check_farm_rps(0u64);

farm_setup.b_mock.set_block_nonce(10);
farm_setup.b_mock.set_block_epoch(6);
farm_setup.set_user_energy(&first_user, 1_000, 6, 1);
farm_setup.set_user_energy(&temp_user, 1, 6, 1);
farm_setup.enter_farm(&temp_user, 1);
farm_setup.exit_farm(&temp_user, 2, 1);

farm_setup.check_farm_rps(75_000_000u64);

// advance 1 week
farm_setup.set_user_energy(&first_user, 1_000, 13, 1);
farm_setup.b_mock.set_block_nonce(20);
farm_setup.b_mock.set_block_epoch(13);

let second_week_received_reward_amt =
farm_setup.claim_boosted_rewards_for_user(&temp_user, &temp_user, 0);

assert_eq!(second_week_received_reward_amt, 0);
farm_setup.check_farm_rps(150_000_000u64);

// advance 1 week
let boosted_rewards = 2_500;
farm_setup.set_user_energy(&first_user, 1_000, 15, 1);
farm_setup.b_mock.set_block_nonce(30);
farm_setup.b_mock.set_block_epoch(15);
let third_week_received_reward_amt =
farm_setup.claim_boosted_rewards_for_user(&first_user, &first_user, 1);

assert_eq!(third_week_received_reward_amt, boosted_rewards * 2); // user receives rewards for weeks 1 and 2)
farm_setup.check_farm_rps(225_000_000u64);

farm_setup.b_mock.check_nft_balance::<Empty>(
&first_user,
LOCKED_REWARD_TOKEN_ID,
1,
&rust_biguint!(boosted_rewards * 2),
None,
);
}
7 changes: 1 addition & 6 deletions farm-staking/farm-staking/src/base_impl_wrapper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,8 @@ where
caller: &ManagedAddress<<<Self as FarmContract>::FarmSc as ContractBase>::Api>,
) -> BigUint<<<Self as FarmContract>::FarmSc as ContractBase>::Api> {
let user_total_farm_position = sc.user_total_farm_position(caller).get();
let mut boosted_rewards = BigUint::zero();

if user_total_farm_position > 0 {
boosted_rewards = sc.claim_boosted_yields_rewards(caller, user_total_farm_position);
}

boosted_rewards
sc.claim_boosted_yields_rewards(caller, user_total_farm_position)
}
}

Expand Down
90 changes: 90 additions & 0 deletions farm-staking/farm-staking/tests/farm_staking_energy_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1616,3 +1616,93 @@ fn claim_rewards_per_week_test() {
&rust_biguint!(user_rewards_balance),
);
}

#[test]
fn claim_boosted_rewards_with_zero_position_test() {
DebugApi::dummy();
let mut fs_setup =
FarmStakingSetup::new(farm_staking::contract_obj, energy_factory::contract_obj);

fs_setup.set_boosted_yields_factors();
fs_setup.set_boosted_yields_rewards_percentage(BOOSTED_YIELDS_PERCENTAGE);

let first_user = fs_setup.user_address.clone();
let farm_in_amount = 100_000_000;

fs_setup.set_user_energy(&first_user, 10_000, 0, 10);
fs_setup.stake_farm(&first_user, farm_in_amount, &[], 1, 0, 0);

fs_setup.check_farm_token_supply(farm_in_amount);
fs_setup.check_farm_rps(0u64);

fs_setup.b_mock.set_block_nonce(100);
fs_setup.b_mock.set_block_epoch(6);
fs_setup.set_user_energy(&first_user, 1_000, 6, 1);

// Reset user balance
fs_setup
.b_mock
.set_esdt_balance(&first_user, FARMING_TOKEN_ID, &rust_biguint!(0));

// tx to collect rewards
let second_user = fs_setup.b_mock.create_user_account(&rust_biguint!(0));
fs_setup.b_mock.set_esdt_balance(
&second_user,
FARMING_TOKEN_ID,
&rust_biguint!(USER_TOTAL_RIDE_TOKENS),
);

fs_setup.set_user_energy(&second_user, 1, 6, 1);
fs_setup.stake_farm(&second_user, 10, &[], 2, 3_000_000u64, 0);
fs_setup.unstake_farm_no_checks(&second_user, 10, 2);

let farm_rps_increase = 3_000_000u64;
let mut current_farm_rps = 0;
current_farm_rps += farm_rps_increase;
fs_setup.check_farm_rps(current_farm_rps);

// advance 1 week
fs_setup.set_user_energy(&first_user, 1_000, 13, 1);
fs_setup.b_mock.set_block_nonce(200);
fs_setup.b_mock.set_block_epoch(13);

let boosted_rewards_for_week = 100;
fs_setup.claim_boosted_rewards_for_user(&second_user, &second_user, 0, &rust_biguint!(0));

current_farm_rps += farm_rps_increase;
fs_setup.check_farm_rps(current_farm_rps);

// advance 1 week
fs_setup.set_user_energy(&first_user, 1_000, 15, 1);
fs_setup.b_mock.set_block_nonce(300);
fs_setup.b_mock.set_block_epoch(15);
fs_setup.claim_boosted_rewards_for_user(
&first_user,
&first_user,
boosted_rewards_for_week * 2,
&rust_biguint!(boosted_rewards_for_week * 2),
);

current_farm_rps += farm_rps_increase;
fs_setup.check_farm_rps(current_farm_rps);
fs_setup.b_mock.check_esdt_balance(
&first_user,
REWARD_TOKEN_ID,
&rust_biguint!(boosted_rewards_for_week * 2),
);

let expected_attributes = StakingFarmTokenAttributes::<DebugApi> {
reward_per_share: managed_biguint!(0),
compounded_reward: managed_biguint!(0),
current_farm_amount: managed_biguint!(farm_in_amount),
original_owner: managed_address!(&first_user),
};

fs_setup.b_mock.check_nft_balance(
&first_user,
FARM_TOKEN_ID,
1,
&rust_biguint!(farm_in_amount),
Some(&expected_attributes),
);
}

0 comments on commit f5d2593

Please sign in to comment.