Solidity

在沒有所有權的情況下轉移 NFT 代幣

  • July 1, 2021

我想知道 opensea 如何在沒有該代幣所有權的情況下將代幣轉移給買方。而且他們根本沒有使用託管賬戶。在混音中,如果我嘗試在沒有所有權的情況下轉移代幣,它不起作用並給出錯誤“ERC721:轉接呼叫者既不是所有者也不是批准的”。我怎麼能像opensea一樣做這個動作..

OpenSea 有一個合約ERC721Tradable.sol,將 OpenSea 運營商列入白名單

   /**
    * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
    */
   function isApprovedForAll(address owner, address operator)
       override
       public
       view
       returns (bool)
   {
       // Whitelist OpenSea proxy contract for easy trading.
       ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
       if (address(proxyRegistry.proxies(owner)) == operator) {
           return true;
       }

       return super.isApprovedForAll(owner, operator);
   }

您可以在沒有所有權的情況下轉讓代幣。如果您給予地址批准,該地址可以轉移代幣。

function approve(address _approved, uint256 _tokenId)

此功能用於給予地址批准。在 ERC-721 的傳遞函式中。該from地址必須是令牌所有者或獲得批准。

這是傳遞函式

function transferFrom(
       address from,
       address to,
       uint256 tokenId
   ) public virtual override {
       //solhint-disable-next-line max-line-length
       require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

       _transfer(from, to, tokenId);
   }

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