Hedera铸造NFT报MAX_NFTS_IN_PRICE_REGIME_HAVE_BEEN_MINTED错误求解
报错原因
这个报错和你设置的maxSupply=250没有关系,触发根源是两个核心问题:
- 元数据传参格式错误,导致SDK误判单批次铸造的NFT数量
- 交易费未匹配对应铸造数量的费率档位
具体细节:
- 元数据参数写法不符合接口要求
你代码中把CID定义为字符串数组,但传给Buffer.from()时直接传入了整个数组而非数组内的CID字符串,会生成异常的乱码元数据。
绝大多数人触发这个报错的直接原因是漏写了setMetadata()参数外层的数组包裹:setMetadata()要求传入值为元数据数组,数组的每个元素对应1个NFT的元数据字节(Buffer/Uint8Array类型),数组长度等于本次要铸造的NFT总数。如果你直接把单个NFT的Buffer实例传给setMetadata(),由于Buffer本身是可迭代的字节数组,SDK会把每个字节识别为1个独立NFT的元数据,判定你要铸造的NFT数量等于元数据的字节长度。普通IPFS CID转成Buffer有34~46字节,若传入更长的元数据,很容易超过默认档位允许的单批次铸造上限,直接触发报错。 - 未显式设置足够的交易费阈值
Hedera网络对NFT铸造采用分档计费规则:默认交易配置下,基础费率档位单批次最多允许铸造10个NFT,铸造更多数量需要支付更高的交易费。SDK默认的最大交易费阈值较低,无法覆盖更高档位的费用,即使你实际铸造数量没有超过自己设置的maxSupply,也会触发该错误。
修复方案
按照以下步骤调整代码即可:
- 修正元数据传参逻辑
- 单批次铸造1个NFT时,CID直接使用字符串类型,转成Buffer后包裹在数组中传入:
// CID直接定义为字符串,不需要包数组 const CID = "**********************************************"; let mintTx = await new TokenMintTransaction() .setTokenId(tokenId) // 必须传入数组,每个元素对应1个NFT的元数据Buffer .setMetadata([Buffer.from(CID)])
- 单批次铸造多个NFT时,将每个CID字符串单独转成Buffer,组成元数据数组后再传入:
const CIDList = ["cid1", "cid2", ..."cidN"]; // 逐个转成Buffer,组成符合要求的元数据数组 const metadataArr = CIDList.map(cid => Buffer.from(cid)); let mintTx = await new TokenMintTransaction() .setTokenId(tokenId) .setMetadata(metadataArr)
- 显式设置足够的交易费
在freezeWith(client)调用前,通过setMaxTransactionFee设置足够的最大交易费阈值,单批次铸造250个NFT设置2~5Hbar即可完全覆盖费用:
let mintTx = await new TokenMintTransaction() .setTokenId(tokenId) .setMetadata([Buffer.from(CID)]) // 显式设置最大交易费,匹配对应铸造数量的费率档位 .setMaxTransactionFee(new Hbar(3)) .freezeWith(client);
如果调整后仍触发报错,先检查当前使用的tokenId是否为之前测试中已经铸满NFT的旧代币,重新创建NFT获取新的tokenId即可。
内容的提问来源于stack exchange,提问作者Nal Luksic
相关产品推荐
相关产品推荐

