Solidity
為什麼我不斷收到此錯誤?“恢復 ERC721:轉接呼叫者既不是所有者也不是批准的”
我正在嘗試以可靠的方式編寫此功能,以轉售某人購買的 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 合約中再次呼叫,以允許該合約代表其出售的權利。所以這個問題實際上並不在這份契約中,這是由於我缺乏理解。我想我現在明白了很多,因為我經歷了這一點。