You need to enable JavaScript to run this app. OpenZeppelin新版移除ERC721Full.sol,手动导入依赖报错如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 07:54:01