メモ：自作NFTをOpenSeaテストネットで表示するまで

忘れてしまうので、完全な自分用メモです
ERC721のトークン作成して、OpenSeaのテストネットで表示するまでを記載してますが、やってみた的な内容なので不明点も多々

## ERC721
- 仕様書
    - https://eips.ethereum.org/EIPS/eip-721
- openzeppelin-contracts実装
    - https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721

### ERC-721標準で管理しているもの

- トークン所有権
    - 所有権の管理
        - 各トークンは特定のアドレス（オーナー）に紐づけられます。ERC-721は、各トークンIDがどのアドレスに所有されているかを管理します。
    - ownerOf(uint256 tokenId):
        - 特定のトークンIDに対してその所有者のアドレスを返します。

- トークンの転送
    - トークンの転送
        - トークン所有者は、トークンを他のアドレスに転送できます。ERC-721標準はこれを管理します。
    - transferFrom(address from, address to, uint256 tokenId):
        - 特定のトークンIDを所有者から新しいアドレスに転送します。
    - safeTransferFrom(address from, address to, uint256 tokenId):
        - 安全にトークンを転送し、転送先がスマートコントラクトである場合、そのコントラクトがERC-721対応であることを確認します。

- 承認と許可
    - トークンの使用許可: トークン所有者は他のアドレスに対して自分のトークンを使用する許可を与えることができます。
    - approve(address to, uint256 tokenId): 特定のトークンIDに対して指定されたアドレスに使用許可を与えます。
    - setApprovalForAll(address operator, bool approved): 指定されたオペレーターに対して、すべてのトークンの管理権限を与えるかどうかを設定します。
    - getApproved(uint256 tokenId): 特定のトークンIDに対して許可されたアドレスを返します。
isApprovedForAll(address owner, address operator): 指定されたオペレーターが所有者のすべてのトークンに対して許可されているかどうかを返します。
4. トークンの情報
トークンの情報: トークンの名前やシンボルなどの基本的な情報を管理します。
name(): トークンの名前を返します。
symbol(): トークンのシンボルを返します。
5. イベント
イベントの発行: トークンの転送や許可に関連するイベントを発行します。これにより、外部アプリケーションやウォレットがトークンの動きを追跡できます。
Transfer(address indexed from, address indexed to, uint256 indexed tokenId): トークンが転送されたときに発行されます。
Approval(address indexed owner, address indexed approved, uint256 indexed tokenId): トークンの使用許可が与えられたときに発行されます。
ApprovalForAll(address indexed owner, address indexed operator, bool approved): 所有者がオペレーターに対して全トークンの使用許可を設定したときに発行されます。


# Seploiaテストネットにデプロイ

### テストネットとは？
https://ethereum.org/ja/developers/docs/networks/

### Faucet

以下からETHを送付できる。テストネットでもテスト用ETHが必要。

- https://www.alchemy.com/faucets/ethereum-sepolia
- https://cloud.google.com/application/web3/faucet/ethereum/sepolia

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/40119c48-4ab6-791f-8ce6-d99b224fad8c.png)

### コントラクト作成

https://wizard.openzeppelin.com/#erc721
にて、ポチポチ作成できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/1f3475be-3e73-f617-ad97-f4c2b44389a8.png)

### 作成したコントラクト(NFT)をRemixからデプロイ

最初にコンパイル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/63caa0e1-e730-09c9-b14b-a47d40b5f34b.png)

- ENVIRONMENTで「Testnet - Sepolia」を選択
    - これでOpenSeaのTestnet上でNFTを確認できるようになる

- initialOwnerのアドレス(Metamaskのアドレス)を入力してデプロイ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/91b23f31-3efb-253d-7fbd-0e4979784f48.png)


推定フィー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/52b9b140-0448-fe70-1aa1-9d424045c4ef.png)


### デプロイされたコントラクトの確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/f58777db-235d-607a-5c65-9f15ace98cb7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/c7584dc3-dae8-df74-9c91-4658b0043fb7.png)

### TXの詳細はEtherscanで確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/e7106545-fcf1-1742-9ce5-cd5ef18e7110.png)

### Remix上のログ

コンソールにてDebugログとして確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/f2702223-2de6-7a97-6b44-4ae832bca088.png)


#### トランザクション詳細

