【问题标题】:How to implement onERC721Received function如何实现onERC721Received函数
【发布时间】:2022-07-29 21:24:02
【问题描述】:

我正在尝试将 NFT 发送到智能合约以进行托管,但在实现覆盖函数 onERC721Received 时遇到了困难,因为我收到有关未使用变量的错误 - 这是我得到的错误吗?

Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.
--> contracts/NftEscrow.sol:11:79:
|
11 | function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) public override returns(bytes4) {
| ^^^^^^^^^^^^^^^^^^

这是智能合约

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";

    
    contract nftescrow is IERC721Receiver {
        
        enum ProjectState {newEscrow, nftDeposited, cancelNFT, ethDeposited, canceledBeforeDelivery, deliveryInitiated, delivered}
        
        address payable public sellerAddress;
        address payable public buyerAddress;
        address public nftAddress;
        uint256 tokenID;
        bool buyerCancel = false;
        bool sellerCancel = false;
        ProjectState public projectState;
    
        constructor()
        {
            sellerAddress = payable(msg.sender);
            projectState = ProjectState.newEscrow;
        }
        
        function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) public override returns (bytes4) {
            return this.onERC721Received.selector;
        }
        
        function depositNFT(address _NFTAddress, uint256 _TokenID)
            public
            inProjectState(ProjectState.newEscrow)
            onlySeller
        {
            nftAddress = _NFTAddress;
            tokenID = _TokenID;
            ERC721(nftAddress).safeTransferFrom(msg.sender, address(this), tokenID);
            projectState = ProjectState.nftDeposited;
        }
    } 
    
    }

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: solidity


    【解决方案1】:

    这“只是”一个警告——不是错误——所以即使有警告,合约也会编译。

    编译器告诉您正在定义参数operatortokenIdfromdata,但您并没有使用它们。然而,ERC721 标准要求 onERC721Received() 函数接受所有这些参数,即使您可能不使用它们,因为函数选择器是由它们确定的。

    因此您可以放心地忽略此警告。

    【讨论】:

    • 这是因为此处给出的 IERC721 规范 eips.ethereum.org/EIPS/eip-721 明确表示将使用上述 4 个参数调用此方法 onERC721Received。所以你应该包括所有 4 个。
    【解决方案2】:

    您可以像这样使警告消失:

        function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {
            return IERC721Receiver.onERC721Received.selector;
        }
    

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多