50 lines
1.6 KiB
Rust
50 lines
1.6 KiB
Rust
//! Program instruction processor
|
|
|
|
use solana_program::{
|
|
account_info::{next_account_info, AccountInfo},
|
|
entrypoint::ProgramResult,
|
|
program::invoke_signed,
|
|
program_error::ProgramError,
|
|
pubkey::Pubkey,
|
|
system_instruction,
|
|
};
|
|
|
|
/// Amount of bytes of account data to allocate
|
|
pub const SIZE: usize = 42;
|
|
|
|
/// Instruction processor
|
|
pub fn process_instruction(
|
|
program_id: &Pubkey,
|
|
accounts: &[AccountInfo],
|
|
instruction_data: &[u8],
|
|
) -> ProgramResult {
|
|
// Create in iterator to safety reference accounts in the slice
|
|
let account_info_iter = &mut accounts.iter();
|
|
|
|
// Account info for the program being invoked
|
|
let system_program_info = next_account_info(account_info_iter)?;
|
|
// Account info to allocate
|
|
let allocated_info = next_account_info(account_info_iter)?;
|
|
|
|
let expected_allocated_key =
|
|
Pubkey::create_program_address(&[b"You pass butter", &[instruction_data[0]]], program_id)?;
|
|
if *allocated_info.key != expected_allocated_key {
|
|
// allocated key does not match the derived address
|
|
return Err(ProgramError::InvalidArgument);
|
|
}
|
|
|
|
// Invoke the system program to allocate account data
|
|
invoke_signed(
|
|
&system_instruction::allocate(allocated_info.key, SIZE as u64),
|
|
// Order doesn't matter and this slice could include all the accounts and be:
|
|
// `&accounts`
|
|
&[
|
|
system_program_info.clone(), // program being invoked also needs to be included
|
|
allocated_info.clone(),
|
|
],
|
|
&[&[b"You pass butter", &[instruction_data[0]]]],
|
|
)?;
|
|
|
|
Ok(())
|
|
}
|