Solana MetaplexとCandy Machine v2のMetadata設定・出力とPhantomのグルーピング

Solana MetaplexのMetadataが、どういう出力になるのか、Phantomがどういう単位でNFTをグルーピングしているのかわからなかったため、検証した。
(特に、Metaplexでcollectionのname, familyを指定する場所がなかったので、どのような出力になるのかが気になった)

Metaplex Storefront を利用した場合

MetaplexのStorefrontでNFT作成した場合の検証。
Storefront: metaplex/js yarn startで立ち上がる画面。

Master Edition

結果

  • Mint元になるオリジナルNFTで、Metaplex上は「NFT0」と表示
  • Mutable(=変更可)
  • collectionは出力されない

https://solscan.io/token/Cm6rGyudSYA8RNGTaia8xeAszLYAFsLZBcan4474kPhq?cluster=devnet#metadata

{
    "name": "вальдемар",
    "symbol": "",
    "description": "вальдемар",
    "seller_fee_basis_points": 100,
    "image": "https://www.arweave.net/37v8c5w1OSmF-1NAcUriBr0F_gcwWWsyPYGfpx7n6P4?ext=jpg",
    "attributes": [],
    "external_url": "",
    "properties": {
        "files": [
            {
                "uri": "https://www.arweave.net/37v8c5w1OSmF-1NAcUriBr0F_gcwWWsyPYGfpx7n6P4?ext=jpg",
                "type": "image/jpeg"
            }
        ],
        "category": "image",
        "creators": [
            {
                "address": "HXtBm8XZbxaTt41uqaKhwUAa6Z1aPyvJdsZVENiWsetg",
                "share": 100
            }
        ]
    }
}

Edition

結果

  • Master EditionからMintしたNFTで、Metaplex上は「1 of 1」のように表示
  • Not Mutable(変更不可)
  • collectionは出力されない

https://solscan.io/token/GPozydbUXby6eLd1p9FNrRGqV1q6VTdBcUKS5cMu79Tp?cluster=devnet#metadata

{
    "name": "вальдемар",
    "symbol": "",
    "description": "вальдемар",
    "seller_fee_basis_points": 100,
    "image": "https://www.arweave.net/37v8c5w1OSmF-1NAcUriBr0F_gcwWWsyPYGfpx7n6P4?ext=jpg",
    "attributes": [],
    "external_url": "",
    "properties": {
        "files": [
            {
                "uri": "https://www.arweave.net/37v8c5w1OSmF-1NAcUriBr0F_gcwWWsyPYGfpx7n6P4?ext=jpg",
                "type": "image/jpeg"
            }
        ],
        "category": "image",
        "creators": [
            {
                "address": "HXtBm8XZbxaTt41uqaKhwUAa6Z1aPyvJdsZVENiWsetg",
                "share": 100
            }
        ]
    }
}

Candy Machine v2 を利用した場合

CLIでMetadataと素材を作成して、FrontendでMintした場合の検証。
CLI: candy-machine-v2-cli.ts
Frontend: candy-machine-ui

collection指定

結果

https://solscan.io/token/3ngy8R3AyGnyhLYznpz7GWicErJJhe64MYtRpsjPZCkV?cluster=devnet#metadata

{
    "name": "Number #0003",
    "symbol": "NB",
    "description": "Collection of 10 numbers on the blockchain. This is the number 3/10.",
    "seller_fee_basis_points": 500,
    "image": "https://www.arweave.net/kDYPnckFwUQxEHkk16yr0D4EkJVusaEOcIpeW8gg8aE?ext=png",
    "attributes": [
        {
            "trait_type": "Layer-1",
            "value": "0"
        },
        {
            "trait_type": "Layer-2",
            "value": "0"
        },
        {
            "trait_type": "Layer-3",
            "value": "0"
        },
        {
            "trait_type": "Layer-4",
            "value": "3"
        }
    ],
    "properties": {
        "creators": [
            {
                "address": "HXtBm8XZbxaTt41uqaKhwUAa6Z1aPyvJdsZVENiWsetg",
                "share": 100
            }
        ],
        "files": [
            {
                "uri": "https://www.arweave.net/kDYPnckFwUQxEHkk16yr0D4EkJVusaEOcIpeW8gg8aE?ext=png",
                "type": "image/png"
            }
        ]
    },
    "collection": {
        "name": "numbers",
        "family": "numbers"
    }
}

読込元Metadataファイル(2.json)

