ParserError при проверке контракта Truffle на Etherscan

У меня есть контракт, который был развернут в основной сети Ethereum, код контракта работает и отлично компилируется при развертывании, и я могу взаимодействовать с контрактом, используя метамаск / MEW.

Однако когда я иду проверить контракт на Etherscan, я получаю ошибку компиляции.

Я использую бета-компилятор трюфелей от etherscan: https://etherscan.io/verifyContract2

Я собрал весь свой код вместе, используя npm truffle-flattener

Я создал закодированные параметры конструктора, используя: https://abi.hashex.org/

Затем я использовал оптимизатор в truffle.js с run = 200:

  solc: {
    optimizer: {
      enabled: true,
      runs: 200
    }
  }

Затем я использовал версию компилятора, которая указана в файле JSON ниже:

...
...
  },
  "compiler": {
    "name": "solc",
    "version": "0.4.21+commit.dfe3193c.Emscripten.clang"
  },
  "networks": {
    "1": {
      "events": {},
      "links": {
        "SaleStagesLib": "0x0ea918c7c1bed2358530baad064d361438543067",
        "BytesDeserializer": "0x278cfd9ed99cf90ebe2e1a750b50e5811a81af77"
      },
      "address": "0x3a2c34ba7be06c7104bb642f4ce74dc4c317f373",
      "transactionHash": "0x02e0a895cd3dcf98ee71b9d823d69b5701d6e76bd326757babac1c2bf805ff8d"
    }
  },
  "schemaVersion": "2.0.0",
  "updatedAt": "2018-03-31T14:09:25.579Z"
}

Следующее вызывает ошибку ParseError в etherscan, указывающую на контракт Ownable:

contract Ownable {
  address public owner;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }


  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

Ошибка гласит:

myc:150:30: ParserError: Expected token Semicolon got 'LParen'
    emit OwnershipTransferred(owner, newOwner)
                             ^

Однако я хотел бы отметить, что этот код скомпилирован правильно, без ошибок в трюфеле, и я успешно взаимодействовал с контрактом в основной сети.

Есть идеи, почему компилятор выдает эту ошибку?


person Jack Pickering    schedule 03.04.2018    source источник
comment
Вы уверены, что ваш контракт был развернут с использованием версии 0.4.21? Похоже, это заставляет компилятор опуститься до 0.4.19 (до того, как emit был доступен)   -  person Adam Kipnis    schedule 03.04.2018
comment
Компилятор и версия указаны в папке сборки, как показано выше, в ней указано 0.4.21, однако я не уверен, как бы проверить в противном случае?   -  person Jack Pickering    schedule 04.04.2018


Ответы (1)


Я удалил выбросы, вызывающие выброс ParseError, и проверка сработала. Я считаю, что это может быть проблема между версиями компилятора truffle и etherscans.

person Jack Pickering    schedule 04.04.2018