AccessControlEnumerableUpgradeable.sol 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // SPDX-License-Identifier: MIT
  2. // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)
  3. pragma solidity ^0.8.0;
  4. import "./IAccessControlEnumerableUpgradeable.sol";
  5. import "./AccessControlUpgradeable.sol";
  6. import "../utils/structs/EnumerableSetUpgradeable.sol";
  7. import "../proxy/utils/Initializable.sol";
  8. /**
  9. * @dev Extension of {AccessControl} that allows enumerating the members of each role.
  10. */
  11. abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable {
  12. function __AccessControlEnumerable_init() internal onlyInitializing {
  13. }
  14. function __AccessControlEnumerable_init_unchained() internal onlyInitializing {
  15. }
  16. using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet;
  17. mapping(bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers;
  18. /**
  19. * @dev See {IERC165-supportsInterface}.
  20. */
  21. function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
  22. return interfaceId == type(IAccessControlEnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId);
  23. }
  24. /**
  25. * @dev Returns one of the accounts that have `role`. `index` must be a
  26. * value between 0 and {getRoleMemberCount}, non-inclusive.
  27. *
  28. * Role bearers are not sorted in any particular way, and their ordering may
  29. * change at any point.
  30. *
  31. * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
  32. * you perform all queries on the same block. See the following
  33. * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
  34. * for more information.
  35. */
  36. function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {
  37. return _roleMembers[role].at(index);
  38. }
  39. /**
  40. * @dev Returns the number of accounts that have `role`. Can be used
  41. * together with {getRoleMember} to enumerate all bearers of a role.
  42. */
  43. function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {
  44. return _roleMembers[role].length();
  45. }
  46. /**
  47. * @dev Overload {_grantRole} to track enumerable memberships
  48. */
  49. function _grantRole(bytes32 role, address account) internal virtual override {
  50. super._grantRole(role, account);
  51. _roleMembers[role].add(account);
  52. }
  53. /**
  54. * @dev Overload {_revokeRole} to track enumerable memberships
  55. */
  56. function _revokeRole(bytes32 role, address account) internal virtual override {
  57. super._revokeRole(role, account);
  58. _roleMembers[role].remove(account);
  59. }
  60. /**
  61. * @dev This empty reserved space is put in place to allow future versions to add new
  62. * variables without shifting down storage in the inheritance chain.
  63. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
  64. */
  65. uint256[49] private __gap;
  66. }