use light_token_interface::{instructions::extensions::CompressToPubkey, state::TokenDataVersion};
use solana_account_info::AccountInfo;
use solana_pubkey::Pubkey;
use crate::constants::{LIGHT_TOKEN_CONFIG, RENT_SPONSOR_V1 as RENT_SPONSOR};
#[derive(Debug, Clone)]
pub struct CompressibleParams {
pub token_account_version: TokenDataVersion,
pub pre_pay_num_epochs: u8,
pub lamports_per_write: Option<u32>,
pub compress_to_account_pubkey: Option<CompressToPubkey>,
pub compressible_config: Pubkey,
pub rent_sponsor: Pubkey,
pub compression_only: bool,
}
impl Default for CompressibleParams {
fn default() -> Self {
Self {
compressible_config: LIGHT_TOKEN_CONFIG,
rent_sponsor: RENT_SPONSOR,
pre_pay_num_epochs: 16,
lamports_per_write: Some(766),
compress_to_account_pubkey: None,
token_account_version: TokenDataVersion::ShaFlat,
compression_only: false,
}
}
}
impl CompressibleParams {
pub fn new() -> Self {
Self::default()
}
pub fn default_ata() -> Self {
Self {
compression_only: true,
..Self::default()
}
}
pub fn compress_to_pubkey(mut self, compress_to: CompressToPubkey) -> Self {
self.compress_to_account_pubkey = Some(compress_to);
self
}
}
pub struct CompressibleParamsCpi<'info> {
pub compressible_config: AccountInfo<'info>,
pub rent_sponsor: AccountInfo<'info>,
pub system_program: AccountInfo<'info>,
pub pre_pay_num_epochs: u8,
pub lamports_per_write: Option<u32>,
pub compress_to_account_pubkey: Option<CompressToPubkey>,
pub token_account_version: TokenDataVersion,
pub compression_only: bool,
}
impl<'info> CompressibleParamsCpi<'info> {
pub fn new(
compressible_config: AccountInfo<'info>,
rent_sponsor: AccountInfo<'info>,
system_program: AccountInfo<'info>,
) -> Self {
let defaults = CompressibleParams::default();
Self {
compressible_config,
rent_sponsor,
system_program,
pre_pay_num_epochs: defaults.pre_pay_num_epochs,
lamports_per_write: defaults.lamports_per_write,
compress_to_account_pubkey: None,
token_account_version: defaults.token_account_version,
compression_only: defaults.compression_only,
}
}
pub fn new_ata(
compressible_config: AccountInfo<'info>,
rent_sponsor: AccountInfo<'info>,
system_program: AccountInfo<'info>,
) -> Self {
let defaults = CompressibleParams::default_ata();
Self {
compressible_config,
rent_sponsor,
system_program,
pre_pay_num_epochs: defaults.pre_pay_num_epochs,
lamports_per_write: defaults.lamports_per_write,
compress_to_account_pubkey: None,
token_account_version: defaults.token_account_version,
compression_only: defaults.compression_only,
}
}
pub fn with_compress_to_pubkey(mut self, compress_to: CompressToPubkey) -> Self {
self.compress_to_account_pubkey = Some(compress_to);
self
}
}