OpenSeaにて独自ContractでRoyaltyを設定した場合のToken移行処理

はじめに

@yutakikuchi_です。

https://mirror.xyz/0x5C40d264716c12755b1C1ea3395518fFe4bc76ed/vlRRlI7jqswPXmrsYR6zByOcnFCx1s2dDOnOEDGo6So

上で書いたNFT購買プロセスにおいての独自SmartContract(以下独自Contract)において、どれほど処理に関わっているかについて調査しましたが、独自Contractはほぼ関係しておらず、ほとんどがOpenSea側のContractに委ねられているという結論でした。

調査の目的が独自ContractでNFTを公開した際に、そのContractがNFT購買プロセスの中にどれほど外部からデータと通貨のやりとりを独自ロジックとして組み込めるかを見極めたかったのですが、OpenSea上での売買プロセスでは関わりは持てないという事になっています。継続して調査中なのが、売買プロセス完了後に別の独自Contractにトランザクションを飛ばすことで、データと通貨のやりとりに独自性をもたせることが可能かを見ており、そちらは状況が分かり次第別のEntryとして公開します。

このEntryではOpenSeaに対して独自ContractでNFTを公開していることを前提とし、CollectionにてRoyaltyを設定した際の購買トランザクションの挙動におけるTokenの移行処理について纏めます。

前提として

権限的な話として、独自SmartContractにてNFTを公開すると、SmartContractのOwner(作成者、Deployした人)が自動的にそのSmartContractに紐づく形でOpenSeaのCollectionのOwnerになります。

手数料の話として、購買プロセスの中でOpenSeaに対して売り手が払うものは売買価格の2.5%と決まっています。またOpenSeaのCollectionで毎回の売買の手数料の一部をCreator(自身や他者)送金する機能が備わっています。これをRoyalty機能と呼びます。

  • CreatorのPublic Addressに対して販売手数料として10%まで送金設定することができる

  • CreatorのPublic Addressとして、自身でも他者でも設定可能

  • item一個ずつに対してはRoyaltyを設定できないため、Collectionで設定する

  • Royalty機能はデフォルトではOffになっているため、CollectionのOwner自身で設定する必要がある

購買トランザクションの流れ

おおよそ下記の図のようになっています。(少し曖昧に書いている部分もあります。)

NFTを売買する中での独自Contractの呼び出しとTokenの移行処理
NFTを売買する中での独自Contractの呼び出しとTokenの移行処理

③のSet Approval for allについてはPolygonで独自Contractを実装している場合において、下記の実装を加えることでステップとして省略可能ではありますが、おおよそ売り手がNFTを出品し、買い手が購入するまでのお金とNFTの権限移譲は図のとおりになります。

https://docs.opensea.io/docs/polygon-basic-integration#code-example-for-erc721

処理の中心を担っているのはOpenSeaのContractであり、買い手が「Buy」をするとOpenSeaのContractからお金のやり取りが始まり、主に下記の流れを作る役割を担っています。

  • 購買価格の送金を買い手から売り手に対して行う

  • 売り手から販売手数料とRoyaltyをセットで受け取る

  • 販売手数料をOpenSeaのPublic Addressへ送金する

  • Royaltyとして設定したCreatorのPublic Addressへ送金

下記は僕がPolygon mumbaiでRoyaltyを10%で設定した上で走らせた購買プロセスですが、具体的なToken(暗号通貨)の動きは下記のようになります。

post image
  • NFTを0.001ETHとして売り

  • 買い手から売り手に0.001ETH移行

  • 売り手から0.000125ETH(売買価格の12.5%)をOpenSeaのContractへ送金

  • OpenSeaのContractから0.000025ETH(売買価格の2.5%)をOpenSeaのPublic Addressへ送金

  • OpenSeaのContractからCreatorのPublic Addressへ0.0001ETH(売買価格の10%)を送金