diff --git a/sdk/src/instruction_processor_utils.rs b/sdk/src/instruction_processor_utils.rs index e97437825f..4c380343c5 100644 --- a/sdk/src/instruction_processor_utils.rs +++ b/sdk/src/instruction_processor_utils.rs @@ -1,17 +1,31 @@ -use crate::{account::KeyedAccount, instruction::InstructionError}; +use crate::{ + account::KeyedAccount, account_info::AccountInfo, instruction::InstructionError, + program_error::ProgramError, +}; use num_traits::FromPrimitive; -/// Return the next KeyedAccount or a NotEnoughAccountKeys instruction error -pub fn next_keyed_account(iter: &mut I) -> Result { +/// Return the next KeyedAccount or a NotEnoughAccountKeys error +pub fn next_keyed_account<'a, 'b, I: Iterator>>( + iter: &mut I, +) -> Result { iter.next().ok_or(InstructionError::NotEnoughAccountKeys) } +/// Return the next AccountInfo or a NotEnoughAccountKeys error +pub fn next_account_info<'a, 'b, I: Iterator>>( + iter: &mut I, +) -> Result { + iter.next().ok_or(ProgramError::NotEnoughAccountKeys) +} + /// Return true if the first keyed_account is executable, used to determine if /// the loader should call a program's 'main' pub fn is_executable(keyed_accounts: &[KeyedAccount]) -> Result { Ok(!keyed_accounts.is_empty() && keyed_accounts[0].executable()?) } +/// Deserialize with a limit based the maximum amount of data a program can expect to get. +/// This function should be used in place of direct deserialization to help prevent OOM errors pub fn limited_deserialize(instruction_data: &[u8]) -> Result where T: serde::de::DeserializeOwned, @@ -23,6 +37,7 @@ where .map_err(|_| InstructionError::InvalidInstructionData) } +/// Allows customer errors to be decoded back to their original enum pub trait DecodeError { fn decode_custom_error_to_enum(custom: u32) -> Option where