mod assert;
mod edition_marker;
mod external_price;
mod master_edition_v2;
mod metadata;
mod vault;
pub use assert::*;
pub use edition_marker::EditionMarker;
pub use external_price::ExternalPrice;
pub use master_edition_v2::MasterEditionV2;
pub use metadata::Metadata;
use solana_program_test::*;
use solana_sdk::{
account::Account, program_pack::Pack, pubkey::Pubkey, signature::Signer,
signer::keypair::Keypair, system_instruction, transaction::Transaction, transport::{self, TransportError},
};
use spl_token::state::Mint;
pub use vault::Vault;
pub fn program_test<'a>() -> ProgramTest {
ProgramTest::new("sol_nft_metadata", sol_nft_metadata::id(), None)
}
pub async fn get_account(context: &mut ProgramTestContext, pubkey: &Pubkey) -> Account {
context
.banks_client
.get_account(*pubkey)
.await
.expect("account not found")
.expect("account empty")
}
pub async fn get_mint(context: &mut ProgramTestContext, pubkey: &Pubkey) -> Mint {
let account = get_account(context, pubkey).await;
Mint::unpack(&account.data).unwrap()
}
pub async fn airdrop(
context: &mut ProgramTestContext,
receiver: &Pubkey,
amount: u64,
) -> Result<(), TransportError> {
let tx = Transaction::new_signed_with_payer(
&[system_instruction::transfer(
&context.payer.pubkey(),
receiver,
amount,
)],
Some(&context.payer.pubkey()),
&[&context.payer],
context.last_blockhash,
);
context.banks_client.process_transaction(tx).await.unwrap();
Ok(())
}
pub async fn mint_tokens(
context: &mut ProgramTestContext,
mint: &Pubkey,
account: &Pubkey,
amount: u64,
owner: &Pubkey,
additional_signer: Option<&Keypair>,
) -> transport::Result<()> {
let mut signing_keypairs = vec![&context.payer];
if let Some(signer) = additional_signer {
signing_keypairs.push(signer);
}
let tx = Transaction::new_signed_with_payer(
&[
spl_token::instruction::mint_to(&spl_token::id(), mint, account, owner, &[], amount)
.unwrap(),
],
Some(&context.payer.pubkey()),
&signing_keypairs,
context.last_blockhash,
);
context.banks_client.process_transaction(tx).await
}
pub async fn create_token_account(
context: &mut ProgramTestContext,
account: &Keypair,
mint: &Pubkey,
manager: &Pubkey,
) -> transport::Result<()> {
let rent = context.banks_client.get_rent().await.unwrap();
let tx = Transaction::new_signed_with_payer(
&[
system_instruction::create_account(
&context.payer.pubkey(),
&account.pubkey(),
rent.minimum_balance(spl_token::state::Account::LEN),
spl_token::state::Account::LEN as u64,
&spl_token::id(),
),
spl_token::instruction::initialize_account(
&spl_token::id(),
&account.pubkey(),
mint,
manager,
)
.unwrap(),
],
Some(&context.payer.pubkey()),
&[&context.payer, &account],
context.last_blockhash,
);
context.banks_client.process_transaction(tx).await
}
pub async fn create_mint(
context: &mut ProgramTestContext,
mint: &Keypair,
manager: &Pubkey,
freeze_authority: Option<&Pubkey>,
) -> transport::Result<()> {
let rent = context.banks_client.get_rent().await.unwrap();
let tx = Transaction::new_signed_with_payer(
&[
system_instruction::create_account(
&context.payer.pubkey(),
&mint.pubkey(),
rent.minimum_balance(spl_token::state::Mint::LEN),
spl_token::state::Mint::LEN as u64,
&spl_token::id(),
),
spl_token::instruction::initialize_mint(
&spl_token::id(),
&mint.pubkey(),
&manager,
freeze_authority,
0,
)
.unwrap(),
],
Some(&context.payer.pubkey()),
&[&context.payer, &mint],
context.last_blockhash,
);
context.banks_client.process_transaction(tx).await
}