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
use crate::bank::Bank;
use solana_sdk::loader_transaction::LoaderTransaction;
use solana_sdk::pubkey::Pubkey;
use solana_sdk::signature::{Keypair, KeypairUtil};
use solana_sdk::system_transaction::SystemTransaction;
pub fn load_program(bank: &Bank, from: &Keypair, loader_id: &Pubkey, program: Vec<u8>) -> Pubkey {
let program_account = Keypair::new();
let tx = SystemTransaction::new_program_account(
from,
&program_account.pubkey(),
bank.last_blockhash(),
1,
program.len() as u64,
loader_id,
0,
);
bank.process_transaction(&tx).unwrap();
assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(())));
let chunk_size = 256;
let mut offset = 0;
for chunk in program.chunks(chunk_size) {
let tx = LoaderTransaction::new_write(
&program_account,
loader_id,
offset,
chunk.to_vec(),
bank.last_blockhash(),
0,
);
bank.process_transaction(&tx).unwrap();
offset += chunk_size as u32;
}
let tx = LoaderTransaction::new_finalize(&program_account, loader_id, bank.last_blockhash(), 0);
bank.process_transaction(&tx).unwrap();
assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(())));
program_account.pubkey()
}