diff --git a/CHANGELOG.md b/CHANGELOG.md index 99972ed62f4..e06138d0f61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + + * `Ownable`: add an internal `_transferOwnership(address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/#2568)) + * `AccessControl`: add internal `_grantRole(bytes32,address)` and `_revokeRole(bytes32,address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/#2568)) + * `AccessControl`: mark `_setupRole(bytes32,address)` as deprecated in favor of `_grantRole(bytes32,address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/#2568)) + ## 4.3.1 * `TimelockController`: Add additional isOperationReady check. diff --git a/contracts/access/AccessControl.sol b/contracts/access/AccessControl.sol index 08ab65f687b..e5c359552e5 100644 --- a/contracts/access/AccessControl.sol +++ b/contracts/access/AccessControl.sol @@ -178,6 +178,8 @@ abstract contract AccessControl is Context, IAccessControl, ERC165 { * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== + * + * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); @@ -194,14 +196,24 @@ abstract contract AccessControl is Context, IAccessControl, ERC165 { emit RoleAdminChanged(role, previousAdminRole, adminRole); } - function _grantRole(bytes32 role, address account) private { + /** + * @dev Grants `role` to `account`. + * + * Internal function without access restriction. + */ + function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } - function _revokeRole(bytes32 role, address account) private { + /** + * @dev Revokes `role` from `account`. + * + * Internal function without access restriction. + */ + function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); diff --git a/contracts/access/Ownable.sol b/contracts/access/Ownable.sol index 16469d5a6bb..3aff13f876e 100644 --- a/contracts/access/Ownable.sol +++ b/contracts/access/Ownable.sol @@ -25,7 +25,7 @@ abstract contract Ownable is Context { * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { - _setOwner(_msgSender()); + _transferOwnership(_msgSender()); } /** @@ -51,7 +51,7 @@ abstract contract Ownable is Context { * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { - _setOwner(address(0)); + _transferOwnership(address(0)); } /** @@ -60,10 +60,14 @@ abstract contract Ownable is Context { */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); - _setOwner(newOwner); + _transferOwnership(newOwner); } - function _setOwner(address newOwner) private { + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Internal function without access restriction. + */ + function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner);