github.com/MetalBlockchain/subnet-evm@v0.4.9/contract-examples/contracts/AllowList.sol (about)

     1  //SPDX-License-Identifier: MIT
     2  pragma solidity ^0.8.0;
     3  
     4  import "./IAllowList.sol";
     5  import "@openzeppelin/contracts/access/Ownable.sol";
     6  
     7  // AllowList is a base contract to use AllowList precompile capabilities.
     8  contract AllowList is Ownable {
     9    // Precompiled Allow List Contract Address
    10    IAllowList private allowList;
    11  
    12    uint256 constant STATUS_NONE = 0;
    13    uint256 constant STATUS_ENABLED = 1;
    14    uint256 constant STATUS_ADMIN = 2;
    15  
    16    constructor(address precompileAddr) Ownable() {
    17      allowList = IAllowList(precompileAddr);
    18    }
    19  
    20    modifier onlyEnabled() {
    21      require(isEnabled(msg.sender), "not enabled");
    22      _;
    23    }
    24  
    25    function isAdmin(address addr) public view returns (bool) {
    26      uint256 result = allowList.readAllowList(addr);
    27      return result == STATUS_ADMIN;
    28    }
    29  
    30    function isEnabled(address addr) public view returns (bool) {
    31      uint256 result = allowList.readAllowList(addr);
    32      // if address is ENABLED or ADMIN it can deploy
    33      // in other words, if it's not NONE it can deploy.
    34      return result != STATUS_NONE;
    35    }
    36  
    37    function setAdmin(address addr) public virtual onlyOwner {
    38      _setAdmin(addr);
    39    }
    40  
    41    function _setAdmin(address addr) private {
    42      allowList.setAdmin(addr);
    43    }
    44  
    45    function setEnabled(address addr) public virtual onlyOwner {
    46      _setEnabled(addr);
    47    }
    48  
    49    function _setEnabled(address addr) private {
    50      allowList.setEnabled(addr);
    51    }
    52  
    53    function revoke(address addr) public virtual onlyOwner {
    54      _revoke(addr);
    55    }
    56  
    57    function _revoke(address addr) private {
    58      require(msg.sender != addr, "cannot revoke own role");
    59      allowList.setNone(addr);
    60    }
    61  }