use crate::AnchorContext;
use litesvm_utils::LiteSVMBuilder;
use solana_program::pubkey::Pubkey;
use solana_sdk::signature::{Keypair, Signer};
pub struct AnchorLiteSVM {
svm_builder: LiteSVMBuilder,
primary_program_id: Option<Pubkey>,
payer: Option<Keypair>,
}
impl AnchorLiteSVM {
pub fn new() -> Self {
Self {
svm_builder: LiteSVMBuilder::new(),
primary_program_id: None,
payer: None,
}
}
pub fn with_payer(mut self, payer: Keypair) -> Self {
self.payer = Some(payer);
self
}
pub fn deploy_program(mut self, program_id: Pubkey, program_bytes: &[u8]) -> Self {
if self.primary_program_id.is_none() {
self.primary_program_id = Some(program_id);
}
self.svm_builder = self.svm_builder.deploy_program(program_id, program_bytes);
self
}
pub fn build(self) -> AnchorContext {
let program_id = self.primary_program_id
.expect("No programs added. Call deploy_program() at least once.");
let mut svm = self.svm_builder.build();
let payer = self.payer.unwrap_or_else(|| {
let payer = Keypair::new();
svm.airdrop(&payer.pubkey(), 10_000_000_000).unwrap();
payer
});
AnchorContext::new_with_payer(svm, program_id, payer)
}
pub fn build_with_program(program_id: Pubkey, program_bytes: &[u8]) -> AnchorContext {
Self::new()
.deploy_program(program_id, program_bytes)
.build()
}
pub fn build_with_programs(programs: &[(Pubkey, &[u8])]) -> AnchorContext {
let mut builder = Self::new();
for (program_id, program_bytes) in programs {
builder = builder.deploy_program(*program_id, program_bytes);
}
builder.build()
}
}
impl Default for AnchorLiteSVM {
fn default() -> Self {
Self::new()
}
}
pub trait ProgramTestExt {
fn deploy_program(&mut self, program_id: Pubkey, program_bytes: &[u8]);
}
impl ProgramTestExt for AnchorContext {
fn deploy_program(&mut self, program_id: Pubkey, program_bytes: &[u8]) {
self.svm.add_program(program_id, program_bytes);
}
}