ERC721 NFT创建购买/销售合同所有者预先安排的NFT的功能,安全问题 [英] ERC721 NFT creating a function to buy/sell NFTs that have been preminted by the contract owner, security question

查看:11
本文介绍了ERC721 NFT创建购买/销售合同所有者预先安排的NFT的功能,安全问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

相关行为

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

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

防止在执行过程中如果天然气耗尽,买家可能最终免费获得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时,我假设他们这样做的方式是合同有一个返回NFTID和令牌URI的函数?这是正确的吗,或者OpenZeppelin提供了这个功能,而我自己不必担心添加这个函数?

推荐答案

我认为通过改变操作顺序解决了气边问题。先付款,然后转账。

这篇关于ERC721 NFT创建购买/销售合同所有者预先安排的NFT的功能,安全问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