// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "@openzeppelin/contracts/utils/Context.sol"; import "./IDelegatedAccessControl.sol"; import "../Roles.sol"; abstract contract DelegatedAccessControlled is Context { error Forbidden(); /** * @dev Modifier that checks that an account has a specific role on delegate. Reverts * with a standardized message including the required role. */ modifier onlyRole(string memory role) { _dac().checkRole(address(this), role, _msgSender()); _; } /** * @dev Modifier that checks that an account has an admin role on delegate. Reverts * with a standardized message including the required role. */ modifier onlyAdmin() { _dac().checkRole(address(this), Roles.DELEGATED_ADMIN, _msgSender()); _; } /** * @dev Modifier that checks that an account has a manager role on delegate. Reverts * with a standardized message including the required role. */ modifier onlyManager() { _dac().checkRole(address(this), Roles.DELEGATED_MANAGER, _msgSender()); _; } modifier onlyDelegateAdmin(address delegate) { _dac().checkRole(delegate, Roles.DELEGATED_ADMIN, _msgSender()); _; } modifier onlyDelegateManager(address delegate) { _dac().checkRole(delegate, Roles.DELEGATED_MANAGER, _msgSender()); _; } modifier onlyDelegateAdminOrManager(address delegate) { if (_hasRole(Roles.DELEGATED_ADMIN, _msgSender()) || _hasRole(Roles.DELEGATED_MANAGER, _msgSender())) { _; } else { revert Forbidden(); } } function _checkRole(string memory role, address account) internal view { _dac().checkRole(address(this), role, account); } function _hasRole(string memory role, address account) internal view returns (bool) { return _dac().hasRole(address(this), role, account); } function _dac() internal view virtual returns (IDelegatedAccessControl); }