Multiple admins, not just owner.
hasRole[ADMIN][msg.sender] = truerequire(hasRole[role][msg.sender]hasRole[role][user] = true// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Roles {
bytes32 public constant ADMIN = keccak256("ADMIN");
mapping(bytes32 => mapping(address => bool)) public hasRole;
constructor() { /* TODO */ }
function grantRole(bytes32 role, address user) external {
// TODO require caller hasRole(role)
}
}