pub fn initialize() -> &'static str {
r#"use pinocchio::{
account_info::AccountInfo,
instruction::{Seed, Signer},
program_error::ProgramError,
pubkey::Pubkey,
sysvars::rent::Rent,
ProgramResult,
};
use pinocchio_system::instructions::CreateAccount;
use crate::{
errors::MyProgramError,
states::{
utils::{load_ix_data, DataLen},
MyState,
},
};
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Initialize {
pub owner: Pubkey,
pub bump: u8,
}
impl DataLen for Initialize {
const LEN: usize = core::mem::size_of::<Initialize>();
}
pub fn initialize(accounts: &[AccountInfo], data: &[u8]) -> ProgramResult {
let [payer_acc, state_acc, sysvar_rent_acc, _system_program] = accounts else {
return Err(ProgramError::NotEnoughAccountKeys);
};
if !payer_acc.is_signer() {
return Err(ProgramError::MissingRequiredSignature);
}
if !state_acc.data_is_empty() {
return Err(ProgramError::AccountAlreadyInitialized);
}
let rent = Rent::from_account_info(sysvar_rent_acc)?;
let ix_data = unsafe { load_ix_data::<Initialize>(data)? };
if ix_data.owner.ne(payer_acc.key()) {
return Err(MyProgramError::InvalidOwner.into());
}
let pda_bump_bytes = [ix_data.bump];
MyState::validate_pda(ix_data.bump, state_acc.key(), &ix_data.owner)?;
// signer seeds
let signer_seeds = [
Seed::from(MyState::SEED.as_bytes()),
Seed::from(&ix_data.owner),
Seed::from(&pda_bump_bytes[..]),
];
let signers = [Signer::from(&signer_seeds[..])];
CreateAccount {
from: payer_acc,
to: state_acc,
space: MyState::LEN as u64,
owner: &crate::ID,
lamports: rent.minimum_balance(MyState::LEN),
}
.invoke_signed(&signers)?;
MyState::initialize(state_acc, ix_data)?;
Ok(())
}"#
}
pub fn instructions_mod_rs() -> &'static str {
r#"use pinocchio::program_error::ProgramError;
pub mod initialize;
pub use initialize::*;
#[repr(u8)]
pub enum ProgramInstruction {
InitializeState,
}
impl TryFrom<&u8> for ProgramInstruction {
type Error = ProgramError;
fn try_from(value: &u8) -> Result<Self, Self::Error> {
match *value {
0 => Ok(ProgramInstruction::InitializeState),
_ => Err(ProgramError::InvalidInstructionData),
}
}
}"#
}