use anchor_lang::prelude::*;
use borsh::BorshSerialize;
use crate::states::{gt::GtState, user};
use super::Event;
#[event]
#[cfg_attr(feature = "debug", derive(derive_more::Debug))]
#[derive(InitSpace)]
pub struct GtUpdated {
pub kind: GtUpdateKind,
pub receiver: Option<Pubkey>,
pub receiver_delta: u64,
pub receiver_balance: Option<u64>,
pub minting_cost: u128,
pub total_minted: u64,
pub grow_steps: u64,
pub supply: u64,
pub vault: u64,
#[cfg_attr(feature = "debug", debug(skip))]
reserved: [u8; 64],
}
#[derive(AnchorSerialize, AnchorDeserialize, InitSpace)]
#[cfg_attr(feature = "debug", derive(derive_more::Debug))]
pub enum GtUpdateKind {
Reward,
Mint,
Burn,
}
impl gmsol_utils::InitSpace for GtUpdated {
const INIT_SPACE: usize = <Self as Space>::INIT_SPACE;
}
impl Event for GtUpdated {}
impl GtUpdated {
fn new(
kind: GtUpdateKind,
minting_cost: Option<u128>,
delta: u64,
state: &GtState,
receiver: Option<&user::UserHeader>,
) -> Self {
Self {
kind,
receiver: receiver.map(|header| header.owner),
receiver_delta: delta,
receiver_balance: receiver.map(|header| header.gt().amount()),
minting_cost: minting_cost.unwrap_or(state.minting_cost()),
total_minted: state.total_minted(),
grow_steps: state.grow_steps(),
supply: state.supply(),
vault: state.gt_vault(),
reserved: [0; 64],
}
}
pub fn rewarded(amount: u64, state: &GtState, receiver: Option<&user::UserHeader>) -> Self {
Self::new(GtUpdateKind::Reward, None, amount, state, receiver)
}
pub fn minted(
minting_cost: u128,
amount: u64,
state: &GtState,
receiver: Option<&user::UserHeader>,
) -> Self {
Self::new(
GtUpdateKind::Mint,
Some(minting_cost),
amount,
state,
receiver,
)
}
pub fn burned(amount: u64, state: &GtState, receiver: Option<&user::UserHeader>) -> Self {
Self::new(GtUpdateKind::Burn, None, amount, state, receiver)
}
}