solana/program-test/src/programs.rs

97 lines
3.1 KiB
Rust

use solana_sdk::{
account::{Account, AccountSharedData},
bpf_loader_upgradeable::UpgradeableLoaderState,
pubkey::Pubkey,
rent::Rent,
};
mod spl_token {
solana_sdk::declare_id!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
}
mod spl_token_2022 {
solana_sdk::declare_id!("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb");
}
mod spl_memo_1_0 {
solana_sdk::declare_id!("Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo");
}
mod spl_memo_3_0 {
solana_sdk::declare_id!("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr");
}
mod spl_associated_token_account {
solana_sdk::declare_id!("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL");
}
static SPL_PROGRAMS: &[(Pubkey, Pubkey, &[u8])] = &[
(
spl_token::ID,
solana_sdk::bpf_loader::ID,
include_bytes!("programs/spl_token-3.5.0.so"),
),
(
spl_token_2022::ID,
solana_sdk::bpf_loader_upgradeable::ID,
include_bytes!("programs/spl_token_2022-0.6.0.so"),
),
(
spl_memo_1_0::ID,
solana_sdk::bpf_loader::ID,
include_bytes!("programs/spl_memo-1.0.0.so"),
),
(
spl_memo_3_0::ID,
solana_sdk::bpf_loader::ID,
include_bytes!("programs/spl_memo-3.0.0.so"),
),
(
spl_associated_token_account::ID,
solana_sdk::bpf_loader::ID,
include_bytes!("programs/spl_associated_token_account-1.1.1.so"),
),
];
pub fn spl_programs(rent: &Rent) -> Vec<(Pubkey, AccountSharedData)> {
SPL_PROGRAMS
.iter()
.flat_map(|(program_id, loader_id, elf)| {
let mut accounts = vec![];
let data = if *loader_id == solana_sdk::bpf_loader_upgradeable::ID {
let (programdata_address, _) =
Pubkey::find_program_address(&[program_id.as_ref()], loader_id);
let mut program_data = bincode::serialize(&UpgradeableLoaderState::ProgramData {
slot: 0,
upgrade_authority_address: Some(Pubkey::default()),
})
.unwrap();
program_data.extend_from_slice(elf);
accounts.push((
programdata_address,
AccountSharedData::from(Account {
lamports: rent.minimum_balance(program_data.len()).max(1),
data: program_data,
owner: *loader_id,
executable: false,
rent_epoch: 0,
}),
));
bincode::serialize(&UpgradeableLoaderState::Program {
programdata_address,
})
.unwrap()
} else {
elf.to_vec()
};
accounts.push((
*program_id,
AccountSharedData::from(Account {
lamports: rent.minimum_balance(data.len()).max(1),
data,
owner: *loader_id,
executable: true,
rent_epoch: 0,
}),
));
accounts.into_iter()
})
.collect()
}