Идентификатор уже объявлен для Context.sol в Openzeppelin

Я работаю над проектом NFT. У меня есть мой NFT-файл в моей папке контракта, который должен импортировать из файлов openzeppelin в nodemodules. Однако компилятор, кажется, предлагает, чтобы 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;
    }
    
}

1 ответ

Я нашел ответ. Это проблема, с которой придется столкнуться независимо от того, какую работу вы выполняете, используя контракты @OpenZeppilin. В каждой подпапке есть файл Context.sol, который помогает с независимыми проектами. Однако такое большое количество файлов Context.sol сталкивается друг с другом, вызывая ошибку компилятора. Как видно из выданной ошибки, мне пришлось отследить импорт и понял, что Context.sol отслеживается и импортируется из папки GSN, а не из папки Utils, поэтому я изменил импорт, чтобы взять его из папки utils как Ключевое слово virtual также должно быть очищено, если вы используете компилятор <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;
Другие вопросы по тегам