簡體   English   中英

ERC721 NFT 創建一個 function 來購買/出售由合約所有者預制的 NFT,安全問題

[英]ERC721 NFT creating a function to buy/sell NFTs that have been preminted by the contract owner, security question

我在研究為某人購買 NFT 創建 function 時遇到了這個答案:

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 看起來像

    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");

確保處理提到的 gas limit edge case。

這是正確的嗎,谷歌搜索這很困難。

最后一個問題(不相關,我希望沒問題)——當市場顯示一個集合的所有可用 NFT 時,我假設他們這樣做的方式是合約有一個 function 返回 NFT ID 和令牌 URI? 這是正確的,還是 OpenZeppelin 提供了這個功能,我不必擔心添加這個 function?

我認為 gas edge case 是通過改變操作順序解決的。 先付款再轉移代幣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM