標準的な NFT プロジェクト(ERC721AQueryableベース)を題材とした fondryのテストを作成しました。
ソースコードは下記を参照ください。
https://github.com/eggdragons/foundry-SampleERC721AQueryable
ERC721Queryableのfoundryのサンプルテスト
テスト時間が非常に長くなるため、極力テストの数を絞っています(特に ffi)。
test | number | time |
normal | 31 + 3 | 8s + 1s |
fork | 1 | 60s |
ffi | 2 | 900s |
そのため、mint テストについては、想定する販売ケースに合わせてテストを追加してください。
また、継承しているコントラクトのロジックテストは各コントラクト毎に実施されているものとし、継承できているかのテストのみ実装しています。
注意事項:constructorMint(ERC2309)に使用されるアドレスを完全に排除できていません。
エラーが出た場合には、エラーが出たテストを単独で実施して検証してみてください。
forkテストやffiテストについて
merkleProof については、ffi test にて動作確認を行なっています。
OpenSea operator-filter-registry については、fork test にて mainnet を fork してブラックリストの動作確認を行なっています。
フォルダ構成
コントラクト
メイン:SampleERC721AQueryable.sol
販売データ:SaleInfoData.sol
(本来コントラクトに保存すべきデータではないので、当該コントラクトを使用するのではなく、セールのたびに上書きする方式を推奨)
テスト
メイン:SampleERC721AQueryable.t.sol
販売データ:SaleInfoData.t.sol
merkleProof 関係:Ffi.t.sol
OpenSea operator-filter-registry 関係(オンチェーン):Fork.t.sol
ヘルパー:ConstructorDatas.t.sol / InternalFunction.t.sol / TestHelpers.t.sol
使い方
ノーマルテストの準備
forge install
ffiテストの準備
npm i
npm run compile
必要に応じて、ts-src/merkle/allowlist.json
の中身を変更してください。
forklテストの準備
ForkTest する際は、root フォルダに.env
の中に、下記を追加してください。
MAINNET_RPC_URL = https://mainnet.infura.io/v3/{API_KEY}
総合テスト(全てのテストが実施されます)
forge test --ffi
コントラクトのmethodとテストの対比表について
リポジトリのREADMEを参照ください!