use serde::{Deserialize, Serialize};
use steel::*;
use crate::state::{miner_pda, Treasury};
use super::OilAccount;
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable, Serialize, Deserialize)]
pub struct Miner {
pub authority: Pubkey,
pub deployed: [u64; 25],
pub cumulative: [u64; 25],
pub checkpoint_fee: u64,
pub checkpoint_id: u64,
pub last_claim_block_oil_at: i64,
pub last_claim_block_sol_at: i64,
pub block_rewards_factor: Numeric,
pub block_rewards_sol: u64,
pub block_rewards_oil: u64,
pub block_refined_oil: u64,
pub round_id: u64,
pub pooled_deployed: u64,
pub auction_rewards_oil: u64,
pub auction_rewards_sol: u64,
pub auction_rewards_factor: Numeric,
pub auction_refined_oil: u64,
pub last_claim_auction_oil_at: i64,
pub last_claim_auction_sol_at: i64,
pub lifetime_rewards_sol: u64,
pub lifetime_rewards_oil: u64,
pub lifetime_deployed: u64,
pub lifetime_bid: u64,
pub referrer: Pubkey,
pub total_stake_score: u64,
pub is_seeker: u64,
pub buffer_a: u64,
pub current_epoch_id: [u64; 4],
pub checkpointed_epoch_id: [u64; 4],
}
impl Miner {
pub fn pda(&self) -> (Pubkey, u8) {
miner_pda(self.authority)
}
pub fn initialize(&mut self, authority: Pubkey) {
self.authority = authority;
self.deployed = [0; 25];
self.cumulative = [0; 25];
self.checkpoint_fee = 0;
self.checkpoint_id = 0;
self.last_claim_block_oil_at = 0;
self.last_claim_block_sol_at = 0;
self.block_rewards_factor = Numeric::ZERO;
self.block_rewards_sol = 0;
self.block_rewards_oil = 0;
self.block_refined_oil = 0;
self.round_id = 0;
self.pooled_deployed = 0;
self.is_seeker = 0;
self.buffer_a = 0;
self.auction_rewards_oil = 0;
self.auction_rewards_sol = 0;
self.auction_rewards_factor = Numeric::ZERO;
self.auction_refined_oil = 0;
self.last_claim_auction_oil_at = 0;
self.last_claim_auction_sol_at = 0;
self.lifetime_rewards_sol = 0;
self.lifetime_rewards_oil = 0;
self.lifetime_deployed = 0;
self.lifetime_bid = 0;
self.referrer = Pubkey::default();
self.total_stake_score = 0;
self.current_epoch_id = [0; 4];
self.checkpointed_epoch_id = [0; 4];
}
pub fn claim_oil(&mut self, clock: &Clock, treasury: &mut Treasury) -> u64 {
self.update_rewards(treasury);
let refined_oil = self.block_refined_oil;
let rewards_oil = self.block_rewards_oil;
let mut amount = refined_oil + rewards_oil;
self.block_refined_oil = 0;
self.block_rewards_oil = 0;
if treasury.block_total_unclaimed > 0 {
let fee = rewards_oil / 10;
amount -= fee;
treasury.block_rewards_factor += Numeric::from_fraction(fee, treasury.block_total_unclaimed);
treasury.block_total_refined += fee;
self.lifetime_rewards_oil -= fee;
}
treasury.block_total_unclaimed -= rewards_oil;
treasury.block_total_refined -= refined_oil;
self.last_claim_block_oil_at = clock.unix_timestamp;
amount
}
pub fn claim_sol(&mut self, clock: &Clock) -> u64 {
let amount = self.block_rewards_sol;
self.block_rewards_sol = 0;
self.last_claim_block_sol_at = clock.unix_timestamp;
amount
}
pub fn update_rewards(&mut self, treasury: &Treasury) {
if treasury.block_rewards_factor > self.block_rewards_factor {
let accumulated_rewards = treasury.block_rewards_factor - self.block_rewards_factor;
if accumulated_rewards < Numeric::ZERO {
panic!("Accumulated rewards is negative");
}
let personal_rewards = accumulated_rewards * Numeric::from_u64(self.block_rewards_oil);
self.block_refined_oil += personal_rewards.to_u64();
self.lifetime_rewards_oil += personal_rewards.to_u64();
}
self.block_rewards_factor = treasury.block_rewards_factor;
}
pub fn update_auction_rewards(&mut self, treasury: &Treasury) {
if treasury.auction_rewards_factor > self.auction_rewards_factor {
let accumulated_rewards = treasury.auction_rewards_factor - self.auction_rewards_factor;
if accumulated_rewards < Numeric::ZERO {
panic!("Accumulated auction rewards is negative");
}
let personal_rewards = accumulated_rewards * Numeric::from_u64(self.auction_rewards_oil);
self.auction_refined_oil += personal_rewards.to_u64();
}
self.auction_rewards_factor = treasury.auction_rewards_factor;
}
}
account!(OilAccount, Miner);