Code
solidity
contract AccessControl {
address public owner;
mapping(address => bool) public admins;
uint256 public pausedAt;
modifier onlyOwner() {
require(msg.sender == owner, "Only owner");
_;
}
modifier onlyAdmin() {
require(admins[msg.sender], "Only admin");
_;
}
modifier whenNotPaused() {
require(pausedAt == 0, "Paused");
_;
}
// Reentrancy guard (prevents reentrancy attacks)
uint256 private _status;
modifier nonReentrant() {
require(_status != 2, "Reentrant");
_status = 2;
_;
_status = 1;
}
constructor() {
owner = msg.sender;
_status = 1;
}
function addAdmin(address a) external onlyOwner {
admins[a] = true;
}
function criticalOp() external onlyAdmin whenNotPaused nonReentrant {
// ... sensitive logic
}
function pause() external onlyOwner {
pausedAt = block.timestamp;
}
}