NFTをOpenseaで販売するためにはOpenseaのSmartContractを利用するか、もしくは独自のSmartContractを利用して販売するかを選択します。一般的には前者のOpenseaのSmartContractを利用するかと思いますが、ここでは独自のSmartContractを利用してBlockChainにNFTをmintし、それをOpenseaで販売したときに独自のSmartContractのがどのように関わっているかについて実際にトランザクションを追いかけて見たいと思います。
独自のSmartContract(以下、独自Contractと定義)でNFTをmintし、Openseaに公開する手順は下記のNoteに記載をしたので、参考にしていただければと思います。ちなみに、使用している BlockChainはPolygonのtestnetになります。
https://note.com/yutakikuchi/n/n03dc50bc5935
結論として、買い手がBuyした後のContractの呼び出し方は独自Contractは通過せず、OpenSea側のContractが中心と動いているようです。(Polygonscanのlogからはそのように見えます)
以下にその手順を図で概要として、またテキストも書いてます。正直、買い手がBuyしたアクション以降のTransferがややこしすぎるので、かなり端折って書いてます。ここでの登場人物は2名で、初回の売り手と買い手となります。2次流通については図から除外しています。図の説明として、既に独自ContractがDeployされた後の状態からの記載になります。

売り手が独自ContractによりNFTを「mint」する。
独自Contractを通して、売り手がNFTの所有者であることを記録するため、売り手のPublic Addressから独自ContractのPublic Addressにトランザクションを送信、レスポンスを受信
売り手がOpenSea上でNFTを「Sell」する。
独自Contractを通して、売り手のPublic Addressから独自のContractに対して「Set Approval for all」のトランザクションを実施する。これにより独自Contractに対してトークン譲渡自動化が委ねられる
(やや不明確) 「Set Approval for all」の実行後、Approvalの先がOpenSeaのContractにも影響を及ぼしているように見えるが、Polygonscanにて詳細のlogが独自Contract側として追うことができず。
OpenSea上で売り手がNFTをSellしたタイミングで、Metamaskが立ち上がり、OpenSea側へのContractへ署名を求められて、このタイミングからBuyが完了するまでは基本的にはOpenSeaのContractが利用される
買い手がOpenSea上でNFTを「Buy」する。
OpenSeaのContractを通して、Buyした買い手にNFTのTransferが行われる
OpenSeaのContractを通して、買い手から売り手に対して売買価格の支払いが行われる
OpenSeaのContractを通して、売り手が得た購入価格の2.5%のFeeがOpenseaのPublic Addressに対して支払いが行われる
※図の⑥〜⑧は別々の処理で動いているような書き方をしていますが、OpenSeaのContractのトランザクションの1つによって処理がなされています。
Set Approval for allについての参考の記事です。検索してもほとんど日本語のドキュメントは出てきませんが、全権の移譲であるため、実行するユーザーは許可を求められた際に注意が必要なものとされています。
https://stackoverflow.com/questions/69854414/why-and-when-is-setapprovalforall-called
https://qiita.com/rmanzoku/items/a90f265ae499dc21b9cb
Opensea側のSmartContractの呼び出し詳細は下記に記載がされています。
https://recruit.gmo.jp/engineer/jisedai/blog/opensea-research/
今回、独自Contractを利用してOpenSeaにNFTを公開した場合、売買のタイミングでどこまで独自Contractが関連しているかを調査しましたが、結果的には売買の過程ではOpenSea側のContractが呼び出され、それで完結をします。独自Contractへは売り手がSellのタイミングでSet Approval for allによって権限の移譲が行われているようでした。
