Hardhatの使い方メモ (2) デプロイ~Verify
Hardhatの使い方の続きです。
※ローカルネットワークについて間違えていたので記事を修正しました。
デプロイファイルの作成
scripts/deploy.js を作成します。
async function main() { const factory = await ethers.getContractFactory("Greeter") // コントラクト名を指定 const contract = await factory.deploy("Hello"); // コンストラクタの引数を指定 await contract.deployed(); // デプロイ完了まで待つ console.log("Deployed to:", contract.address) } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });
Deploying your contracts | Hardhat
ローカルネットワークへのデプロイ、テスト、コンソール
> npx hardhat run scripts/deploy.js # デプロイ > npx hardhat test # テスト実行 > npx hardhat console # コンソール
これらは in-processモードで実行され、その都度、一時的なローカルネットワークが作られます。
--network hardhat
を付けても同じです。
stand-aloneモード
Ganacheのようにローカルネットワークを立ち上げたままの状態にしたい場合は stand-aloneモードを使います。
まずローカルネットワークを起動します。
> npx hardhat node
これを起動したままで、(VSCodeなら新しくターミナルを開いて) デプロイやコンソールを使うことができます。
コマンドに --network localhost
を付けます。
> npx hardhat run scripts/deploy.js --network localhost
コンソールからデプロイされたコントラクトを触るときは attach() を使います。
> npx hardhat console --network localhost >> const factory = await ethers.getContractFactory("Greeter") >> const contract = await factory.attach("コントラクトアドレス") >> await contract.greet() >> .exit
また、外部のウォレットやソフトウェアからは http://localhost:8545
へアクセスして接続することができます。
(Chain ID 31337
)
マイニングの設定
デフォルトでは、トランザクションを受信するごとにマイニングされる自動マイニングが有効になっています。無効にしたい場合は consoleなどで次のコマンドを送信します。
await network.provider.send("evm_setAutomine", [false]);
また、一定時間ごとにマイニングを行うインターバルマイニングも可能です。 5秒おきにマイニングさせたい場合は次のようにします。
await network.provider.send("evm_setIntervalMining", [5000]);
自動マイニングとインターバルマイニングは併用が可能です。
Mining modes
Configuring Mining Modes
テストネットにデプロイ
こちらもローカルネットワークとほぼ同じです。
hardhat.config.js でネットワークを設定していれば、
コマンドに --network ネットワーク名
を追加するだけです。
> npx hardhat run scripts/deploy.js --network matic_testnet > npx hardhat console --network matic_testnet
スクリプト
scriptsディレクトリに、デプロイ以外のスクリプトを書いておくこともできます。 NFT発行してtokenURIを呼び出して、SVGを確認する、みたいな作業はスクリプトに書いておくと便利です。
Etherscan/PolygonscanのVerify
Etherscan/Polygonscanにコードを登録(Verify)するには、まず、
- @nomiclabs/hardhat-etherscan がインストールされている
- secrets.jsonにetherscanApiKey / polygonscanApiKeyが設定されている
- hardhat.config.jsにetherscan.apiKeyが設定されている
ことを確認します。
Truffle Verify Pluginとは違って、hardhat-etherscanでは EtherscanとPolygonscanのAPI KEYを自動で切り替えてくれないようです。 Etherscanを使う場合には hardhat.config.jsでEtherscanのAPI KEYを設定し、Polygonscanを使う場合には PolygonscanのAPI KEYを設定に書き換えるという作業が必要です。
etherscan: { // apiKey: etherscanApiKey // EtherscanでVerifyする場合 apiKey: polygonscanApiKey // PolygonscanでVerifyする場合 }
設定できたら verifyコマンドでコード登録!
> npx hardhat verify --network matic_testnet CONTRACT_ADDRESS
コンストラクタに引数がある場合
> npx hardhat verify --network matic_testnet CONTRACT_ADDRESS "argument"
としますが、うまいかない場合や、引数が複雑な場合は、いったん別ファイルに保存してから渡します。
args.jsを作成
module.exports = [ "Good morning, Hardhat!" ]
作成した args.js を--constructor-args
で指定します。
> npx hardhat verify --network matic_testnet CONTRACT_ADDRESS --constructor-args args.js
おわりに
Truffleとは少し違っていてちょっと戸惑いましたが、慣れれば使いやすそうです。