pub use crate::state::*;
use anchor_lang::{
prelude::*,
system_program::{transfer, System, Transfer},
};
#[derive(Accounts)]
pub struct WithdrawFromPayer<'info> {
#[account(mut)]
authority: Signer<'info>,
#[account(mut, seeds = ["payer".as_bytes(), authority.key().as_ref()], bump)]
payer_pda: SystemAccount<'info>,
system_program: Program<'info, System>,
}
pub fn handler(ctx: Context<WithdrawFromPayer>, lamports: u64) -> Result<()> {
let payer_seeds = &[
"payer".as_bytes(),
&ctx.accounts.authority.key().to_bytes()[..],
&[ctx.bumps.get("payer_pda").unwrap().clone()],
];
let payer = &[&payer_seeds[..]];
let cpi_context = CpiContext::new_with_signer(
ctx.accounts.system_program.to_account_info(),
Transfer {
from: ctx.accounts.payer_pda.to_account_info(),
to: ctx.accounts.authority.to_account_info(),
},
payer,
);
transfer(cpi_context, lamports)?;
msg!("Withdrawl {} lamports", lamports);
Ok(())
}