hardhatで作成したプロジェクトにFoundryを導入する
前置き
Foundryを使ってみたいと思いつつ、以下のような悩みを抱えている方がいらっしゃるかと思います(多分)
- 既にhardhatでプロジェクト作ってしまっている
- テストはFoundryでやりたいけど、デプロイはhardhatでやりたい
そこで本記事では、hardhatで作成したプロジェクトにFoundryを導入し、共存させる手順5ステップを書きます。
以下の内容を噛み砕いたり補足したりする内容になります。
1. Foundryをインストールする
まずFoundryをインストールをしないことには始まりません。
以下コマンドでFoundryをインストールします。
$ curl -L https://foundry.paradigm.xyz | bash
$ foundryup
次にFoundryでデプロイやテストを行う際に使用するforgeというコマンドでプロジェクトを作成します。
$ forge init hello_foundry
2. Foundryをhardhatプロジェクトに移植する
手順1で作成したプロジェクト内の
lib/forge-std
-
foundry.toml
をhardhatのプロジェクトルートにコピーします。
次に、以下のようにフォルダ・ファイルを作成してください。
- プロジェクトルートに
remappings.txt
を作成 -
test
フォルダ内にfoundry
フォルダを作成
以下のようになっていればOKです。
-contracts
-scripts
-test
-foundry
-lib
-forge-std
-hardhat.config.js
-foundry.toml
-remappings.txt
これでforgeコマンドが使用できるようになりました。
3. hardhatの既存ファイルを参照するよう修正
forgeコマンドは使用できるようになりましたが、現状だとFoundryのデフォルトのフォルダを参照してしまうので修正します。
手順2でコピーしたfoundry.toml
を以下のように書き換えます。
[profile.default]
src = 'contracts'
out = 'out'
libs = ['node_modules', 'lib']
test = 'test/foundry'
cache_path = 'forge-cache'
# See more config options https://book.getfoundry.sh/reference/config.html
これによって、ソースコードはsrc
フォルダ、ライブラリはnode_modules
配下を参照してくれるようになりました。後述しますが、テストコードはtest/foundy
配下を見てくれます。
4. remappings.txtの修正
手順3でnode_modules
を参照するように修正しましたが、中にはforge
にしか提供されていないライブラリもあります。それらをimportする際はlib
配下を参照しないといけません。
しかしそうすると、今度はhardhatのコマンドを叩いた際に参照エラーが出てしまいます。
そこでremappings.txtの出番です。左辺に設定した文字列をFoundry使用時は右辺のように置換してくれます。つまりhardhatでエラーが出ない形式で書いてあればうまいことやってくれるということです。
ds-test/=lib/forge-std/lib/ds-test/src/
forge-std/=lib/forge-std/src/
5. 完成!
以上で導入は完了です!foundry/test
フォルダ内にテストコードを作成したら、以下のコマンドを打ってみましょう。テストが実行されるはずです。
forge test
また、hardhatのコマンドも導入前と変わらず使用できるかと思います。お疲れ様でした!
補足
上記手順でforge
コマンドだけでなく、ローカルノードの立ち上げが行えるanvil
、コマンドラインからスマコンを叩けるcast
なども使えるようになります。
こちらも便利なので、良ければチェックしてみてください。
Discussion
最近はhardhat側にfoundryもセットアップできるコマンドがあるらしい
(やったことないのでどうなるかは不明)