Hardhatでテストネットやメインネットにデプロイする方法（Alchemy編）


今まではINFURA.IO使うことが多かったけど、近代的な？Alchemyで試してみます。

HardhatでAlchemyを使う方法自体は[こちら](https://docs.alchemy.com/docs/how-to-set-up-hardhat)に手順が紹介されています。
デプロイするものは、[この記事](https://qiita.com/zaburo/items/957eabdd4753aa7b3bba)のソースをそのまま利用してみたいとおもいます。

## 前提

* macOS
* AlchemyでSignUpを済ませている。
* アプリを追加（Ethereum Goerli）してKeyやURLを生成している。


## 準備

### .envの追加

作業フォルダに移動。.envを使うので追加インストール。

```bash
cd
cd test-hardhat

npm install dotenv
```

.envを作成

```bash
touch .env
```

### .envの記述

GoerliとMAINNET両方の記述をしておきます。

* ALCHEMY_GOERLI_URLおよびALCHEMY_MAIN_URLはAlchemyで生成してもの。
* PRIVATE_KEYはMetamask等、外部Walletで生成したもの。

```bash:.env
ALCHEMY_GOERLI_URL=https://eth-goerli.g.alchemy.com/v2/pEOf1_cKMf**********************
ALCHEMY_MAIN_URL=https://eth-mainnet.g.alchemy.com/v2/Rs5r6AEO7A2**********************
PRIVATE_KEY=4059d7ccd9006c2************************************************************
```

>PrivateKeyを分けることもできますが、ここでは同じにしてます。
>GoerliETHは[Faucetサイト](https://goerlifaucet.com/)で入手できますが、Alchemyのアカウントおよびメインネットで0.001ETH持ってないと動かないようです。また、1日に0.05ETHの制限があるようです。

## hardhat.config.jsの編集

各ネットワークへのアクセス情報をhardhat.config.jsに記述します。

>localhostは明示的に記述しなくてもいいようです。

```js:hardhat.config.js
require('dotenv').config(); //all the key value pairs are being made available due to this lib
require("@nomicfoundation/hardhat-toolbox");

module.exports = {
  solidity: "0.8.18",
  networks: {
    goerli: {
      url: `${process.env.ALCHEMY_GOERLI_URL}`,
      accounts: [`0x${process.env.PRIVATE_KEY}`],
    },
    mainnet: {
      url: `${process.env.ALCHEMY_MAIN_URL}`,
      accounts: [`0x${process.env.PRIVATE_KEY}`],
    }
  }
};
```

## Goerli

### Deploy

では、Goerliにデプロイしてみます。--networkで設定したgoeriを指定します。

```bash
npx hardhat run --network goerli scripts/deploy.js
```

>当然ですが、deployするためにはGoerli用のETHを獲得しておく必要があります（0.004ほど消費しました）。
>出力されたアドレスは動作確認で利用するのでメモしておきます。

### 動作確認

consoleも--networkで利用したネットワークを指定すればいいようです。

```bash
npx hardhat console --network goerli
```

動作確認してみます。

```bash
> const abi = [
     {
       "inputs": [],
       "name": "greet",
       "outputs": [
         {
           "internalType": "string",
           "name": "",
           "type": "string"
         }
       ],
       "stateMutability": "pure",
       "type": "function"
     }
   ]
undefined
> const address = "0xAAF9692beEF3BBd23488bfcf783c0706********"
undefined
> const hello = await ethers.getContractAt(abi,address)
undefined
> await hello.greet()
'Hello World'
```

### Verify

Etherscan上等でコードやABIを確認できるようにします。
Ehterscan上でも可能ですが、hardhatで対応できるので、hardhatコマンドを利用してみます。

#### 準備

* まず、EtherscanにSignUpし、API Keyを取得します。
* API Keyをhardhat.config.jsに登録（.envから取得）

```js:hardhat.config.js
require('dotenv').config(); //all the key value pairs are being made available due to this lib
require("@nomicfoundation/hardhat-toolbox");
// const { etherscanApiKey } = require("./etherscan_apikey.json");

module.exports = {
  solidity: "0.8.18",
  networks: {
    goerli: {
		//省略
    },
    mainnet: {
		//省略
    }
  },
  etherscan: {
    apiKey: `${process.env.ETHERSCAN_API_KEY}`, //追加
  }
};
```

.envにAPIKEYを追加します。

```bash:.env
# 省略
ETHERSCAN_API_KEY=DIKFGXM6ADKP8QNMM1TPH2VH5GU3A***** #追加
```


#### 実行

verifyを実行します。

```bash
npx hardhat verify --network goerli --contract contracts/Hello.sol:Hello 0xAAF9692beEF3BBd23488bfcf783c0706********（コントラクトAddress)
```

>引数があればコントラクトアドレスに続いて入力。

## MAIN NET

メインネットの場合も基本的には同じです。--networkでmainnetを指定します。

```bash
npx hardhat run --network mainnet scripts/deploy.js
```

>出力されたアドレスは動作確認で利用するのでメモしておきます。

コンソールも同様に。

```bash
npx hardhat console --network mainnet
```

動作確認。

```bash
> const abi = [
     {
       "inputs": [],
       "name": "greet",
       "outputs": [
         {
           "internalType": "string",
           "name": "",
           "type": "string"
         }
       ],
       "stateMutability": "pure",
       "type": "function"
     }
   ]
undefined
> const address = "0xAAF9692beEF3BBd23488bfcf783c0706********"
undefined
> const hello = await ethers.getContractAt(abi,address)
undefined
> await hello.greet()
'Hello World'
```

## 参考

* https://qiita.com/FinanceMofumofu/items/a46488333fbee819bb01