lib.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. use solana_program::{
  2. account_info::{next_account_info, AccountInfo},
  3. entrypoint,
  4. entrypoint::ProgramResult,
  5. msg,
  6. program::invoke,
  7. pubkey::Pubkey,
  8. rent::Rent,
  9. system_instruction, system_program,
  10. sysvar::Sysvar,
  11. };
  12. entrypoint!(process_instruction);
  13. fn process_instruction(
  14. _program_id: &Pubkey,
  15. accounts: &[AccountInfo],
  16. instruction_data: &[u8],
  17. ) -> ProgramResult {
  18. let accounts_iter = &mut accounts.iter();
  19. let payer = next_account_info(accounts_iter)?;
  20. let new_account = next_account_info(accounts_iter)?;
  21. let system_program = next_account_info(accounts_iter)?;
  22. msg!("Program invoked. Creating a system account...");
  23. msg!(" New public key will be: {}", &new_account.key.to_string());
  24. // Determine the necessary minimum rent by calculating the account's size
  25. //
  26. let account_span = instruction_data.len();
  27. let lamports_required = (Rent::get()?).minimum_balance(account_span);
  28. msg!("Account span: {}", &account_span);
  29. msg!("Lamports required: {}", &lamports_required);
  30. invoke(
  31. &system_instruction::create_account(
  32. payer.key,
  33. new_account.key,
  34. lamports_required,
  35. account_span as u64,
  36. &system_program::ID,
  37. ),
  38. &[payer.clone(), new_account.clone(), system_program.clone()],
  39. )?;
  40. msg!("Account created succesfully.");
  41. Ok(())
  42. }