use steel::*;
use super::MiracleAccount;
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
pub struct Proof {
pub claimed_epochs: [u64; 8],
pub authority: Pubkey,
pub last_claim_at: i64,
pub last_claim_epoch: u64,
pub total_claimed_rewards: u64,
pub claim_count: u32,
pub _padding: [u8; 4],
}
account!(MiracleAccount, Proof);
impl Proof {
pub fn is_epoch_claimed(&self, epoch: u64) -> bool {
let bitmap_index = (epoch % 512) as usize;
let u64_index = bitmap_index / 64;
let bit_position = bitmap_index % 64;
(self.claimed_epochs[u64_index] & (1u64 << bit_position)) != 0
}
pub fn mark_epoch_claimed(&mut self, epoch: u64) {
let bitmap_index = (epoch % 512) as usize;
let u64_index = bitmap_index / 64;
let bit_position = bitmap_index % 64;
self.claimed_epochs[u64_index] |= 1u64 << bit_position;
}
pub fn clear_epoch_claimed(&mut self, epoch: u64) {
let bitmap_index = (epoch % 512) as usize;
let u64_index = bitmap_index / 64;
let bit_position = bitmap_index % 64;
self.claimed_epochs[u64_index] &= !(1u64 << bit_position);
}
pub fn claimed_epoch_count(&self) -> u32 {
self.claimed_epochs
.iter()
.map(|&u64_val| u64_val.count_ones())
.sum()
}
pub fn is_empty(&self) -> bool {
self.claimed_epochs.iter().all(|&u64_val| u64_val == 0)
}
}