Jacky Gu

Solana开发笔记: Token2022 - 丢弃mint权限

01 Jan 2025 Share to

Token2022 - 丢弃mint权限

创建指令

instructions目录下创建revoke_mint_authority.rs,并粘贴以下代码:

use anchor_lang::prelude::*;
use crate::constants::MINT_SEEDS;
use crate::errors::ErrorCode;
use anchor_spl::token_2022::spl_token_2022;
use anchor_spl::{token_2022::{set_authority, SetAuthority, spl_token_2022::instruction::AuthorityType}, token_interface::{Mint, Token2022}};

#[derive(Accounts)]
#[instruction(token_name: String, token_symbol: String)]
pub struct RevokeMintAuthority<'info> {
  /// CHECK: Must be same as mint
  #[account(mut)]
  pub metadata: UncheckedAccount<'info>,
  #[account(
    seeds = [MINT_SEEDS.as_bytes(), token_name.as_bytes(), token_symbol.as_bytes()],
    bump,
  )]
  pub mint: Box<InterfaceAccount<'info, Mint>>,
  #[account(mut)]
  pub payer: Signer<'info>,
  pub system_program: Program<'info, System>,
  pub token_program: Program<'info, Token2022>,
}

impl<'info> RevokeMintAuthority<'info> {
  pub fn revoke_mint_authority(ctx: Context<RevokeMintAuthority>, token_name: String, token_symbol: String) -> Result<()> {
    require!(spl_token_2022::ID == ctx.accounts.token_program.key(), ErrorCode::WrongTokenProgram);
    let seeds = &[MINT_SEEDS.as_bytes(), token_name.as_bytes(), token_symbol.as_bytes(), &[ctx.bumps.mint]];
    let signer = [&seeds[..]];

    // Revoke mint authority
    set_authority(
      CpiContext::new_with_signer(
          ctx.accounts.token_program.to_account_info(),
          SetAuthority {
              current_authority: ctx.accounts.mint.to_account_info(),
              account_or_mint: ctx.accounts.mint.to_account_info(),
          },
          &signer,
      ),
      AuthorityType::MintTokens,
      None,
    )?;
    Ok(())
  }
}

在lib.rs中调用上面的指令

pub fn revoke_mint_authority(ctx: Context<RevokeMintAuthority>, token_name: String, token_symbol: String) -> Result<()> {
    RevokeMintAuthority::revoke_mint_authority(ctx, token_name, token_symbol)
}

编译部署

anchor build && anchor deploy

编写测试代码

  it("Revoke mint authority", async () => {
    const context = {
      mint: mintAccount,
      metadata: mintAccount,
      payer: deployerAccount.publicKey,
      tokenProgram: TOKEN_2022_PROGRAM_ID,
    }
    const tx = await program.methods.revokeMintAuthority(metadataParams.name, metadataParams.symbol).accounts(context).signers([deployerAccount]).rpc();
    console.log("Revoke mint authority tx:", tx); 
  })

检查执行结果

执行后,返回交易hash,把hash输入区块链浏览器,查看交易是否正常。

在查询代币的mint权限,已经解除,如下图: