Solidity

為什麼我不斷收到此錯誤?“恢復 ERC721:轉接呼叫者既不是所有者也不是批准的”

  • March 2, 2022

我正在嘗試以可靠的方式編寫此功能,以轉售某人購買的 NFT,但我不斷收到上述錯誤。我不確定問題是什麼,因為這個函式幾乎與另一個在鑄造後最初列出 NFT 的函式相似。

我還需要第一個要求聲明嗎?或者轉移是否有辦法檢查其是否為 NFT 所有者?

我一直在閱讀的所有其他內容,例如批准轉移令牌,都沒有工作。事實上,如果我首先嘗試從令牌實例批准,它會拋出一個錯誤,說“批准所有者”或類似的東西。在此先感謝您對 Solidity 還是很陌生。

function marketItemResell(
       address nftContract,
       uint256 itemId,
       uint256 price
   ) public payable nonReentrant {
       // require(
       //     IERC721(nftContract).ownerOf(itemId) == msg.sender,
       //     "Only the owner can list an NFT for sale"
       // );
       require(price > 0, "Price must be at least 1 wei");
       require(
           msg.value == listingPrice,
           "Price must be equal to listing price"
       );

       uint256 tokenId = idToMarketItem[itemId].tokenId;

       IERC721(nftContract).transferFrom(msg.sender, address(this), tokenId);

       idToMarketItem[itemId].seller = payable(msg.sender);
       idToMarketItem[itemId].owner = payable(address(0));
       idToMarketItem[itemId].price = price;
       idToMarketItem[itemId].sold = false;

       _itemsSold.decrement();

       emit ItemListed(
           itemId,
           nftContract,
           tokenId,
           msg.sender,
           address(0),
           price,
           false
       );
   }

在 ERC721 規範(https://eips.ethereum.org/EIPS/eip-721#specification)中,它聲明 transferFrom 函式必須具有此屬性

/// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
///  THEY MAY BE PERMANENTLY LOST
/// @dev Throws unless `msg.sender` is the current owner, an authorized
///  operator, or the approved address for this NFT. Throws if `_from` is
///  not the current owner. Throws if `_to` is the zero address. Throws if
///  `_tokenId` is not a valid NFT.
/// @param _from The current owner of the NFT
/// @param _to The new owner
/// @param _tokenId The NFT to transfer
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

和批准功能:

   /// @notice Change or reaffirm the approved address for an NFT
   /// @dev The zero address indicates there is no approved address.
   ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
   ///  operator of the current owner.
   /// @param _approved The new approved NFT controller
   /// @param _tokenId The NFT to approve
   function approve(address _approved, uint256 _tokenId) external payable;

在開發中,它說“msg.sender”必須是 nft 令牌的目前所有者。但是發出呼叫的智能合約不是代幣的所有者。

因此,要解決這個問題,代幣的所有者必須首先批准智能合約地址才能擁有修改代幣的權利,然後才能修改代幣。或者所有者可以在 erc721 上呼叫approvalForAll,以賦予智能合約修改他們擁有的每一項資產的權利。

嘿,再次感謝 Haxerl 的幫助,它確實幫助我弄清楚了發生了什麼。本質上,我需要從 ERC721 合約中再次呼叫,以允許該合約代表其出售的權利。所以這個問題實際上並不在這份契約中,這是由於我缺乏理解。我想我現在明白了很多,因為我經歷了這一點。

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