Solana web3.js初始化Mint时设置权限为null报toBuffer错误如何解决
报错原因
TypeError: Cannot read property 'toBuffer' of null报错是因为@solana/spl-token库的createInitMintInstruction接口不支持直接传入null作为权限参数,接口内部会自动对传入的权限公钥调用toBuffer方法做序列化处理,null没有该方法就会抛出异常。
解决方案
要在初始化时就永久禁用mint权限和freeze权限,不需要后续二次修改,只需将两个权限参数传入无对应私钥的公钥即可,业界通用方案是传入PublicKey.default(即地址为11111111111111111111111111111111的系统默认公钥,不存在对应私钥,权限等效于永久废弃)。
正确代码示例:
首先确保导入PublicKey依赖:
import { PublicKey } from '@solana/web3.js';
修改初始化指令调用代码:
Token.createInitMintInstruction( TOKEN_PROGRAM_ID, // 程序ID mint.publicKey, // 代币Mint地址 decimals, // 代币精度 PublicKey.default, // 永久禁用mint权限 PublicKey.default, // 永久禁用freeze权限 )
- 该方式初始化的Mint,两个权限都指向无主地址,没有人可以执行增发代币、冻结代币账户的操作,和你预期的设置为
null的效果完全一致,不需要后续再调用setAuthority指令单独更新。 - 如果你使用的是
@solana/spl-token2.x及以上版本,对应的createInitializeMintInstruction方法逻辑完全相同,同样传入PublicKey.default作为权限参数即可。
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

