use solana_program::{pubkey::Pubkey, system_program};
use crate::{
cpi::{CAccountInfo, CAccountMeta, CInstruction},
AccountInfo,
};
pub fn create_account(
funder: &AccountInfo,
account: &AccountInfo,
lamports: u64,
space: u64,
owner: &Pubkey,
) {
let instruction_accounts: [CAccountMeta; 2] = [funder.into(), account.into()];
let mut instruction_data = [0; 52];
instruction_data[4..12].copy_from_slice(&lamports.to_le_bytes());
instruction_data[12..20].copy_from_slice(&space.to_le_bytes());
instruction_data[20..52].copy_from_slice(owner.as_ref());
let instruction = CInstruction {
program_id: &system_program::ID,
accounts: instruction_accounts.as_ptr(),
accounts_len: instruction_accounts.len() as u64,
data: instruction_data.as_ptr(),
data_len: instruction_data.len() as u64,
};
let account_infos: [CAccountInfo; 2] = [funder.into(), account.into()];
let seeds: &[&[&[u8]]] = &[];
#[cfg(target_os = "solana")]
unsafe {
solana_program::syscalls::sol_invoke_signed_c(
&instruction as *const CInstruction as *const u8,
account_infos.as_ptr() as *const u8,
account_infos.len() as u64,
seeds.as_ptr() as *const u8,
seeds.len() as u64,
);
}
#[cfg(not(target_os = "solana"))]
core::hint::black_box(&(&instruction, &account_infos, &seeds));
}
pub fn transfer(from: &AccountInfo, recipient: &AccountInfo, amount: u64) {
let instruction_accounts: [CAccountMeta; 2] = [from.into(), recipient.into()];
let mut instruction_data = [0; 12];
instruction_data[0] = 2;
instruction_data[4..12].copy_from_slice(&amount.to_le_bytes());
let instruction = CInstruction {
program_id: &system_program::ID,
accounts: instruction_accounts.as_ptr(),
accounts_len: instruction_accounts.len() as u64,
data: instruction_data.as_ptr(),
data_len: instruction_data.len() as u64,
};
let account_infos: [CAccountInfo; 2] = [from.into(), recipient.into()];
let seeds: &[&[&[u8]]] = &[];
#[cfg(target_os = "solana")]
unsafe {
solana_program::syscalls::sol_invoke_signed_c(
&instruction as *const CInstruction as *const u8,
account_infos.as_ptr() as *const u8,
account_infos.len() as u64,
seeds.as_ptr() as *const u8,
seeds.len() as u64,
);
}
#[cfg(not(target_os = "solana"))]
core::hint::black_box(&(&instruction, &account_infos, &seeds));
}