Solidity

使用 Open Zeppelin IERC721.transferFrom() 失敗並出現錯誤“ERC721:轉接呼叫者不是所有者或批准”

  • April 21, 2022

我正在使用 IERC721.transferFrom() openZeppelin 介面。當我嘗試將 NFT 從 msg.sender(me) 轉移到合約(address.(this))時出現Fail with error 'ERC721: transfer caller is not owner nor approved'錯誤。我正在嘗試將 NFT 上架到我的市場,而無需進行多次交易。我錯過了什麼?

contract Market is OwnableUpgradeable, ReentrancyGuardUpgradeable {
function _createListing(
   address nftAddress,
   uint256 tokenId,
   address _listingTokenAddress,
   string calldata _listingTokenName,
   string calldata _listingTokenSymbol,
   uint256 price,
   uint256 expiration
) internal {
   require(nftAddress != address(0), "zero address");
   require(price > 0, "zero amount");
   IERC721Upgradeable(nftAddress).transferFrom( //<-- Issue line
       msg.sender,
       address(this),
       tokenId
   );
   PropertyListing memory _propertyListing = PropertyListing(
       nftAddress,
       tokenId,
       price,
       _listingTokenAddress,
       _listingTokenName,
       _listingTokenSymbol,
       msg.sender,
       expiration,
       true,
       false
   );
   listings.push(_propertyListing);
   uint256 _id = listings.length - 1;
   emit NewPropertyListing(
       _id,
       nftAddress,
       tokenId,
       price,
       _listingTokenAddress,
       _listingTokenName,
       _listingTokenSymbol,
       msg.sender,
       expiration,
       true,
       false
   );
}
}

如果您使用transferFrom()功能,使用者必須批准您的智能合約才能移動他的代幣。只有當使用者批准了這個操作,你才能_createListing()從你的智能合約中呼叫。在您的情況下,使用者必須approve()使用以下參數從 nft 智能合約地址呼叫函式:

  • 至:您的智能合約地址;
  • tokenId:必須進入您的智能合約的令牌。

完成此操作後,您可以呼叫_createListing()函式。

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