如何编写Solidity中带数组参数的批量铸造NFT测试脚本?
问题:Solidity批量铸造NFT测试脚本数组传参报错
我写了一个Solidity智能合约的batchMintUniqueNFT函数,但不知道怎么编写测试脚本传递数组参数,运行测试时系统提示"undeclared identifier names, uris, description"错误。
智能合约代码
function batchMintUniqueNFT( string[] memory _names, string[] memory _descriptions, string[] memory _images ) external onlyOwner{ if(_names.length != _descriptions.length || _descriptions.length != _images.length || _images.length != _names.length ){ revert UnbalancedMetadataLength(_names.length, _descriptions.length, _images.length); } uint256 amount = _names.length; if(amount == 0){ revert InsuficientAmount(amount); } uint256 startTokenID = _nextTokenId(); _mint(msg.sender, amount); for(uint256 i = 0; i < amount; i++){ uint256 tokenID = startTokenID + i; string memory metadata = GenerateMetadata(_names[i], _descriptions[i], _images[i]); tokenURIs[tokenID] = metadata; emit MintingSuccess(msg.sender, tokenID, metadata); } successMinted += amount; }
我尝试的错误测试代码
function testbatchmintunique() external { string ; string ; string ; names[0] = "keren 1"; descriptions[0] = "deskripsi 1"; uris[0] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[1] = "keren 2"; descriptions[1] = "deskripsi 2"; uris[1] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[2] = "keren 3"; descriptions[2] = "deskripsi 3"; uris[2] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[3] = "keren 4"; descriptions[3] = "deskripsi 4"; uris[3] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[4] = "keren 5"; descriptions[4] = "deskripsi 5"; uris[4] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[5] = "keren 6"; descriptions[5] = "deskripsi 6"; uris[5] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[6] = "keren 7"; descriptions[6] = "deskripsi 7"; uris[6] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[7] = "keren 8"; descriptions[7] = "deskripsi 8"; uris[7] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[8] = "keren 9"; descriptions[8] = "deskripsi 9"; uris[8] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[9] = "keren 10"; descriptions[9] = "deskripsi 10"; uris[9] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; ketewelnft.batchMintUniqueNFT(names, descriptions, uris); }
解决方法
错误根源
测试代码里的names、descriptions、uris变量没有正确声明数组类型,也没有初始化数组长度,直接赋值自然会触发未定义标识符的错误。
修复方案1:先声明并初始化数组再赋值
function testbatchmintunique() external { // 声明长度为10的字符串数组并初始化 string[] memory names = new string[](10); string[] memory descriptions = new string[](10); string[] memory uris = new string[](10); // 逐个赋值数组元素 names[0] = "keren 1"; descriptions[0] = "deskripsi 1"; uris[0] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[1] = "keren 2"; descriptions[1] = "deskripsi 2"; uris[1] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[2] = "keren 3"; descriptions[2] = "deskripsi 3"; uris[2] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[3] = "keren 4"; descriptions[3] = "deskripsi 4"; uris[3] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[4] = "keren 5"; descriptions[4] = "deskripsi 5"; uris[4] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[5] = "keren 6"; descriptions[5] = "deskripsi 6"; uris[5] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[6] = "keren 7"; descriptions[6] = "deskripsi 7"; uris[6] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[7] = "keren 8"; descriptions[7] = "deskripsi 8"; uris[7] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[8] = "keren 9"; descriptions[8] = "deskripsi 9"; uris[8] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; names[9] = "keren 10"; descriptions[9] = "deskripsi 10"; uris[9] = "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha"; // 调用合约函数,注意第三个参数对应合约的_images ketewelnft.batchMintUniqueNFT(names, descriptions, uris); }
修复方案2:直接使用数组字面量传参(更简洁)
function testbatchmintunique() external { ketewelnft.batchMintUniqueNFT( // 第一个参数:names数组 ["keren 1", "keren 2", "keren 3", "keren 4", "keren 5", "keren 6", "keren 7", "keren 8", "keren 9", "keren 10"], // 第二个参数:descriptions数组 ["deskripsi 1", "deskripsi 2", "deskripsi 3", "deskripsi 4", "deskripsi 5", "deskripsi 6", "deskripsi 7", "deskripsi 8", "deskripsi 9", "deskripsi 10"], // 第三个参数:images数组(对应合约的_images) [ "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha", "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha", "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha", "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha", "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha", "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha", "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha", "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha", "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha", "https://ipfs.io/ipfs/bafkreihqaswfkli5plhmicnmqq6zqgci32tk26jxk7lix42ktkowc62cha" ] ); }
额外注意事项
- 确保测试调用者是合约的
owner,否则会触发onlyOwner修饰符的权限检查失败。 - 三个数组的长度必须一致,否则合约会触发
UnbalancedMetadataLength回滚。
内容的提问来源于stack exchange,提问作者Trahwidhi Oxtan
相关产品推荐
相关产品推荐

