Build on Solana
Review IV - Implementing Update_Review
In this lesson, we are going to see how we can update an existing review.
Here is the changes we have made to lib.rs in this video:
pub fn update_review( program_id: &Pubkey, accounts: &[AccountInfo], _title: String, rating: u8, description: String, ) -> ProgramResult { msg!("Updating review..."); let account_info_iter = &mut accounts.iter(); let initializer = next_account_info(account_info_iter)?; let pda_account = next_account_info(account_info_iter)?; if pda_account.owner != program_id { return Err(ProgramError::IllegalOwner); } if !initializer.is_signer { msg!("Missing required signature"); return Err(ProgramError::MissingRequiredSignature); } msg!("unpacking state account"); let mut account_data = try_from_slice_unchecked::<AccountState>(&pda_account.data.borrow()).unwrap(); msg!("review title: {}", account_data.title); let (pda, _bump_seed) = Pubkey::find_program_address( &[ initializer.key.as_ref(), account_data.title.as_bytes().as_ref(), ], program_id, ); if pda != *pda_account.key { msg!("Invalid seeds for PDA"); return Err(ReviewError::InvalidPDA.into()); } msg!("checking if account is initialized"); if !account_data.is_initialized() { msg!("Account is not initialized"); return Err(ReviewError::UninitializedAccount.into()); } if rating > 10 || rating < 1 { return Err(ReviewError::InvalidRating.into()); } msg!("Review before update:"); msg!("Title: {}", account_data.title); msg!("Rating: {}", account_data.rating); msg!("Description: {}", account_data.description); account_data.rating = rating; account_data.description = description; msg!("Review after update:"); msg!("Title: {}", account_data.title); msg!("Rating: {}", account_data.rating); msg!("Description: {}", account_data.description); msg!("serializing account"); account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?; msg!("state account serialized"); Ok(()) }
Comments
You need to enroll in the course to be able to comment!