ore_boost_api/state/
stake.rs1use ore_api::state::Proof;
2use steel::*;
3
4use super::{Boost, BoostAccount, Config};
5
6#[repr(C)]
8#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
9pub struct Stake {
10 pub authority: Pubkey,
12
13 pub balance: u64,
15
16 pub boost: Pubkey,
18
19 pub last_claim_at: i64,
21
22 pub last_deposit_at: i64,
24
25 pub last_withdraw_at: i64,
27
28 pub last_rewards_factor: Numeric,
30
31 pub rewards: u64,
33
34 pub _buffer: [u8; 1024],
36}
37
38impl Stake {
39 pub fn claim(
41 &mut self,
42 amount: u64,
43 boost: &mut Boost,
44 clock: &Clock,
45 config: &mut Config,
46 proof: &Proof,
47 ) -> u64 {
48 self.collect_rewards(boost, config, &proof);
49 let amount = amount.min(self.rewards);
50 self.last_claim_at = clock.unix_timestamp;
51 self.rewards -= amount;
52 amount
53 }
54
55 pub fn deposit(
57 &mut self,
58 amount: u64,
59 boost: &mut Boost,
60 clock: &Clock,
61 config: &mut Config,
62 proof: &Proof,
63 sender: &TokenAccount,
64 ) -> u64 {
65 self.collect_rewards(boost, config, &proof);
66 let amount = amount.min(sender.amount());
67 self.balance += amount;
68 self.last_deposit_at = clock.unix_timestamp;
69 boost.total_deposits += amount;
70 amount
71 }
72
73 pub fn withdraw(
75 &mut self,
76 amount: u64,
77 boost: &mut Boost,
78 clock: &Clock,
79 config: &mut Config,
80 proof: &Proof,
81 ) -> u64 {
82 self.collect_rewards(boost, config, &proof);
83 let amount = amount.min(self.balance);
84 self.balance -= amount;
85 self.last_withdraw_at = clock.unix_timestamp;
86 boost.total_deposits -= amount;
87 amount
88 }
89
90 fn collect_rewards(&mut self, boost: &mut Boost, config: &mut Config, proof: &Proof) {
92 boost.collect_rewards(config, proof);
94
95 if boost.rewards_factor > self.last_rewards_factor {
97 let accumulated_rewards = boost.rewards_factor - self.last_rewards_factor;
98 if accumulated_rewards < Numeric::ZERO {
99 panic!("Accumulated rewards is negative");
100 }
101 let personal_rewards = accumulated_rewards * Numeric::from_u64(self.balance);
102 self.rewards += personal_rewards.to_u64();
103 }
104
105 self.last_rewards_factor = boost.rewards_factor;
107 }
108}
109
110account!(BoostAccount, Stake);