📌

OpenSeaのOn-Chain クリエイターフィー管理ツールの実装と検証

2022/11/17に公開

OpenSeaのOn-Chain Loyalty

NFT界隈がざわついた(?)記事がOpenSeaから投稿されました。
https://opensea.io/blog/announcements/on-creator-fees/

既存のオフチェーンでのロイヤルティの徴収を廃止し、特定のコントラクトを埋め込んだコレクションのみが今まで通りのロイヤルティ設定を行えるというものです。

既に作成されたコレクションのロイヤルティに関しては検討中という内容で出されていましたが数日後に既存コレクションのロイヤルティはそのままという発表もされていました。

https://twitter.com/opensea/status/1590466334814785537?s=20&t=I9aFfRPT6ci7X7LJ0-fqXg

そのため、既にリリース済みのコレクションのオーナーさんに関しては基本そこまで気にしなくて良いですがこれからコレクションを作成するプロジェクトにとってはOpenSeaの方針に従うかどうかというのが1つの実装ポイントとなります。

OpenSeaが提供するツールとは

オンチェーン上でロイヤルティ徴収の記事中でツールについての記載があります。

そしてそのツールというのはGithubに公開されています。

https://github.com/ProjectOpenSea/operator-filter-registry

丁寧にサンプルのコードもついており、基本的にはこの実装方法をそのまま真似れば良さそうです。

https://github.com/ProjectOpenSea/operator-filter-registry/blob/893be50ad825eef10efa38d450060392a6b6b487/src/example/ExampleERC721.sol#L1-L35

対応としてはDefaultOperatorを読み込んで、継承した上でいくつかの関数にmodifierを付与するという内容になります。

実装内容

OperatorFilter関連のコントラクトが特段ライブラリ的に使えるとかでもなさそうなので原始的にファイルを落としてきて読み込む形で実装をしています。

実装するとどうなるか

まず結果だけで言うと、単純にCreator Feeが今まで通り設定可能な状態となります。

ツールを実装したコントラクト

これが実際にツールのおかげなのかを検証するためにツールを埋め込まない版のコントラクトもデプロイしてみましたが、そちらはCreator Feeの設定がDisableになっておりロイヤルティ設定ができないようになっていました。

ツールを実装していないコントラクト

サンプル通りの実装だとOpenSeaが用意したOperatorFilterRegistryに作成したコントラクトが登録され、さらにOpenSeaが用意したBlacklistのアドレスを登録した状態になります。

Blacklistとして登録されているのは以下の取引所でこれらの取引所ではNFTの売買が行えなくなります。

OperatorFilterRegistryのコントラクト操作

記事にも記載がありましたが、各取引所に対して取引を禁止したり可能にしたりは後から更新が可能です。実際に更新をする際にはOperatorFilterRegistryのコントラクト上で操作します。

https://goerli.etherscan.io/address/0x000000000000AAeB6D7670E522A718067333cd4E

実際にコントラクト見ていただくかコード見ていただくとどのようなことが可能かはなんとなく想像ができそうです。


Read Contract

ここで実際にいくつかRead Contractで確認してみます。
filteredOperatorsはブラックリストとして登録されているコントラクトアドレスが表示されます。これはOpenSeaがリストしているコントラクトになります。

他にもisRegisteredやisOperatorFilteredなど登録状況や個別の確認も可能ですが、基本的にはisRegisterdかfilteredOperatorsでデプロイしたコントラクトの確認を行えば問題ないかと思います。

続いてWrite Contractを見ていきます。

OpenSea以外でも取引を可能にする場合は、unregisterやunsubscribeなどを実行することで制限を解除することができます。

また、個別のOperator(取引所)単位で制御を変更したい場合はupdateOperatorを実行することでオペレーター単位での制御が可能です。

実際にそれぞれ試してみましたが、unregisterでもunsubscribeでもfilteredOperatorsは空っぽになっていました。

また、同様に再登録ももちろん可能です。

updateOperatorはなぜかガス代が異様に高かったのでそこは試せていませんが、一旦ツールをコントラクト上に組み込んでも後ほど制約を外せるのがわかったので組み込み自体は安心してできそうです。

Discussion