use {
pinocchio::{cpi::Signer, sysvars::rent::Rent, AccountView, Address, ProgramResult},
pinocchio_system::instructions::{Assign, CreateAccount, Transfer},
};
#[inline(always)]
pub fn create_account_with_minimum_balance_signed(
account: &AccountView,
space: usize,
owner: &Address,
payer: &AccountView,
rent_sysvar: &Rent,
signers: &[Signer],
) -> ProgramResult {
let lamports = rent_sysvar.try_minimum_balance(space)?;
if account.lamports() == 0 {
CreateAccount {
from: payer,
to: account,
lamports,
space: space as u64,
owner,
}
.invoke_signed(signers)
} else {
let required_lamports = lamports.saturating_sub(account.lamports());
if required_lamports > 0 {
Transfer {
from: payer,
to: account,
lamports: required_lamports,
}
.invoke_signed(signers)?;
}
Assign { account, owner }.invoke_signed(signers)?;
unsafe { account.resize_unchecked(space) }
}
}