ERC20 のトークンをAstarのテストネットにデプロイする。

## 前提
ドキュメント作成者の知識不足により、誤った用語や表現がある場合がありますが、そこは大目に見て頂けますと幸いです。

完成のコード

https://github.com/yhoi/shibuya-test-token

## 事前準備
- Wallet (MetaMaskなど）の追加
- Shibuya Networkの追加 (Astar Networkの詳細）

https://docs.astar.network/integration/network-details


## 使用技術
- Hardhat
- OpenZeppalin

#### Hardhat とは？
Hardhatは Ethereum ソフトウェアをコンパイル、デプロイ、テスト、およびデバッグするための開発環境です。この他だとTruffle Suiteなどがあります。
これを使用することにより、EVM互換性をもつチェーンを扱うことができます。

https://hardhat.org/

#### OpenZeppelinとは？

ERC20 ERC721 ERC1155などのコードを簡単に使うことができるパッケージです。

https://docs.openzeppelin.com/


## 環境構築

#### バージョン
- Hardhat 2.9.3 
- node v16.14.0
- npm v8.3.1

#### コマンド

```
# npmの初期化
$ npm init -y

# hardhatのinstall
# Create a basic sample projectを選択
# 残りは推奨されている方を選択
$ npx hardhat install

# 必要なパッケージのインストール
$ npm install @openzeppelin/contracts
$ npm install dotenv

#　不要なファイルの削除
$ rm contracts/Greeter.sol
$ rm scripts/sample-script.js

```

## コーディング

#### 1. トークンのコード作成  
OpenZeppelinの下記リンクから必要な機能を追加してcontractsディレクトリの中にファイルを追加する。


https://docs.openzeppelin.com/contracts/4.x/wizard

``` contracts/TEST.sol
// SPDX-License-Identifier: TEST
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract TEST is ERC20, Ownable {
    constructor() ERC20("TEST", "TEST") {}

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }
}
```
＊全体の流れが知りたい人はパッケージのファイルを実際にみてみよう！

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/contracts/token/ERC20/ERC20.sol

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/contracts/access/Ownable.sol

#### 2. デプロイするコード作成

``` scripts/deploy.js
const hre = require("hardhat");

async function main() {
  // Hardhat always runs the compile task when running scripts with its command
  // line interface.
  //
  // If this script is run directly using `node` you may want to call compile
  // manually to make sure everything is compiled
  // await hre.run('compile');

  // We get the contract to deploy
  const ERC20 = await hre.ethers.getContractFactory("TEST");
  const erc20 = await ERC20.deploy();

  await erc20.deployed();

  console.log("ERC20 Token deployed to:", erc20.address);
}

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });
```

#### 3.Walletの秘密鍵を環境変数に追加

```.env
PRIVATE_KEY='あなたのWalletの秘密鍵'
```
**※秘密鍵の扱いはとても慎重に行なってください、特に資産を保有しているWalletなのであれば開発用のWalletをもう一つ持つことをお勧めします。**



#### 4.hardhat.config.jsの設定
``` hardhat.config.js
require("@nomiclabs/hardhat-waffle");
require('dotenv').config();

// This is a sample Hardhat task. To learn how to create your own go to
// https://hardhat.org/guides/create-task.html
task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {
  const accounts = await hre.ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

module.exports = {
  solidity: "0.8.4",
  networks:{
    shibuya: {
      url:"https://rpc.shibuya.astar.network:8545",
      chainId:81,
      accounts:[process.env.PRIVATE_KEY],
    }
  }
};

```
networksの設定を変更することで指定したEVMを保持するチェーンにスマートコントラクトを発行できる。
今回はAstarのテストネットのShibuyaを扱う。

https://docs.astar.network/integration/network-details

## デプロイ

#### 1. SBYトークンを取得する

ここまででコーディングは終わり、デプロイをしたいところなのですがスマートコントラクトを発行する上ではガス代が必要となります。
そこで、ShibuyaネットワークのSBYを取得しなければなりません。
下記が公式ドキュメントです。無事Wallet上で取得の確認が取れたら次に進んでください。

https://docs.astar.network/integration/testnet-faucet

#### 2. スマコン発行
```
Solidityのコンパイル
$ npx hardhat compile

# スマコン発行　この時のアドレスはメモしておいてください
$ npx hardhat run --network shibuya scripts/deploy.js

```
実際にスマートコントラクトが発行できているかは、SubscanでネットワークをSibuyaにして検索することで確認することができます。

https://www.subscan.io/


#### 3.デプロイ
```
npx hardhat console --network shibuya
> const ERC20 = await ethers.getContractFactory("TEST");
> const erc20 = await ERC20.attach( "発行したコントラクトアドレス" );
> await erc20.mint("あなたのウォレットアドレス", 発行したいトークンの数 );

# Ctrl + D　でコンソールから退出

```

最後にWallet上でTESTトークンを確認することができたのであれば完成です！

## 最後に
この記事はデプロイを目的としたドキュメントです。
本来はローカルでテストを行ったのちにスマコンを発行する方が一般的です。
なのであくまでこの記事は参考程度にお使いください。


## 参考記事

https://realtakahashi-work.medium.com/hardhat%E3%82%92%E4%BD%BF%E3%81%86-astar-network-ee2b27563a3f