use steel::*;
use crate::consts::MAX_MARKET_SERIES;
use crate::error::StreakError;
use super::{treasury_pda, StreakAccount};
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
pub struct Treasury {
pub daily_jackpot: u64,
pub weekly_jackpot: u64,
pub buyback: u64,
pub next_period: [u64; MAX_MARKET_SERIES],
}
impl Treasury {
pub fn pda() -> (Pubkey, u8) {
treasury_pda()
}
#[inline(always)]
pub fn series_index(series_id: u16) -> Result<usize, StreakError> {
let i = series_id as usize;
if i >= MAX_MARKET_SERIES {
return Err(StreakError::InvalidMarketSeries);
}
Ok(i)
}
#[inline(always)]
pub fn bump_next_period_floor(
&mut self,
series_id: u16,
settled_period: u64,
) -> Result<(), StreakError> {
let i = Self::series_index(series_id)?;
let n = settled_period.checked_add(1).ok_or(StreakError::Overflow)?;
if n > self.next_period[i] {
self.next_period[i] = n;
}
Ok(())
}
}
account!(StreakAccount, Treasury);