ERC20開発ハンズオン2(EOAへapproveしてtransferFromを行う編)

# はじめに

https://qiita.com/shu-kob/items/d298e6d658b5075d293b

↑こちらの記事の続編になります

上記の記事を読まなくてもこの記事だけでERC20発行から行えます。

# ERC20開発

## ERC20発行

ERC20発行したことある方は復習で、ない方は上記「はじめに」の記事も参考にしつつ、MetamaskとRemixを連携させて、Ropstenでトークンを発行してみましょう。

https://wizard.openzeppelin.com/

こちらの便利ツールを使います。

![スクリーンショット 2022-04-03 12.28.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/444393cb-9635-0468-d6fe-4ba6955573d5.png)

`SETTINGS`の`Name`、`Symbol`に任意のトークン名を入力、

`Premint`に任意の発行枚数を入力します。

コードをコピーして、Remixで作成した新しい`.sol`ファイルににペーストします。

![スクリーンショット 2022-04-03 12.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/3d9d59cc-1adf-974b-916e-94d093bb2278.png)

```SakeToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

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

contract SakeToken is ERC20 {
    constructor() ERC20("SakeToken", "SAKE") {
        _mint(msg.sender, 21000000 * 10 ** decimals());
    }
}
```

![スクリーンショット 2022-04-03 12.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/b63368e7-ac05-2358-5400-f57ddf8aa741.png)

MetamaskのTestnet、例えばRopstenに接続し、Contractは作成したファイルを選択し、デプロイします。

https://ropsten.etherscan.io/tx/0x02e2e35e7d8999a752dd5a48b5fa34c451fe8ac41b178cb0e296d36dc84cc773

デプロイできました。

デプロイできたら、`decimals`, `Name`, `Symbol`, `totalSupply`ボタンを押してみましょう。

これらは関数で、Ethereumネットワーク上にあるデプロイしたコントラクトの状態を調べることができます。

![スクリーンショット 2022-04-03 12.38.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/65a4cf62-758c-e9c6-9721-1dc2efbdb1ae.png)

![スクリーンショット 2022-04-03 12.40.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/08b1dc20-892e-77e7-6066-791b3cba98e5.png)

デプロイに使ったアカウント（以下、アリスとする）を`balanceOf`の入力欄に入れ、`call`ボタンを押してみましょう。

21,000,000 * 10**18発行されています。10の18乗はデフォルトの設定になります。

## ERC20転送

![スクリーンショット 2022-04-03 12.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/b91888c0-979a-2ce9-d85a-48fc65098070.png)

別のアドレス（以下、ボブとする）を用意し、`balanceOf`の入力欄に入れ、`call`ボタンを押してみましょう。

デプロイしたアカウントにしかトークンは存在しないので、それ以外のアカウントは当然ながらゼロです。

![スクリーンショット 2022-04-03 12.44.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/6fd62c4d-0afd-c7b2-39de-c0cab24b589a.png)

このアカウントに対して、任意の額(この記事の見本では600万SAKE)を送ってみましょう。

https://ropsten.etherscan.io/tx/0x65e77949859880c9a0cc3a1b9dd45407397e30f9865b21bb34f7c405ee4135fe

転送できました。

![スクリーンショット 2022-04-03 12.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/619240d9-3d5a-2869-3fb7-b1a66ea114ef.png)

再度、`balanceOf`を見てみると、受け取った額が表示されています。

## ERC20の委任

### approve

`approve`, `transferFrom`関数を使うと、キャロルがSAKEを持っていなくても、ボブがキャロルにトークンの転送を委任することができます。

Remixに接続するアカウントをボブに切り替えます。

![スクリーンショット 2022-04-03 12.51.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/d6ed3154-365d-af5a-e01b-e493b9ffa67f.png)

キャロル役のアカウントを用意し、`approve`関数の`spender`にキャロルのアカウントを、`amount`に委任する任意の額(ここでは300万SAKE）を入力し、`transact`ボタンを押します。

実行結果がこちら

https://ropsten.etherscan.io/tx/0x34b50fb94f06f53e26b1043d789a85ecff7f853687c7ac7627a5ed5f8f990bfc

![スクリーンショット 2022-04-03 12.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/0a97e89f-7cc2-5ccb-6af1-d965680f2281.png)

`allownance`の`owner`にボブのアカウント、`spender`にキャロルのアカウントを入力し、`call`を押すと、委任した額が表示されていることを確認できます。

### transferFrom

これまでとは別のアカウント（以下、デビットとする）を用意します。

`transferFrom`の`from`にボブのアカウント、`to`にデビットのアカウント、`amount`はボブがキャロルに委任した額の範囲内で入力し、キャロルのアカウントで実行します。

![スクリーンショット 2022-04-03 14.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194002/b7d95c45-dfad-9e1f-5828-884c90e32709.png)

https://ropsten.etherscan.io/tx/0xf288a778a358c1ed3b3287a8cb2de20c1c9bf0bc57e9081aae1d3045a2ce52e4

キャロルが実行し、ボブからデビットへ250万SAKE移動したことがわかります。

今回は、人が操作するEOA(Externally Owned Account)に対して、委任を行いましたが、

↓次回はコントラクトへの委任を行います。

https://qiita.com/shu-kob/items/ff43eb313233538d8272