litesvm_token/
create_mint.rsuse litesvm::{types::FailedTransactionMetadata, LiteSVM};
#[cfg(not(feature = "token-2022"))]
use solana_sdk::program_pack::Pack;
use solana_sdk::{
pubkey::Pubkey, signature::Keypair, signer::Signer, system_instruction::create_account,
transaction::Transaction,
};
#[cfg(feature = "token-2022")]
use spl_token_2022::extension::ExtensionType;
use super::{
spl_token::{instruction::initialize_mint2, state::Mint},
TOKEN_ID,
};
pub struct CreateMint<'a> {
svm: &'a mut LiteSVM,
payer: &'a Keypair,
authority: Option<&'a Pubkey>,
freeze_authority: Option<&'a Pubkey>,
decimals: Option<u8>,
token_program_id: Option<&'a Pubkey>,
}
impl<'a> CreateMint<'a> {
pub fn new(svm: &'a mut LiteSVM, payer: &'a Keypair) -> Self {
CreateMint {
svm,
payer,
authority: None,
freeze_authority: None,
decimals: None,
token_program_id: None,
}
}
pub fn authority(mut self, authority: &'a Pubkey) -> Self {
self.authority = Some(authority);
self
}
pub fn freeze_authority(mut self, freeze_authority: &'a Pubkey) -> Self {
self.freeze_authority = Some(freeze_authority);
self
}
pub fn decimals(mut self, value: u8) -> Self {
self.decimals = Some(value);
self
}
pub fn token_program_id(mut self, program_id: &'a Pubkey) -> Self {
self.token_program_id = Some(program_id);
self
}
pub fn send(self) -> Result<Pubkey, FailedTransactionMetadata> {
#[cfg(feature = "token-2022")]
let mint_size = ExtensionType::try_calculate_account_len::<Mint>(&[])?;
#[cfg(not(feature = "token-2022"))]
let mint_size = Mint::LEN;
let mint_kp = Keypair::new();
let mint_pk = mint_kp.pubkey();
let token_program_id = self.token_program_id.unwrap_or(&TOKEN_ID);
let payer_pk = self.payer.pubkey();
let ix1 = create_account(
&payer_pk,
&mint_pk,
self.svm.minimum_balance_for_rent_exemption(mint_size),
mint_size as u64,
token_program_id,
);
let ix2 = initialize_mint2(
token_program_id,
&mint_pk,
self.authority.unwrap_or(&payer_pk),
self.freeze_authority,
self.decimals.unwrap_or(8),
)?;
let block_hash = self.svm.latest_blockhash();
let tx = Transaction::new_signed_with_payer(
&[ix1, ix2],
Some(&payer_pk),
&[self.payer, &mint_kp],
block_hash,
);
self.svm.send_transaction(tx)?;
Ok(mint_pk)
}
}