1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-06-11

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

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): 指定されたオペレーターが所有者のすべてのトークンに対して許可されているかどうかを返します。
  1. トークンの情報
    トークンの情報: トークンの名前やシンボルなどの基本的な情報を管理します。
    name(): トークンの名前を返します。
    symbol(): トークンのシンボルを返します。
  2. イベント
    イベントの発行: トークンの転送や許可に関連するイベントを発行します。これにより、外部アプリケーションやウォレットがトークンの動きを追跡できます。
    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テストネットにデプロイ

テストネットとは?

Faucet

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

image.png

コントラクト作成

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

image.png

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

最初にコンパイル

image.png

  • ENVIRONMENTで「Testnet - Sepolia」を選択

    • これでOpenSeaのTestnet上でNFTを確認できるようになる
  • initialOwnerのアドレス(Metamaskのアドレス)を入力してデプロイ

image.png

推定フィー

image.png

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

image.png

image.png

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

image.png

Remix上のログ

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

image.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://sepolia.etherscan.io/address/0x77db1d56b75f8897780f93ea023f0d0764406270

OpenSea

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

image.png

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

image.png

コントラクト呼び出し

safeMint

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

image.png

image.png

image.png

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

image.png

  • トークンの詳細

image.png

image.png

ownerOf

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

image.png

tokenURI

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

image.png

name

トークンの名前

image.png

symbol

image.png

owner

image.png

getApproved

image.png

balanceOf

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

image.png

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

image.png

  • メタデータの中身
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

image.png

  • OpenSeaでトークンの履歴(遷移)を確認できる

image.png

setApprovalForAll

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

image.png

image.png

image.png

image.png

MetamaskでもNFTを表示させてみる

コントラクトアドレス: 0x77DB1d56b75f8897780F93ea023F0D0764406270

image.png

image.png

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

image.png

image.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.

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

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

image.png

ERC1155

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

各ドキュメント

コントラクト実装

image.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

image.png

コントラクト呼び出し

mint

image.png

image.png

image.png

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

image.png

public で name を指定してみた

image.png

image.png

image.png

Etherscanでコントラクトを確認

  • デプロイとmintのTXが確認できる
    image.png

  • mint TXの詳細
    image.png

    • From,To
      image.png

      • From: TX発行アカウント
      • To: コントラクトアドレス
    • ERC-1155トークン
      image.png

      • トークンID:5 のトークンが2枚mintされたのが分かる
    • NFT Detail
      image.png

ERC1155 同一nameトークンの表示

image.png

image.png

  • このトークンの所有者が2人いることが分かる
    image.png
    • 1人が4つ保持し、もう1人が1つ保持している
      image.png

出品

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

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

image.png

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

image.png

image.png

image.png

image.png

image.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

参考ページ

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?