pragma solidity ^0.6.0; import "@openzeppelin/contracts/access/AccessControl.sol"; contract DynamicAccessControl is AccessControl { event AdminRoleSet(bytes32 roleId, bytes32 adminRoleId); constructor (address root) public { _grantRole(DEFAULT_ADMIN_ROLE, root); } modifier onlyMembersOf(bytes32[] roleIds) { bool isMember = false; for (var 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