【问题标题】:ParseError: Source file requires different compiler , when using chainlink-brownie-contractsParseError: 使用 chainlink-brownie-contracts 时,源文件需要不同的编译器
【发布时间】:2021-08-25 11:53:48
【问题描述】:

我正在尝试实现PatrickAlpha NFT implementation Github。当我按照自述文件的说明进行操作时,收藏品已正确铸造。但是如果我试图更改代码中的任何内容,它会给我这样的错误。

正在编译合同...
Solc 版本:0.6.6
优化器:已启用运行次数:200
EVM 版本:伊斯坦布尔
CompilerError:solc 返回以下错误:
/Users/batuhansesli/.brownie/packages/smartcontractkit/chainlink-brownie-contracts@1.0.2/contracts/src/v0.6/VRFConsumerBase.sol:2:1: ParserError: Source file requires different compiler version (当前编译器是0.6.6+commit.6c089d02.Darwin.appleclang - 请注意,夜间构建被认为严格低于发布版本
pragma solidity 0.6.0;
^--------------------^

为了调试,我尝试只更改ERC721的构造函数参数,但再次出现错误。

原代码:

pragma solidity 0.6.6;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";

contract AdvancedCollectible is ERC721, VRFConsumerBase {
    uint256 public tokenCounter;
    enum Breed{PUG, SHIBA_INU, ST_BERNARD}
    // add other things
    mapping(bytes32 => address) public requestIdToSender;
    mapping(bytes32 => string) public requestIdToTokenURI;
    mapping(uint256 => Breed) public tokenIdToBreed;
    mapping(bytes32 => uint256) public requestIdToTokenId;
    event requestedCollectible(bytes32 indexed requestId); 


    bytes32 internal keyHash;
    uint256 internal fee;
    
    constructor(address _VRFCoordinator, address _LinkToken, bytes32 _keyhash)
    public 
    VRFConsumerBase(_VRFCoordinator, _LinkToken)
    ERC721("Dogie", "DOG")
    {
        tokenCounter = 0;
        keyHash = _keyhash;
        fee = 0.1 * 10 ** 18;
    }

    function createCollectible(string memory tokenURI, uint256 userProvidedSeed) 
        public returns (bytes32){
            bytes32 requestId = requestRandomness(keyHash, fee, userProvidedSeed);
            requestIdToSender[requestId] = msg.sender;
            requestIdToTokenURI[requestId] = tokenURI;
            emit requestedCollectible(requestId);
    }

    function fulfillRandomness(bytes32 requestId, uint256 randomNumber) internal override {
        address dogOwner = requestIdToSender[requestId];
        string memory tokenURI = requestIdToTokenURI[requestId];
        uint256 newItemId = tokenCounter;
        _safeMint(dogOwner, newItemId);
        _setTokenURI(newItemId, tokenURI);
        Breed breed = Breed(randomNumber % 3); 
        tokenIdToBreed[newItemId] = breed;
        requestIdToTokenId[requestId] = newItemId;
        tokenCounter = tokenCounter + 1;
    }

    function setTokenURI(uint256 tokenId, string memory _tokenURI) public {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _setTokenURI(tokenId, _tokenURI);
    }
}

我的代码:

pragma solidity 0.6.6;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";

contract FootballerCollectible is ERC721, VRFConsumerBase {

    bytes32 internal keyHash;
    uint256 public fee;
    uint256 public tokenCounter;

    enum Player{MBAPPE, NEYMAR, MESSI, RONALDO}

    mapping (bytes32 => address) public requestIdToSender;
    mapping (bytes32 => string) public requestIdToTokenURI;
    mapping (uint256 => Player) public tokenIdToPlayer;
    event requestedCollectible(bytes32 indexed requestId); 


    constructor(address _VRFCoordinator, address _LinkToken, bytes32 _keyhash) public
    VRFConsumer(_VRFCoordinator, _LinkToken)
    ERC721("Footballer", "FTC") 
    {
        keyHash = _keyhash;
        fee = 0.1 * 10 ** 18;
        tokenCounter = 0; 
    }

    function createCollectible(uint256 userProvidedSeed, string memory tokenURI)
    public returns (bytes32) {
        bytes32 requestId = requestRandomness(keyHash, fee, userProvidedSeed);
        requestIdToSender[requestId] = msg.sender;
        requestIdToTokenURI[requestId] = tokenURI;
        emit requestedCollectible(requestId);
    }

    function fulfillRandomness(bytes32 requestId, uint256 randomNumber) internal override{
        address cardOwner = requestIdToSender[requestId];
        string memory tokenURI = requestIdToTokenURI[requestId];
        uint256 newItemId = tokenCounter;
        _safeMint(cardOwner, newItemId);
        _setTokenURI(newItemId, tokenURI);
        Player player = Player(randomNumber % 4);
        tokenIdToPlayer[newItemId] = player;
        requestIdToTokenId[requestId] = newItemId;
        tokenCounter = tokenCounter + 1;


    }
        function setTokenURI(uint256 tokenId, string memory _tokenURI) public {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _setTokenURI(tokenId, _tokenURI);
    }
} 

【问题讨论】:

    标签: ethereum solidity chainlink


    【解决方案1】:

    嗨 :) 在您收到的错误消息中

    Blockquote ParserError:源文件需要不同的编译器版本(当前编译器是 0.6.6+commit.6c089d02.Darwin.appleclang - 请注意,夜间构建被认为严格低于发布版本 pragma solidity 0.6.0;

    它表示您正在尝试使用不同版本的 pragma solidity 编译您的合同。有问题的智能合约是:

    [https://github.com/smartcontractkit/chainlink-brownie-contracts/blob/main/contracts/src/v0.6/VRFConsumerBase.sol]

    正在使用

    pragma solidity ^0.6.0;
    

    您指定在合同中使用比所选编译器晚的版本 0.6.6。为了解决这个问题,您可以下拉到 ^0.6.0 或者您可以将您的编译指示更改为

        pragma solidity ^0.6.0;
    

    更多信息可以阅读this ticket

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 2019-05-27
      • 1970-01-01
      • 2022-07-22
      • 2022-11-27
      • 1970-01-01
      • 2023-01-07
      • 2023-01-16
      • 1970-01-01
      相关资源
      最近更新 更多