create.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. use program_derived_addresses_api::prelude::*;
  2. use solana_program::msg;
  3. use steel::*;
  4. pub fn process_create(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
  5. msg!("Processing Create instruction");
  6. // parse args
  7. let args = Create::try_from_bytes(data)?;
  8. let page_visits = args.page_visits;
  9. // load accounts
  10. let [signer_info, user_info, pages_visit_info, system_program] = accounts else {
  11. return Err(ProgramError::NotEnoughAccountKeys);
  12. };
  13. // validations
  14. signer_info.is_signer()?;
  15. pages_visit_info.is_empty()?.is_writable()?.has_seeds(
  16. &[SEED, &user_info.key.as_ref()],
  17. &program_derived_addresses_api::ID,
  18. )?;
  19. system_program.is_program(&system_program::ID)?;
  20. // create account
  21. create_account::<PageVisits>(
  22. pages_visit_info,
  23. system_program,
  24. signer_info,
  25. &program_derived_addresses_api::ID,
  26. &[SEED, user_info.key.as_ref()],
  27. )?;
  28. let info = pages_visit_info.as_account_mut::<PageVisits>(&program_derived_addresses_api::ID)?;
  29. info.page_visits = page_visits.page_visits;
  30. info.bump = page_visits.bump;
  31. msg!("page visits: {:?}", u32::from_le_bytes(info.page_visits));
  32. Ok(())
  33. }