- **ステータス**: 0x1 (トランザクションがマイニングされ、実行に成功)
- **トランザクションハッシュ**: 0x45c7af05034936505b8556f8864e5eee90fcb51b424db0e003b12db8d7d69982
- **ブロックハッシュ**: 0x72bbfafba46cb93050b1a08a55367211e83e9697e3fb633c0201723f3d57e4de
- **ブロックナンバー**: 6081530
- **コントラクトアドレス**: 0x3511dd4c958228bdbe7c7d255e1530904cfbdcbe
- **送信元**: 0xa2c07e793b7955d58add5cce9dcd86cadd669d9a
- **宛先**: KinoNFT.(constructor)
- **ガス**: 2251803 ガス
- **トランザクションコスト**: 2232914 ガス
- **入力データ**: 0x608...69d9a

#### デコードされた入力

- **initialOwnerアドレス**: 0xa2C07E793B7955d58aDd5ccE9DCD86cADD669D9a

#### ログ

- **from**: 0x3511dd4c958228bdbe7c7d255e1530904cfbdcbe
- **トピック**: 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0
- **イベント**: OwnershipTransferred
  - **前のオーナー**: 0x0000000000000000000000000000000000000000
  - **新しいオーナー**: 0xa2C07E793B7955d58aDd5ccE9DCD86cADD669D9a


# コントラクトの呼出し

以下に呼び出せるメソッドが列挙されるのでポチポチすれば呼び出せる
以降でいくつか呼び出して実際にNFTを発行=>OpenSeaで確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/61219702-9426-3d5a-ac5a-cde7571cabd7.png)


デプロイしたコントラクトはこれがベース
https://sepolia.etherscan.io/address/0x77db1d56b75f8897780f93ea023f0d0764406270


# OpenSea

Metamaskでログインすると、以下のようにテストネットに切り替えるか？と表示されるので切り替える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/cf61f963-7555-a7cf-5397-f897a720d3bb.png)

左上のロゴを確認するとテストネットに接続されているのが確認できる
https://testnets.opensea.io/ja/account

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/d9013782-a5bc-d877-c0a1-08e4745db0f0.png)


# コントラクト呼び出し

## safeMint

to: 発行先
uri: tokenに紐づけるメタデータの識別子。以下の画像は間違えた入力になっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/dc790c11-b5af-0b04-d5e9-3431e3601053.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/dacd99d5-845c-cbbd-354c-c3c5758df8c4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/977b5a33-8e18-3dbc-e5b4-dcd11e4bf07f.png)


https://sepolia.etherscan.io/tx/0x6d8a8b7ec13693ec67a5a29010566b2a4c555f0abfe42bdba8aa00d6852f9738

- 発行に成功すれば、OpenSeaでも確認ができる。が、画像が表示されていない。。メタデータに問題!?
- メタデータを.jsonと付与したところ画像表示された!?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/f58871cf-c04e-a36f-796a-5833f3c3cee1.png)

- トークンの詳細

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/8b828f87-65b1-50bf-56d2-5a4914fedd76.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/101bcd08-83ed-8c6a-75fe-5467457a96b6.png)



## ownerOf

識別子0で発行されているので、以下の通り所有者のアドレスを確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/4331c763-e516-27be-7c3b-f16285432c89.png)

## tokenURI

想定したものと異なっていた・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/55c16b4b-1702-e51d-d2d0-6d3e19e0d959.png)

## name

トークンの名前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/65d8c151-2a99-51bc-b734-23daa5ad0f28.png)

## symbol

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/dba89caa-7745-cf06-efb2-abe98605ecfb.png)

## owner

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/cd39a33c-b89e-7920-0474-a34a122eb607.png)


## getApproved

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/a48d179d-5185-0be0-3bd9-0ff56705b61d.png)

## balanceOf

アドレスが保有しているトークン数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/20d29c4a-b34c-83dc-0ec7-863583f410ad.png)


## メタデータを.jsonと付与したところ画像表示された

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/e495b8a8-5c20-2c2d-bc36-d19aaf079425.png)

https://testnets.opensea.io/ja/assets/sepolia/0x77db1d56b75f8897780f93ea023f0d0764406270/2

- メタデータの中身

```1.json
{
  "name": "kinoko no 1",
  "description": "This is a 1 Kino No.1 coin.",
  "image": "https://mashandroom.org/wp-content/uploads/2017/04/logo-320x320.png",
  "attributes": [
    {
      "trait_type": "Denomination",
      "value": "1"
    },
    {
      "trait_type": "Material",
      "value": "shimeji"
    }
  ]
}
```
 
## safeTransferFrom

- From: 
- To:
- tokenId:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/25c5ddcc-41a2-606d-2c9b-9a25ece92118.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/444475cc-825f-fb49-ce80-368a879b78e9.png)

