# OpenSea上でのNFT購買プロセスにおいて、独自SmartContractの関連度調査

By [Y's note](https://paragraph.com/@y-s-note) · 2022-07-25

---

### はじめに

[@yutakikuchi\_](https://twitter.com/yutakikuchi_)です。

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](https://note.com/yutakikuchi/n/n03dc50bc5935)

### 独自ContractがOpenSeaから呼ばれる関連度の結論

**結論として、買い手がBuyした後のContractの呼び出し方は独自Contractは通過せず、OpenSea側のContractが中心と動いているようです。(Polygonscanのlogからはそのように見えます)**

以下にその手順を図で概要として、またテキストも書いてます。正直、買い手がBuyしたアクション以降のTransferがややこしすぎるので、かなり端折って書いてます。ここでの登場人物は2名で、初回の売り手と買い手となります。2次流通については図から除外しています。図の説明として、既に独自ContractがDeployされた後の状態からの記載になります。

![NFTを売買する中での独自Contractの呼び出し](https://storage.googleapis.com/papyrus_images/81ab7c5c704046d6cd38c690c16614f2399d222f9b7273abe6bec250bda13b65.png)

NFTを売買する中での独自Contractの呼び出し

*   売り手が独自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について

Set Approval for allについての参考の記事です。検索してもほとんど日本語のドキュメントは出てきませんが、全権の移譲であるため、実行するユーザーは許可を求められた際に注意が必要なものとされています。

[https://stackoverflow.com/questions/69854414/why-and-when-is-setapprovalforall-called](https://stackoverflow.com/questions/69854414/why-and-when-is-setapprovalforall-called)

[https://qiita.com/rmanzoku/items/a90f265ae499dc21b9cb](https://qiita.com/rmanzoku/items/a90f265ae499dc21b9cb)

### その他参考記事

Opensea側のSmartContractの呼び出し詳細は下記に記載がされています。

[https://recruit.gmo.jp/engineer/jisedai/blog/opensea-research/](https://recruit.gmo.jp/engineer/jisedai/blog/opensea-research/)

### まとめとして

今回、独自Contractを利用してOpenSeaにNFTを公開した場合、売買のタイミングでどこまで独自Contractが関連しているかを調査しましたが、結果的には売買の過程ではOpenSea側のContractが呼び出され、それで完結をします。独自Contractへは売り手がSellのタイミングでSet Approval for allによって権限の移譲が行われているようでした。

---

*Originally published on [Y's note](https://paragraph.com/@y-s-note/opensea-nft-smartcontract)*
