PolygonでERC721をmapping

# はじめに

MaticネットワークへとEthereumネットワークではブリッジと呼ばれるスマートコントラクトを用いることで、
資産の移動を相互に行うことが可能となっています。


![スクリーンショット 2022-04-19 11.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/f4573532-05b3-20a5-2d2b-a43e41c84191.png)



ブリッジには、PlasmaブリッジとPoSブリッジの二種類があり、現状は、PoSブリッジが推奨されているようです。

Polygon | Ethereum's Internet of Blockchains
https://polygon.technology

現在PolygonではEthereumとMaticネットワークがつながっている状態で、
今後、さまざまなレイヤー2ネットワークがサポートされる計画となっています。

![スクリーンショット 2022-02-03 17.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/6cfd57f0-7923-d2d5-2aa4-abeeec0cee3a.png)

勉強会の資料として、利用するために、faucetで、testtokenを取得するところから、Contractの記述、Verify、マッピングまですべての流れを記載しておくので、初心者の方でも一つずつ丁寧に行うことで、最後まで実行できると思いますので参考にしてみてください。

https://docs.polygon.technology/


# テスト環境
Polygonのテスト用に下記の環境のマッピングが用意されています。
Ethereum/Goerli <-> Polygon/Mumbai

# 手順

## テストトークンなどの準備

### 1.metamaskでアカウントを作成

### 2.faucetからGoerliのEthereumを取得する

https://faucet.goerli.mudit.blog/

![スクリーンショット 2022-02-03 11.17.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/c3384ca0-b83b-9aa5-008c-021a2d659b91.png)

### 3.Maticの環境でfaucetからMATICを取得する

https://faucet.polygon.technology/

![スクリーンショット 2022-02-03 11.17.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/d0e1b16c-4c22-f597-a331-6aaf2e09c841.png)


## ERC721のコントラクトを準備

### 1.remixdをインストール
ローカルのファイルをブラウザのremixでソースコードを記述するために、remixdを立ち上げておきます。

```
//remixdをinstall (https://www.npmjs.com/package/@remix-project/remixd)
$ npm install -g @remix-project/remixd
//daemonを立ち上げ
$ remixd -s . --remix-ide https://remix.ethereum.org
//remixにアクセスする
https://remix.ethereum.org/
```

### 2. RemixのFILEEXPLORERSからlocalhostに接続する

![スクリーンショット 2022-02-03 11.54.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/e9953f70-1aeb-de2d-ab22-8f129faa38b3.png)

![スクリーンショット 2022-02-03 11.55.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/4c67c243-d61b-47b3-6837-8e0419aa5da8.png)


基本的なERC721のコントラクトは下記のような形okです。
今回は画像付きのNFTを発行するためにdemo2.solのコントラクトを使っています。

```demo1.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

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

contract MyCollectible is ERC721 {
    constructor() ERC721("MaticDemoToken", "MDT") {
    }
}
```

```demo2.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.2/contracts/token/ERC721/ERC721.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.2/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.2/contracts/utils/Counters.sol";

contract MaticDemoToken is ERC721URIStorage {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    constructor () ERC721 ("MaticDemoToken", "MDT") {}
    function mint(string memory tokenURI) public returns (uint256) {
        uint256 newItemId = _tokenIds.current();
        _safeMint(msg.sender, newItemId);
        _setTokenURI(newItemId, tokenURI);
　　　　　　　　　　　　　　　　_tokenIds.increment();
        return newItemId;
    }
}
```

### 3. RemixのPLUGIN MANAGERでFLATTENERを探す

今回はmappingのためにverifyする必要がありますが、verify時に、importして利用するcontractなどもすべて合わせておく必要があります。そのために、FLATTENERというモジュールを使います。
このモジュールを利用することですべて1枚のsolに結合することが可能となります。


![スクリーンショット 2022-02-03 15.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/3fc79ee5-3e53-1388-3918-f69ba8b20f17.png)


### 4. FLATTENERでSaveを押下する
![スクリーンショット 2022-02-03 15.12.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/bc40f784-1d2c-ada2-8c7a-d1ade50d3d5a.png)

### 5. test.solからtest_flat.solが作成される
![スクリーンショット 2022-02-03 15.13.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/398e2595-2898-4ca1-0564-52007b6ba4c5.png)

### 6. test_flat.solをcompile & deployする

[compile]
COMPILERを環境にあわせる
COMPILER CONFIGURATION -> Auto compileにチェック
COMPILER CONFIGURATION -> Enable optimization を 200に設定

