OpenZeppelin新版移除ERC721Full.sol,手动导入依赖报错如何解决?
解决方案
导入路径错误修复
- 你当前使用的相对路径
./开头的导入语句,默认读取的是当前合约文件所在目录的文件,你需要先安装对应版本的OpenZeppelin依赖,再修改导入路径为包引用路径:
首先执行安装命令:npm install openzeppelin-solidity@2.5.1,这个是兼容solidity ^0.4.24的最高稳定OpenZeppelin版本
随后将导入语句修改为:import "openzeppelin-solidity/contracts/token/ERC721/ERC721.sol"; import "openzeppelin-solidity/contracts/token/ERC721/ERC721Enumerable.sol"; import "openzeppelin-solidity/contracts/token/ERC721/ERC721Metadata.sol";
ERC721Full废弃说明
OpenZeppelin从3.x版本开始就移除了ERC721Full.sol,这个文件本质就是ERC721、ERC721Enumerable、ERC721Metadata三个实现的聚合合约,你当前同时继承三个合约的写法本身是对的,功能和原来的ERC721Full完全一致,不需要专门找废弃的文件。
现有代码语法错误修正
你提供的代码里把mint函数写在了构造函数内部,属于基础语法错误,同时缺少colors数组和_colorExists映射的定义,修正后的完整可运行代码如下:
pragma solidity ^0.4.24; import "openzeppelin-solidity/contracts/token/ERC721/ERC721.sol"; import "openzeppelin-solidity/contracts/token/ERC721/ERC721Enumerable.sol"; import "openzeppelin-solidity/contracts/token/ERC721/ERC721Metadata.sol"; contract Color is ERC721, ERC721Enumerable, ERC721Metadata { string[] public colors; mapping(string => bool) public _colorExists; constructor(string name, string symbol) ERC721Metadata(name, symbol) public { } // E.G. color = "#FFFFFF" function mint(string memory _color) public { require(!_colorExists[_color]); colors.push(_color); uint _id = colors.length - 1; _mint(msg.sender, _id); _setTokenURI(_id, _color); _colorExists[_color] = true; } }
可选升级方案(适配新Solidity版本)
如果你不想使用过旧的0.4.24版本,可以升级到0.8+版本,使用最新的OpenZeppelin合约库,完整代码如下:
pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; contract Color is ERC721Enumerable, ERC721URIStorage { string[] public colors; mapping(string => bool) public _colorExists; constructor() ERC721("Color NFT", "COLOR") {} function mint(string memory _color) public { require(!_colorExists[_color]); colors.push(_color); uint256 _id = colors.length - 1; _safeMint(msg.sender, _id); _setTokenURI(_id, _color); _colorExists[_color] = true; } // 接口重叠方法重写 function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } }
依赖安装命令为:npm install @openzeppelin/contracts
内容的提问来源于stack exchange,提问作者BrownwhofearsSpice
相关产品推荐
相关产品推荐