{
    "name": "Number #0003",
    "symbol": "NB",
    "description": "Collection of 10 numbers on the blockchain. This is the number 3/10.",
    "seller_fee_basis_points": 500,
    "image": "2.png",
    "attributes": [
        {"trait_type": "Layer-1", "value": "0"},
        {"trait_type": "Layer-2", "value": "0"},
        {"trait_type": "Layer-3", "value": "0"},
        {"trait_type": "Layer-4", "value": "3"}
    ],
    "properties": {
        "creators": [{"address": "HXtBm8XZbxaTt41uqaKhwUAa6Z1aPyvJdsZVENiWsetg", "share": 100}],
        "files": [{"uri": "2.png", "type": "image/png"}]
    },
    "collection": {"name": "numbers", "family": "numbers"}
}

collectionを空指定

結果

https://solscan.io/token/DT6ocLTqhBeCzGzFH2m8skYhUDky8bb9NpvMs7Lg5vH8?cluster=devnet#metadata

{
    "name": "2",
    "symbol": "",
    "image": "https://www.arweave.net/ksDLX2149o0HbyIubHs2k-8EmYTVBOyNGKcw_JVR6q8?ext=png",
    "properties": {
        "files": [
            {
                "uri": "https://www.arweave.net/ksDLX2149o0HbyIubHs2k-8EmYTVBOyNGKcw_JVR6q8?ext=png",
                "type": "image/png"
            }
        ],
        "category": "image",
        "creators": []
    },
    "description": "",
    "seller_fee_basis_points": 500,
    "attributes": [
        {
            "trait_type": "background",
            "value": "light-blue"
        },
        {
            "trait_type": "eyes",
            "value": "star-eyes"
        },
        {
            "trait_type": "mouth",
            "value": "triangle-mouth"
        },
        {
            "trait_type": "face",
            "value": "teal-face"
        }
    ],
    "collection": {}
}

読込元Metadataファイル(1.json)

{
    "name": "2",
    "symbol": "",
    "image": "1.png",
    "properties": {
        "files": [
            {
                "uri": "1.png",
                "type": "image/png"
            }
        ],
        "category": "image",
        "creators": []
    },
    "description": "",
    "seller_fee_basis_points": 500,
    "attributes": [
        {
            "trait_type": "background",
            "value": "light-blue"
        },
        {
            "trait_type": "eyes",
            "value": "star-eyes"
        },
        {
            "trait_type": "mouth",
            "value": "triangle-mouth"
        },
        {
            "trait_type": "face",
            "value": "teal-face"
        }
    ],
    "collection": {}
}

Phantom

グルーピングの基本ルール

意訳すると、「Phantom上でNFTを表示するときは、まずCreatorsのアドレスをもとにグルーピングする。そのあと、ベストエフォートで各項目をチェックしてグルーピング名を決める。」とのこと。

引用:Phantom Grouping Non-Fungible Tokens

Grouping Non-Fungible Tokens

Phantom groups non-fungible tokens by the first verified creator's address in the creators array found on the on-chain metadata.

When a group is created, a best-effort process is used to determine that group’s name. That is because not every collection includes all the uri schema json key / value pairs. The following data is therefore used in descending order of preference:

1. collection.name
2. collection.family
3. external_url (parsed to remove url parts)
4. name (of a single collectible)
5. symbol
6. address of the first verified creator in the creators array (also used to group the collection)

Please add the above mentioned data if you are a creator and want your collection to be displayed properly in Phantom. 

Candy Machine v2で作成した場合

Candy Machine v2 で、まったく同じ内容で2セット(10件のNFT x 2回デプロイ)をデプロイしたところ、1つにグルーピングされずにわかれてしまった。

Candy Machine v2 で作成したNFTを見てみると、Creatorsに身に覚えないのないアドレスが先頭にセットされている。
原因はおそらくこれで、Creatorsに Candy Machine v2 用のPDAアカウント(ユーザーの代わりに実行してくれるエスクローの仕組み)が自動的にセットされてしまうと思われ、別物のコレクションとして認識されたのではと推測している。
(Candy Machineの設定で対応できそうなものだが、調べても解決方法わからず。config.jsonやassetsの.jsonもいろいろ変更してみたがダメだった)

MetaplexのStorefrontだと、Creatorsに余計なアドレスが紐付かないため、自身で作成したNFTだと、1つにグルーピングされる。しかし、コレクション指定する方法がないようなので、常に1つにグルーピングされてしまうっぽい。