【问题标题】:ERC721 NFT creating a function to buy/sell NFTs that have been preminted by the contract owner, security questionERC721 NFT 创建一个功能来购买/出售由合约所有者预先设定的 NFT,安全问题
【发布时间】:2021-09-15 13:04:27
【问题描述】:

我在研究为某人购买 NFT 创建函数时遇到了这个答案:

https://stackoverflow.com/a/67384225/1414721

相关行是

            IERC20 tokenContract = IERC20(tokenAddress);
            require(tokenContract.transferFrom(msg.sender, address(this), price),
                "buy: payment failed");

我不希望人们能够在以太坊以外的任何地方购买我的 NFT,尽管这里的作者说:

防止出现极端情况,即如果执行过程中 gas 用完,买方最终可能会免费获得 NFT

这引起了我的注意,从阅读代码看来,这里正在进行的检查是为了防止这种极端情况。

我不确定当购买 NFT 的货币是以太坊时如何应用。

我已将购买功能调整为如下所示

    function buy(uint256 _tokenId) external payable {
        uint256 price = tokenIdToPrice[_tokenId];
        require(price > 0, 'This token is not for sale');
        require(msg.value == price, 'Incorrect value');
        address seller = ownerOf(_tokenId);
        IERC20 tokenContract = IERC20(address(0));
        require(tokenContract.transferFrom(msg.sender, address(this), price), "buy: payment failed");
        payable(seller).transfer(msg.value);
        _transfer(seller, msg.sender, _tokenId);
        tokenIdToPrice[_tokenId] = 0;
        emit NftBought(seller, msg.sender, msg.value);
    }

我相信 a) 将代币合约从以太坊代币(IERC20(address(0)) - 我知道address(0) 是以太坊代币地址?)和 b

require(tokenContract.transferFrom(msg.sender, address(this), price), "buy: payment failed");

确保处理提到的气体限制边缘情况。

这是正确的吗,谷歌搜索这很困难。

最后一个问题(不相关,我希望没关系) - 当市场显示所有可用于集合的 NFT 时,我假设他们这样做的方式是合约具有返回 NFT ID 和令牌的函数URI?这是正确的,还是 OpenZeppelin 提供了这个功能,我不必担心添加这个功能?

【问题讨论】:

    标签: ethereum solidity nft


    【解决方案1】:

    我认为气体边缘情况是通过改变操作顺序来解决的。先付款再转账。

    【讨论】:

      猜你喜欢
      • 2022-12-10
      • 1970-01-01
      • 2022-10-18
      • 2023-01-25
      • 2021-10-09
      • 2021-11-05
      • 1970-01-01
      • 2022-08-12
      • 1970-01-01
      相关资源
      最近更新 更多