triggr/instructions/
withdraw_from_payer_spl.rs

1pub use crate::state::*;
2use {
3    anchor_lang::{prelude::*, system_program::System},
4    anchor_spl::{associated_token, token, token::Transfer},
5};
6
7#[derive(Accounts)]
8pub struct WithdrawFromPayerSPL<'info> {
9    #[account(mut)]
10    pub signer: Signer<'info>,
11
12    #[account(mut)]
13    pub mint_account: Account<'info, token::Mint>,
14
15    #[account(
16            init_if_needed,
17            payer = signer,
18            associated_token::mint = mint_account,
19            associated_token::authority = payer_pda,
20        )]
21    pub from_ata: Account<'info, token::TokenAccount>,
22
23    #[account(mut, seeds = ["payer".as_bytes(), signer.key().as_ref()], bump)]
24    pub payer_pda: SystemAccount<'info>,
25
26    #[account(
27            init_if_needed,
28            payer = signer,
29            associated_token::mint = mint_account,
30            associated_token::authority = signer,
31        )]
32    pub to_ata: Account<'info, token::TokenAccount>,
33
34    pub system_program: Program<'info, System>,
35    pub token_program: Program<'info, token::Token>,
36    pub associated_token_program: Program<'info, associated_token::AssociatedToken>,
37}
38
39pub fn handler(ctx: Context<WithdrawFromPayerSPL>, amount: u64) -> Result<()> {
40    let payer_seeds = &[
41        "payer".as_bytes(),
42        &ctx.accounts.signer.key().to_bytes()[..],
43        &[ctx.bumps.get("payer_pda").unwrap().clone()],
44    ];
45
46    let payer = &[&payer_seeds[..]];
47
48    let cpi_accounts = Transfer {
49        from: ctx.accounts.from_ata.to_account_info(),
50        to: ctx.accounts.to_ata.to_account_info(),
51        authority: ctx.accounts.payer_pda.to_account_info(),
52    };
53
54    token::transfer(
55        CpiContext::new_with_signer(
56            ctx.accounts.token_program.to_account_info(),
57            cpi_accounts,
58            payer,
59        ),
60        amount,
61    )?;
62
63    Ok(())
64}