🤖

hardhatで作成したプロジェクトにFoundryを導入する

2022/12/20に公開1

前置き

Foundryを使ってみたいと思いつつ、以下のような悩みを抱えている方がいらっしゃるかと思います(多分)

  • 既にhardhatでプロジェクト作ってしまっている
  • テストはFoundryでやりたいけど、デプロイはhardhatでやりたい
    そこで本記事では、hardhatで作成したプロジェクトにFoundryを導入し、共存させる手順5ステップを書きます。

以下の内容を噛み砕いたり補足したりする内容になります。
https://book.getfoundry.sh/config/hardhat

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なども使えるようになります。
こちらも便利なので、良ければチェックしてみてください。
https://book.getfoundry.sh/anvil/
https://book.getfoundry.sh/cast/

Discussion