[英]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.