Authorities
SPL mints carry two optional authorities: mint authority (inflate supply) and freeze authority (freeze token accounts). Revoking authorities is a common immutability and trust signal for launched tokens.
Search across all documentation pages
SPL mints carry two optional authorities: mint authority (inflate supply) and freeze authority (freeze token accounts). Revoking authorities is a common immutability and trust signal for launched tokens.
spl-token display <MINT>
spl-token authorize <MINT> mint --disable
spl-token authorize <MINT> freeze --disableuse anchor_spl::token::spl_token::instruction::AuthorityType;
use anchor_spl::token::{self, SetAuthority};
token::set_authority(cpi_ctx, AuthorityType::MintTokens, None)?;When to reach for this:
MINT=<YOUR_MINT>
# Inspect current authorities
spl-token display "$MINT"
# Revoke mint authority permanently
spl-token authorize "$MINT" mint --disable
# Revoke freeze authority (users cannot be frozen)
spl-token authorize "$MINT" freeze --disable
spl-token display "$MINT"use anchor_lang::prelude::*;
use anchor_lang::solana_program::program_option::COption;
use anchor_spl::token::spl_token::instruction::AuthorityType;
use anchor_spl::token::{self, Mint, SetAuthority, Token};
#[derive(Accounts)]
pub struct RevokeMintAuthority<'info> {
#[account(mut, mint::authority = current_authority)]
pub mint: Account<'info, Mint>,
pub current_authority: Signer<'info>,
pub token_program: Program<'info, Token>,
}
pub fn revoke_mint_authority(ctx: Context<RevokeMintAuthority>) -> Result<()> {
// `mint_authority` is a COption, not an Option - compare against COption::Some.
require!(
ctx.accounts.mint.mint_authority == COption::Some(ctx.accounts.current_authority.key()),
ErrorCode::NotMintAuthority
);
let cpi = CpiContext::new(
ctx.accounts.token_program.to_account_info(),
SetAuthority {
current_authority: ctx.accounts.current_authority.to_account_info(),
account_or_mint: ctx.accounts.mint.to_account_info(),
},
);
token::set_authority(cpi, AuthorityType::MintTokens, None)?;
Ok(())
}
#[error_code]
pub enum ErrorCode {
NotMintAuthority,
}What this demonstrates:
authorize --disable sets authority field to Noneset_authority CPI with current authority signermint_authority: COption<Pubkey> and freeze_authority: COption<Pubkey>MintTo; freeze authority for FreezeAccount / ThawAccount| Authority | Scope | Revoked means |
|---|---|---|
| Mint tokens | Mint account | No inflation ever |
| Freeze account | Mint account | Cannot freeze holder accounts |
| Account owner | Token account | Cannot transfer (N/A - ownership transfer is different) |
| Close account | Token account | Cannot close to reclaim rent |
// Always log authority state changes for indexers
emit!(AuthorityRevoked { mint: mint.key(), kind: "mint" });spl-token display fields in explorers.| Alternative | Use When | Don't Use When |
|---|---|---|
| Multisig mint authority | DAO-controlled inflation | Simple fixed-supply launch |
| PDA mint authority | Programmatic emissions | Human-operated treasury only |
| Token-2022 permanent delegate | Forced policy enforcement | Standard fungible token |
Pubkey allowed to inflate supply via MintTo until set to None.
Pubkey allowed to freeze/thaw token accounts for that mint, blocking transfers while frozen.
No. Setting None is permanent for that authority slot.
Yes for most community tokens unless freeze is a documented compliance feature.
Yes. Program signs emissions with PDA seeds.
Current authority signer for that authority type only.
Separate instruction path - mint accounts persist until explicitly closed where supported.
Read mint account on-chain or spl-token display - never trust UI labels alone.
Yes, per-account freeze calls - reason many projects revoke freeze authority.
Same mint/freeze model plus extension-specific authorities (e.g., transfer fee config).
Can be set to None at init for pre-fixed supply minted in same transaction batch.
set_authority to multisig pubkey while current authority signs.
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.
Reviewed by Chris St. John·Last updated Jul 16, 2026