![スクリーンショット 2022-02-03 17.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/8d72427f-c95d-ac23-47e7-b5a83ff3477f.png)

[deploy]
ENVIRONMENT => injected Web3 <-この設定によって、メタマスクのネットワークが選ばれます

![スクリーンショット 2022-02-03 16.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/a37bbb44-7482-ecc9-7a7f-97c7750e0be0.png)


### 7.Deplyoed Contractsに実行可能な関数が表示される。-> mintする

![スクリーンショット 2022-02-03 17.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/777cc2f0-a71c-0eb7-ad3e-7e6d92f20ea2.png)

https://gateway.pinata.cloud/ipfs/QmfRdo2CAfP7VVpweGKs8fwQ9ZGDwFb45Q4Y9mNv6FhnRi

![スクリーンショット 2022-02-03 17.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/77ebe609-aab6-8da4-c54e-dfd776df7632.png)


### 8. etherscanからveryfyを行う

### 8-1.EtherScanのVerifyのリンクを押下

![スクリーンショット 2022-02-03 17.04.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/5881a9a2-9ad9-9980-f465-2a743208a92e.png)

### 8-2.
SingleFileを選択
コンパイラーのバージョンを選択
ライセンスを選択

![スクリーンショット 2022-02-03 17.05.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/daba50f0-30be-44a7-ccd9-a3fb29f9a236.png)

### 8-3.
OptimizationをYes
Enter the Solidity Contract Code below にtest_flat.solコードを貼り付け
他は空欄でOK (deploy時に引数がなければ必要がない。もし引数があれば入力が必要)

![スクリーンショット 2022-02-03 17.06.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/7ccf0b11-ff82-54fb-2c99-899318272a84.png)


Goerli>>
0xe496Eea28c3D0DC1055cB4659deaD6b2E8D1CB62

matic>>>
0x47277af202C16E6ff55b4356Eb939b27ADF0372c


## Mappingをつくる

### 1. 必要な情報を入力する
![スクリーンショット 2022-02-03 16.52.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/9db13b70-c03a-b083-6709-2e3eea69c56f.png)

![スクリーンショット 2022-02-03 16.51.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/7c67a5fe-c14a-9da6-8168-6f26e053f4c3.png)

## Mainnetで実装するためにMATICを得る
mainnetで実装するためにはEthereumとMaticが必要になります。


![スクリーンショット 2022-04-19 11.43.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/611b15d9-289c-0fa2-47c5-9fffb831760e.png)


(注意)
このやり方だと、Ethereumのガス代が高騰しているので、6matic(日本円で、おおよそ1000円)送るのに
Swapに20ドル、ネットワークの移動に15ドル、合計35ドルほどかかりました。Maticを扱っている海外の取引所でアカウントを作った方が良いので、あくまで、手元にEthereumがあって、あえてmaticに変換したい人向けです。

### 1.取引所でETHを購入。事前にMetamaskに送金しておく

### 2.Metamaskでswapする

![スクリーンショット 2022-04-15 10.38.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/4fd44a9a-b6c1-cbce-c05d-f829e95f43d6.png)

### 3.maticをbridgeを通じて、polygonネットワークに送る

https://wallet.polygon.technology/bridge

移動したい金額をいれる
![スクリーンショット 2022-04-18 13.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/65f04228-4bb2-10b4-ee68-faf44c6550b3.png)

ステーキング用の受け口じゃないよという注意書き。今回は移動するだけなのでこれでok。
![スクリーンショット 2022-04-18 13.15.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/e670e084-95aa-5d87-892e-8a0923224ab5.png)

approveにガス代がかかる。
![スクリーンショット 2022-04-18 13.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/d670ca82-6866-0fdf-0e4e-8a68000fb111.png)

実行中
![スクリーンショット 2022-04-18 13.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/cf9def2f-94f3-026a-dda5-24ecd76ca19b.png)

さらにconfirmにもガス代がかかる
![スクリーンショット 2022-04-18 13.18.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/4ab38e56-282e-a7f6-e415-a787928e1df2.png)

完了
![スクリーンショット 2022-04-18 16.07.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/b7728b42-d5e9-3a62-345b-69d7a1540372.png)


# 参考

https://gaiax-blockchain.com/polygon

https://learn.figment.io/tutorials/transfer-nfts-using-the-polygon-pos-bridge-and-sdk