Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Owner claim undist farm boosted rewards #1015

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions dex/farm-with-locked-rewards/wasm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

// Init: 1
// Upgrade: 1
// Endpoints: 69
// Endpoints: 68
// Async Callback: 1
// Total number of exported functions: 72
// Total number of exported functions: 71

#![no_std]

Expand Down Expand Up @@ -74,7 +74,6 @@ multiversx_sc_wasm_adapter::endpoints! {
getAccumulatedRewardsForWeek => accumulated_rewards_for_week
getFarmSupplyForWeek => farm_supply_for_week
getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute
getUndistributedBoostedRewards => undistributed_boosted_rewards
setBoostedYieldsFactors => set_boosted_yields_factors
getBoostedYieldsFactors => get_boosted_yields_factors
getCurrentWeek => get_current_week
Expand Down
8 changes: 5 additions & 3 deletions dex/farm/tests/farm_multi_user_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -696,12 +696,14 @@ fn farm_multiple_claim_weeks_with_collect_undistributed_rewards_test() {

farm_setup.check_error_collect_undistributed_boosted_rewards(
"Current week must be higher than the week offset",
1,
4,
);

// advance to week 6
farm_setup.b_mock.set_block_epoch(36);

farm_setup.collect_undistributed_boosted_rewards();
farm_setup.collect_undistributed_boosted_rewards(1, 1);
farm_setup.check_undistributed_boosted_rewards(1);
farm_setup.check_remaining_boosted_rewards_to_distribute(1, 0);
farm_setup.check_remaining_boosted_rewards_to_distribute(2, 1);
Expand All @@ -710,7 +712,7 @@ fn farm_multiple_claim_weeks_with_collect_undistributed_rewards_test() {
// advance to week 8
farm_setup.b_mock.set_block_epoch(50);

farm_setup.collect_undistributed_boosted_rewards();
farm_setup.collect_undistributed_boosted_rewards(1, 3);
farm_setup.check_undistributed_boosted_rewards(3);

farm_setup.check_remaining_boosted_rewards_to_distribute(1, 0);
Expand Down Expand Up @@ -974,7 +976,7 @@ fn farm_claim_with_minimum_tokens() {
let remaining_boosted_yields_rewards =
total_boosted_yields_rewards - first_boosted_amt - second_boosted_amt;
farm_setup.check_undistributed_boosted_rewards(0);
farm_setup.collect_undistributed_boosted_rewards();
farm_setup.collect_undistributed_boosted_rewards(1, 1);
farm_setup.check_undistributed_boosted_rewards(remaining_boosted_yields_rewards);
farm_setup.check_remaining_boosted_rewards_to_distribute(1, 0);
farm_setup.check_remaining_boosted_rewards_to_distribute(2, 0);
Expand Down
57 changes: 45 additions & 12 deletions dex/farm/tests/farm_setup/multi_user_farm_setup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,11 @@ use pausable::{PausableModule, State};
use permissions_hub::PermissionsHub;
use permissions_hub_module::PermissionsHubModule;
use sc_whitelist_module::SCWhitelistModule;
use week_timekeeping::Epoch;
use week_timekeeping::{Epoch, Week};
use weekly_rewards_splitting::update_claim_progress_energy::UpdateClaimProgressEnergyModule;

use super::single_user_farm_setup::MEX_TOKEN_ID;

pub static REWARD_TOKEN_ID: &[u8] = b"REW-123456";
pub static FARMING_TOKEN_ID: &[u8] = b"LPTOK-123456";
pub static FARM_TOKEN_ID: &[u8] = b"FARM-123456";
Expand Down Expand Up @@ -73,6 +75,7 @@ pub struct MultiUserFarmSetup<
pub first_user: Address,
pub second_user: Address,
pub third_user: Address,
pub undistributed_rew_dest: Address,
pub last_farm_token_nonce: u64,
pub farm_wrapper: ContractObjWrapper<farm::ContractObj<DebugApi>, FarmObjBuilder>,
pub energy_factory_wrapper:
Expand Down Expand Up @@ -108,6 +111,7 @@ where
let first_user = b_mock.create_user_account(&rust_zero);
let second_user = b_mock.create_user_account(&rust_zero);
let third_user = b_mock.create_user_account(&rust_zero);
let undistributed_rew_dest = b_mock.create_user_account(&rust_zero);
let farm_wrapper =
b_mock.create_sc_account(&rust_zero, Some(&owner), farm_builder, "farm.wasm");
let energy_factory_wrapper = b_mock.create_sc_account(
Expand All @@ -119,6 +123,20 @@ where
let eu_wrapper =
b_mock.create_sc_account(&rust_zero, Some(&owner), eu_builder, "energy update mock");

b_mock
.execute_tx(&owner, &energy_factory_wrapper, &rust_zero, |sc| {
sc.init();
sc.base_asset_token_id()
.set(managed_token_id!(MEX_TOKEN_ID));
})
.assert_ok();

b_mock.set_esdt_local_roles(
energy_factory_wrapper.address_ref(),
MEX_TOKEN_ID,
&[EsdtLocalRole::Mint],
);

b_mock
.execute_tx(&owner, &eu_wrapper, &rust_zero, |sc| {
sc.init();
Expand Down Expand Up @@ -219,6 +237,7 @@ where
first_user,
second_user,
third_user,
undistributed_rew_dest,
last_farm_token_nonce: 0,
farm_wrapper,
energy_factory_wrapper,
Expand Down Expand Up @@ -810,18 +829,33 @@ where
.assert_ok();
}

pub fn check_error_collect_undistributed_boosted_rewards(&mut self, expected_message: &str) {
pub fn check_error_collect_undistributed_boosted_rewards(
&mut self,
expected_message: &str,
start_week: Week,
end_week: Week,
) {
let dest_address = self.undistributed_rew_dest.clone();
self.b_mock
.execute_tx(&self.owner, &self.farm_wrapper, &rust_biguint!(0), |sc| {
sc.collect_undistributed_boosted_rewards();
sc.collect_undistributed_boosted_rewards(
start_week,
end_week,
managed_address!(&dest_address),
);
})
.assert_error(4, expected_message)
.assert_error(4, expected_message);
}

pub fn collect_undistributed_boosted_rewards(&mut self) {
pub fn collect_undistributed_boosted_rewards(&mut self, start_week: Week, end_week: Week) {
let dest_address = self.undistributed_rew_dest.clone();
self.b_mock
.execute_tx(&self.owner, &self.farm_wrapper, &rust_biguint!(0), |sc| {
sc.collect_undistributed_boosted_rewards();
sc.collect_undistributed_boosted_rewards(
start_week,
end_week,
managed_address!(&dest_address),
);
})
.assert_ok();
}
Expand All @@ -842,12 +876,11 @@ where
}

pub fn check_undistributed_boosted_rewards(&mut self, expected_amount: u64) {
self.b_mock
.execute_query(&self.farm_wrapper, |sc| {
let result_managed = sc.undistributed_boosted_rewards().get();
assert_eq!(result_managed, managed_biguint!(expected_amount));
})
.assert_ok();
self.b_mock.check_esdt_balance(
&self.undistributed_rew_dest,
MEX_TOKEN_ID,
&rust_biguint!(expected_amount),
);
}

pub fn check_farm_token_supply(&mut self, expected_farm_token_supply: u64) {
Expand Down
5 changes: 2 additions & 3 deletions dex/farm/wasm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

// Init: 1
// Upgrade: 1
// Endpoints: 66
// Endpoints: 65
// Async Callback: 1
// Total number of exported functions: 69
// Total number of exported functions: 68

#![no_std]

Expand Down Expand Up @@ -71,7 +71,6 @@ multiversx_sc_wasm_adapter::endpoints! {
getAccumulatedRewardsForWeek => accumulated_rewards_for_week
getFarmSupplyForWeek => farm_supply_for_week
getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute
getUndistributedBoostedRewards => undistributed_boosted_rewards
setBoostedYieldsFactors => set_boosted_yields_factors
getBoostedYieldsFactors => get_boosted_yields_factors
getCurrentWeek => get_current_week
Expand Down
1 change: 1 addition & 0 deletions dex/pair/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,4 @@ pub trait Pair<ContractReader>:
self.lp_token_identifier().set(&token_identifier);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
multiversx_sc::imports!();
multiversx_sc::derive_imports!();

pub const USER_MAX_CLAIM_WEEKS: usize = 4;
pub const USER_MAX_CLAIM_WEEKS: Week = 4;

pub mod base_impl;
pub mod events;
Expand Down
14 changes: 14 additions & 0 deletions energy-integration/energy-factory-mock/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,23 @@ pub trait EnergyFactoryMock {
self.user_energy(&user).set(&energy);
}

#[endpoint(transferUnlockedToken)]
fn transfer_unlocked_token(&self, dest: ManagedAddress, amount: BigUint) {
require!(amount != 0, "Invalid amount");

let base_asset_token_id = self.base_asset_token_id().get();
self.send()
.esdt_local_mint(&base_asset_token_id, 0, &amount);
self.send()
.direct_esdt(&dest, &base_asset_token_id, 0, &amount);
}

#[storage_mapper("userEnergy")]
fn user_energy(&self, user: &ManagedAddress) -> SingleValueMapper<Energy<Self::Api>>;

#[storage_mapper("lockedTokenId")]
fn locked_token(&self) -> NonFungibleTokenMapper;

#[storage_mapper("baseAssetTokenId")]
fn base_asset_token_id(&self) -> SingleValueMapper<TokenIdentifier>;
}
5 changes: 3 additions & 2 deletions energy-integration/energy-factory-mock/wasm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
////////////////////////////////////////////////////

// Init: 1
// Endpoints: 4
// Endpoints: 5
// Async Callback (empty): 1
// Total number of exported functions: 6
// Total number of exported functions: 7

#![no_std]

Expand All @@ -22,6 +22,7 @@ multiversx_sc_wasm_adapter::endpoints! {
getEnergyAmountForUser => get_energy_amount_for_user
getEnergyEntryForUser => get_energy_entry_for_user
setUserEnergyAfterLockedTokenTransfer => set_user_energy_after_locked_token_transfer
transferUnlockedToken => transfer_unlocked_token
)
}

Expand Down
59 changes: 39 additions & 20 deletions energy-integration/farm-boosted-yields/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,16 @@ impl<M: ManagedTypeApi> SplitReward<M> {
}
}

mod energy_factory_proxy_send_rew {
multiversx_sc::imports!();

#[multiversx_sc::proxy]
pub trait EnergyFactorySendRewProxy {
#[endpoint(transferUnlockedToken)]
fn transfer_unlocked_token(&self, dest: ManagedAddress, amount: BigUint);
}
}

#[multiversx_sc::module]
pub trait FarmBoostedYieldsModule:
boosted_yields_factors::BoostedYieldsFactorsModule
Expand All @@ -44,31 +54,41 @@ pub trait FarmBoostedYieldsModule:
+ weekly_rewards_splitting::update_claim_progress_energy::UpdateClaimProgressEnergyModule
+ energy_query::EnergyQueryModule
{
#[only_owner]
#[endpoint(collectUndistributedBoostedRewards)]
fn collect_undistributed_boosted_rewards(&self) {
self.require_caller_has_admin_permissions();

let collect_rewards_offset = USER_MAX_CLAIM_WEEKS + 1usize;
fn collect_undistributed_boosted_rewards(
&self,
start_week: Week,
end_week: Week,
dest_address: ManagedAddress,
) {
let collect_rewards_offset = USER_MAX_CLAIM_WEEKS + 1;
let current_week = self.get_current_week();
require!(
current_week > collect_rewards_offset,
"Current week must be higher than the week offset"
);
require!(start_week <= end_week, "Invalid week numbers");
require!(
end_week <= current_week - collect_rewards_offset,
"Invalid end week"
);

let last_collect_week_mapper = self.last_undistributed_boosted_rewards_collect_week();
let first_collect_week = last_collect_week_mapper.get() + 1;
let last_collect_week = current_week - collect_rewards_offset;
if first_collect_week > last_collect_week {
return;
let mut total_rewards = BigUint::zero();
for week in start_week..=end_week {
let rewards_to_distribute = self.remaining_boosted_rewards_to_distribute(week).take();
total_rewards += rewards_to_distribute;
}

for week in first_collect_week..=last_collect_week {
let rewards_to_distribute = self.remaining_boosted_rewards_to_distribute(week).take();
self.undistributed_boosted_rewards()
.update(|total_amount| *total_amount += rewards_to_distribute);
if total_rewards == 0 {
return;
}

last_collect_week_mapper.set(last_collect_week);
let energy_factory = self.energy_factory_address().get();
let _: () = self
.energy_factory_send_rew_proxy_obj(energy_factory)
.transfer_unlocked_token(dest_address, total_rewards)
.execute_on_dest_context();
}

fn take_reward_slice(&self, full_reward: BigUint) -> SplitReward<Self::Api> {
Expand Down Expand Up @@ -150,12 +170,11 @@ pub trait FarmBoostedYieldsModule:
#[storage_mapper("remainingBoostedRewardsToDistribute")]
fn remaining_boosted_rewards_to_distribute(&self, week: Week) -> SingleValueMapper<BigUint>;

#[storage_mapper("lastUndistributedBoostedRewardsCollectWeek")]
fn last_undistributed_boosted_rewards_collect_week(&self) -> SingleValueMapper<Week>;

#[view(getUndistributedBoostedRewards)]
#[storage_mapper("undistributedBoostedRewards")]
fn undistributed_boosted_rewards(&self) -> SingleValueMapper<BigUint>;
#[proxy]
fn energy_factory_send_rew_proxy_obj(
&self,
sc_address: ManagedAddress,
) -> energy_factory_proxy_send_rew::Proxy<Self::Api>;
}

pub struct FarmBoostedYieldsWrapper<T: FarmBoostedYieldsModule> {
Expand Down
5 changes: 2 additions & 3 deletions farm-staking/farm-staking/wasm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

// Init: 1
// Upgrade: 1
// Endpoints: 72
// Endpoints: 71
// Async Callback: 1
// Total number of exported functions: 75
// Total number of exported functions: 74

#![no_std]

Expand Down Expand Up @@ -77,7 +77,6 @@ multiversx_sc_wasm_adapter::endpoints! {
getAccumulatedRewardsForWeek => accumulated_rewards_for_week
getFarmSupplyForWeek => farm_supply_for_week
getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute
getUndistributedBoostedRewards => undistributed_boosted_rewards
setBoostedYieldsFactors => set_boosted_yields_factors
getBoostedYieldsFactors => get_boosted_yields_factors
getCurrentWeek => get_current_week
Expand Down
2 changes: 2 additions & 0 deletions locked-asset/energy-factory/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pub mod penalty;
pub mod token_merging;
pub mod token_whitelist;
pub mod unlock_with_penalty;
pub mod unlocked_token_transfer;
pub mod unstake;
pub mod virtual_lock;

Expand Down Expand Up @@ -47,6 +48,7 @@ pub trait SimpleLockEnergy:
+ virtual_lock::VirtualLockModule
+ sc_whitelist_module::SCWhitelistModule
+ locked_token_transfer::LockedTokenTransferModule
+ unlocked_token_transfer::UnlockedTokenTransferModule
+ legacy_token_decode_module::LegacyTokenDecodeModule
{
/// Args:
Expand Down
6 changes: 3 additions & 3 deletions locked-asset/energy-factory/src/lock_options.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
multiversx_sc::imports!();
multiversx_sc::derive_imports!();

use common_structs::Epoch;
use common_structs::{Epoch, Percent};
use unwrappable::Unwrappable;

pub const EPOCHS_PER_MONTH: Epoch = 30;
pub const EPOCHS_PER_YEAR: Epoch = 12 * EPOCHS_PER_MONTH;
pub const MAX_PENALTY_PERCENTAGE: u64 = 10_000; // 100%
pub const MAX_PENALTY_PERCENTAGE: Percent = 10_000; // 100%

#[derive(TypeAbi, TopEncode, TopDecode, NestedEncode, NestedDecode, Clone, Copy, Default)]
pub struct LockOption {
pub lock_epochs: Epoch,
pub penalty_start_percentage: u64,
pub penalty_start_percentage: Percent,
}

pub const MAX_LOCK_OPTIONS: usize = 10;
Expand Down
Loading