etherscanでのコントラクトベリファイにはLicense指定が必須でコメントは消してもよい


はじめに

etherscanでソースコードのベリファイの動きを勉強しました。そのノートです。

TruffleとOpenZeppelinを使ってコントラクトを作成しました。

ソースはここにおいてあります。

コントラクトデプロイ1

こんなコントラクトをデプロイしました。

pragma solidity >=0.4.21 <0.7.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol";

contract PToken is ERC20, ERC20Detailed {
  constructor(uint256 initialSupply) ERC20Detailed("PToken", "PTN", 18) public {
    _mint(msg.sender, initialSupply);
  }
}

ではベリファイに進みます。

etherscanにアップロードできるファイルの種類は4つ

Standard-Json-Inputって何?

truffleでコンパイルした後にできるjsonではない

build/contracts/PToken.jsonをアップロードしてみた

Error! Unable to generate Contract ByteCode and ABI (General Exception, unable to get compiled [bytecode])
エラー!コントラクトのByteCodeおよびABIを生成できません(一般例外、コンパイルされた[bytecode]を取得できません)

こういう形式らしい

そのjsonのmetadataにあるやつがそれっぽい、でもダメだった

これ

parseしてみる

エラー

Unable to process the standard-input-json you uploaded. ErrCode: Only literal contents of the source file, Source using URLS are not supported
アップロードしたstandard-input-jsonを処理できません。 ErrCode:ソースファイルのリテラルコンテンツのみ、URLSを使用するソースはサポートされていません

以下のように、sources[<file_name>].urlsではなく、sources[<file_name>].contentでなければならないということだと思った。

truffle-flattenerを使ってSingle fileを指定するとできた

これを使うと、インポートとかをさかのぼって一つのファイルにまとめられる

無事ベリファイできた

Contractタブにソースコードが表示された

コントラクトデプロイ2

1とまったく同じSolidityをデプロイした

etherscanではすでにベリファイされている

前のやつと同じバイトコードだから

コントラクトデプロイ3

名前を一文字変えた。PTokenからLTokenにした。コンストラクタ引数は変えていない。

pragma solidity >=0.4.21 <0.7.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol";

contract LToken is ERC20, ERC20Detailed {
  constructor(uint256 initialSupply) ERC20Detailed("PToken", "PTN", 18) public {
    _mint(msg.sender, initialSupply);
  }
}

コントラクトの名前を変えると同一ではなくなる

etherscanの画面がまだベリファイではない。

ベリファイではLicenseが必須項目、コメントの有無はベリファイに影響しない

Licenseは必須項目

LicenseをNoneに指定

コメントを消してアップロード

License Noneと表示される。Licenseの表記がないコントラクトは、昔の時代のものなのかもしれない。

おわりに

コントラクトベリファイは、Single fileを選択する。

全く同じバイトコードのコントラクトは、自動的にベリファイされる。

Licenseの指定は必須。

コントラクトのコメントは消しても問題ない。