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权限,已经解除,如下图: