Now and Nawoo

NFTの制作記録、技術メモ → C#, Solidity, Blockchain, Bitcoin, Ethereum, NFT

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
(中略)
・・・

これは手動で修正するしかない。(地味に面倒)

参考: Deduplicate or remove SPDX license identifier comments · Issue #55 · nomiclabs/truffle-flattener · GitHub

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