use ore_api::state::Proof;
use steel::*;
use super::{BoostAccount, Config};
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
pub struct Boost {
pub expires_at: i64,
pub last_rewards_factor: Numeric,
pub mint: Pubkey,
pub rewards_factor: Numeric,
pub total_deposits: u64,
pub total_stakers: u64,
pub weight: u64,
pub withdraw_fee: u64,
}
impl Boost {
pub fn collect_rewards(&mut self, config: &mut Config, proof: &Proof) {
if config.total_weight > 0 {
config.rewards_factor += Numeric::from_fraction(proof.balance, config.total_weight);
}
if config.rewards_factor > self.last_rewards_factor {
let accumulated_rewards = config.rewards_factor - self.last_rewards_factor;
if accumulated_rewards < Numeric::ZERO {
panic!("Accumulated rewards is negative");
}
let boost_rewards = accumulated_rewards * Numeric::from_u64(self.weight);
self.rewards_factor += boost_rewards / Numeric::from_u64(self.total_deposits);
}
self.last_rewards_factor = config.rewards_factor;
}
}
account!(BoostAccount, Boost);