Solidity

如何為任何代幣地址創建可靠的“hasBalance”修飾符?

  • January 10, 2022

我一直在研究是否可以創建一個修飾符來檢查 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 上列出,則可以通過閃電貸利用您的合約。

引用自:https://ethereum.stackexchange.com/questions/118078