2020-04-28 14:33:56 -07:00
|
|
|
#![cfg(feature = "program")]
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
account_info::AccountInfo, entrypoint::ProgramResult, entrypoint::SUCCESS,
|
2020-08-05 16:35:54 -07:00
|
|
|
instruction::Instruction, program_error::ProgramError, pubkey::Pubkey,
|
2020-04-28 14:33:56 -07:00
|
|
|
};
|
|
|
|
|
2020-08-05 16:35:54 -07:00
|
|
|
pub fn create_program_address(
|
|
|
|
seeds: &[&[u8]],
|
|
|
|
program_id: &Pubkey,
|
|
|
|
) -> Result<Pubkey, ProgramError> {
|
|
|
|
let bytes = [
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0,
|
|
|
|
];
|
|
|
|
let result = unsafe {
|
|
|
|
sol_create_program_address(
|
|
|
|
seeds as *const _ as *const u8,
|
|
|
|
seeds.len() as u64,
|
|
|
|
program_id as *const _ as *const u8,
|
|
|
|
&bytes as *const _ as *const u8,
|
|
|
|
)
|
|
|
|
};
|
|
|
|
match result {
|
|
|
|
SUCCESS => Ok(Pubkey::new(&bytes)),
|
|
|
|
_ => Err(result.into()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
extern "C" {
|
|
|
|
fn sol_create_program_address(
|
|
|
|
seeds_addr: *const u8,
|
|
|
|
seeds_len: u64,
|
|
|
|
program_id_addr: *const u8,
|
|
|
|
address_bytes_addr: *const u8,
|
|
|
|
) -> u64;
|
|
|
|
}
|
|
|
|
|
2020-04-28 14:33:56 -07:00
|
|
|
/// Invoke a cross-program instruction
|
|
|
|
pub fn invoke(instruction: &Instruction, account_infos: &[AccountInfo]) -> ProgramResult {
|
|
|
|
invoke_signed(instruction, account_infos, &[])
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Invoke a cross-program instruction with program signatures
|
|
|
|
pub fn invoke_signed(
|
|
|
|
instruction: &Instruction,
|
|
|
|
account_infos: &[AccountInfo],
|
2020-06-22 16:51:43 -07:00
|
|
|
signers_seeds: &[&[&[u8]]],
|
2020-04-28 14:33:56 -07:00
|
|
|
) -> ProgramResult {
|
|
|
|
let result = unsafe {
|
|
|
|
sol_invoke_signed_rust(
|
|
|
|
instruction as *const _ as *const u8,
|
|
|
|
account_infos as *const _ as *const u8,
|
|
|
|
account_infos.len() as u64,
|
|
|
|
signers_seeds as *const _ as *const u8,
|
|
|
|
signers_seeds.len() as u64,
|
|
|
|
)
|
|
|
|
};
|
|
|
|
match result {
|
|
|
|
SUCCESS => Ok(()),
|
|
|
|
_ => Err(result.into()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
extern "C" {
|
|
|
|
fn sol_invoke_signed_rust(
|
|
|
|
instruction_addr: *const u8,
|
|
|
|
account_infos_addr: *const u8,
|
|
|
|
account_infos_len: u64,
|
|
|
|
signers_seeds_addr: *const u8,
|
|
|
|
signers_seeds_len: u64,
|
|
|
|
) -> u64;
|
|
|
|
}
|