1use serde::{Deserialize, Serialize};
2use steel::*;
3
4use crate::state::{miner_pda, Treasury};
5
6use super::OilAccount;
7
8
9#[repr(C)]
10#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable, Serialize, Deserialize)]
11pub struct Miner {
12 pub authority: Pubkey,
14
15 pub deployed: [u64; 25],
17
18 pub cumulative: [u64; 25],
20
21 pub checkpoint_fee: u64,
23
24 pub checkpoint_id: u64,
26
27 pub last_claim_block_oil_at: i64,
29
30 pub last_claim_block_sol_at: i64,
32
33 pub block_rewards_factor: Numeric,
35
36 pub block_rewards_sol: u64,
38
39 pub block_rewards_oil: u64,
41
42 pub block_refined_oil: u64,
44
45 pub round_id: u64,
47
48 pub pooled_deployed: u64,
50
51 pub auction_rewards_oil: u64,
54
55 pub auction_rewards_sol: u64,
58
59 pub auction_rewards_factor: Numeric,
61
62 pub auction_refined_oil: u64,
64
65 pub last_claim_auction_oil_at: i64,
67
68 pub last_claim_auction_sol_at: i64,
70
71 pub lifetime_rewards_sol: u64,
73
74 pub lifetime_rewards_oil: u64,
76
77 pub lifetime_deployed: u64,
79
80 pub lifetime_bid: u64,
81
82 pub referrer: Pubkey,
85
86 pub total_stake_score: u64,
90
91 pub is_seeker: u64,
92
93 pub buffer_a: u64,
94}
95
96impl Miner {
97 pub fn pda(&self) -> (Pubkey, u8) {
98 miner_pda(self.authority)
99 }
100
101 pub fn claim_oil(&mut self, clock: &Clock, treasury: &mut Treasury) -> u64 {
102 self.update_rewards(treasury);
103 let refined_oil = self.block_refined_oil;
104 let rewards_oil = self.block_rewards_oil;
105 let mut amount = refined_oil + rewards_oil;
106 self.block_refined_oil = 0;
107 self.block_rewards_oil = 0;
108
109 if treasury.block_total_unclaimed > 0 {
113 let fee = rewards_oil / 10;
114 amount -= fee;
115 treasury.block_rewards_factor += Numeric::from_fraction(fee, treasury.block_total_unclaimed);
116 treasury.block_total_refined += fee;
117 self.lifetime_rewards_oil -= fee;
118 }
119
120 treasury.block_total_unclaimed -= rewards_oil;
121 treasury.block_total_refined -= refined_oil;
122 self.last_claim_block_oil_at = clock.unix_timestamp;
123
124 amount
125 }
126
127 pub fn claim_sol(&mut self, clock: &Clock) -> u64 {
128 let amount = self.block_rewards_sol;
129 self.block_rewards_sol = 0;
130 self.last_claim_block_sol_at = clock.unix_timestamp;
131 amount
132 }
133
134 pub fn update_rewards(&mut self, treasury: &Treasury) {
135 if treasury.block_rewards_factor > self.block_rewards_factor {
137 let accumulated_rewards = treasury.block_rewards_factor - self.block_rewards_factor;
138 if accumulated_rewards < Numeric::ZERO {
139 panic!("Accumulated rewards is negative");
140 }
141 let personal_rewards = accumulated_rewards * Numeric::from_u64(self.block_rewards_oil);
142 self.block_refined_oil += personal_rewards.to_u64();
143 self.lifetime_rewards_oil += personal_rewards.to_u64();
144 }
145
146 self.block_rewards_factor = treasury.block_rewards_factor;
148 }
149
150 pub fn update_auction_rewards(&mut self, treasury: &Treasury) {
151 if treasury.auction_rewards_factor > self.auction_rewards_factor {
153 let accumulated_rewards = treasury.auction_rewards_factor - self.auction_rewards_factor;
154 if accumulated_rewards < Numeric::ZERO {
155 panic!("Accumulated auction rewards is negative");
156 }
157 let personal_rewards = accumulated_rewards * Numeric::from_u64(self.auction_rewards_oil);
158 self.auction_refined_oil += personal_rewards.to_u64();
159 }
160
161 self.auction_rewards_factor = treasury.auction_rewards_factor;
163 }
164}
165
166account!(OilAccount, Miner);