Skip to content

Commit

Permalink
redistribute initial rewards
Browse files Browse the repository at this point in the history
  • Loading branch information
dorin-iancu committed Nov 15, 2024
1 parent 0c41aa5 commit 696428e
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ pub trait AdditionalLockedTokensModule:
+ crate::fees_accumulation::FeesAccumulationModule
+ crate::events::FeesCollectorEventsModule
+ week_timekeeping::WeekTimekeepingModule
+ multiversx_sc_modules::only_admin::OnlyAdminModule
{
#[only_owner]
#[endpoint(setLockedTokensPerBlock)]
Expand Down
1 change: 0 additions & 1 deletion energy-integration/fees-collector/src/fees_accumulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ pub trait FeesAccumulationModule:
crate::config::ConfigModule
+ crate::events::FeesCollectorEventsModule
+ week_timekeeping::WeekTimekeepingModule
+ multiversx_sc_modules::only_admin::OnlyAdminModule
{
/// Pair SC will deposit the fees through this endpoint
/// Deposits for current week are accessible starting next week
Expand Down
83 changes: 77 additions & 6 deletions energy-integration/fees-collector/src/redistribute_rewards.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,53 @@
use common_types::{PaymentsVec, Week};
use common_types::{PaymentsVec, TokenAmountPair, Week};
use weekly_rewards_splitting::USER_MAX_CLAIM_WEEKS;

multiversx_sc::imports!();

const INITIAL_REW_DIST: bool = true;
const INITIAL_REW_NOT_DIST: bool = false;
static INVALID_OFFSET_ERR_MSG: &[u8] = b"Current week must be higher than the week offset";

#[multiversx_sc::module]
pub trait RedistributeRewardsModule:
crate::fees_accumulation::FeesAccumulationModule
+ crate::config::ConfigModule
+ crate::events::FeesCollectorEventsModule
+ week_timekeeping::WeekTimekeepingModule
+ multiversx_sc_modules::only_admin::OnlyAdminModule
+ crate::additional_locked_tokens::AdditionalLockedTokensModule
{
#[only_admin]
#[endpoint(redistributeInitialRewards)]
fn redistribute_initial_rewards(&self) {
require!(
self.redistributed_initial_rewards().get() == INITIAL_REW_NOT_DIST,
"Initial rewards already distributed"
);

let collect_rewards_offset = USER_MAX_CLAIM_WEEKS + 1;
let current_week = self.get_current_week();
require!(
current_week > collect_rewards_offset,
INVALID_OFFSET_ERR_MSG
);

let all_rem_rewards = self.redist_initial_rew(current_week, collect_rewards_offset);
for reward_entry in &all_rem_rewards {
self.accumulated_fees(current_week, &reward_entry.token)
.update(|acc_fees| *acc_fees += reward_entry.amount);
}

self.redistributed_initial_rewards().set(INITIAL_REW_DIST);
}

#[only_admin]
#[endpoint(redistributeRewards)]
fn redistribute_rewards(&self, start_week: Week, end_week: Week) {
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"
INVALID_OFFSET_ERR_MSG
);
require!(start_week <= end_week, "Invalid week numbers");
require!(
Expand All @@ -27,9 +56,9 @@ pub trait RedistributeRewardsModule:
);

let all_tokens = self.all_tokens().get();
let mut all_rewards = PaymentsVec::new();
let mut all_rewards = ManagedVec::new();
for token_id in &all_tokens {
all_rewards.push(EsdtTokenPayment::new(token_id, 0, BigUint::zero()));
all_rewards.push(TokenAmountPair::new(token_id, BigUint::zero()));
}

for week in start_week..=end_week {
Expand All @@ -41,14 +70,14 @@ pub trait RedistributeRewardsModule:
continue;
}

self.accumulated_fees(current_week, &reward_entry.token_identifier)
self.accumulated_fees(current_week, &reward_entry.token)
.update(|acc_fees| *acc_fees += reward_entry.amount);
}
}

fn accumulate_remaining_rewards_single_week(
&self,
all_rewards: &mut PaymentsVec<Self::Api>,
all_rewards: &mut ManagedVec<TokenAmountPair<Self::Api>>,
all_tokens: &ManagedVec<TokenIdentifier>,
week: Week,
) {
Expand All @@ -69,6 +98,48 @@ pub trait RedistributeRewardsModule:
}
}

fn redist_initial_rew(
&self,
current_week: Week,
collect_rewards_offset: Week,
) -> ManagedVec<TokenAmountPair<Self::Api>> {
let all_tokens = self.all_tokens().get();
let locked_token_id = self.locked_token_id().get();
let start_week = current_week - collect_rewards_offset;
let end_week = current_week;

let mut all_rem_rewards = ManagedVec::new();
for token_id in &all_tokens {
if token_id == locked_token_id {
continue;
}

let mut token_balance = self
.blockchain()
.get_sc_balance(&EgldOrEsdtTokenIdentifier::esdt(token_id.clone()), 0);
if token_balance == 0 {
continue;
}

for week in start_week..=end_week {
let to_dist_week = self.accumulated_fees(week, &token_id).get();
token_balance -= to_dist_week;
}

if token_balance == 0 {
continue;
}

all_rem_rewards.push(TokenAmountPair::new(token_id, token_balance));
}

all_rem_rewards
}

#[view(wereInitialRewardsRedistributed)]
#[storage_mapper("redistributedInitialRewards")]
fn redistributed_initial_rewards(&self) -> SingleValueMapper<bool>;

#[view(getRemainingRewards)]
#[storage_mapper("remainingRewards")]
fn remaining_rewards(&self, week: Week) -> SingleValueMapper<PaymentsVec<Self::Api>>;
Expand Down
6 changes: 4 additions & 2 deletions energy-integration/fees-collector/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: 43
// Endpoints: 45
// Async Callback (empty): 1
// Total number of exported functions: 46
// Total number of exported functions: 48

#![no_std]

Expand Down Expand Up @@ -61,7 +61,9 @@ multiversx_sc_wasm_adapter::endpoints! {
getAdmins => admins
claimRewards => claim_rewards_endpoint
claimBoostedRewards => claim_boosted_rewards
redistributeInitialRewards => redistribute_initial_rewards
redistributeRewards => redistribute_rewards
wereInitialRewardsRedistributed => redistributed_initial_rewards
getRemainingRewards => remaining_rewards
)
}
Expand Down

0 comments on commit 696428e

Please sign in to comment.