Remix IDEを使ってテストネットにNFT(Non-Fungible Token)を作るまで

## 概要

Remix IDEを使用してEthereumのテストネットにERC721に基づいたNFT(Non-Fungible Token)を作成する手順まとめた．
NFTを作成して確認するまでの最低限の手順だけでも，備忘録として残しておこうと思う．

:::note warn
今回の記事では，**画像の登録などを行いません**
もし画像付きのNFTを発行する場合はTokenURIなどの設定が追加で必要になります．
:::


## RemixIDEについて

https://remix.ethereum.org/

ブラウザの統合開発環境で，コントラクトのソースコードであるSolidityの記述が可能．
コントラクトの作成からデプロイまでを一括で行うことができる．
ローカルで編集したsolidityコードのアップロードして編集することも可能．

:::note warn
ブラウザのキャッシュに編集データが残るため，キャッシュクリアすると戻せない．
編集したデータは一応ローカルにダウンロードしておくと良い
:::

## 準備するもの

### MetaMaskの拡張機能のインストール

https://chromewebstore.google.com/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=ja&pli=1

インストールしてウォレットの作成まで進める．

:::note warn
firefox版とchrome版の2種類があるが，**chrome版**を推奨．
firefox版だと所持しているNFTの画像がうまく表示されなかったりする..
:::

### sepoliaテストネットへの接続

MetaMaskの接続先をテストネットに切り替える．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/e5352238-7eb1-57e7-40a7-f4aec9abb1de.png)

1. MetaMaskの拡張機能をクリック
1. 「ローカルテストネットワークを表示」をオンにする
1. Sepoliaをクリック

:::note warn
テストネットにコントラクトをデプロイする際は，接続するネットの通貨を所持している必要がある．
通貨はfausetと呼ばれるサイトで配布されている．
:::

fausetなどテストネットについては以下の記事でまとめた．

https://qiita.com/Killinneko/items/dac4a43fefa6e9281246

## NFTを作るまで

### 1. RemixIDEでsolidtyのコードを書く

まずは，コントラクトをsolidtyで作成する．
とはいえ，RemixIDEを利用すると大枠をほとんど作成してくれる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/87587378-5986-021a-b1d1-335549b37368.png)

以下のようにソースコードが生成される．

```solidty:MyToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

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

contract MyToken is ERC721, Ownable {
    constructor(address initialOwner)
        ERC721("MyToken", "MTK") // MyToken..トークン名 MTK..トークン名の略称
        Ownable(initialOwner)
    {}

    function safeMint(address to, uint256 tokenId) public onlyOwner {
        _safeMint(to, tokenId);
    }
}
```

任意で，ソースコードのうち，トークンの名前や略称を変えて置けばよい．

### 2. コンパイル・デプロイする

作成したsolファイルをコンパイルしてデプロイする．
コントラクト(作成してすぐだとMytoken.sol)を選択して，「Compile MyToken.sol」を選択する．
画像のように，左側のタブに緑のアイコンが付いたらコンパイルが成功する．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/59c25358-6c7b-f7d1-7a3f-8cac5ac23968.png)

::: note 
「Auto compile」にチェックを入れておくと，
solファイルを編集するたびに自動でコンパイルしてくれる．

特に理由がなければチェックを入れておくと便利．
:::

次にデプロイする．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/35967bf1-0477-b362-b42e-d69ddb4d2765.png)

::: note warn
3.の作業で，Deployボタンの右側に入れるウォレットアドレスは，**コントラクトのオーナーとなるアドレス**です．
特にsolファイルを触らない限り，NFTの発行ができるのはオーナーのみ(onlyOwner)になるので，間違えないように注意してください．
:::

デプロイのボタンを押すと，拡張機能にポップアップがでる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/21e62162-25ec-b97e-b527-7c53faf0805a.png)

ここで，確認を押すとトランザクションが発行されて，
コントラクトがテストネットにデプロイされる．

### 3. NFTを発行する

NFTの発行は，コントラクトの操作(トランザクション)を通して行う．
同じくデプロイのタブの下に「Deployed Contracts」がある．
クリックすると，コントラクトの関数一覧が表示される．

その中で，「safemint」という関数でNFTを発行する
safemintのタブを押すと，to と tokenIDを指定するボックスが出現する．
to は NFTの所有者となるウォレットアドレスを入力し，
tokenID は NFTのIDを入力する(0以上の整数)．

記入したらtransactボタンを押す．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/318e845b-4af9-466f-2cdb-19c436e80a51.png)

コントラクト発行時と同様に，MetaMaskの拡張機能が開いて確認をクリックする．
すると，safemintが実行される．

### 4. MetaMask・OpenSeaで確認する 

まず検索するために，デプロイしたコントラクトのアドレスをコピーする．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/166e8fac-ee7e-0b1f-04a5-ae042f23dbf2.png)

#### OpenSea で確認

**テストネット用のOpenSea**を開く．
(本番用のOpenSeaでは確認できないので注意)

https://testnets.opensea.io/ja

先ほどコピーしたコントラクトアドレスで検索すると，
デプロイしたコントラクトが出てくる．

tokenURIなど適切な画像のパスをコントラクトに設定することで，
画像の表示が可能となる．

#### MetaMaskで確認

MetaMaskの拡張機能のボタンをクリックしてNFTのタブをクリックした後，
画面下部の「NFTのインポート」をクリックする．

「NFTのインポート」の画面で，
アドレスにデプロイしたコントラクトアドレス，
IDに，safemintで入力したIDを入力してインポートを押す．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/8f8a2f9f-031e-c0b3-3b3a-68c484178ac9.png)

インポートに成功すると，NFTタブに取得したNFTが表示される．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/ff3d6547-649d-2897-f545-31cc0041952e.png)


## まとめ

本記事ではRemix IDEを使用してEthereumのテストネットにおいてERC721に基づいたNFT（Non-Fungible Token）を作成する最低限の手順を紹介しました．
RemixIDEとMetaMaskを用いてコントラクトのデプロイ・NFTの発行を実施して，
作成したNFTをOpenSeaとMetaMaskから取得を確認した．
画像の登録など，NFTの拡張機能については今回の記事では触れませんでしたが、
必要に応じてTokenURIなどの設定が必要になる．