Solidityのflattenerについて
Etherscan(やPolygonscan)のContractのページにCodeを登録するためには、書いたSolidityをフラット化(flatten)する必要がある。
例えば、以下のようなコードであれば、まずimportしている ERC721.solを展開する。そしてERC721.solからimportしているファイルを展開する。これを繰り返して、すべての関連ファイルを一つのファイルにまとめる。これをflattenといい、flattenerというツールを使って行う。
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract MyNFT is ERC721 { // 省略 }
flattenerにはいくつか種類があるのだが、どれも問題がある。
truffle-flattener
> npm install -g truffle-flattener > truffle-flattener contracts/MyNFT.sol > MyNFT_flatten.sol
これで作成されたファイルをコンパイルするとエラーがでる。 1ファイルの中にLicense表記が複数あることが原因。 License表記は1ファイルにつき1つしか認められていないのだが、truffle-flattenerはLicenseの重複を考慮せず、単純にファイルをまとめている。そのため1ファイルに複数のLicense表記が存在することになる。
// SPDX-License-Identifier: MIT (中略) // SPDX-License-Identifier: MIT (中略) // SPDX-License-Identifier: MIT (中略) ・・・
これは手動で修正するしかない。(地味に面倒)
RemixのFlattener
RemixのプラグインとしてFlattenerがある。solファイルを右クリックしてFlattenするだけなので簡単だ。 こちらはLicenseの行を全部削除するようで、上記のようなエラーは出ない。ところが、別のエラーが発生する。
どうも複数ファイルを展開する順番がおかしいようだ。例えば、ERC721の前にIERC721が必要なのに後ろにある、など。 これを手動で修正するのはかなり面倒。
VSCodeの拡張機能 Solidity Contracts Merger
そもそも、まともなファイルが生成できてない。 長い間更新されていないので、すでに現在のVSCodeでは正しく動かないのかも。
VSCodeの拡張機能 Solidity Contract Flattener
内部でtruffle-flattener を使っているらしいので、同じ問題があるだろう。
結論
どれも一長一短。truffle-flattenerが一番ましか。
追記
Etherscanに登録するときに1ファイルにまとめずに複数ファイルで登録する方法もあるようだ。
Verify contract deployed with Remix - #6 by abcoathup - Contracts - OpenZeppelin Community