pragma solidity ^0.6.0; import "openzeppelin-solidity/contracts/access/AccessControl.sol"; contract DynamicAccessControl is AccessControl { event AdminRoleSet(bytes32 roleId, bytes32 adminRoleId); constructor (address root) public { _grantRole(DEFAULT_ADMIN_ROLE, root); } modifier onlyMember(bytes32 roleId) { require(hasRole(roleId, msg.sender), "Restricted to members."); _; } modifier onlyMembersOf(bytes32[] memory roleIds) { bool isMember = false; for (uint i = 0; i < roleIds.length; i++) { if (hasRole(roleIds[i], msg.sender)) { isMember = true; break; } } require(isMember == true, "Restricted to members."); _; } function addRole(bytes32 roleId, bytes32 adminRoleId) public onlyMember(adminRoleId) { _setRoleAdmin(roleId, adminRoleId); emit AdminRoleSet(roleId, adminRoleId); } }
0.6.0