Solidity调用mintToken报string无法转换为bytes memory[]类型错误
错误信息
Invalid type for argument in function call. Invalid implicit conversion from string storage ref to bytes memory[] memory requested.
问题根因
HederaTokenService.mintToken 函数要求的第三个入参metadata类型为bytes[] memory(字节类型的内存动态数组),用于批量传入NFT铸造时每个代币的元数据。你直接传入单个string类型的uri变量,不存在Solidity默认支持的隐式类型转换,因此触发报错。
结合函数定义补充参数使用规则:
- 铸造同质化代币(FT)时:仅使用
amount参数传入铸造数量,metadata传入空数组即可 - 铸造非同质化代币(NFT)时:
amount参数必须传0,metadata数组长度等于本次铸造的NFT数量,数组每个元素对应一个NFT的元数据字节内容,单个元数据长度不能超过100字节
另外原始代码还存在基础语法问题:状态变量定义末尾缺少分号、调用函数时未接收全部返回值、函数体未闭合。
修复后代码
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; import "./hip-206/HederaTokenService.sol"; import "./hip-206/HederaResponseCodes.sol"; contract Mint is HederaTokenService{ address tokenAddress; string public uri = "abc"; /** * 铸造同质化代币示例 * @param _amount 要铸造的FT数量 */ function mintFungible(uint64 _amount) external { bytes[] memory emptyMetadata = new bytes[](0); ( int256 response, uint64 newTotalSupply, int64[] memory serialNumbers ) = HederaTokenService.mintToken(tokenAddress, _amount, emptyMetadata); if (response != HederaResponseCodes.SUCCESS) { revert("Mint Failed"); } } /** * 铸造非同质化代币示例 * 单次铸造1个NFT,元数据使用合约中存储的uri */ function mintNonFungible() external { bytes[] memory nftMetadata = new bytes[](1); // string转bytes后存入元数据数组 nftMetadata[0] = bytes(uri); ( int256 response, uint64 newTotalSupply, int64[] memory serialNumbers ) = HederaTokenService.mintToken(tokenAddress, 0, nftMetadata); if (response != HederaResponseCodes.SUCCESS) { revert("Mint Failed"); } } }
关键转换逻辑说明
string类型转bytes类型直接使用Solidity内置转换方法bytes(字符串变量)即可,转换后得到的bytes值按顺序放入bytes[]数组,就能满足mintToken函数的参数类型要求。
如果需要一次铸造多个NFT,只需要初始化对应长度的bytes[]数组,给每个索引位置赋值对应NFT的元数据即可。
内容的提问来源于stack exchange,提问作者Yasuo
相关产品推荐
相关产品推荐

