triggr/instructions/
withdraw_from_payer_spl.rs1pub 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}