Skip to main content

anchor_spl/
associated_token.rs

1// Avoiding AccountInfo deprecated msg in anchor context
2#![allow(deprecated)]
3pub use ::spl_associated_token_account_interface::{
4    self as spl_associated_token_account,
5    address::{get_associated_token_address, get_associated_token_address_with_program_id},
6    program::ID,
7};
8use anchor_lang::{
9    context::CpiContext,
10    solana_program::{account_info::AccountInfo, pubkey::Pubkey},
11    Accounts, Result,
12};
13
14pub fn create<'info>(ctx: CpiContext<'_, '_, '_, 'info, Create<'info>>) -> Result<()> {
15    let ix = spl_associated_token_account::instruction::create_associated_token_account(
16        ctx.accounts.payer.key,
17        ctx.accounts.authority.key,
18        ctx.accounts.mint.key,
19        ctx.accounts.token_program.key,
20    );
21    anchor_lang::solana_program::program::invoke_signed(
22        &ix,
23        &[
24            ctx.accounts.payer,
25            ctx.accounts.associated_token,
26            ctx.accounts.authority,
27            ctx.accounts.mint,
28            ctx.accounts.system_program,
29            ctx.accounts.token_program,
30        ],
31        ctx.signer_seeds,
32    )
33    .map_err(Into::into)
34}
35
36pub fn create_idempotent<'info>(
37    ctx: CpiContext<'_, '_, '_, 'info, CreateIdempotent<'info>>,
38) -> Result<()> {
39    let ix = spl_associated_token_account::instruction::create_associated_token_account_idempotent(
40        ctx.accounts.payer.key,
41        ctx.accounts.authority.key,
42        ctx.accounts.mint.key,
43        ctx.accounts.token_program.key,
44    );
45    anchor_lang::solana_program::program::invoke_signed(
46        &ix,
47        &[
48            ctx.accounts.payer,
49            ctx.accounts.associated_token,
50            ctx.accounts.authority,
51            ctx.accounts.mint,
52            ctx.accounts.system_program,
53            ctx.accounts.token_program,
54        ],
55        ctx.signer_seeds,
56    )
57    .map_err(Into::into)
58}
59
60#[derive(Accounts)]
61pub struct Create<'info> {
62    pub payer: AccountInfo<'info>,
63    pub associated_token: AccountInfo<'info>,
64    pub authority: AccountInfo<'info>,
65    pub mint: AccountInfo<'info>,
66    pub system_program: AccountInfo<'info>,
67    pub token_program: AccountInfo<'info>,
68}
69
70type CreateIdempotent<'info> = Create<'info>;
71
72#[derive(Clone)]
73pub struct AssociatedToken;
74
75impl anchor_lang::Id for AssociatedToken {
76    fn id() -> Pubkey {
77        ID
78    }
79}