Solidity
使用 Open Zeppelin IERC721.transferFrom() 失敗並出現錯誤“ERC721:轉接呼叫者不是所有者或批准”
我正在使用 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()
函式。