忘れてしまうので、完全な自分用メモです
ERC721のトークン作成して、OpenSeaのテストネットで表示するまでを記載してますが、やってみた的な内容なので不明点も多々
ERC721
- 仕様書
- openzeppelin-contracts実装
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): 指定されたオペレーターが所有者のすべてのトークンに対して許可されているかどうかを返します。
- トークンの情報
トークンの情報: トークンの名前やシンボルなどの基本的な情報を管理します。
name(): トークンの名前を返します。
symbol(): トークンのシンボルを返します。 - イベント
イベントの発行: トークンの転送や許可に関連するイベントを発行します。これにより、外部アプリケーションやウォレットがトークンの動きを追跡できます。
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が必要。
- https://www.alchemy.com/faucets/ethereum-sepolia
- https://cloud.google.com/application/web3/faucet/ethereum/sepolia
コントラクト作成
https://wizard.openzeppelin.com/#erc721
にて、ポチポチ作成できる
作成したコントラクト(NFT)をRemixからデプロイ
最初にコンパイル
-
ENVIRONMENTで「Testnet - Sepolia」を選択
- これでOpenSeaのTestnet上でNFTを確認できるようになる
-
initialOwnerのアドレス(Metamaskのアドレス)を入力してデプロイ
推定フィー
デプロイされたコントラクトの確認
TXの詳細はEtherscanで確認できる
Remix上のログ
コンソールにてDebugログとして確認できる
トランザクション詳細
- ステータス: 0x1 (トランザクションがマイニングされ、実行に成功)
- トランザクションハッシュ: 0x45c7af05034936505b8556f8864e5eee90fcb51b424db0e003b12db8d7d69982
- ブロックハッシュ: 0x72bbfafba46cb93050b1a08a55367211e83e9697e3fb633c0201723f3d57e4de
- ブロックナンバー: 6081530
- コントラクトアドレス: 0x3511dd4c958228bdbe7c7d255e1530904cfbdcbe
- 送信元: 0xa2c07e793b7955d58add5cce9dcd86cadd669d9a
- 宛先: KinoNFT.(constructor)
- ガス: 2251803 ガス
- トランザクションコスト: 2232914 ガス
- 入力データ: 0x608...69d9a
デコードされた入力
- initialOwnerアドレス: 0xa2C07E793B7955d58aDd5ccE9DCD86cADD669D9a
ログ
- from: 0x3511dd4c958228bdbe7c7d255e1530904cfbdcbe
- トピック: 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0
-
イベント: OwnershipTransferred
- 前のオーナー: 0x0000000000000000000000000000000000000000
- 新しいオーナー: 0xa2C07E793B7955d58aDd5ccE9DCD86cADD669D9a
コントラクトの呼出し
以下に呼び出せるメソッドが列挙されるのでポチポチすれば呼び出せる
以降でいくつか呼び出して実際にNFTを発行=>OpenSeaで確認
デプロイしたコントラクトはこれがベース
https://sepolia.etherscan.io/address/0x77db1d56b75f8897780f93ea023f0d0764406270
OpenSea
Metamaskでログインすると、以下のようにテストネットに切り替えるか?と表示されるので切り替える
左上のロゴを確認するとテストネットに接続されているのが確認できる
https://testnets.opensea.io/ja/account
コントラクト呼び出し
safeMint
to: 発行先
uri: tokenに紐づけるメタデータの識別子。以下の画像は間違えた入力になっている
- 発行に成功すれば、OpenSeaでも確認ができる。が、画像が表示されていない。。メタデータに問題!?
- メタデータを.jsonと付与したところ画像表示された!?
- トークンの詳細
ownerOf
識別子0で発行されているので、以下の通り所有者のアドレスを確認できる
tokenURI
想定したものと異なっていた・・
name
トークンの名前
symbol
owner
getApproved
balanceOf
アドレスが保有しているトークン数
メタデータを.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:
- OpenSeaでトークンの履歴(遷移)を確認できる
setApprovalForAll
- 特定のオペレーターアドレスに対して、トークン所有者のすべてのトークンを管理する権限を付与または取り消すために使用されます。この関数を呼び出すと、指定されたオペレーターが所有者のトークンを転送する許可を得ることができます。
- setApprovalForAllの効果
- オペレーターに対する全トークンの管理権限の付与:
- 所有者は、オペレーター(別のアドレス)に対して、自分が所有するすべてのトークンの転送を許可することができます。
- オペレーターに対する全トークンの管理権限の取り消し:
- 既に許可したオペレーターに対して、全トークンの管理権限を取り消すこともできます。
- オペレーターに対する全トークンの管理権限の付与:
MetamaskでもNFTを表示させてみる
コントラクトアドレス: 0x77DB1d56b75f8897780F93ea023F0D0764406270
- トークン2をインポート
- インポートされたことを確認できるが、metamask上では画像が表示されない!?
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.
コントラクトのロードも可能
- 何かの拍子で再デプロイした場合など、一覧から消えてしまうがアドレスが控えてあればロードできる
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
コントラクト実装
// 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);
}
}
コンパイル&デプロイ
コントラクト呼び出し
mint
-
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の設定が間違えていたため
- 枚数は2枚所有となっている
public で name を指定してみた
Etherscanでコントラクトを確認
ERC1155 同一nameトークンの表示
- このコントラクトアドレスでは、4回NFTをmintしている
出品
ERC1155ベースのKino1155を出品してみた
アイテム数(出品する枚数)と価格を設定して出品
- OpenSeaにトークンの送信を許可
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
- ログに出品が記録
参考ページ
色々とあっちこっち見てましたのでリンクだけ貼らせて頂きます。ありがとうございます!