- OpenSeaでトークンの履歴（遷移）を確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/86b04bb1-87cd-e2a7-c986-f24033375c94.png)


## setApprovalForAll

- 特定のオペレーターアドレスに対して、トークン所有者のすべてのトークンを管理する権限を付与または取り消すために使用されます。この関数を呼び出すと、指定されたオペレーターが所有者のトークンを転送する許可を得ることができます。
- setApprovalForAllの効果
    - オペレーターに対する全トークンの管理権限の付与:
        - 所有者は、オペレーター（別のアドレス）に対して、自分が所有するすべてのトークンの転送を許可することができます。
    - オペレーターに対する全トークンの管理権限の取り消し:
        - 既に許可したオペレーターに対して、全トークンの管理権限を取り消すこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/05c2dcf9-8fe8-04ac-b42f-b524ef8cc229.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/12d6e389-dd56-2c75-8d4c-e32e8e04c73a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/4862792f-dc50-ad19-28ff-791c24f97990.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/3407a875-0215-983e-597a-b8ed05040a48.png)

- こちらも参考！
    - https://qiita.com/rmanzoku/items/a90f265ae499dc21b9cb


# MetamaskでもNFTを表示させてみる
コントラクトアドレス： 0x77DB1d56b75f8897780F93ea023F0D0764406270

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/f4cd77a9-236c-c811-361d-1c0b3a46079c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/368615a5-1405-44d7-77ef-f9280dce3246.png)

- トークン2をインポート
    - インポートされたことを確認できるが、metamask上では画像が表示されない！？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/5de2f12e-3789-d422-1062-a1baa1240070.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/27174a54-6fa3-b523-18ff-d91c4a5fb7e8.png)


# transferでのガス不足

```
transact to KinoNFT.safeTransferFrom errored: Error occurred: execution reverted.

execution reverted
	The transaction has been reverted to the initial state.
Error provided by the contract:
ERC721InsufficientApproval
Parameters:
{
 "operator": {
  "value": "0xa2C07E793B7955d58aDd5ccE9DCD86cADD669D9a",
  "documentation": "Address that may be allowed to operate on tokens without being their owner."
 },
 "tokenId": {
  "value": "3",
  "documentation": "Identifier number of a token."
 }
}
You may want to cautiously increase the gas limit if the transaction went out of gas.
transact to KinoNFT.safeTransferFrom pending ... 
transact to KinoNFT.safeTransferFrom errored: Error occurred: execution reverted.

execution reverted
	The transaction has been reverted to the initial state.
Error provided by the contract:
ERC721InsufficientApproval
Parameters:
{
 "operator": {
  "value": "0xa2C07E793B7955d58aDd5ccE9DCD86cADD669D9a",
  "documentation": "Address that may be allowed to operate on tokens without being their owner."
 },
 "tokenId": {
  "value": "3",
  "documentation": "Identifier number of a token."
 }
}
You may want to cautiously increase the gas limit if the transaction went out of gas.
```

https://sepolia.etherscan.io/tx/0x88db0ca42a4b79326fb08fcff4210f10c665ba6c7262c70a63a6291316acb6b9

# コントラクトのロードも可能

- 何かの拍子で再デプロイした場合など、一覧から消えてしまうがアドレスが控えてあればロードできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/ec702d10-cdef-9523-8b72-6ee0e192ef37.png)


# ERC1155

同じような手順でOpenSeaで確認できるか試してみた

## 各ドキュメント
- https://docs.openzeppelin.com/contracts/3.x/api/token/erc1155
- https://eips.ethereum.org/EIPS/eip-1155
- https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155


## コントラクト実装

https://wizard.openzeppelin.com/#erc1155

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/fc8d1398-3c15-3682-f0e9-6d3b1175593e.png)

```
// SPDX-License-Identifier: MIT
// Compatible with OpenZeppelin Contracts ^5.0.0
pragma solidity ^0.8.20;

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

contract Kino1155 is ERC1155, Ownable {
    constructor(address initialOwner)
        ERC1155("https://happy2mylife.github.io/t3sampe/{id}.json")
        Ownable(initialOwner)
    {}

    function setURI(string memory newuri) public onlyOwner {
        _setURI(newuri);
    }

    function mint(address account, uint256 id, uint256 amount, bytes memory data)
        public
        onlyOwner
    {
        _mint(account, id, amount, data);
    }

    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        public
        onlyOwner
    {
        _mintBatch(to, ids, amounts, data);
    }
}
```

