123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- use borsh::{BorshDeserialize, BorshSerialize};
- use solana_program::{
- account_info::{next_account_info, AccountInfo},
- entrypoint::ProgramResult,
- program::invoke,
- rent::Rent,
- system_instruction,
- sysvar::Sysvar,
- };
- use crate::state::{AddressInfo, EnhancedAddressInfo, EnhancedAddressInfoExtender, WorkInfo};
- pub fn reallocate_without_zero_init(
- accounts: &[AccountInfo],
- args: EnhancedAddressInfoExtender,
- ) -> ProgramResult {
- let accounts_iter = &mut accounts.iter();
- let target_account = next_account_info(accounts_iter)?;
- let payer = next_account_info(accounts_iter)?;
- let system_program = next_account_info(accounts_iter)?;
- let address_info_data = AddressInfo::try_from_slice(&target_account.data.borrow())?;
- let enhanced_address_info_data =
- EnhancedAddressInfo::from_address_info(address_info_data, args.state, args.zip);
- let account_span = (enhanced_address_info_data.try_to_vec()?).len();
- let lamports_required = (Rent::get()?).minimum_balance(account_span);
- let diff = lamports_required - target_account.lamports();
- invoke(
- &system_instruction::transfer(payer.key, target_account.key, diff),
- &[
- payer.clone(),
- target_account.clone(),
- system_program.clone(),
- ],
- )?;
- target_account.realloc(account_span, false)?;
- enhanced_address_info_data.serialize(&mut &mut target_account.data.borrow_mut()[..])?;
- Ok(())
- }
- pub fn reallocate_zero_init(accounts: &[AccountInfo], data: WorkInfo) -> ProgramResult {
- let accounts_iter = &mut accounts.iter();
- let target_account = next_account_info(accounts_iter)?;
- let account_span = (data.try_to_vec()?).len();
- target_account.realloc(account_span, true)?;
- data.serialize(&mut &mut target_account.data.borrow_mut()[..])?;
- Ok(())
- }
|