1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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()
}