ore_boost_api/state/
boost.rs1use ore_api::state::Proof;
2use steel::*;
3
4use super::{BoostAccount, Config};
5
6#[repr(C)]
8#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
9pub struct Boost {
10 pub expires_at: i64,
12
13 pub last_rewards_factor: Numeric,
15
16 pub mint: Pubkey,
18
19 pub rewards_factor: Numeric,
21
22 pub total_deposits: u64,
24
25 pub total_stakers: u64,
27
28 pub weight: u64,
30
31 pub withdraw_fee: u64,
33}
34
35impl Boost {
36 pub fn collect_rewards(&mut self, config: &mut Config, proof: &Proof) {
38 if config.total_weight > 0 {
40 config.rewards_factor += Numeric::from_fraction(proof.balance, config.total_weight);
41 }
42
43 if config.rewards_factor > self.last_rewards_factor {
45 let accumulated_rewards = config.rewards_factor - self.last_rewards_factor;
46 if accumulated_rewards < Numeric::ZERO {
47 panic!("Accumulated rewards is negative");
48 }
49 let boost_rewards = accumulated_rewards * Numeric::from_u64(self.weight);
50 self.rewards_factor += boost_rewards / Numeric::from_u64(self.total_deposits);
51 }
52
53 self.last_rewards_factor = config.rewards_factor;
55 }
56}
57
58account!(BoostAccount, Boost);