use {
super::{AccountState, Initializable},
crate::state::SizeOf,
bytemuck::{Pod, Zeroable},
pinocchio::pubkey::Pubkey,
shank::ShankAccount,
};
pub const AUTHORITY_OFFSET: usize = 0;
pub const PENDING_AUTHORITY_OFFSET: usize = 32;
pub const INFLATION_RATE_OFFSET: usize = 64;
pub const LAMPORTS_PER_SIGNATURE_OFFSET: usize = 72;
pub const VAT_LAMPORTS_PER_EPOCH_OFFSET: usize = 80;
pub const BURN_PERCENT_OFFSET: usize = 88;
pub const STATE_OFFSET: usize = 89;
#[repr(C)]
#[derive(ShankAccount, Copy, Clone, Pod, Zeroable)]
pub struct MonetaryPolicyAccount {
pub authority: Pubkey,
pub pending_authority: Pubkey,
pub inflation_rate_bips: u64,
pub lamports_per_signature: u64,
pub vat_lamports_per_epoch: u64,
pub burn_percent: u8,
pub state: u8,
pub _padding: [u8; 6],
}
impl MonetaryPolicyAccount {
#[inline(always)]
pub fn pack(&self) -> [u8; Self::SIZE_OF] {
let bytes = bytemuck::bytes_of(self);
let mut array = [0u8; Self::SIZE_OF];
array.copy_from_slice(bytes);
array
}
#[inline(always)]
pub fn set_pending_authority(&mut self, new_pending_authority: &Pubkey) {
self.pending_authority = *new_pending_authority;
}
#[inline(always)]
pub fn clear_pending_authority(&mut self) {
self.pending_authority = Pubkey::default();
}
#[inline(always)]
pub fn pending_authority(&self) -> Option<&Pubkey> {
if self.pending_authority == Pubkey::default() {
None
} else {
Some(&self.pending_authority)
}
}
#[inline(always)]
pub fn inflation_rate_bips(&self) -> u64 {
self.inflation_rate_bips
}
#[inline(always)]
pub fn set_inflation_rate_bips(&mut self, new_rate_bips: u64) {
self.inflation_rate_bips = new_rate_bips;
}
#[inline(always)]
pub fn lamports_per_signature(&self) -> u64 {
self.lamports_per_signature
}
#[inline(always)]
pub fn set_lamports_per_signature(&mut self, new_lamports_per_signature: u64) {
self.lamports_per_signature = new_lamports_per_signature;
}
#[inline(always)]
pub fn vat_lamports_per_epoch(&self) -> u64 {
self.vat_lamports_per_epoch
}
#[inline(always)]
pub fn set_vat_lamports_per_epoch(&mut self, new_vat_lamports: u64) {
self.vat_lamports_per_epoch = new_vat_lamports;
}
#[inline(always)]
pub fn burn_percent(&self) -> u8 {
self.burn_percent
}
#[inline(always)]
pub fn set_burn_percent(&mut self, new_percent: u8) {
self.burn_percent = new_percent;
}
#[inline(always)]
pub fn set_initialized(&mut self) {
self.state = AccountState::Initialized as u8;
}
}
impl Initializable for MonetaryPolicyAccount {
#[inline(always)]
fn is_initialized(&self) -> bool {
self.state != AccountState::Uninitialized as u8
}
}