已在Openzeppelin中为Context.sol声明标识符



我正在做一个NFT项目。我的合同文件夹中有我的NFT文件,它将从nodemodule中的openzeppelin文件导入。然而,编译器似乎暗示Context.sol已经在我的文件中声明了。我检查了Context.sol文件,在给定的文件夹中似乎有很多,我该如何解决这个问题。

Error: DeclarationError: Identifier already declared.
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
^-------------------------------------------------------^
@openzeppelin/contracts/utils/Context.sol:15:2: The previous declaration is here
:
contract Context {
^ (Relevant source part starts here and spans across multiple lines)

NFT.sol

pragma solidity ^0.5.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract NFT is ERC721, Ownable {
address payable public _owner;
mapping (uint => bool) public sold;
mapping (uint => uint) public price;
event Purchase(address owner, uint price, uint id, string uri);
constructor() ERC721("Dapp University", "DAPPU") public{
_owner = msg.sender;
}
function mint(string memory _tokenURI, uint _price) public onlyOwner returns (bool) {
uint _tokenId = totalSupply() + 1;
price[_tokenId] = _price;
_mint(address(this), _tokenId);
_setTokenURI(_tokenId, _tokenURI);

return true;
}
function buy(uint _id) external payable {
_validate(_id); //check req. for trade
_trade(_id); //swap nft for eth

emit Purchase(msg.sender, price[_id], _id, tokenURI(_id));
}
function _validate(uint _id) internal {
require(_exists(_id), "Error, wrong Token id"); //not exists
require(!sold[_id], "Error, Token is sold"); //already sold
require(msg.value >= price[_id], "Error, Token costs more"); //costs more
}
function _trade(uint _id) internal {
_transfer(address(this), msg.sender, _id); //nft to user
_owner.transfer(msg.value); //eth to owner
sold[_id] = true; //nft is sold
}
}

Context.sol

pragma solidity ^0.5.0;
contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}

}
我找到了答案。无论你使用@OpenZeppilin合同做什么样的工作,都会面临这个问题。每个子文件夹中都有一个Context.sol文件,用于帮助执行独立项目。但是,大量Context.sol文件相互冲突,导致编译器出错。从抛出的错误中可以看出,我必须追溯导入,并意识到Context.sol是从GSN文件夹而不是Utils文件夹跟踪和导入的,所以我重新更改了导入,将其从Utils文件夹中获取,如图所示。如果您正在使用<0.6.0编译器(我想这将是对不同问题的不同答案(
pragma solidity ^0.5.0;
import "@openzeppelin/contracts/utils/Context.sol";
// Change to utils folder instead of GSN folder and possibly for all clashing 
// Context.sol files
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";
import "../../drafts/Counters.sol";
import "../../introspection/ERC165.sol";

contract ERC721 is  Context, ERC165, IERC721 {
using SafeMath for uint256;
using Address for address;
using Counters for Counters.Counter;
// Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
// which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

最新更新