ERC-20トークンを自作して使う

## はじめに
トークンとは一体何者なのか？という疑問が浮かんだのでまずは自分で作って使ってみようということになりました。

ということで、ERC-20トークンを実装しデプロイしてMETAMSKで送金するまでの一連の流れをまとめました。

今回自作したERC-20トークン「tJPY」を送金した様子
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/8ee2fc8d-d425-d126-b136-00346cd09c01.png"><img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/3ca9a39e-8a46-4a1b-5527-4b1a9524c757.png">

## ERC-20トークンの要件
今回以下の要件を満たすERC-20トークンを作ります。

- 名前は"Test Japanese Yen"
- トークンのシンボルは"tJPY"
- 総発行量は1億トークン
- デプロイ先ネットーワーク（チェーン）はEthereumのGoerli Testnet

:::note info
EthereumのGoerli Testnet
テストネットワークの一つ。メインネット（Ethereum）で正式に稼働させる前に、事前にテストをするためのネットワークになります。web2で例えるとステージング環境のような位置付けです。
そのため通貨もETHではなくGoerliETHであり実際のお金の価値はありません。
以下公式で紹介されているFausetと呼ばれるサイトから無料で入手することができます。
https://ethereum.org/en/developers/docs/networks/#goerli
:::

## 作る
ライブラリを使えば５分でデプロイまでできてしまいます。
では始めます。

