pub use crate::state::*;
use {
anchor_lang::{prelude::*, system_program::System},
anchor_spl::{associated_token, token, token::Transfer},
};
#[derive(Accounts)]
pub struct WithdrawFromPayerSPL<'info> {
#[account(mut)]
pub signer: Signer<'info>,
#[account(mut)]
pub mint_account: Account<'info, token::Mint>,
#[account(
init_if_needed,
payer = signer,
associated_token::mint = mint_account,
associated_token::authority = payer_pda,
)]
pub from_ata: Account<'info, token::TokenAccount>,
#[account(mut, seeds = ["payer".as_bytes(), signer.key().as_ref()], bump)]
pub payer_pda: SystemAccount<'info>,
#[account(
init_if_needed,
payer = signer,
associated_token::mint = mint_account,
associated_token::authority = signer,
)]
pub to_ata: Account<'info, token::TokenAccount>,
pub system_program: Program<'info, System>,
pub token_program: Program<'info, token::Token>,
pub associated_token_program: Program<'info, associated_token::AssociatedToken>,
}
pub fn handler(ctx: Context<WithdrawFromPayerSPL>, amount: u64) -> Result<()> {
let payer_seeds = &[
"payer".as_bytes(),
&ctx.accounts.signer.key().to_bytes()[..],
&[ctx.bumps.get("payer_pda").unwrap().clone()],
];
let payer = &[&payer_seeds[..]];
let cpi_accounts = Transfer {
from: ctx.accounts.from_ata.to_account_info(),
to: ctx.accounts.to_ata.to_account_info(),
authority: ctx.accounts.payer_pda.to_account_info(),
};
token::transfer(
CpiContext::new_with_signer(
ctx.accounts.token_program.to_account_info(),
cpi_accounts,
payer,
),
amount,
)?;
Ok(())
}