Allow programs to realloc their accounts within limits (#19475)
This commit is contained in:
71
programs/bpf/rust/realloc/src/instructions.rs
Normal file
71
programs/bpf/rust/realloc/src/instructions.rs
Normal file
@@ -0,0 +1,71 @@
|
||||
//! @brief Example Rust-based BPF realloc test program
|
||||
|
||||
use solana_program::{
|
||||
instruction::{AccountMeta, Instruction},
|
||||
pubkey::Pubkey,
|
||||
};
|
||||
|
||||
pub const REALLOC: u8 = 1;
|
||||
pub const REALLOC_EXTEND: u8 = 2;
|
||||
pub const REALLOC_EXTEND_AND_FILL: u8 = 3;
|
||||
pub const REALLOC_AND_ASSIGN: u8 = 4;
|
||||
pub const REALLOC_AND_ASSIGN_TO_SELF_VIA_SYSTEM_PROGRAM: u8 = 5;
|
||||
pub const ASSIGN_TO_SELF_VIA_SYSTEM_PROGRAM_AND_REALLOC: u8 = 6;
|
||||
pub const DEALLOC_AND_ASSIGN_TO_CALLER: u8 = 7;
|
||||
pub const CHECK: u8 = 8;
|
||||
pub const ZERO_INIT: u8 = 9;
|
||||
|
||||
pub fn realloc(program_id: &Pubkey, address: &Pubkey, size: usize, bump: &mut u8) -> Instruction {
|
||||
let mut instruction_data = vec![REALLOC, *bump];
|
||||
instruction_data.extend_from_slice(&size.to_le_bytes());
|
||||
|
||||
*bump += 1;
|
||||
|
||||
Instruction::new_with_bytes(
|
||||
*program_id,
|
||||
&instruction_data,
|
||||
vec![AccountMeta::new(*address, false)],
|
||||
)
|
||||
}
|
||||
|
||||
pub fn realloc_extend(
|
||||
program_id: &Pubkey,
|
||||
address: &Pubkey,
|
||||
size: usize,
|
||||
bump: &mut u8,
|
||||
) -> Instruction {
|
||||
let mut instruction_data = vec![REALLOC_EXTEND, *bump];
|
||||
instruction_data.extend_from_slice(&size.to_le_bytes());
|
||||
|
||||
*bump += 1;
|
||||
|
||||
Instruction::new_with_bytes(
|
||||
*program_id,
|
||||
&instruction_data,
|
||||
vec![AccountMeta::new(*address, false)],
|
||||
)
|
||||
}
|
||||
|
||||
pub fn realloc_extend_and_fill(
|
||||
program_id: &Pubkey,
|
||||
address: &Pubkey,
|
||||
size: usize,
|
||||
fill: u8,
|
||||
bump: &mut u64,
|
||||
) -> Instruction {
|
||||
let mut instruction_data = vec![
|
||||
REALLOC_EXTEND_AND_FILL,
|
||||
fill,
|
||||
*bump as u8,
|
||||
(*bump / 255) as u8,
|
||||
];
|
||||
instruction_data.extend_from_slice(&size.to_le_bytes());
|
||||
|
||||
*bump += 1;
|
||||
|
||||
Instruction::new_with_bytes(
|
||||
*program_id,
|
||||
&instruction_data,
|
||||
vec![AccountMeta::new(*address, false)],
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user