triggr-program 0.1.1

Created with Anchor
Documentation
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(())
}