### 1. スマートコントラクトを実装
ライブラリをベースに実装することが一般的なようです。
ということでOpenZeppelinの[Contracts Wizard](https://docs.openzeppelin.com/contracts/4.x/wizard)でコントラクトのソースコードを作成します。
![Screenshot 2023-09-20 at 11.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/f489f8f8-9ab4-9842-29de-629ed8e745b0.png)
要件通り、Nameに"Test Japanese Yen"、Synbolに"tJPY" 、Premintに"100000000"（１億）を設定します。

作成したソースコード

```javascript
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

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

contract TestJapaneseYen is ERC20 {
    constructor() ERC20("Test Japanese Yen", "tJPY") {
        _mint(msg.sender, 100000000 * 10 ** decimals());
    }
}
```

### 2. デプロイ
EthereumのGoerli Testnetに先ほどのコントラクトをデプロイしていきます。

#### 2.1. 開発環境Remixを起動
先ほどのContracts Wizardの「Open in Remix」ボタンをクリックしてRemixを立ち上げます。
すると先ほど作成したソースコードが用意された状態で立ち上がります。
![Screenshot 2023-09-20 at 12.03.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/2e56dd17-5da3-2226-2c9f-36bf326b65d6.png)

#### 2.2. コンパイル
起動した状態ですでにコンパイル画面になっていると思います。そうでない場合は画面左端のSolidityアイコンをクリックしてください。
「Compile ****」ボタンをクリックしてコンパイルします。
![Screenshot 2023-09-20 at 12.03.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/2e56dd17-5da3-2226-2c9f-36bf326b65d6.png)
コンパイルできました。画面左端のアイコンに、コンパイルが成功したことを示す緑色のチェックアイコンが表示されています。
![Screenshot 2023-09-20 at 12.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/2d77bcf0-65ed-dd8b-c347-ecd80bc9ab31.png)

#### 2.3. デプロイ
コンパイルしたものをGoerli Testnetにデプロイします。
画面左端のSolidityアイコンの一つ下のアイコンをクリックしてデプロイ画面を表示させます。
![Screenshot 2023-09-20 at 12.12.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/c856f8da-87f5-20e9-7830-56ae31325860.png)

この後デプロイする時にMETAMASKを通してEthereum Goerli Testnetにデプロすることになります。なので先にMETAMASKのネットワークをEthereum Goerli Testnetに変更しておきます。
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/0f8f8d2c-f2e8-5ae0-2b04-8ed8951fd23a.png"><img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/d00738e2-8e32-a7fe-ba45-5ecbb411274b.png">
併せて、デプロイ時に必要なガス代（GoerliETH）を調達します。以下のEtherum公式で紹介されているFausetsから好きなものを選び自分のアドレスにGoerliETHを入金してください。上のスクショのように金額が表示されたらOKです。

https://ethereum.org/en/developers/docs/networks/#goerli


それではRemixに戻ってデプロイしていきます。
ENVIRONMENT欄で「Injected Provider - MetaMask」を選択します。METAMSKが立ち上がるのでOKしてください。

:::note info
デプロイミスしないための確認
- 下側に小さく「Goerli」（デプロイ先のネットワーク）と表示されていること
- METAMASKで複数アカウントを管理している場合はACCOUNTの値が期待したアカウントのアドレスであること
:::

![Screenshot 2023-09-20 at 12.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/2946640b-1fea-5140-d9ef-0fc208cf8e81.png)
「Deploy」ボタンをクリックします。するとMETAMASKが起動してGoerli Testnetにこのコントラクトをデプロイしてよいか承認を求められるので承認（Confirmをクリック）してください。
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/a953a5ae-834a-56d9-eba5-5e7ed5ee491c.png">
しばらくすると、Remix画面下側のターミナルにデプロイが正常に完了した旨が表示されます。
また、画面左下の「Deployed Contracts」には先ほどデプロイしたコントラクトが表示されます。ちなみに、ここからコントラクトとやりとりして送金することもできますが今回はMETAMASKを使いたいので割愛します。
![Screenshot 2023-09-20 at 13.07.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/29c14d46-9feb-5c5e-5426-e83850aff9ec.png)
これでGoerli Testnetへのデプロイ完了です！

#### 2.4. Etherscanで確認
Etherscan(Goerli)で先ほどデプロイしたtJPYを確認しましょう。

https://goerli.etherscan.io

Etherscan(Goerli)でコントラクトアドレスを検索します。

:::note info
コントラクトアドレスはどこ？
先ほどの画面左下の「Deployed Contracts」のクリップボードボタンでコントラクトのアドレスを取得できます。
:::

期待通りtJPYトークンがデプロイされていることが確認できます。
ついでにトークンの詳細も確認します。TOKEN TRACKERのリンクをクリックしてください。
![Screenshot 2023-09-20 at 14.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/fbf1f399-d2b6-2b47-4eab-2f5c47c56ff5.png)
するとスマートコントラクトで設定した通りに名前、シンボル、発行数量が設定されています。これでバッチリです。
![Screenshot 2023-09-20 at 15.01.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/c328882c-06ac-0f9f-d3f0-458e39d2a531.png)

トークンを"作る"パートはこれで以上です。

## 使う
最後に、先ほどデプロイしたトークンtJPYをMETAMASKを使って送金したいと思います。

と、当たり前のように言っていますが、なぜこれが可能かというと、METAMASKがERC-20トークに対応していて、かつ今回のコントラクトもERC-20に従って実装したからです。
なのでMETAMSKに限らずERC-20トークンに対応しているアプリケーションであれば同様に扱うことができます。

では続けます。

### 1. METAMASKにtJPYを認識させる
METAMSKで先ほどのコントラクトアドレスを入力してtJPYをインポートします。

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/cf2088a8-6bf5-ae1d-aeee-0bb6bb8f808f.png"><img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/387e0fea-94eb-cf89-51bb-7da84bb2ce63.png"><img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/4c811ec0-3a43-acb7-6daa-a527ab9a8444.png">


### 2. 送金する
「:construction_worker_tone1:Dev1 - Unsafe」から「:construction_worker_tone5:Dev2 - Unsafe」へtJPYを送金しようと思います。
ということで「Send」ボタンをタップして送金相手を選択します。
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/4c811ec0-3a43-acb7-6daa-a527ab9a8444.png"><img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/556eb492-c1d4-ef5c-a2d4-4b1a492a8a30.png">

1000tJPY送金しようと思うのでAmount欄に「1000」を入力して「Next」をタップし、内容に誤りがないことを確認したら「Confirm」をタップして送金を実行します。
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/08691976-a4ac-7bf0-6d7b-6ab26c7012af.png"><img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/2ca45ffe-d50d-ebcd-5c93-5eb21020e864.png">

結果、「:construction_worker_tone1:Dev1 - Unsafe」から1000tJPY差し引かれ、「:construction_worker_tone5:Dev2 - Unsafe」に1000tJPY入金されました。
（事前に:construction_worker_tone5:Dev2 - UnsafeアカウントにもtJPYを認識させています）
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/8ee2fc8d-d425-d126-b136-00346cd09c01.png"><img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/3ca9a39e-8a46-4a1b-5527-4b1a9524c757.png">

### 3. Etherscanで送金履歴を確認する
コントラクトを確認します。
「:construction_worker_tone1:Dev1 - Unsafe」がコントラクトを呼び出しているのが分かります。
これで分かるのは、「:construction_worker_tone1:Dev1 - Unsafe」が直接「:construction_worker_tone5:Dev2 - Unsafe」に送金しているのではなく、
「:construction_worker_tone1:Dev1 - Unsafe」に呼び出されたコントラクトが「:construction_worker_tone5:Dev2 - Unsafe」へ送金する仕組みになっているということです。
![Screenshot 2023-09-20 at 15.45.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/42812016-4ff3-dd5f-c74f-6b7f3c81c8f9.png)


ということでその詳細をTOKER TRAKERページで確認します。
すると確かに「:construction_worker_tone1:Dev1 - Unsafe」が「:construction_worker_tone5:Dev2 - Unsafe」に1000tJPY送金していることが確認できます。
![Screenshot 2023-09-20 at 15.41.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559834/d3bb80ef-b5f5-748b-e7f0-15d22a37a685.png)

トークンを"使う"パートもこれで以上です。

## まとめ
ERC-20トークンを実装しテストネットワークにデプロイしてMETAMASKで送金するという一連の流れを体験しました。
当たり前のようにtJPYがMETAMSKで認識され、当たり前のように送金することができましたが、これが規格（今回でいうERC-20）による恩恵なんだなぁだと感じました。

EtherscanでのコントラクトのVerifyも扱う予定でしたが、今回のソースコードはOpenZeppelinの外部ライブラリを使っているために一工夫必要で説明が難しくなりそうだったので今回割愛しました。気になった方は調べてみてください。

### thirdweb
今回は自作しましたが、thirdwebを使えばブラウザ上のボタンクリックだけでスマートコントラクトをデプロイ＆管理することができます。一般的な機能が欲しいだけであればこういったツールを使った方が早く安く確実だと思います。非常に簡単にできるので使うと驚くと思います。
一方、特有の機能や条件を組み込みたいのであれば自作する必要があります。なので適材適所だと思います。

https://thirdweb.com/