You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:09:01