use borsh::{BorshDeserialize, BorshSerialize}; use solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint, entrypoint::ProgramResult, msg, program_error::ProgramError, pubkey::Pubkey, }; /// Define the type of state stored in accounts #[derive(BorshSerialize, BorshDeserialize, Debug)] pub struct GreetingAccount { pub counter: u32, } entrypoint!(process_instruction); pub fn process_instruction( program_id: &Pubkey, // Public key of the account the hello world program was loaded into accounts: &[AccountInfo], // The account to say hello to _instruction_data: &[u8], // Ignored, all helloworld instructions are hellos ) -> ProgramResult { let accounts_iter = &mut accounts.iter(); let account = next_account_info(accounts_iter)?; msg!("Start instruction decode"); let data_received = GreetingAccount::try_from_slice(_instruction_data).map_err(|err| { msg!("Receiving counter u32, {:?}", err); ProgramError::InvalidInstructionData })?; msg!("Greeting passed to program is {:?}", data_received); msg!("Count: {}!", data_received.counter); // The account must be owned by the program in order to modify its data if account.owner != program_id { msg!("Wrong permissions. Greeted account does not have the correct program id"); return Err(ProgramError::IncorrectProgramId); } let mut greeting_account = GreetingAccount::try_from_slice(&account.data.borrow())?; greeting_account.counter += data_received.counter; greeting_account.serialize(&mut &mut account.data.borrow_mut()[..])?; msg!("Greeted {} time(s)!", greeting_account.counter); Ok(()) }
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter