如何在Solana中使用@solana/web3.js移除自定义代币的铸造权限
SPL代币固定总供应量与移除铸造权限操作方法
SPL代币没有内置的总供应量配置项,总供应量的限制完全通过铸造权限(Mint Authority)控制:只要销毁铸造权限,就没有任何地址可以增发代币,总供应量将永久固定为当前已铸造的数量。
前置依赖
你需要提前安装@solana/web3.js和@solana/spl-token两个依赖包,且持有当前代币铸造权限对应的钱包私钥(也就是你通过web3.Keypair.generate()生成的自定义钱包)。
场景1:创建代币时直接固定总供应量
操作步骤如下:
- 生成代币Mint实例,配置初始铸造权限为你的自定义钱包
- 创建你的钱包对应的关联代币账户,用于接收全量铸造的代币
- 将你设定的总供应量一次性全部铸造到上述关联代币账户
- 调用权限修改接口,将铸造权限设置为
null,完成总量固定
完整代码示例:
import { Keypair, Connection, clusterApiUrl } from "@solana/web3.js"; import { createMint, getOrCreateAssociatedTokenAccount, mintTo, setAuthority, AuthorityType } from "@solana/spl-token"; // 你的自定义钱包实例,可直接用generate生成或者导入私钥恢复 const payerWallet = Keypair.generate(); // 连接链节点,主网换为mainnet-beta const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); // 1. 创建代币Mint const tokenMint = await createMint( connection, payerWallet, payerWallet.publicKey, // 初始铸造权限 null, // 不需要冻结权限可直接设为null 9 // 代币小数位数 ); // 2. 获取你的钱包对应的关联代币账户 const ownerTokenAccount = await getOrCreateAssociatedTokenAccount( connection, payerWallet, tokenMint, payerWallet.publicKey ); // 3. 铸造全量总供应量到你的账户,示例为发行1000万枚,对应数量为10000000 * 10^9 const totalSupply = 10000000 * Math.pow(10, 9); await mintTo( connection, payerWallet, tokenMint, ownerTokenAccount.address, payerWallet, totalSupply ); // 4. 移除铸造权限,永久固定总供应量 await setAuthority( connection, payerWallet, tokenMint, payerWallet, AuthorityType.MintTokens, null );
场景2:已发行代币移除铸造权限
如果你已经完成代币创建和铸造,只需要固定当前总量不再增发,直接执行上述代码的第4步setAuthority操作即可,无需重复创建和铸造代币。
注意事项
- 操作不可逆:一旦将铸造权限设置为
null,没有任何人可以恢复该权限,总供应量将永久固定,操作前请确认已经完成所有需要的代币铸造操作 - 只有当前持有铸造权限的钱包签名才能修改权限,丢失对应私钥后将无法执行该操作
内容的提问来源于stack exchange,提问作者Rahul Saxena
相关产品推荐
相关产品推荐

