123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529 |
- use anchor_lang::solana_program::account_info::AccountInfo;
- use anchor_lang::solana_program::pubkey::Pubkey;
- use anchor_lang::{context::CpiContext, Accounts};
- use anchor_lang::{solana_program, Result};
- pub use spl_token_2022;
- pub use spl_token_2022::ID;
- #[deprecated(
- since = "0.28.0",
- note = "please use `transfer_checked` or `transfer_checked_with_fee` instead"
- )]
- pub fn transfer<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, Transfer<'info>>,
- amount: u64,
- ) -> Result<()> {
- #[allow(deprecated)]
- let ix = spl_token_2022::instruction::transfer(
- ctx.program.key,
- ctx.accounts.from.key,
- ctx.accounts.to.key,
- ctx.accounts.authority.key,
- &[],
- amount,
- )?;
- solana_program::program::invoke_signed(
- &ix,
- &[ctx.accounts.from, ctx.accounts.to, ctx.accounts.authority],
- ctx.signer_seeds,
- )
- .map_err(Into::into)
- }
- pub fn transfer_checked<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, TransferChecked<'info>>,
- amount: u64,
- decimals: u8,
- ) -> Result<()> {
- let ix = spl_token_2022::instruction::transfer_checked(
- ctx.program.key,
- ctx.accounts.from.key,
- ctx.accounts.mint.key,
- ctx.accounts.to.key,
- ctx.accounts.authority.key,
- &[],
- amount,
- decimals,
- )?;
- solana_program::program::invoke_signed(
- &ix,
- &[
- ctx.accounts.from,
- ctx.accounts.mint,
- ctx.accounts.to,
- ctx.accounts.authority,
- ],
- ctx.signer_seeds,
- )
- .map_err(Into::into)
- }
- pub fn mint_to<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, MintTo<'info>>,
- amount: u64,
- ) -> Result<()> {
- let ix = spl_token_2022::instruction::mint_to(
- ctx.program.key,
- ctx.accounts.mint.key,
- ctx.accounts.to.key,
- ctx.accounts.authority.key,
- &[],
- amount,
- )?;
- solana_program::program::invoke_signed(
- &ix,
- &[ctx.accounts.to, ctx.accounts.mint, ctx.accounts.authority],
- ctx.signer_seeds,
- )
- .map_err(Into::into)
- }
- pub fn burn<'info>(ctx: CpiContext<'_, '_, '_, 'info, Burn<'info>>, amount: u64) -> Result<()> {
- let ix = spl_token_2022::instruction::burn(
- ctx.program.key,
- ctx.accounts.from.key,
- ctx.accounts.mint.key,
- ctx.accounts.authority.key,
- &[],
- amount,
- )?;
- solana_program::program::invoke_signed(
- &ix,
- &[ctx.accounts.from, ctx.accounts.mint, ctx.accounts.authority],
- ctx.signer_seeds,
- )
- .map_err(Into::into)
- }
- pub fn approve<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, Approve<'info>>,
- amount: u64,
- ) -> Result<()> {
- let ix = spl_token_2022::instruction::approve(
- ctx.program.key,
- ctx.accounts.to.key,
- ctx.accounts.delegate.key,
- ctx.accounts.authority.key,
- &[],
- amount,
- )?;
- solana_program::program::invoke_signed(
- &ix,
- &[
- ctx.accounts.to,
- ctx.accounts.delegate,
- ctx.accounts.authority,
- ],
- ctx.signer_seeds,
- )
- .map_err(Into::into)
- }
- pub fn revoke<'info>(ctx: CpiContext<'_, '_, '_, 'info, Revoke<'info>>) -> Result<()> {
- let ix = spl_token_2022::instruction::revoke(
- ctx.program.key,
- ctx.accounts.source.key,
- ctx.accounts.authority.key,
- &[],
- )?;
- solana_program::program::invoke_signed(
- &ix,
- &[ctx.accounts.source, ctx.accounts.authority],
- ctx.signer_seeds,
- )
- .map_err(Into::into)
- }
- pub fn initialize_account<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, InitializeAccount<'info>>,
- ) -> Result<()> {
- let ix = spl_token_2022::instruction::initialize_account(
- ctx.program.key,
- ctx.accounts.account.key,
- ctx.accounts.mint.key,
- ctx.accounts.authority.key,
- )?;
- solana_program::program::invoke(
- &ix,
- &[
- ctx.accounts.account,
- ctx.accounts.mint,
- ctx.accounts.authority,
- ctx.accounts.rent,
- ],
- )
- .map_err(Into::into)
- }
- pub fn initialize_account3<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, InitializeAccount3<'info>>,
- ) -> Result<()> {
- let ix = spl_token_2022::instruction::initialize_account3(
- ctx.program.key,
- ctx.accounts.account.key,
- ctx.accounts.mint.key,
- ctx.accounts.authority.key,
- )?;
- solana_program::program::invoke(&ix, &[ctx.accounts.account, ctx.accounts.mint])
- .map_err(Into::into)
- }
- pub fn close_account<'info>(ctx: CpiContext<'_, '_, '_, 'info, CloseAccount<'info>>) -> Result<()> {
- let ix = spl_token_2022::instruction::close_account(
- ctx.program.key,
- ctx.accounts.account.key,
- ctx.accounts.destination.key,
- ctx.accounts.authority.key,
- &[], // TODO: support multisig
- )?;
- solana_program::program::invoke_signed(
- &ix,
- &[
- ctx.accounts.account,
- ctx.accounts.destination,
- ctx.accounts.authority,
- ],
- ctx.signer_seeds,
- )
- .map_err(Into::into)
- }
- pub fn freeze_account<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, FreezeAccount<'info>>,
- ) -> Result<()> {
- let ix = spl_token_2022::instruction::freeze_account(
- ctx.program.key,
- ctx.accounts.account.key,
- ctx.accounts.mint.key,
- ctx.accounts.authority.key,
- &[], // TODO: Support multisig signers.
- )?;
- solana_program::program::invoke_signed(
- &ix,
- &[
- ctx.accounts.account,
- ctx.accounts.mint,
- ctx.accounts.authority,
- ],
- ctx.signer_seeds,
- )
- .map_err(Into::into)
- }
- pub fn thaw_account<'info>(ctx: CpiContext<'_, '_, '_, 'info, ThawAccount<'info>>) -> Result<()> {
- let ix = spl_token_2022::instruction::thaw_account(
- ctx.program.key,
- ctx.accounts.account.key,
- ctx.accounts.mint.key,
- ctx.accounts.authority.key,
- &[], // TODO: Support multisig signers.
- )?;
- solana_program::program::invoke_signed(
- &ix,
- &[
- ctx.accounts.account,
- ctx.accounts.mint,
- ctx.accounts.authority,
- ],
- ctx.signer_seeds,
- )
- .map_err(Into::into)
- }
- pub fn initialize_mint<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, InitializeMint<'info>>,
- decimals: u8,
- authority: &Pubkey,
- freeze_authority: Option<&Pubkey>,
- ) -> Result<()> {
- let ix = spl_token_2022::instruction::initialize_mint(
- ctx.program.key,
- ctx.accounts.mint.key,
- authority,
- freeze_authority,
- decimals,
- )?;
- solana_program::program::invoke(&ix, &[ctx.accounts.mint, ctx.accounts.rent])
- .map_err(Into::into)
- }
- pub fn initialize_mint2<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, InitializeMint2<'info>>,
- decimals: u8,
- authority: &Pubkey,
- freeze_authority: Option<&Pubkey>,
- ) -> Result<()> {
- let ix = spl_token_2022::instruction::initialize_mint2(
- ctx.program.key,
- ctx.accounts.mint.key,
- authority,
- freeze_authority,
- decimals,
- )?;
- solana_program::program::invoke(&ix, &[ctx.accounts.mint]).map_err(Into::into)
- }
- pub fn set_authority<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, SetAuthority<'info>>,
- authority_type: spl_token_2022::instruction::AuthorityType,
- new_authority: Option<Pubkey>,
- ) -> Result<()> {
- let mut spl_new_authority: Option<&Pubkey> = None;
- if new_authority.is_some() {
- spl_new_authority = new_authority.as_ref()
- }
- let ix = spl_token_2022::instruction::set_authority(
- ctx.program.key,
- ctx.accounts.account_or_mint.key,
- spl_new_authority,
- authority_type,
- ctx.accounts.current_authority.key,
- &[], // TODO: Support multisig signers.
- )?;
- solana_program::program::invoke_signed(
- &ix,
- &[ctx.accounts.account_or_mint, ctx.accounts.current_authority],
- ctx.signer_seeds,
- )
- .map_err(Into::into)
- }
- pub fn sync_native<'info>(ctx: CpiContext<'_, '_, '_, 'info, SyncNative<'info>>) -> Result<()> {
- let ix = spl_token_2022::instruction::sync_native(ctx.program.key, ctx.accounts.account.key)?;
- solana_program::program::invoke(&ix, &[ctx.accounts.account]).map_err(Into::into)
- }
- pub fn get_account_data_size<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, GetAccountDataSize<'info>>,
- extension_types: &[spl_token_2022::extension::ExtensionType],
- ) -> Result<u64> {
- let ix = spl_token_2022::instruction::get_account_data_size(
- ctx.program.key,
- ctx.accounts.mint.key,
- extension_types,
- )?;
- solana_program::program::invoke(&ix, &[ctx.accounts.mint])?;
- solana_program::program::get_return_data()
- .ok_or(solana_program::program_error::ProgramError::InvalidInstructionData)
- .and_then(|(key, data)| {
- if key != *ctx.program.key {
- Err(solana_program::program_error::ProgramError::IncorrectProgramId)
- } else {
- data.try_into().map(u64::from_le_bytes).map_err(|_| {
- solana_program::program_error::ProgramError::InvalidInstructionData
- })
- }
- })
- .map_err(Into::into)
- }
- pub fn initialize_mint_close_authority<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, InitializeMintCloseAuthority<'info>>,
- close_authority: Option<&Pubkey>,
- ) -> Result<()> {
- let ix = spl_token_2022::instruction::initialize_mint_close_authority(
- ctx.program.key,
- ctx.accounts.mint.key,
- close_authority,
- )?;
- solana_program::program::invoke(&ix, &[ctx.accounts.mint]).map_err(Into::into)
- }
- pub fn initialize_immutable_owner<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, InitializeImmutableOwner<'info>>,
- ) -> Result<()> {
- let ix = spl_token_2022::instruction::initialize_immutable_owner(
- ctx.program.key,
- ctx.accounts.account.key,
- )?;
- solana_program::program::invoke(&ix, &[ctx.accounts.account]).map_err(Into::into)
- }
- pub fn amount_to_ui_amount<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, AmountToUiAmount<'info>>,
- amount: u64,
- ) -> Result<String> {
- let ix = spl_token_2022::instruction::amount_to_ui_amount(
- ctx.program.key,
- ctx.accounts.account.key,
- amount,
- )?;
- solana_program::program::invoke(&ix, &[ctx.accounts.account])?;
- solana_program::program::get_return_data()
- .ok_or(solana_program::program_error::ProgramError::InvalidInstructionData)
- .and_then(|(key, data)| {
- if key != *ctx.program.key {
- Err(solana_program::program_error::ProgramError::IncorrectProgramId)
- } else {
- String::from_utf8(data).map_err(|_| {
- solana_program::program_error::ProgramError::InvalidInstructionData
- })
- }
- })
- .map_err(Into::into)
- }
- pub fn ui_amount_to_amount<'info>(
- ctx: CpiContext<'_, '_, '_, 'info, UiAmountToAmount<'info>>,
- ui_amount: &str,
- ) -> Result<u64> {
- let ix = spl_token_2022::instruction::ui_amount_to_amount(
- ctx.program.key,
- ctx.accounts.account.key,
- ui_amount,
- )?;
- solana_program::program::invoke(&ix, &[ctx.accounts.account])?;
- solana_program::program::get_return_data()
- .ok_or(solana_program::program_error::ProgramError::InvalidInstructionData)
- .and_then(|(key, data)| {
- if key != *ctx.program.key {
- Err(solana_program::program_error::ProgramError::IncorrectProgramId)
- } else {
- data.try_into().map(u64::from_le_bytes).map_err(|_| {
- solana_program::program_error::ProgramError::InvalidInstructionData
- })
- }
- })
- .map_err(Into::into)
- }
- #[derive(Accounts)]
- pub struct Transfer<'info> {
- pub from: AccountInfo<'info>,
- pub to: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct TransferChecked<'info> {
- pub from: AccountInfo<'info>,
- pub mint: AccountInfo<'info>,
- pub to: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct MintTo<'info> {
- pub mint: AccountInfo<'info>,
- pub to: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct Burn<'info> {
- pub mint: AccountInfo<'info>,
- pub from: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct Approve<'info> {
- pub to: AccountInfo<'info>,
- pub delegate: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct Revoke<'info> {
- pub source: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct InitializeAccount<'info> {
- pub account: AccountInfo<'info>,
- pub mint: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- pub rent: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct InitializeAccount3<'info> {
- pub account: AccountInfo<'info>,
- pub mint: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct CloseAccount<'info> {
- pub account: AccountInfo<'info>,
- pub destination: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct FreezeAccount<'info> {
- pub account: AccountInfo<'info>,
- pub mint: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct ThawAccount<'info> {
- pub account: AccountInfo<'info>,
- pub mint: AccountInfo<'info>,
- pub authority: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct InitializeMint<'info> {
- pub mint: AccountInfo<'info>,
- pub rent: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct InitializeMint2<'info> {
- pub mint: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct SetAuthority<'info> {
- pub current_authority: AccountInfo<'info>,
- pub account_or_mint: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct SyncNative<'info> {
- pub account: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct GetAccountDataSize<'info> {
- pub mint: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct InitializeMintCloseAuthority<'info> {
- pub mint: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct InitializeImmutableOwner<'info> {
- pub account: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct AmountToUiAmount<'info> {
- pub account: AccountInfo<'info>,
- }
- #[derive(Accounts)]
- pub struct UiAmountToAmount<'info> {
- pub account: AccountInfo<'info>,
- }
- #[derive(Clone)]
- pub struct Token2022;
- impl anchor_lang::Id for Token2022 {
- fn id() -> Pubkey {
- ID
- }
- }
- // Field parsers to save compute. All account validation is assumed to be done
- // outside of these methods.
- pub use crate::token::accessor;
|