use std::str::FromStr;
use solana_program::instruction::Instruction;
use solana_program::program_pack::Pack;
use solana_program::pubkey::Pubkey;
use solana_program_test::{BanksClientError, ProgramTest, ProgramTestContext};
use solana_sdk::{signature::Keypair, transaction::Transaction};
use solana_sdk::account::Account;
use solana_sdk::signature::Signer;
use spl_token::state::Mint;
pub async fn sign_send_instructions(
ctx: &mut ProgramTestContext,
instructions: Vec<Instruction>,
signers: Vec<&Keypair>,
) -> Result<(), BanksClientError> {
let mut transaction = Transaction::new_with_payer(&instructions, Some(&ctx.payer.pubkey()));
let mut payer_signers = vec![&ctx.payer];
for s in signers {
payer_signers.push(s);
}
transaction.partial_sign(&payer_signers, ctx.last_blockhash);
ctx.banks_client.process_transaction(transaction).await
}
pub async fn sign_send_instructions_without_authority(
ctx: &mut ProgramTestContext,
instructions: Vec<Instruction>,
signers: Vec<&Keypair>,
) -> Result<(), BanksClientError> {
let mut transaction = Transaction::new_with_payer(&instructions, Some(&signers[0].pubkey()));
transaction.partial_sign(&signers, ctx.last_blockhash);
ctx.banks_client.process_transaction(transaction).await
}
pub fn mint_bootstrap(
address: Option<&str>,
decimals: u8,
program_test: &mut ProgramTest,
mint_authority: &Pubkey,
) -> (Pubkey, Mint) {
let address = address
.map(|s| Pubkey::from_str(s).unwrap())
.unwrap_or_else(Pubkey::new_unique);
let mint_info = Mint {
mint_authority: Some(*mint_authority).into(),
supply: 0,
decimals,
is_initialized: true,
freeze_authority: None.into(),
};
let mut data = [0; Mint::LEN];
mint_info.pack_into_slice(&mut data);
program_test.add_account(
address,
Account {
lamports: u32::MAX.into(),
data: data.into(),
owner: spl_token::ID,
executable: false,
..Account::default()
},
);
(address, mint_info)
}