## コンパイル＆デプロイ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/347b2c0d-939b-6bf4-ab25-dd0e003609ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/0e467da6-3713-8f4f-9971-3489546b7ed2.png)

## コントラクト呼び出し

#### mint

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/418e77b4-c669-785e-8b49-521ef6bc8441.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/eda4e15d-fb9e-6c4f-e315-666e7a109a4b.png)

- Unidentified contract の表示に
    - https://stackoverflow.com/questions/68891144/how-to-fix-unidentified-contract-opensea-is-unable-to-understand-erc1155
    - public で name を宣言する必要があるみたい
    - string public name = "Kino1155";

- 画像が表示されていなかったのは、tokenUriの設定が間違えていたため

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/c73363e4-4b1c-82a1-a7e1-a2440a82464e.png)

- 枚数は2枚所有となっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/015f04f7-ad1b-2bce-4392-38aad2e36343.png)

#### public で name を指定してみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/4765f233-5f72-2d88-6da4-e942033b0aa4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/278078db-4a50-c630-a708-458d478f0dcd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/8b6147cc-c8f5-ceff-3c23-dbfbdf63187a.png)

#### Etherscanでコントラクトを確認

https://sepolia.etherscan.io/address/0x764d8fb78c718439060e157a5de4eaf6deea55b6

- デプロイとmintのTXが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/b14bd472-b810-1562-66b3-398c2656c0ec.png)

- mint TXの詳細
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/8dd86890-9e7a-c86b-869f-7bc76c44868c.png)

    - From,To
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/f000bd0d-c16d-b7d0-4311-e5d2806804ca.png)
        - From: TX発行アカウント
        - To: コントラクトアドレス

    - ERC-1155トークン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/27b206ca-19c6-80ab-2ed0-aaf03d311d9d.png)
        - トークンID:5 のトークンが2枚mintされたのが分かる

    - NFT Detail
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/659c5440-a228-b787-cf6a-d762dd52104e.png)


### ERC1155 同一nameトークンの表示

- このコントラクトアドレスでは、4回NFTをmintしている
    - https://sepolia.etherscan.io/address/0x764d8fb78c718439060e157a5de4eaf6deea55b6

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/d20c16f8-85f2-9a63-c88e-b3e53386bf7c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/417cb5d0-2d6e-e11c-2b0c-c239960aa53a.png)

- このトークンの所有者が2人いることが分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/94a56a7e-3697-a3de-3b61-fec002f54030.png)
    - 1人が4つ保持し、もう1人が1つ保持している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/b8a3d153-8829-6429-2e94-41e79882c178.png)


# 出品

ERC1155ベースのKino1155を出品してみた

アイテム数(出品する枚数)と価格を設定して出品

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/562389f9-66c9-5feb-e796-00f2061d1359.png)

- OpenSeaにトークンの送信を許可

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/b7e66a29-991d-cc03-d24c-195fe87f3b64.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/5d2cc4b0-8725-8d7e-fa86-6589473089e3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/ad7a7e29-2d22-5e03-83a7-817916529d0a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/e2d403d5-a5b4-0102-c849-7afe3cb87ef0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/6a8f29b5-5b01-764d-d8ad-2991f2a86985.png)

```
OrderComponents

Offerer:
Account 7

Offer:
0:
ItemType:3
Token:0x764D8...A55b6

IdentifierOrCriteria:1000000100000001
StartAmount:1
EndAmount:1
Consideration:

0:
ItemType:0
Token:0x00000...00000

IdentifierOrCriteria:0
StartAmount:975000000000000
EndAmount:975000000000000
Recipient:Account 7

1:
ItemType:0
Token:0x00000...00000

IdentifierOrCriteria:0
StartAmount:25000000000000
EndAmount:25000000000000
Recipient:0x0000a...Aa719

StartTime:1718151143
EndTime:1720743143
OrderType:1
Zone:0x004C0...60C00

ZoneHash:0x0000000000000000000000000000000000000000000000000000000000000000
Salt:24446860302761739304752683030156737591518664810215442929801513695076622682397
ConduitKey:0x0000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000
Counter:0
```

- ログに出品が記録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/4bb137bc-b86e-481b-eafe-75d86ae1902c.png)



# 参考ページ
色々とあっちこっち見てましたのでリンクだけ貼らせて頂きます。ありがとうございます！

- https://tech-lab.sios.jp/archives/32656
- https://zenn.dev/razokulover/articles/7db2340f14c2cd
- https://qiita.com/blueplanet/items/2f7f1ceccad28c9650fb
- https://qiita.com/blueplanet/items/4abf55ac2357be7cc324