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; // Utils // todo maybe don't sign everything with an authority here pub async fn sign_send_instructions( ctx: &mut ProgramTestContext, instructions: Vec, 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, 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) }