use steel::*;
use super::{ledger_pda, StreakAccount};
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
pub struct Ledger {
pub authority: Pubkey,
pub tickets: u64,
pub unstaked_micros: u64,
pub win_streak: u64,
pub last_win_period: u64,
pub last_win_series_id: u16,
pub _pad0: [u8; 6],
pub total_wins: u64,
pub total_bets: u64,
pub peak_win_streak: u64,
pub week_wins: u64,
pub week_bets: u64,
pub week_peak_streak: u64,
pub week_number: u64,
}
impl Ledger {
pub fn pda(authority: Pubkey) -> (Pubkey, u8) {
ledger_pda(authority)
}
#[inline(always)]
pub fn maybe_reset_weekly(&mut self, current_week: u64) {
if self.week_number != current_week {
self.week_number = current_week;
self.week_wins = 0;
self.week_bets = 0;
self.week_peak_streak = 0;
}
}
#[inline(always)]
pub fn record_win(&mut self, market_period: u64, series_id: u16, current_week: u64) {
self.maybe_reset_weekly(current_week);
if self.last_win_period == 0 {
self.win_streak = 1;
} else if market_period == self.last_win_period.saturating_add(1)
&& self.last_win_series_id == series_id
{
self.win_streak = self.win_streak.saturating_add(1);
} else {
self.win_streak = 1;
}
self.last_win_period = market_period;
self.last_win_series_id = series_id;
if self.win_streak > self.peak_win_streak {
self.peak_win_streak = self.win_streak;
}
if self.win_streak > self.week_peak_streak {
self.week_peak_streak = self.win_streak;
}
self.total_wins = self.total_wins.saturating_add(1);
self.week_wins = self.week_wins.saturating_add(1);
}
#[inline(always)]
pub fn record_loss(&mut self, current_week: u64) {
self.maybe_reset_weekly(current_week);
self.win_streak = 0;
self.last_win_period = 0;
self.last_win_series_id = 0;
}
#[inline(always)]
pub fn record_bet(&mut self, current_week: u64) {
self.maybe_reset_weekly(current_week);
self.total_bets = self.total_bets.saturating_add(1);
self.week_bets = self.week_bets.saturating_add(1);
}
}
account!(StreakAccount, Ledger);