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 }