Solidity

支持 OpenSea 上的界面破壞可見性

  • February 9, 2022

我有兩個相同的 ERC721 合約,允許鑄造 nfts,但有一個例外。其中一份合約有以下程式碼:

function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
   if(interfaceId == _INTERFACE_ID_ERC2981) {
       return true;
   }
   return false;
} 

這是為了支持版稅。這就是防止我的項目出現在 OpenSea 上的全部內容。合約編譯得很好,我什至可以與之互動,我可以鑄造、獲取 tokenUri 和任何其他功能。我只是在作業系統上看不到該項目。

任何想法為什麼會這樣?

contract1(有效):https ://rinkeby.etherscan.io/address/0xEA8d1638bDAA19A4c6C3F7fD0AA4dC98060fcB84#code

你可以在這裡看到這個項目:https ://testnets.opensea.io/assets/0xEA8d1638bDAA19A4c6C3F7fD0AA4dC98060fcB84/1

contract2(有效,但項目不會列出):https ://rinkeby.etherscan.io/address/0x8B6972cc712f115A3726f086932ac2d7a22F551e#code

我只是收到一個 404 錯誤: https ://testnets.opensea.io/assets/0x8B6972cc712f115A3726f086932ac2d7a22F551e/1

如果您查看合約程式碼並一直向下滾動,您會看到唯一的區別是contract1 將程式碼註釋掉了,而contract2 將其包含在建構中。在這兩種情況下,我們都指向相同的項目和相同的元數據。您可以通過與合約互動並找到 tokenId 1 的 tokenURI 來測試這一點

如何進行調試?

更新這個損壞的項目確實出現在 Rarible 的測試網上:https ://rinkeby.rarible.com/token/tezos/0x8B6972cc712f115A3726f086932ac2d7a22F551e:1?tab=owners

因此,我們知道這是 OpenSea 特有的。但是現在再次不知道如何解決這個問題

通過覆蓋supportsInterface這種方式,合約將為除 ERC2981 之外的任何其他介面返回 false。它為 ERC721 返回 false!

正確的覆蓋方式是呼叫其他介面的父合約。

function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
   if (interfaceId == _INTERFACE_ID_ERC2981) {
       return true;
   }
   return super.supportsInterface(interfaceId);
} 

引用自:https://ethereum.stackexchange.com/questions/121164