2020-04-28 14:33:56 -07:00
|
|
|
#![cfg(feature = "program")]
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
account_info::AccountInfo, entrypoint::ProgramResult, entrypoint::SUCCESS,
|
2020-08-10 10:24:11 -07:00
|
|
|
instruction::Instruction,
|
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;
|
|
|
|
}
|