use solana_program::{account_info::AccountInfo, program_error::ProgramError};
pub trait LamportTransfer<'a, 'info> {
fn send(&'a self, lamports: u64, to: &'a AccountInfo<'info>);
fn collect(&'a self, lamports: u64, from: &'a AccountInfo<'info>) -> Result<(), ProgramError>;
}
impl<'a, 'info> LamportTransfer<'a, 'info> for AccountInfo<'info> {
#[inline(always)]
fn send(&'a self, lamports: u64, to: &'a AccountInfo<'info>) {
**self.lamports.borrow_mut() -= lamports;
**to.lamports.borrow_mut() += lamports;
}
#[inline(always)]
fn collect(&'a self, lamports: u64, from: &'a AccountInfo<'info>) -> Result<(), ProgramError> {
solana_program::program::invoke(
&solana_program::system_instruction::transfer(from.key, self.key, lamports),
&[from.clone(), self.clone()],
)
}
}