Идентификатор уже объявлен для 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;
    }
    
}

person Peeman    schedule 05.04.2021    source источник


Ответы (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;
person Peeman    schedule 05.04.2021