2019-03-02 20:03:36 -08:00
|
|
|
use crate::bank::Bank;
|
2019-03-21 07:14:14 -07:00
|
|
|
use crate::bank_client::BankClient;
|
|
|
|
use serde::Serialize;
|
2019-03-23 20:12:27 -07:00
|
|
|
use solana_sdk::instruction::{AccountMeta, Instruction};
|
2019-03-21 07:14:14 -07:00
|
|
|
use solana_sdk::loader_instruction::LoaderInstruction;
|
2019-03-02 20:03:36 -08:00
|
|
|
use solana_sdk::pubkey::Pubkey;
|
|
|
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
2019-03-21 07:14:14 -07:00
|
|
|
use solana_sdk::system_instruction::SystemInstruction;
|
2019-03-02 20:03:36 -08:00
|
|
|
|
2019-03-21 07:14:14 -07:00
|
|
|
pub fn load_program(
|
|
|
|
bank: &Bank,
|
|
|
|
from_client: &BankClient,
|
|
|
|
loader_id: &Pubkey,
|
|
|
|
program: Vec<u8>,
|
|
|
|
) -> Pubkey {
|
|
|
|
let program_keypair = Keypair::new();
|
|
|
|
let program_pubkey = program_keypair.pubkey();
|
2019-03-02 20:03:36 -08:00
|
|
|
|
2019-03-21 07:14:14 -07:00
|
|
|
let instruction = SystemInstruction::new_program_account(
|
|
|
|
&from_client.pubkey(),
|
|
|
|
&program_pubkey,
|
2019-03-02 20:03:36 -08:00
|
|
|
1,
|
|
|
|
program.len() as u64,
|
|
|
|
loader_id,
|
|
|
|
);
|
2019-03-21 07:14:14 -07:00
|
|
|
from_client.process_instruction(instruction).unwrap();
|
|
|
|
|
|
|
|
let program_client = BankClient::new(bank, program_keypair);
|
2019-03-02 20:03:36 -08:00
|
|
|
|
|
|
|
let chunk_size = 256; // Size of chunk just needs to fit into tx
|
|
|
|
let mut offset = 0;
|
|
|
|
for chunk in program.chunks(chunk_size) {
|
2019-03-21 07:14:14 -07:00
|
|
|
let instruction =
|
|
|
|
LoaderInstruction::new_write(&program_pubkey, loader_id, offset, chunk.to_vec());
|
|
|
|
program_client.process_instruction(instruction).unwrap();
|
2019-03-02 20:03:36 -08:00
|
|
|
offset += chunk_size as u32;
|
|
|
|
}
|
|
|
|
|
2019-03-21 07:14:14 -07:00
|
|
|
let instruction = LoaderInstruction::new_finalize(&program_pubkey, loader_id);
|
|
|
|
program_client.process_instruction(instruction).unwrap();
|
|
|
|
|
|
|
|
program_pubkey
|
|
|
|
}
|
2019-03-02 20:03:36 -08:00
|
|
|
|
2019-03-21 07:14:14 -07:00
|
|
|
// Return an Instruction that invokes `program_id` with `data` and required
|
|
|
|
// a signature from `from_pubkey`.
|
|
|
|
pub fn create_invoke_instruction<T: Serialize>(
|
|
|
|
from_pubkey: Pubkey,
|
|
|
|
program_id: Pubkey,
|
|
|
|
data: &T,
|
|
|
|
) -> Instruction {
|
|
|
|
let account_metas = vec![AccountMeta::new(from_pubkey, true)];
|
|
|
|
Instruction::new(program_id, data, account_metas)
|
2019-03-02 20:03:36 -08:00
|
|
|
}
|