From dd97750a4dc174569b109f8fb7b0a4627b60b777 Mon Sep 17 00:00:00 2001 From: Dorin Marian Iancu Date: Thu, 27 Feb 2025 11:27:48 +0200 Subject: [PATCH 1/2] fixes for claim undistributed rewards --- Cargo.lock | 5 +- .../src/external_interaction.rs | 1 + dex/farm-with-locked-rewards/src/lib.rs | 1 + dex/farm-with-locked-rewards/wasm/Cargo.lock | 17 +- dex/farm-with-locked-rewards/wasm/src/lib.rs | 10 +- dex/farm/src/base_functions.rs | 1 + dex/farm/src/external_interaction.rs | 1 + dex/farm/src/lib.rs | 1 + dex/farm/tests/farm_multi_user_test.rs | 8 +- .../tests/farm_setup/multi_user_farm_setup.rs | 32 ++-- dex/farm/wasm/Cargo.lock | 17 +- dex/farm/wasm/src/lib.rs | 10 +- dex/proxy-deployer/wasm/Cargo.lock | 17 +- .../energy-update/wasm/Cargo.lock | 17 +- .../farm-boosted-yields/Cargo.toml | 9 ++ .../farm-boosted-yields/src/lib.rs | 64 +------- .../src/undistributed_rewards.rs | 146 ++++++++++++++++++ .../farm-staking-proxy/wasm/Cargo.lock | 17 +- .../src/claim_only_boosted_staking_rewards.rs | 1 + .../src/claim_stake_farm_rewards.rs | 1 + .../src/compound_stake_farm_rewards.rs | 1 + .../farm-staking/src/custom_rewards.rs | 1 + .../farm-staking/src/external_interaction.rs | 1 + farm-staking/farm-staking/src/lib.rs | 1 + farm-staking/farm-staking/src/stake_farm.rs | 1 + farm-staking/farm-staking/src/unbond_farm.rs | 1 + farm-staking/farm-staking/src/unstake_farm.rs | 1 + farm-staking/farm-staking/wasm/Cargo.lock | 17 +- farm-staking/farm-staking/wasm/src/lib.rs | 10 +- .../farm-staking-proxy-v13/wasm/Cargo.lock | 17 +- locked-asset/proxy_dex/wasm/Cargo.lock | 17 +- 31 files changed, 336 insertions(+), 108 deletions(-) create mode 100644 energy-integration/farm-boosted-yields/src/undistributed_rewards.rs diff --git a/Cargo.lock b/Cargo.lock index 0225ea7f8..f4624cfc1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "ahash" @@ -568,8 +568,11 @@ dependencies = [ "config", "energy-query", "multiversx-sc", + "pair", "pausable", "permissions_module", + "router", + "utils", "week-timekeeping", "weekly-rewards-splitting", ] diff --git a/dex/farm-with-locked-rewards/src/external_interaction.rs b/dex/farm-with-locked-rewards/src/external_interaction.rs index 6f107d307..ea2d64f55 100644 --- a/dex/farm-with-locked-rewards/src/external_interaction.rs +++ b/dex/farm-with-locked-rewards/src/external_interaction.rs @@ -32,6 +32,7 @@ pub trait ExternalInteractionsModule: + farm_base_impl::exit_farm::BaseExitFarmModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/dex/farm-with-locked-rewards/src/lib.rs b/dex/farm-with-locked-rewards/src/lib.rs index a8a3c22f8..68c268454 100644 --- a/dex/farm-with-locked-rewards/src/lib.rs +++ b/dex/farm-with-locked-rewards/src/lib.rs @@ -45,6 +45,7 @@ pub trait Farm: + farm_base_impl::exit_farm::BaseExitFarmModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/dex/farm-with-locked-rewards/wasm/Cargo.lock b/dex/farm-with-locked-rewards/wasm/Cargo.lock index 1dad9303b..09ed8c1c2 100644 --- a/dex/farm-with-locked-rewards/wasm/Cargo.lock +++ b/dex/farm-with-locked-rewards/wasm/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -165,8 +165,11 @@ dependencies = [ "config", "energy-query", "multiversx-sc", + "pair", "pausable", "permissions_module", + "router", + "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -511,6 +514,18 @@ dependencies = [ "token_send", ] +[[package]] +name = "router" +version = "0.0.0" +dependencies = [ + "locking_module", + "multiversx-sc", + "pair", + "pausable", + "simple-lock", + "token_send", +] + [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/dex/farm-with-locked-rewards/wasm/src/lib.rs b/dex/farm-with-locked-rewards/wasm/src/lib.rs index a38d0d0d2..fec7cdbd6 100644 --- a/dex/farm-with-locked-rewards/wasm/src/lib.rs +++ b/dex/farm-with-locked-rewards/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 68 +// Endpoints: 70 // Async Callback: 1 -// Total number of exported functions: 71 +// Total number of exported functions: 73 #![no_std] @@ -69,13 +69,15 @@ multiversx_sc_wasm_adapter::endpoints! { getPairContractManagedAddress => pair_contract_address enterFarmOnBehalf => enter_farm_on_behalf claimRewardsOnBehalf => claim_rewards_on_behalf - collectUndistributedBoostedRewards => collect_undistributed_boosted_rewards getBoostedYieldsRewardsPercentage => boosted_yields_rewards_percentage getAccumulatedRewardsForWeek => accumulated_rewards_for_week getFarmSupplyForWeek => farm_supply_for_week - getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute setBoostedYieldsFactors => set_boosted_yields_factors getBoostedYieldsFactors => get_boosted_yields_factors + setMultisigAddress => set_multisig_address + setRouterAddress => set_router_address + collectUndistributedBoostedRewards => collect_undistributed_boosted_rewards + getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute getCurrentWeek => get_current_week getFirstWeekStartEpoch => first_week_start_epoch getLastActiveWeekForUser => get_last_active_week_for_user_view diff --git a/dex/farm/src/base_functions.rs b/dex/farm/src/base_functions.rs index d6455a2b7..15529d6bf 100644 --- a/dex/farm/src/base_functions.rs +++ b/dex/farm/src/base_functions.rs @@ -62,6 +62,7 @@ pub trait BaseFunctionsModule: + utils::UtilsModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/dex/farm/src/external_interaction.rs b/dex/farm/src/external_interaction.rs index 7d597a691..a287cc812 100644 --- a/dex/farm/src/external_interaction.rs +++ b/dex/farm/src/external_interaction.rs @@ -30,6 +30,7 @@ pub trait ExternalInteractionsModule: + farm_base_impl::exit_farm::BaseExitFarmModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/dex/farm/src/lib.rs b/dex/farm/src/lib.rs index 5eb7ea834..553e70419 100644 --- a/dex/farm/src/lib.rs +++ b/dex/farm/src/lib.rs @@ -46,6 +46,7 @@ pub trait Farm: + farm_base_impl::exit_farm::BaseExitFarmModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/dex/farm/tests/farm_multi_user_test.rs b/dex/farm/tests/farm_multi_user_test.rs index 9593eb0fd..d37bee046 100644 --- a/dex/farm/tests/farm_multi_user_test.rs +++ b/dex/farm/tests/farm_multi_user_test.rs @@ -696,14 +696,12 @@ 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(1, 1); + farm_setup.collect_undistributed_boosted_rewards(); 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); @@ -712,7 +710,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(1, 3); + farm_setup.collect_undistributed_boosted_rewards(); farm_setup.check_undistributed_boosted_rewards(3); farm_setup.check_remaining_boosted_rewards_to_distribute(1, 0); @@ -976,7 +974,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(1, 1); + farm_setup.collect_undistributed_boosted_rewards(); 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); diff --git a/dex/farm/tests/farm_setup/multi_user_farm_setup.rs b/dex/farm/tests/farm_setup/multi_user_farm_setup.rs index d870ad1f7..ab8e654cc 100644 --- a/dex/farm/tests/farm_setup/multi_user_farm_setup.rs +++ b/dex/farm/tests/farm_setup/multi_user_farm_setup.rs @@ -4,6 +4,7 @@ use common_structs::FarmTokenAttributes; use config::ConfigModule; use farm::external_interaction::ExternalInteractionsModule; +use farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule; use multiversx_sc::codec::multi_types::OptionalValue; use multiversx_sc::{ storage::mappers::StorageTokenWrapper, @@ -21,18 +22,17 @@ use energy_query::{Energy, EnergyQueryModule}; use energy_update::EnergyUpdate; use farm::Farm; use farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule; -use farm_boosted_yields::FarmBoostedYieldsModule; use farm_token::FarmTokenModule; use pausable::{PausableModule, State}; use permissions_hub::PermissionsHub; use permissions_hub_module::PermissionsHubModule; use sc_whitelist_module::SCWhitelistModule; -use week_timekeeping::{Epoch, Week}; +use week_timekeeping::Epoch; 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 REWARD_TOKEN_ID: &[u8] = MEX_TOKEN_ID; pub static FARMING_TOKEN_ID: &[u8] = b"LPTOK-123456"; pub static FARM_TOKEN_ID: &[u8] = b"FARM-123456"; pub const DIV_SAFETY: u64 = 1_000_000_000_000; @@ -187,6 +187,9 @@ where sc.set_permissions_hub_address(managed_address!( permissions_hub_wrapper.address_ref() )); + + sc.multisig_address() + .set(managed_address!(&undistributed_rew_dest)); }) .assert_ok(); @@ -829,33 +832,18 @@ where .assert_ok(); } - 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(); + pub fn check_error_collect_undistributed_boosted_rewards(&mut self, expected_message: &str) { self.b_mock .execute_tx(&self.owner, &self.farm_wrapper, &rust_biguint!(0), |sc| { - sc.collect_undistributed_boosted_rewards( - start_week, - end_week, - managed_address!(&dest_address), - ); + sc.collect_undistributed_boosted_rewards(OptionalValue::None); }) .assert_error(4, expected_message) } - pub fn collect_undistributed_boosted_rewards(&mut self, start_week: Week, end_week: Week) { - let dest_address = self.undistributed_rew_dest.clone(); + pub fn collect_undistributed_boosted_rewards(&mut self) { self.b_mock .execute_tx(&self.owner, &self.farm_wrapper, &rust_biguint!(0), |sc| { - sc.collect_undistributed_boosted_rewards( - start_week, - end_week, - managed_address!(&dest_address), - ); + sc.collect_undistributed_boosted_rewards(OptionalValue::None); }) .assert_ok(); } diff --git a/dex/farm/wasm/Cargo.lock b/dex/farm/wasm/Cargo.lock index 57f73c805..27108db01 100644 --- a/dex/farm/wasm/Cargo.lock +++ b/dex/farm/wasm/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -165,8 +165,11 @@ dependencies = [ "config", "energy-query", "multiversx-sc", + "pair", "pausable", "permissions_module", + "router", + "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -478,6 +481,18 @@ dependencies = [ "token_send", ] +[[package]] +name = "router" +version = "0.0.0" +dependencies = [ + "locking_module", + "multiversx-sc", + "pair", + "pausable", + "simple-lock", + "token_send", +] + [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/dex/farm/wasm/src/lib.rs b/dex/farm/wasm/src/lib.rs index 47cf1d6c5..4b3c0270c 100644 --- a/dex/farm/wasm/src/lib.rs +++ b/dex/farm/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 65 +// Endpoints: 67 // Async Callback: 1 -// Total number of exported functions: 68 +// Total number of exported functions: 70 #![no_std] @@ -66,13 +66,15 @@ multiversx_sc_wasm_adapter::endpoints! { getPairContractManagedAddress => pair_contract_address enterFarmOnBehalf => enter_farm_on_behalf claimRewardsOnBehalf => claim_rewards_on_behalf - collectUndistributedBoostedRewards => collect_undistributed_boosted_rewards getBoostedYieldsRewardsPercentage => boosted_yields_rewards_percentage getAccumulatedRewardsForWeek => accumulated_rewards_for_week getFarmSupplyForWeek => farm_supply_for_week - getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute setBoostedYieldsFactors => set_boosted_yields_factors getBoostedYieldsFactors => get_boosted_yields_factors + setMultisigAddress => set_multisig_address + setRouterAddress => set_router_address + collectUndistributedBoostedRewards => collect_undistributed_boosted_rewards + getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute getCurrentWeek => get_current_week getFirstWeekStartEpoch => first_week_start_epoch getLastActiveWeekForUser => get_last_active_week_for_user_view diff --git a/dex/proxy-deployer/wasm/Cargo.lock b/dex/proxy-deployer/wasm/Cargo.lock index 9d6a26163..c9a86b75d 100644 --- a/dex/proxy-deployer/wasm/Cargo.lock +++ b/dex/proxy-deployer/wasm/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -165,8 +165,11 @@ dependencies = [ "config", "energy-query", "multiversx-sc", + "pair", "pausable", "permissions_module", + "router", + "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -489,6 +492,18 @@ dependencies = [ "token_send", ] +[[package]] +name = "router" +version = "0.0.0" +dependencies = [ + "locking_module", + "multiversx-sc", + "pair", + "pausable", + "simple-lock", + "token_send", +] + [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/energy-integration/energy-update/wasm/Cargo.lock b/energy-integration/energy-update/wasm/Cargo.lock index 74a7a8691..4cd86c95f 100644 --- a/energy-integration/energy-update/wasm/Cargo.lock +++ b/energy-integration/energy-update/wasm/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -183,8 +183,11 @@ dependencies = [ "config", "energy-query", "multiversx-sc", + "pair", "pausable", "permissions_module", + "router", + "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -488,6 +491,18 @@ dependencies = [ "token_send", ] +[[package]] +name = "router" +version = "0.0.0" +dependencies = [ + "locking_module", + "multiversx-sc", + "pair", + "pausable", + "simple-lock", + "token_send", +] + [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/energy-integration/farm-boosted-yields/Cargo.toml b/energy-integration/farm-boosted-yields/Cargo.toml index e3e8bb0c0..8d9e2a361 100644 --- a/energy-integration/farm-boosted-yields/Cargo.toml +++ b/energy-integration/farm-boosted-yields/Cargo.toml @@ -29,5 +29,14 @@ path = "../common-modules/weekly-rewards-splitting" [dependencies.energy-query] path = "../common-modules/energy-query" +[dependencies.utils] +path = "../../common/modules/utils" + [dependencies.common-types] path = "../common-types" + +[dependencies.router] +path = "../../dex/router" + +[dependencies.pair] +path = "../../dex/pair" diff --git a/energy-integration/farm-boosted-yields/src/lib.rs b/energy-integration/farm-boosted-yields/src/lib.rs index f3f088f96..4c15ac485 100644 --- a/energy-integration/farm-boosted-yields/src/lib.rs +++ b/energy-integration/farm-boosted-yields/src/lib.rs @@ -8,11 +8,10 @@ use boosted_yields_factors::BoostedYieldsConfig; use common_types::PaymentsVec; use multiversx_sc::api::ErrorApi; use week_timekeeping::Week; -use weekly_rewards_splitting::{ - base_impl::WeeklyRewardsSplittingTraitsModule, USER_MAX_CLAIM_WEEKS, -}; +use weekly_rewards_splitting::base_impl::WeeklyRewardsSplittingTraitsModule; pub mod boosted_yields_factors; +pub mod undistributed_rewards; const MAX_PERCENT: u64 = 10_000; @@ -30,16 +29,6 @@ impl SplitReward { } } -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 @@ -53,44 +42,9 @@ pub trait FarmBoostedYieldsModule: + weekly_rewards_splitting::locked_token_buckets::WeeklyRewardsLockedTokenBucketsModule + weekly_rewards_splitting::update_claim_progress_energy::UpdateClaimProgressEnergyModule + energy_query::EnergyQueryModule + + utils::UtilsModule + + undistributed_rewards::UndistributedRewardsModule { - #[only_owner] - #[endpoint(collectUndistributedBoostedRewards)] - 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 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; - } - - if total_rewards == 0 { - return; - } - - 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 { let percentage = self.boosted_yields_rewards_percentage().get(); if percentage == 0 { @@ -165,16 +119,6 @@ pub trait FarmBoostedYieldsModule: #[view(getFarmSupplyForWeek)] #[storage_mapper("farmSupplyForWeek")] fn farm_supply_for_week(&self, week: Week) -> SingleValueMapper; - - #[view(getRemainingBoostedRewardsToDistribute)] - #[storage_mapper("remainingBoostedRewardsToDistribute")] - fn remaining_boosted_rewards_to_distribute(&self, week: Week) -> SingleValueMapper; - - #[proxy] - fn energy_factory_send_rew_proxy_obj( - &self, - sc_address: ManagedAddress, - ) -> energy_factory_proxy_send_rew::Proxy; } pub struct FarmBoostedYieldsWrapper { diff --git a/energy-integration/farm-boosted-yields/src/undistributed_rewards.rs b/energy-integration/farm-boosted-yields/src/undistributed_rewards.rs new file mode 100644 index 000000000..8134caa8b --- /dev/null +++ b/energy-integration/farm-boosted-yields/src/undistributed_rewards.rs @@ -0,0 +1,146 @@ +use common_types::Week; +use pair::pair_actions::swap::ProxyTrait as _; +use router::factory::ProxyTrait as _; +use week_timekeeping::FIRST_WEEK; +use weekly_rewards_splitting::USER_MAX_CLAIM_WEEKS; + +multiversx_sc::imports!(); + +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 UndistributedRewardsModule: + config::ConfigModule + + week_timekeeping::WeekTimekeepingModule + + pausable::PausableModule + + permissions_module::PermissionsModule + + energy_query::EnergyQueryModule + + utils::UtilsModule +{ + #[only_owner] + #[endpoint(setMultisigAddress)] + fn set_multisig_address(&self, multisig_address: ManagedAddress) { + self.require_sc_address(&multisig_address); + + self.multisig_address().set(multisig_address); + } + + #[only_owner] + #[endpoint(setRouterAddress)] + fn set_router_address(&self, router_address: ManagedAddress) { + self.require_sc_address(&router_address); + + self.router_address().set(router_address); + } + + #[only_owner] + #[endpoint(collectUndistributedBoostedRewards)] + fn collect_undistributed_boosted_rewards( + &self, + opt_start_week: OptionalValue, + ) -> BigUint { + require!( + !self.multisig_address().is_empty(), + "No multisig address set" + ); + + 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" + ); + + let end_week = current_week - collect_rewards_offset; + let start_week = match opt_start_week { + OptionalValue::Some(start_week) => { + require!(start_week <= end_week, "Invalid week numbers"); + + start_week + } + OptionalValue::None => FIRST_WEEK, + }; + + 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; + } + + if total_rewards == 0 { + return total_rewards; + } + + let base_token_id = self.get_base_token_id(); + let reward_token_id = self.reward_token_id().get(); + if base_token_id != reward_token_id { + total_rewards = self.try_swap(base_token_id, reward_token_id, total_rewards); + } + + self.send_rewards_to_multisig(total_rewards.clone()); + + total_rewards + } + + fn try_swap( + &self, + base_token_id: TokenIdentifier, + reward_token_id: TokenIdentifier, + tokens_amount: BigUint, + ) -> BigUint { + require!(!self.router_address().is_empty(), "No router address set"); + + let router_address = self.router_address().get(); + let pair_address: ManagedAddress = self + .router_proxy(router_address) + .get_pair(base_token_id.clone(), reward_token_id.clone()) + .execute_on_dest_context(); + require!(!pair_address.is_zero(), "No pair found"); + + let received_tokens: EsdtTokenPayment = self + .pair_proxy(pair_address) + .swap_tokens_fixed_input(base_token_id, BigUint::from(1u32)) + .single_esdt(&reward_token_id, 0, &tokens_amount) + .execute_on_dest_context(); + + received_tokens.amount + } + + fn send_rewards_to_multisig(&self, total_rewards: BigUint) { + let multisig_address = self.multisig_address().get(); + let energy_factory = self.energy_factory_address().get(); + self.energy_factory_send_rew_proxy_obj(energy_factory) + .transfer_unlocked_token(multisig_address, total_rewards) + .execute_on_dest_context() + } + + #[view(getRemainingBoostedRewardsToDistribute)] + #[storage_mapper("remainingBoostedRewardsToDistribute")] + fn remaining_boosted_rewards_to_distribute(&self, week: Week) -> SingleValueMapper; + + #[storage_mapper("multisigAddress")] + fn multisig_address(&self) -> SingleValueMapper; + + #[storage_mapper("routerAddress")] + fn router_address(&self) -> SingleValueMapper; + + #[proxy] + fn energy_factory_send_rew_proxy_obj( + &self, + sc_address: ManagedAddress, + ) -> energy_factory_proxy_send_rew::Proxy; + + #[proxy] + fn router_proxy(&self, sc_address: ManagedAddress) -> router::Proxy; + + #[proxy] + fn pair_proxy(&self, sc_address: ManagedAddress) -> pair::Proxy; +} diff --git a/farm-staking/farm-staking-proxy/wasm/Cargo.lock b/farm-staking/farm-staking-proxy/wasm/Cargo.lock index 8841293c4..557dde38c 100644 --- a/farm-staking/farm-staking-proxy/wasm/Cargo.lock +++ b/farm-staking/farm-staking-proxy/wasm/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -165,8 +165,11 @@ dependencies = [ "config", "energy-query", "multiversx-sc", + "pair", "pausable", "permissions_module", + "router", + "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -577,6 +580,18 @@ dependencies = [ "token_send", ] +[[package]] +name = "router" +version = "0.0.0" +dependencies = [ + "locking_module", + "multiversx-sc", + "pair", + "pausable", + "simple-lock", + "token_send", +] + [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/farm-staking/farm-staking/src/claim_only_boosted_staking_rewards.rs b/farm-staking/farm-staking/src/claim_only_boosted_staking_rewards.rs index c5b903e0b..fc410cb47 100644 --- a/farm-staking/farm-staking/src/claim_only_boosted_staking_rewards.rs +++ b/farm-staking/farm-staking/src/claim_only_boosted_staking_rewards.rs @@ -26,6 +26,7 @@ pub trait ClaimOnlyBoostedStakingRewardsModule: + utils::UtilsModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + crate::custom_rewards::CustomRewardsModule { #[endpoint(claimBoostedRewards)] diff --git a/farm-staking/farm-staking/src/claim_stake_farm_rewards.rs b/farm-staking/farm-staking/src/claim_stake_farm_rewards.rs index e2ba49fe4..58443bf05 100644 --- a/farm-staking/farm-staking/src/claim_stake_farm_rewards.rs +++ b/farm-staking/farm-staking/src/claim_stake_farm_rewards.rs @@ -23,6 +23,7 @@ pub trait ClaimStakeFarmRewardsModule: + utils::UtilsModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/farm-staking/farm-staking/src/compound_stake_farm_rewards.rs b/farm-staking/farm-staking/src/compound_stake_farm_rewards.rs index a7d83d574..ee8b5910c 100644 --- a/farm-staking/farm-staking/src/compound_stake_farm_rewards.rs +++ b/farm-staking/farm-staking/src/compound_stake_farm_rewards.rs @@ -21,6 +21,7 @@ pub trait CompoundStakeFarmRewardsModule: + utils::UtilsModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/farm-staking/farm-staking/src/custom_rewards.rs b/farm-staking/farm-staking/src/custom_rewards.rs index 4d07dd5a4..4b55edeb2 100644 --- a/farm-staking/farm-staking/src/custom_rewards.rs +++ b/farm-staking/farm-staking/src/custom_rewards.rs @@ -25,6 +25,7 @@ pub trait CustomRewardsModule: + multiversx_sc_modules::default_issue_callbacks::DefaultIssueCallbacksModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/farm-staking/farm-staking/src/external_interaction.rs b/farm-staking/farm-staking/src/external_interaction.rs index 4e748d108..0947b3ed4 100644 --- a/farm-staking/farm-staking/src/external_interaction.rs +++ b/farm-staking/farm-staking/src/external_interaction.rs @@ -38,6 +38,7 @@ pub trait ExternalInteractionsModule: + claim_only_boosted_staking_rewards::ClaimOnlyBoostedStakingRewardsModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/farm-staking/farm-staking/src/lib.rs b/farm-staking/farm-staking/src/lib.rs index 4cf1c3ebf..be20deb1b 100644 --- a/farm-staking/farm-staking/src/lib.rs +++ b/farm-staking/farm-staking/src/lib.rs @@ -56,6 +56,7 @@ pub trait FarmStaking: + claim_only_boosted_staking_rewards::ClaimOnlyBoostedStakingRewardsModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/farm-staking/farm-staking/src/stake_farm.rs b/farm-staking/farm-staking/src/stake_farm.rs index 7ab3dea1c..40da23a67 100644 --- a/farm-staking/farm-staking/src/stake_farm.rs +++ b/farm-staking/farm-staking/src/stake_farm.rs @@ -24,6 +24,7 @@ pub trait StakeFarmModule: + utils::UtilsModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/farm-staking/farm-staking/src/unbond_farm.rs b/farm-staking/farm-staking/src/unbond_farm.rs index 0e661616e..895c61385 100644 --- a/farm-staking/farm-staking/src/unbond_farm.rs +++ b/farm-staking/farm-staking/src/unbond_farm.rs @@ -20,6 +20,7 @@ pub trait UnbondFarmModule: + utils::UtilsModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/farm-staking/farm-staking/src/unstake_farm.rs b/farm-staking/farm-staking/src/unstake_farm.rs index e40642b4f..2f48d70cc 100644 --- a/farm-staking/farm-staking/src/unstake_farm.rs +++ b/farm-staking/farm-staking/src/unstake_farm.rs @@ -23,6 +23,7 @@ pub trait UnstakeFarmModule: + utils::UtilsModule + farm_boosted_yields::FarmBoostedYieldsModule + farm_boosted_yields::boosted_yields_factors::BoostedYieldsFactorsModule + + farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule + week_timekeeping::WeekTimekeepingModule + weekly_rewards_splitting::WeeklyRewardsSplittingModule + weekly_rewards_splitting::events::WeeklyRewardsSplittingEventsModule diff --git a/farm-staking/farm-staking/wasm/Cargo.lock b/farm-staking/farm-staking/wasm/Cargo.lock index 1c27451e2..3eec378fa 100644 --- a/farm-staking/farm-staking/wasm/Cargo.lock +++ b/farm-staking/farm-staking/wasm/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -165,8 +165,11 @@ dependencies = [ "config", "energy-query", "multiversx-sc", + "pair", "pausable", "permissions_module", + "router", + "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -512,6 +515,18 @@ dependencies = [ "token_send", ] +[[package]] +name = "router" +version = "0.0.0" +dependencies = [ + "locking_module", + "multiversx-sc", + "pair", + "pausable", + "simple-lock", + "token_send", +] + [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/farm-staking/farm-staking/wasm/src/lib.rs b/farm-staking/farm-staking/wasm/src/lib.rs index f69f1684a..4858ec503 100644 --- a/farm-staking/farm-staking/wasm/src/lib.rs +++ b/farm-staking/farm-staking/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 71 +// Endpoints: 73 // Async Callback: 1 -// Total number of exported functions: 74 +// Total number of exported functions: 76 #![no_std] @@ -72,13 +72,15 @@ multiversx_sc_wasm_adapter::endpoints! { stakeFarmOnBehalf => stake_farm_on_behalf claimRewardsOnBehalf => claim_rewards_on_behalf claimBoostedRewards => claim_boosted_rewards - collectUndistributedBoostedRewards => collect_undistributed_boosted_rewards getBoostedYieldsRewardsPercentage => boosted_yields_rewards_percentage getAccumulatedRewardsForWeek => accumulated_rewards_for_week getFarmSupplyForWeek => farm_supply_for_week - getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute setBoostedYieldsFactors => set_boosted_yields_factors getBoostedYieldsFactors => get_boosted_yields_factors + setMultisigAddress => set_multisig_address + setRouterAddress => set_router_address + collectUndistributedBoostedRewards => collect_undistributed_boosted_rewards + getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute getCurrentWeek => get_current_week getFirstWeekStartEpoch => first_week_start_epoch getLastActiveWeekForUser => get_last_active_week_for_user_view diff --git a/legacy-contracts/farm-staking-proxy-v13/wasm/Cargo.lock b/legacy-contracts/farm-staking-proxy-v13/wasm/Cargo.lock index 61aeef987..7d31fa989 100644 --- a/legacy-contracts/farm-staking-proxy-v13/wasm/Cargo.lock +++ b/legacy-contracts/farm-staking-proxy-v13/wasm/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -165,8 +165,11 @@ dependencies = [ "config", "energy-query", "multiversx-sc", + "pair", "pausable", "permissions_module", + "router", + "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -532,6 +535,18 @@ dependencies = [ "token_send", ] +[[package]] +name = "router" +version = "0.0.0" +dependencies = [ + "locking_module", + "multiversx-sc", + "pair", + "pausable", + "simple-lock", + "token_send", +] + [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/locked-asset/proxy_dex/wasm/Cargo.lock b/locked-asset/proxy_dex/wasm/Cargo.lock index 38d6743d0..25861f679 100644 --- a/locked-asset/proxy_dex/wasm/Cargo.lock +++ b/locked-asset/proxy_dex/wasm/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -165,8 +165,11 @@ dependencies = [ "config", "energy-query", "multiversx-sc", + "pair", "pausable", "permissions_module", + "router", + "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -536,6 +539,18 @@ dependencies = [ "token_send", ] +[[package]] +name = "router" +version = "0.0.0" +dependencies = [ + "locking_module", + "multiversx-sc", + "pair", + "pausable", + "simple-lock", + "token_send", +] + [[package]] name = "sc_whitelist_module" version = "0.0.0" From ed318f3a7ba2866a0c8552d1e3bc1fd5d3b4bc35 Mon Sep 17 00:00:00 2001 From: Dorin Marian Iancu Date: Thu, 27 Feb 2025 12:39:54 +0200 Subject: [PATCH 2/2] changes + test --- Cargo.lock | 3 - dex/farm-with-locked-rewards/wasm/Cargo.lock | 15 -- dex/farm-with-locked-rewards/wasm/src/lib.rs | 5 +- dex/farm/tests/farm_multi_user_test.rs | 5 + .../tests/farm_setup/multi_user_farm_setup.rs | 4 +- dex/farm/wasm/Cargo.lock | 15 -- dex/farm/wasm/src/lib.rs | 5 +- dex/proxy-deployer/wasm/Cargo.lock | 15 -- .../energy-update/wasm/Cargo.lock | 15 -- .../farm-boosted-yields/Cargo.toml | 9 - .../farm-boosted-yields/src/lib.rs | 1 - .../src/undistributed_rewards.rs | 94 ++------ .../farm-staking-proxy/wasm/Cargo.lock | 15 -- .../tests/farm_staking_energy_test.rs | 227 ++++++++++++++++++ farm-staking/farm-staking/wasm/Cargo.lock | 15 -- farm-staking/farm-staking/wasm/src/lib.rs | 5 +- .../farm-staking-proxy-v13/wasm/Cargo.lock | 15 -- locked-asset/proxy_dex/wasm/Cargo.lock | 15 -- 18 files changed, 265 insertions(+), 213 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f4624cfc1..660063d88 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -568,11 +568,8 @@ dependencies = [ "config", "energy-query", "multiversx-sc", - "pair", "pausable", "permissions_module", - "router", - "utils", "week-timekeeping", "weekly-rewards-splitting", ] diff --git a/dex/farm-with-locked-rewards/wasm/Cargo.lock b/dex/farm-with-locked-rewards/wasm/Cargo.lock index 09ed8c1c2..a30367ea8 100644 --- a/dex/farm-with-locked-rewards/wasm/Cargo.lock +++ b/dex/farm-with-locked-rewards/wasm/Cargo.lock @@ -165,11 +165,8 @@ dependencies = [ "config", "energy-query", "multiversx-sc", - "pair", "pausable", "permissions_module", - "router", - "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -514,18 +511,6 @@ dependencies = [ "token_send", ] -[[package]] -name = "router" -version = "0.0.0" -dependencies = [ - "locking_module", - "multiversx-sc", - "pair", - "pausable", - "simple-lock", - "token_send", -] - [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/dex/farm-with-locked-rewards/wasm/src/lib.rs b/dex/farm-with-locked-rewards/wasm/src/lib.rs index fec7cdbd6..4307a6244 100644 --- a/dex/farm-with-locked-rewards/wasm/src/lib.rs +++ b/dex/farm-with-locked-rewards/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 70 +// Endpoints: 69 // Async Callback: 1 -// Total number of exported functions: 73 +// Total number of exported functions: 72 #![no_std] @@ -75,7 +75,6 @@ multiversx_sc_wasm_adapter::endpoints! { setBoostedYieldsFactors => set_boosted_yields_factors getBoostedYieldsFactors => get_boosted_yields_factors setMultisigAddress => set_multisig_address - setRouterAddress => set_router_address collectUndistributedBoostedRewards => collect_undistributed_boosted_rewards getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute getCurrentWeek => get_current_week diff --git a/dex/farm/tests/farm_multi_user_test.rs b/dex/farm/tests/farm_multi_user_test.rs index d37bee046..b6733d315 100644 --- a/dex/farm/tests/farm_multi_user_test.rs +++ b/dex/farm/tests/farm_multi_user_test.rs @@ -717,6 +717,11 @@ fn farm_multiple_claim_weeks_with_collect_undistributed_rewards_test() { farm_setup.check_remaining_boosted_rewards_to_distribute(2, 0); farm_setup.check_remaining_boosted_rewards_to_distribute(3, 0); + // collecting multiple times has no effect + farm_setup.collect_undistributed_boosted_rewards(); + farm_setup.collect_undistributed_boosted_rewards(); + farm_setup.collect_undistributed_boosted_rewards(); + // check entries are not empty farm_setup .b_mock diff --git a/dex/farm/tests/farm_setup/multi_user_farm_setup.rs b/dex/farm/tests/farm_setup/multi_user_farm_setup.rs index ab8e654cc..8636753aa 100644 --- a/dex/farm/tests/farm_setup/multi_user_farm_setup.rs +++ b/dex/farm/tests/farm_setup/multi_user_farm_setup.rs @@ -835,7 +835,7 @@ where pub fn check_error_collect_undistributed_boosted_rewards(&mut self, expected_message: &str) { self.b_mock .execute_tx(&self.owner, &self.farm_wrapper, &rust_biguint!(0), |sc| { - sc.collect_undistributed_boosted_rewards(OptionalValue::None); + sc.collect_undistributed_boosted_rewards(); }) .assert_error(4, expected_message) } @@ -843,7 +843,7 @@ where pub fn collect_undistributed_boosted_rewards(&mut self) { self.b_mock .execute_tx(&self.owner, &self.farm_wrapper, &rust_biguint!(0), |sc| { - sc.collect_undistributed_boosted_rewards(OptionalValue::None); + sc.collect_undistributed_boosted_rewards(); }) .assert_ok(); } diff --git a/dex/farm/wasm/Cargo.lock b/dex/farm/wasm/Cargo.lock index 27108db01..14d17fb3b 100644 --- a/dex/farm/wasm/Cargo.lock +++ b/dex/farm/wasm/Cargo.lock @@ -165,11 +165,8 @@ dependencies = [ "config", "energy-query", "multiversx-sc", - "pair", "pausable", "permissions_module", - "router", - "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -481,18 +478,6 @@ dependencies = [ "token_send", ] -[[package]] -name = "router" -version = "0.0.0" -dependencies = [ - "locking_module", - "multiversx-sc", - "pair", - "pausable", - "simple-lock", - "token_send", -] - [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/dex/farm/wasm/src/lib.rs b/dex/farm/wasm/src/lib.rs index 4b3c0270c..efb760172 100644 --- a/dex/farm/wasm/src/lib.rs +++ b/dex/farm/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 67 +// Endpoints: 66 // Async Callback: 1 -// Total number of exported functions: 70 +// Total number of exported functions: 69 #![no_std] @@ -72,7 +72,6 @@ multiversx_sc_wasm_adapter::endpoints! { setBoostedYieldsFactors => set_boosted_yields_factors getBoostedYieldsFactors => get_boosted_yields_factors setMultisigAddress => set_multisig_address - setRouterAddress => set_router_address collectUndistributedBoostedRewards => collect_undistributed_boosted_rewards getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute getCurrentWeek => get_current_week diff --git a/dex/proxy-deployer/wasm/Cargo.lock b/dex/proxy-deployer/wasm/Cargo.lock index c9a86b75d..4ca913a27 100644 --- a/dex/proxy-deployer/wasm/Cargo.lock +++ b/dex/proxy-deployer/wasm/Cargo.lock @@ -165,11 +165,8 @@ dependencies = [ "config", "energy-query", "multiversx-sc", - "pair", "pausable", "permissions_module", - "router", - "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -492,18 +489,6 @@ dependencies = [ "token_send", ] -[[package]] -name = "router" -version = "0.0.0" -dependencies = [ - "locking_module", - "multiversx-sc", - "pair", - "pausable", - "simple-lock", - "token_send", -] - [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/energy-integration/energy-update/wasm/Cargo.lock b/energy-integration/energy-update/wasm/Cargo.lock index 4cd86c95f..7211630a3 100644 --- a/energy-integration/energy-update/wasm/Cargo.lock +++ b/energy-integration/energy-update/wasm/Cargo.lock @@ -183,11 +183,8 @@ dependencies = [ "config", "energy-query", "multiversx-sc", - "pair", "pausable", "permissions_module", - "router", - "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -491,18 +488,6 @@ dependencies = [ "token_send", ] -[[package]] -name = "router" -version = "0.0.0" -dependencies = [ - "locking_module", - "multiversx-sc", - "pair", - "pausable", - "simple-lock", - "token_send", -] - [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/energy-integration/farm-boosted-yields/Cargo.toml b/energy-integration/farm-boosted-yields/Cargo.toml index 8d9e2a361..e3e8bb0c0 100644 --- a/energy-integration/farm-boosted-yields/Cargo.toml +++ b/energy-integration/farm-boosted-yields/Cargo.toml @@ -29,14 +29,5 @@ path = "../common-modules/weekly-rewards-splitting" [dependencies.energy-query] path = "../common-modules/energy-query" -[dependencies.utils] -path = "../../common/modules/utils" - [dependencies.common-types] path = "../common-types" - -[dependencies.router] -path = "../../dex/router" - -[dependencies.pair] -path = "../../dex/pair" diff --git a/energy-integration/farm-boosted-yields/src/lib.rs b/energy-integration/farm-boosted-yields/src/lib.rs index 4c15ac485..1f8f06dcd 100644 --- a/energy-integration/farm-boosted-yields/src/lib.rs +++ b/energy-integration/farm-boosted-yields/src/lib.rs @@ -42,7 +42,6 @@ pub trait FarmBoostedYieldsModule: + weekly_rewards_splitting::locked_token_buckets::WeeklyRewardsLockedTokenBucketsModule + weekly_rewards_splitting::update_claim_progress_energy::UpdateClaimProgressEnergyModule + energy_query::EnergyQueryModule - + utils::UtilsModule + undistributed_rewards::UndistributedRewardsModule { fn take_reward_slice(&self, full_reward: BigUint) -> SplitReward { diff --git a/energy-integration/farm-boosted-yields/src/undistributed_rewards.rs b/energy-integration/farm-boosted-yields/src/undistributed_rewards.rs index 8134caa8b..1fc46b8d2 100644 --- a/energy-integration/farm-boosted-yields/src/undistributed_rewards.rs +++ b/energy-integration/farm-boosted-yields/src/undistributed_rewards.rs @@ -1,6 +1,4 @@ use common_types::Week; -use pair::pair_actions::swap::ProxyTrait as _; -use router::factory::ProxyTrait as _; use week_timekeeping::FIRST_WEEK; use weekly_rewards_splitting::USER_MAX_CLAIM_WEEKS; @@ -23,30 +21,16 @@ pub trait UndistributedRewardsModule: + pausable::PausableModule + permissions_module::PermissionsModule + energy_query::EnergyQueryModule - + utils::UtilsModule { #[only_owner] #[endpoint(setMultisigAddress)] fn set_multisig_address(&self, multisig_address: ManagedAddress) { - self.require_sc_address(&multisig_address); - self.multisig_address().set(multisig_address); } - #[only_owner] - #[endpoint(setRouterAddress)] - fn set_router_address(&self, router_address: ManagedAddress) { - self.require_sc_address(&router_address); - - self.router_address().set(router_address); - } - #[only_owner] #[endpoint(collectUndistributedBoostedRewards)] - fn collect_undistributed_boosted_rewards( - &self, - opt_start_week: OptionalValue, - ) -> BigUint { + fn collect_undistributed_boosted_rewards(&self) -> BigUint { require!( !self.multisig_address().is_empty(), "No multisig address set" @@ -59,15 +43,13 @@ pub trait UndistributedRewardsModule: "Current week must be higher than the week offset" ); - let end_week = current_week - collect_rewards_offset; - let start_week = match opt_start_week { - OptionalValue::Some(start_week) => { - require!(start_week <= end_week, "Invalid week numbers"); - - start_week - } - OptionalValue::None => FIRST_WEEK, + let last_collect_week = self.last_collect_undist_week().get(); + let start_week = if last_collect_week > 0 { + last_collect_week + } else { + FIRST_WEEK }; + let end_week = current_week - collect_rewards_offset; let mut total_rewards = BigUint::zero(); for week in start_week..=end_week { @@ -75,51 +57,31 @@ pub trait UndistributedRewardsModule: total_rewards += rewards_to_distribute; } + self.last_collect_undist_week().set(end_week + 1); + if total_rewards == 0 { return total_rewards; } - let base_token_id = self.get_base_token_id(); - let reward_token_id = self.reward_token_id().get(); - if base_token_id != reward_token_id { - total_rewards = self.try_swap(base_token_id, reward_token_id, total_rewards); - } - - self.send_rewards_to_multisig(total_rewards.clone()); + self.distribute_leftover_rewards(&total_rewards); total_rewards } - fn try_swap( - &self, - base_token_id: TokenIdentifier, - reward_token_id: TokenIdentifier, - tokens_amount: BigUint, - ) -> BigUint { - require!(!self.router_address().is_empty(), "No router address set"); - - let router_address = self.router_address().get(); - let pair_address: ManagedAddress = self - .router_proxy(router_address) - .get_pair(base_token_id.clone(), reward_token_id.clone()) - .execute_on_dest_context(); - require!(!pair_address.is_zero(), "No pair found"); - - let received_tokens: EsdtTokenPayment = self - .pair_proxy(pair_address) - .swap_tokens_fixed_input(base_token_id, BigUint::from(1u32)) - .single_esdt(&reward_token_id, 0, &tokens_amount) - .execute_on_dest_context(); - - received_tokens.amount - } - - fn send_rewards_to_multisig(&self, total_rewards: BigUint) { + fn distribute_leftover_rewards(&self, total_rewards: &BigUint) { let multisig_address = self.multisig_address().get(); - let energy_factory = self.energy_factory_address().get(); - self.energy_factory_send_rew_proxy_obj(energy_factory) - .transfer_unlocked_token(multisig_address, total_rewards) - .execute_on_dest_context() + let base_token_id = self.get_base_token_id(); + let reward_token_id = self.reward_token_id().get(); + if base_token_id == reward_token_id { + let energy_factory = self.energy_factory_address().get(); + let _: () = self + .energy_factory_send_rew_proxy_obj(energy_factory) + .transfer_unlocked_token(multisig_address, total_rewards.clone()) + .execute_on_dest_context(); + } else { + self.send() + .direct_esdt(&multisig_address, &reward_token_id, 0, total_rewards); + } } #[view(getRemainingBoostedRewardsToDistribute)] @@ -129,18 +91,12 @@ pub trait UndistributedRewardsModule: #[storage_mapper("multisigAddress")] fn multisig_address(&self) -> SingleValueMapper; - #[storage_mapper("routerAddress")] - fn router_address(&self) -> SingleValueMapper; + #[storage_mapper("lastCollectUndistWeek")] + fn last_collect_undist_week(&self) -> SingleValueMapper; #[proxy] fn energy_factory_send_rew_proxy_obj( &self, sc_address: ManagedAddress, ) -> energy_factory_proxy_send_rew::Proxy; - - #[proxy] - fn router_proxy(&self, sc_address: ManagedAddress) -> router::Proxy; - - #[proxy] - fn pair_proxy(&self, sc_address: ManagedAddress) -> pair::Proxy; } diff --git a/farm-staking/farm-staking-proxy/wasm/Cargo.lock b/farm-staking/farm-staking-proxy/wasm/Cargo.lock index 557dde38c..83518696a 100644 --- a/farm-staking/farm-staking-proxy/wasm/Cargo.lock +++ b/farm-staking/farm-staking-proxy/wasm/Cargo.lock @@ -165,11 +165,8 @@ dependencies = [ "config", "energy-query", "multiversx-sc", - "pair", "pausable", "permissions_module", - "router", - "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -580,18 +577,6 @@ dependencies = [ "token_send", ] -[[package]] -name = "router" -version = "0.0.0" -dependencies = [ - "locking_module", - "multiversx-sc", - "pair", - "pausable", - "simple-lock", - "token_send", -] - [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/farm-staking/farm-staking/tests/farm_staking_energy_test.rs b/farm-staking/farm-staking/tests/farm_staking_energy_test.rs index e1a885355..dca9ccce5 100644 --- a/farm-staking/farm-staking/tests/farm_staking_energy_test.rs +++ b/farm-staking/farm-staking/tests/farm_staking_energy_test.rs @@ -2,6 +2,7 @@ pub mod farm_staking_setup; use config::ConfigModule; +use farm_boosted_yields::undistributed_rewards::UndistributedRewardsModule; use farm_staking::{ claim_only_boosted_staking_rewards::ClaimOnlyBoostedStakingRewardsModule, claim_stake_farm_rewards::ClaimStakeFarmRewardsModule, @@ -1868,3 +1869,229 @@ fn test_multiple_positions_on_behalf() { Some(&farm_token_attributes), ); } + +#[test] +fn owner_claim_undist_rewards_test() { + DebugApi::dummy(); + + let mut fs_setup = FarmStakingSetup::new( + farm_staking::contract_obj, + energy_factory::contract_obj, + permissions_hub::contract_obj, + ); + + let user_address = fs_setup.user_address.clone(); + let user_address2 = fs_setup.user_address2.clone(); + + fs_setup.set_boosted_yields_factors(); + fs_setup.set_boosted_yields_rewards_percentage(BOOSTED_YIELDS_PERCENTAGE); + + fs_setup.set_user_energy(&user_address, 9_800, 0, 100); + fs_setup.set_user_energy(&user_address2, 4_900, 0, 350); + + let farm_in_amount = 100_000_000; + fs_setup.stake_farm(&user_address, farm_in_amount, &[], 1, 0, 0); + fs_setup.stake_farm(&user_address2, farm_in_amount, &[], 2, 0, 0); + fs_setup.check_farm_token_supply(farm_in_amount * 2); + + // claim to get energy registered + fs_setup + .b_mock + .execute_esdt_transfer( + &user_address, + &fs_setup.farm_wrapper, + FARM_TOKEN_ID, + 1, + &rust_biguint!(farm_in_amount), + |sc| { + let _ = sc.claim_rewards(OptionalValue::None); + }, + ) + .assert_ok(); + + fs_setup + .b_mock + .execute_esdt_transfer( + &user_address2, + &fs_setup.farm_wrapper, + FARM_TOKEN_ID, + 2, + &rust_biguint!(farm_in_amount), + |sc| { + let _ = sc.claim_rewards(OptionalValue::None); + }, + ) + .assert_ok(); + + // random user tx to collect rewards - week 1 + let rand_user = fs_setup.b_mock.create_user_account(&rust_biguint!(0)); + fs_setup.b_mock.set_esdt_balance( + &rand_user, + FARMING_TOKEN_ID, + &rust_biguint!(USER_TOTAL_RIDE_TOKENS), + ); + + fs_setup.set_user_energy(&rand_user, 1, 6, 1); + fs_setup.set_block_epoch(6); + fs_setup.set_block_nonce(10); + + fs_setup + .b_mock + .execute_esdt_transfer( + &rand_user, + &fs_setup.farm_wrapper, + FARMING_TOKEN_ID, + 0, + &rust_biguint!(10), + |sc| { + let _ = sc.stake_farm_endpoint(OptionalValue::None); + }, + ) + .assert_ok(); + + fs_setup + .b_mock + .execute_esdt_transfer( + &rand_user, + &fs_setup.farm_wrapper, + FARM_TOKEN_ID, + 5, + &rust_biguint!(10), + |sc| { + let _ = sc.unstake_farm(OptionalValue::None); + }, + ) + .assert_ok(); + + // first user claim - week 2 + fs_setup.set_block_epoch(13); + fs_setup.set_block_nonce(20); + + fs_setup + .b_mock + .execute_esdt_transfer( + &user_address, + &fs_setup.farm_wrapper, + FARM_TOKEN_ID, + 3, + &rust_biguint!(farm_in_amount), + |sc| { + let _ = sc.claim_rewards(OptionalValue::None); + }, + ) + .assert_ok(); + + // first user claim - week 3 + fs_setup.set_block_epoch(20); + fs_setup.set_block_nonce(30); + + fs_setup + .b_mock + .execute_esdt_transfer( + &user_address, + &fs_setup.farm_wrapper, + FARM_TOKEN_ID, + 7, + &rust_biguint!(farm_in_amount), + |sc| { + let _ = sc.claim_rewards(OptionalValue::None); + }, + ) + .assert_ok(); + + // first user claim - week 4 + fs_setup.set_block_epoch(27); + fs_setup.set_block_nonce(40); + + fs_setup + .b_mock + .execute_esdt_transfer( + &user_address, + &fs_setup.farm_wrapper, + FARM_TOKEN_ID, + 8, + &rust_biguint!(farm_in_amount), + |sc| { + let _ = sc.claim_rewards(OptionalValue::None); + }, + ) + .assert_ok(); + + // first user claim - week 5 + fs_setup.set_block_epoch(34); + fs_setup.set_block_nonce(50); + + fs_setup + .b_mock + .execute_esdt_transfer( + &user_address, + &fs_setup.farm_wrapper, + FARM_TOKEN_ID, + 9, + &rust_biguint!(farm_in_amount), + |sc| { + let _ = sc.claim_rewards(OptionalValue::None); + }, + ) + .assert_ok(); + + // first user claim - week 6 + fs_setup.set_block_epoch(41); + fs_setup.set_block_nonce(50); + + fs_setup + .b_mock + .execute_esdt_transfer( + &user_address, + &fs_setup.farm_wrapper, + FARM_TOKEN_ID, + 10, + &rust_biguint!(farm_in_amount), + |sc| { + let _ = sc.claim_rewards(OptionalValue::None); + }, + ) + .assert_ok(); + + // first user claim - week 7 + fs_setup.set_block_epoch(48); + fs_setup.set_block_nonce(60); + + fs_setup + .b_mock + .execute_esdt_transfer( + &user_address, + &fs_setup.farm_wrapper, + FARM_TOKEN_ID, + 11, + &rust_biguint!(farm_in_amount), + |sc| { + let _ = sc.claim_rewards(OptionalValue::None); + }, + ) + .assert_ok(); + + fs_setup.set_block_epoch(49); + + // owner collect undist rewards + let owner = fs_setup.owner_address.clone(); + fs_setup + .b_mock + .execute_tx( + &fs_setup.owner_address, + &fs_setup.farm_wrapper, + &rust_biguint!(0), + |sc| { + sc.set_multisig_address(managed_address!(&owner)); + + let undist_rewards = sc.collect_undistributed_boosted_rewards(); + assert_eq!(undist_rewards, 22); + }, + ) + .assert_ok(); + + // check owner received tokens + fs_setup + .b_mock + .check_esdt_balance(&owner, REWARD_TOKEN_ID, &rust_biguint!(22)); +} diff --git a/farm-staking/farm-staking/wasm/Cargo.lock b/farm-staking/farm-staking/wasm/Cargo.lock index 3eec378fa..14cbbe940 100644 --- a/farm-staking/farm-staking/wasm/Cargo.lock +++ b/farm-staking/farm-staking/wasm/Cargo.lock @@ -165,11 +165,8 @@ dependencies = [ "config", "energy-query", "multiversx-sc", - "pair", "pausable", "permissions_module", - "router", - "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -515,18 +512,6 @@ dependencies = [ "token_send", ] -[[package]] -name = "router" -version = "0.0.0" -dependencies = [ - "locking_module", - "multiversx-sc", - "pair", - "pausable", - "simple-lock", - "token_send", -] - [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/farm-staking/farm-staking/wasm/src/lib.rs b/farm-staking/farm-staking/wasm/src/lib.rs index 4858ec503..c5f3f71e6 100644 --- a/farm-staking/farm-staking/wasm/src/lib.rs +++ b/farm-staking/farm-staking/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 73 +// Endpoints: 72 // Async Callback: 1 -// Total number of exported functions: 76 +// Total number of exported functions: 75 #![no_std] @@ -78,7 +78,6 @@ multiversx_sc_wasm_adapter::endpoints! { setBoostedYieldsFactors => set_boosted_yields_factors getBoostedYieldsFactors => get_boosted_yields_factors setMultisigAddress => set_multisig_address - setRouterAddress => set_router_address collectUndistributedBoostedRewards => collect_undistributed_boosted_rewards getRemainingBoostedRewardsToDistribute => remaining_boosted_rewards_to_distribute getCurrentWeek => get_current_week diff --git a/legacy-contracts/farm-staking-proxy-v13/wasm/Cargo.lock b/legacy-contracts/farm-staking-proxy-v13/wasm/Cargo.lock index 7d31fa989..2f155e5d3 100644 --- a/legacy-contracts/farm-staking-proxy-v13/wasm/Cargo.lock +++ b/legacy-contracts/farm-staking-proxy-v13/wasm/Cargo.lock @@ -165,11 +165,8 @@ dependencies = [ "config", "energy-query", "multiversx-sc", - "pair", "pausable", "permissions_module", - "router", - "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -535,18 +532,6 @@ dependencies = [ "token_send", ] -[[package]] -name = "router" -version = "0.0.0" -dependencies = [ - "locking_module", - "multiversx-sc", - "pair", - "pausable", - "simple-lock", - "token_send", -] - [[package]] name = "sc_whitelist_module" version = "0.0.0" diff --git a/locked-asset/proxy_dex/wasm/Cargo.lock b/locked-asset/proxy_dex/wasm/Cargo.lock index 25861f679..5a3f47f2e 100644 --- a/locked-asset/proxy_dex/wasm/Cargo.lock +++ b/locked-asset/proxy_dex/wasm/Cargo.lock @@ -165,11 +165,8 @@ dependencies = [ "config", "energy-query", "multiversx-sc", - "pair", "pausable", "permissions_module", - "router", - "utils", "week-timekeeping", "weekly-rewards-splitting", ] @@ -539,18 +536,6 @@ dependencies = [ "token_send", ] -[[package]] -name = "router" -version = "0.0.0" -dependencies = [ - "locking_module", - "multiversx-sc", - "pair", - "pausable", - "simple-lock", - "token_send", -] - [[package]] name = "sc_whitelist_module" version = "0.0.0"