Open10

Nxでhardhatをいい感じにやる手順

uuyu-guuyu-g

Nx のmonorepoにhardhatをいい感じに組み込む手順。試行錯誤あり。

uuyu-guuyu-g

まずnx generate @nrwl/node:application でnodeのアプリを生成する。

その時テストランナーをnoneにしておく。hardhatのsccafoldでmochaが入るからなんだけど、jestにまとめられそうな気はする。

npx nx generate @nrwl/node:application --name=contract --unitTestRunner=none
uuyu-guuyu-g

npx hardhat init を monorepo rootで実行。templateはTypescriptのやつを選択。
生成先をさっき作ったnode appのpathにする。

✔ What do you want to do? · Create an advanced sample project that uses TypeScript
✔ Hardhat project root: · ./apps/contract
✔ Do you want to add a .gitignore? (Y/n) · y
uuyu-guuyu-g

依存パッケージをインストールするよう言われ、以下のコマンドが出てくるのでそのままインストール。

npm install --save-dev "hardhat@^2.7.0" "@nomiclabs/hardhat-waffle@^2.0.0" "ethereum-waffle@^3.0.0" "chai@^4.2.0" "@nomiclabs/hardhat-ethers@^2.0.0" "ethers@^5.0.0" "@nomiclabs/hardhat-etherscan@^2.1.3" "dotenv@^10.0.0" "eslint@^7.29.0" "eslint-config-prettier@^8.3.0" "eslint-config-standard@^16.0.3" "eslint-plugin-import@^2.23.4" "eslint-plugin-node@^11.1.0" "eslint-plugin-prettier@^3.4.0" "eslint-plugin-promise@^5.1.0" "hardhat-gas-reporter@^1.0.4" "prettier@^2.3.2" "prettier-plugin-solidity@^1.0.0-beta.13" "solhint@^3.3.6" "solidity-coverage@^0.7.16" "@typechain/ethers-v5@^7.0.1" "@typechain/hardhat@^2.3.0" "@typescript-eslint/eslint-plugin@^4.29.1" "@typescript-eslint/parser@^4.29.1" "@types/chai@^4.2.21" "@types/node@^16.4.13" "@types/mocha@^9.0.0" "ts-node@^10.1.0" "typechain@^5.1.2" "typescript@^4.3.5"

※ただこのまま実行すると typescript@4.5.2 がインストールされちゃうが、自分のプロジェクトではAngularがまだ4.4しか対応していないので typescriptだけバージョン下げる。

npm i -D typescript@4.4
uuyu-guuyu-g

eslintrc.jsが作られるけど特にsolidityに特有のルールは無いっぽいし、monorepoでまとめたいので消しとく。

uuyu-guuyu-g

hardhat init で Nxで生成されたtsconfig.jsonが上書きされるけど Nx の設定とはどう調整すればいいかな?

uuyu-guuyu-g

基本的にはhardhatで生成されたものを使ったほうが良さそう。

uuyu-guuyu-g

hardhat compileの生成物をdistに移動できそうだけどちょっとうまく行ってない。
hardhat.config.tsにとりあえずこのように追記してみたけどcompileできなかった。

  paths: {
    artifacts: '../../dist/apps/contract/artifacts',
    cache: '../../.contract/cache',
  },
  typechain: {
    outDir: '../../dist/apps/contract/typechain',
    externalArtifacts: ['../../dist/apps/contract/artifacts'],
  },

hardhatのドキュメント見てみないと。
とりあえずapps/contract内に生成しとこう。

uuyu-guuyu-g
apps/contract/project.json
    "compile": {
      "executor": "@nrwl/workspace:run-commands",
      "options": {
        "cwd": "apps/contract",
        "command": "npx hardhat compile"
      }
    },

hardhat compile用に追加。cwdを追加しないと hardhat.configが見つけられなくてエラーになる。

これで nx compile contract で動くようになる。

uuyu-guuyu-g

他アプリでcontractのtypechainの中身を使えるようにrootのtsconfig.base.jsonを編集。

tsconfig.base.json
    "paths": {
      "@hoge/contract": ["apps/contract/typechain/index.ts"]
    }