Skip to content

Commit 287f8f9

Browse files
Krishang NadgaudaKrishang Nadgauda
authored andcommitted
add Permissions enumerable
1 parent f7feef7 commit 287f8f9

File tree

2 files changed

+77
-11
lines changed

2 files changed

+77
-11
lines changed

contracts/feature/Permissions.sol

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,23 @@ contract Permissions is IPermissions, Context {
1212

1313
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
1414

15-
function grantRole(bytes32 role, address account) external {
16-
require(
17-
hasRole[getRoleAdmin[role]][_msgSender()],
18-
"Not role admin."
19-
);
15+
function grantRole(bytes32 role, address account) public virtual {
16+
_checkRole(getRoleAdmin[role], _msgSender());
2017

2118
hasRole[role][account] = true;
2219

2320
emit RoleGranted(role, account, _msgSender());
2421
}
2522

26-
function revokeRole(bytes32 role, address account) external {
27-
require(
28-
hasRole[getRoleAdmin[role]][_msgSender()],
29-
"Not role admin."
30-
);
23+
function revokeRole(bytes32 role, address account) public virtual {
24+
_checkRole(getRoleAdmin[role], _msgSender());
3125

3226
delete hasRole[role][account];
3327

3428
emit RoleRevoked(role, account, _msgSender());
3529
}
3630

37-
function renounceRole(bytes32 role, address account) external {
31+
function renounceRole(bytes32 role, address account) public virtual {
3832
require(
3933
_msgSender() == account,
4034
"Can only renounce for self"
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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

Comments
 (0)