Solidity
如何為任何代幣地址創建可靠的“hasBalance”修飾符?
我一直在研究是否可以創建一個修飾符來檢查 msg.sender 是否有任何給定數量的令牌地址。案例:將某些功能限制為給定代幣或 NFT 的所有者。
我從 Remix 中的 Storage.sol 開始提出了這個非常殘酷的例子。它編譯,但我不知道它是否真的有意義。非常歡迎任何幫助
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; /** * the Storage.sol evergreen where only certain NFT holders (or NFTiD holder) * can store value in the variable * public retrieve the number */ contract Storage is Ownable { uint256 number; ERC721 nftAddress; uint256 NFTId; // use this modifier if you want to allow all holders of a given NFT collection modifier hasNFTCollection { require(nftAddress.balanceOf(msg.sender) >= 1); _; } // use this modifier if you want to allow only the holder of a specific NFTid modifier hasNFTId { require(nftAddress.ownerOf(NFTId) == msg.sender); _; } // only the owner can set the NFT collection address function setNFTCollection(ERC721 _nft) public onlyOwner { nftAddress = _nft; } // only the owner can set the NFT Id function setNFTId(uint256 _tokenId) public onlyOwner { NFTId = _tokenId; } /** * @dev Store value in variable * @param num value to store */ function store(uint256 num) public hasNFTCollection { number = num; } /** * @dev Return value * @return value of 'number' */ function retrieve() public view returns (uint256){ return number; } }
我認為您的概念證明是有道理的,請記住,它會返回此集合
uint256 balanceOf(address owner)
擁有的 NFT 總數。owner
也許你可能想檢查呼叫者是否在這個集合中擁有一個特定的 NFT,在這種情況下使用address ownerOf(uint256 tokenId)
.此外,請注意您正在與哪些代幣合約進行互動!例如,如果您嘗試使用 ERC20 實施此機制,並且此 ERC20 已在 DeX 上列出,則可以通過閃電貸利用您的合約。