1+ // SPDX-License-Identifier: Apache-2.0
2+ pragma solidity ^ 0.8.0 ;
3+
4+ import "./interface/IPermissionsEnumerable.sol " ;
5+ import "./Permissions.sol " ;
6+
7+ contract PermissionsEnumerable is IPermissionsEnumerable , Permissions {
8+
9+ struct RoleMembers {
10+ uint256 index;
11+ mapping (uint256 => address ) members;
12+ mapping (address => uint256 ) indexOf;
13+ }
14+
15+ mapping (bytes32 => RoleMembers) private roleMembers;
16+
17+ function getRoleMember (bytes32 role , uint256 index ) external view returns (address member ) {
18+ uint256 currentIndex = roleMembers[role].index;
19+ uint256 check;
20+
21+ for (uint256 i = 0 ; i < currentIndex; i += 1 ) {
22+ if (roleMembers[role].members[i] != address (0 )) {
23+ if (check == index) {
24+ member = roleMembers[role].members[i];
25+ }
26+ } else {
27+ check += 1 ;
28+ }
29+ }
30+
31+ }
32+
33+ function getRoleMemberCount (bytes32 role ) external view returns (uint256 count ) {
34+ uint256 currentIndex = roleMembers[role].index;
35+
36+ for (uint256 i = 0 ; i < currentIndex; i += 1 ) {
37+ if (roleMembers[role].members[i] != address (0 )) {
38+ count += 1 ;
39+ }
40+ }
41+ }
42+
43+ function grantRole (bytes32 role , address account ) public override (IPermissions, Permissions) {
44+ super .grantRole (role, account);
45+ _addMember (role, account);
46+ }
47+
48+ function revokeRole (bytes32 role , address account ) public override (IPermissions, Permissions) {
49+ super .revokeRole (role, account);
50+ _removeMember (role, account);
51+ }
52+
53+ function renounceRole (bytes32 role , address account ) public override (IPermissions, Permissions) {
54+ super .renounceRole (role, account);
55+ _removeMember (role, account);
56+ }
57+
58+ function _addMember (bytes32 role , address account ) internal {
59+ uint256 idx = roleMembers[role].index;
60+ roleMembers[role].index += 1 ;
61+
62+ roleMembers[role].members[idx] = account;
63+ roleMembers[role].indexOf[account] = idx;
64+ }
65+
66+ function _removeMember (bytes32 role , address account ) internal {
67+ uint256 idx = roleMembers[role].indexOf[account];
68+
69+ delete roleMembers[role].members[idx];
70+ delete roleMembers[role].indexOf[account];
71+ }
72+ }
0 commit comments