associated_token.rs 2.1 KB

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