141 lines
3.8 KiB
Rust
141 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::{
|
|
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(())
|
|
}
|
|
|
|
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(())
|
|
}
|