reallocate.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. use borsh::{BorshDeserialize, BorshSerialize};
  2. use solana_program::{
  3. account_info::{next_account_info, AccountInfo},
  4. entrypoint::ProgramResult,
  5. program::invoke,
  6. rent::Rent,
  7. system_instruction,
  8. sysvar::Sysvar,
  9. };
  10. use crate::state::{AddressInfo, EnhancedAddressInfo, EnhancedAddressInfoExtender, WorkInfo};
  11. pub fn reallocate_without_zero_init(
  12. accounts: &[AccountInfo],
  13. args: EnhancedAddressInfoExtender,
  14. ) -> ProgramResult {
  15. let accounts_iter = &mut accounts.iter();
  16. let target_account = next_account_info(accounts_iter)?;
  17. let payer = next_account_info(accounts_iter)?;
  18. let system_program = next_account_info(accounts_iter)?;
  19. let address_info_data = AddressInfo::try_from_slice(&target_account.data.borrow())?;
  20. let enhanced_address_info_data =
  21. EnhancedAddressInfo::from_address_info(address_info_data, args.state, args.zip);
  22. let account_span = (enhanced_address_info_data.try_to_vec()?).len();
  23. let lamports_required = (Rent::get()?).minimum_balance(account_span);
  24. let diff = lamports_required - target_account.lamports();
  25. invoke(
  26. &system_instruction::transfer(payer.key, target_account.key, diff),
  27. &[
  28. payer.clone(),
  29. target_account.clone(),
  30. system_program.clone(),
  31. ],
  32. )?;
  33. target_account.realloc(account_span, false)?;
  34. enhanced_address_info_data.serialize(&mut &mut target_account.data.borrow_mut()[..])?;
  35. Ok(())
  36. }
  37. pub fn reallocate_zero_init(accounts: &[AccountInfo], data: WorkInfo) -> ProgramResult {
  38. let accounts_iter = &mut accounts.iter();
  39. let target_account = next_account_info(accounts_iter)?;
  40. let account_span = (data.try_to_vec()?).len();
  41. target_account.realloc(account_span, true)?;
  42. data.serialize(&mut &mut target_account.data.borrow_mut()[..])?;
  43. Ok(())
  44. }