solana-program-library/token/program-2022/tests/action.rs

142 lines
3.8 KiB
Rust

use {
solana_program_test::BanksClient,
solana_sdk::{
hash::Hash,
program_pack::Pack,
pubkey::Pubkey,
signature::{Keypair, Signer},
system_instruction,
transaction::Transaction,
transport::TransportError,
},
spl_token_2022::{
id, instruction,
state::{Account, Mint},
},
};
pub async fn create_mint(
banks_client: &mut BanksClient,
payer: &Keypair,
recent_blockhash: Hash,
pool_mint: &Keypair,
manager: &Pubkey,
decimals: u8,
) -> Result<(), TransportError> {
let rent = banks_client.get_rent().await.unwrap();
let mint_rent = rent.minimum_balance(Mint::LEN);
let transaction = Transaction::new_signed_with_payer(
&[
system_instruction::create_account(
&payer.pubkey(),
&pool_mint.pubkey(),
mint_rent,
Mint::LEN as u64,
&id(),
),
instruction::initialize_mint(&id(), &pool_mint.pubkey(), manager, None, decimals)
.unwrap(),
],
Some(&payer.pubkey()),
&[payer, pool_mint],
recent_blockhash,
);
banks_client.process_transaction(transaction).await?;
Ok(())
}
pub async fn create_account(
banks_client: &mut BanksClient,
payer: &Keypair,
recent_blockhash: Hash,
account: &Keypair,
pool_mint: &Pubkey,
owner: &Pubkey,
) -> Result<(), TransportError> {
let rent = banks_client.get_rent().await.unwrap();
let account_rent = rent.minimum_balance(Account::LEN);
let transaction = Transaction::new_signed_with_payer(
&[
system_instruction::create_account(
&payer.pubkey(),
&account.pubkey(),
account_rent,
Account::LEN as u64,
&id(),
),
instruction::initialize_account(&id(), &account.pubkey(), pool_mint, owner).unwrap(),
],
Some(&payer.pubkey()),
&[payer, account],
recent_blockhash,
);
banks_client.process_transaction(transaction).await?;
Ok(())
}
pub async fn mint_to(
banks_client: &mut BanksClient,
payer: &Keypair,
recent_blockhash: Hash,
mint: &Pubkey,
account: &Pubkey,
mint_authority: &Keypair,
amount: u64,
) -> Result<(), TransportError> {
let transaction = Transaction::new_signed_with_payer(
&[
instruction::mint_to(&id(), mint, account, &mint_authority.pubkey(), &[], amount)
.unwrap(),
],
Some(&payer.pubkey()),
&[payer, mint_authority],
recent_blockhash,
);
banks_client.process_transaction(transaction).await?;
Ok(())
}
#[allow(deprecated)]
pub async fn transfer(
banks_client: &mut BanksClient,
payer: &Keypair,
recent_blockhash: Hash,
source: &Pubkey,
destination: &Pubkey,
authority: &Keypair,
amount: u64,
) -> Result<(), TransportError> {
let transaction = Transaction::new_signed_with_payer(
&[
instruction::transfer(&id(), source, destination, &authority.pubkey(), &[], amount)
.unwrap(),
],
Some(&payer.pubkey()),
&[payer, authority],
recent_blockhash,
);
banks_client.process_transaction(transaction).await?;
Ok(())
}
pub async fn burn(
banks_client: &mut BanksClient,
payer: &Keypair,
recent_blockhash: Hash,
mint: &Pubkey,
account: &Pubkey,
authority: &Keypair,
amount: u64,
) -> Result<(), TransportError> {
let transaction = Transaction::new_signed_with_payer(
&[instruction::burn(&id(), account, mint, &authority.pubkey(), &[], amount).unwrap()],
Some(&payer.pubkey()),
&[payer, authority],
recent_blockhash,
);
banks_client.process_transaction(transaction).await?;
Ok(())
}