diff --git a/CHANGELOG.md b/CHANGELOG.md index d3d72db4fa0..94e575810a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + + * `AccessControl`: add a virtual `_checkRole(bytes32)` function that can be overriden to alter the the `onlyRole` modifier behavior. ([#3137](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3137)) + ## Unreleased * `ERC2981`: add implementation of the royalty standard, and the respective extensions for `ERC721` and `ERC1155`. ([#3012](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3012)) diff --git a/contracts/access/AccessControl.sol b/contracts/access/AccessControl.sol index 70c81f6c268..f18448770bc 100644 --- a/contracts/access/AccessControl.sol +++ b/contracts/access/AccessControl.sol @@ -67,7 +67,7 @@ abstract contract AccessControl is Context, IAccessControl, ERC165 { * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { - _checkRole(role, _msgSender()); + _checkRole(role); _; } @@ -85,6 +85,18 @@ abstract contract AccessControl is Context, IAccessControl, ERC165 { return _roles[role].members[account]; } + /** + * @dev Revert with a standard message if `_msgSender()` is missing `role`. + * Overriding this function changes the behavior of the {onlyRole} modifier. + * + * Format of the revert message is described in {_checkRole}. + * + * _Available since v4.6._ + */ + function _checkRole(bytes32 role) internal view virtual { + _checkRole(role, _msgSender()); + } + /** * @dev Revert with a standard message if `account` is missing `role`. *