1use serde::{Deserialize, Serialize};
2use steel::*;
3
4use crate::state::{driller_pda, Treasury};
5
6use super::OilAccount;
7
8
9#[repr(C)]
10#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable, Serialize, Deserialize)]
11pub struct Driller {
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_oil_at: i64,
29
30 pub last_claim_sol_at: i64,
32
33 pub rewards_factor: Numeric,
35
36 pub rewards_sol: u64,
38
39 pub rewards_oil: u64,
41
42 pub refined_oil: u64,
44
45 pub round_id: u64,
47
48 pub lifetime_rewards_sol: u64,
50
51 pub lifetime_rewards_oil: u64,
53
54 pub lifetime_deployed: u64,
56
57 pub referrer: Pubkey,
60
61 pub pooled_deployed: u64,
63}
64
65impl Driller {
66 pub fn pda(&self) -> (Pubkey, u8) {
67 driller_pda(self.authority)
68 }
69
70 pub fn claim_oil(&mut self, clock: &Clock, treasury: &mut Treasury) -> u64 {
71 self.update_rewards(treasury);
72 let refined_oil = self.refined_oil;
73 let rewards_oil = self.rewards_oil;
74 let mut amount = refined_oil + rewards_oil;
75 self.refined_oil = 0;
76 self.rewards_oil = 0;
77
78 if treasury.total_unclaimed > 0 {
82 let fee = rewards_oil / 10;
83 amount -= fee;
84 treasury.driller_rewards_factor += Numeric::from_fraction(fee, treasury.total_unclaimed);
85 treasury.total_refined += fee;
86 self.lifetime_rewards_oil -= fee;
87 }
88
89 treasury.total_unclaimed -= rewards_oil;
90 treasury.total_refined -= refined_oil;
91 self.last_claim_oil_at = clock.unix_timestamp;
92
93 amount
94 }
95
96 pub fn claim_sol(&mut self, clock: &Clock) -> u64 {
97 let amount = self.rewards_sol;
98 self.rewards_sol = 0;
99 self.last_claim_sol_at = clock.unix_timestamp;
100 amount
101 }
102
103 pub fn update_rewards(&mut self, treasury: &Treasury) {
104 if treasury.driller_rewards_factor > self.rewards_factor {
106 let accumulated_rewards = treasury.driller_rewards_factor - self.rewards_factor;
107 if accumulated_rewards < Numeric::ZERO {
108 panic!("Accumulated rewards is negative");
109 }
110 let personal_rewards = accumulated_rewards * Numeric::from_u64(self.rewards_oil);
111 self.refined_oil += personal_rewards.to_u64();
112 self.lifetime_rewards_oil += personal_rewards.to_u64();
113 }
114
115 self.rewards_factor = treasury.driller_rewards_factor;
117 }
118}
119
120account!(OilAccount, Driller);