-
Notifications
You must be signed in to change notification settings - Fork 0
/
ContractB.sol
150 lines (107 loc) · 4.57 KB
/
ContractB.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.5;
import '@openzeppelin/contracts/security/Pausable.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
// import '@openzeppelin/contracts/access/AccessControl.sol';
import '@openzeppelin/contracts/utils/Context.sol';
// import '@openzeppelin/contracts/utils/Strings.sol';
// import '@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol';
// import '@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol';
// import '@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol';
// import '@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol';
// import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';
// import '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';
// import '@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol';
import 'hardhat/console.sol';
/**
* @title Contract B
*/
contract ContractB {
// using AddressUpgradeable for address;
// using SafeMathUpgradeable for uint256;
// ==========State variables====================================
mapping(bytes32 => mapping(address => bool) ) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
bool private initialized;
address private _admin;
// ==========Events=============================================
event AdminAdded(address indexed account, uint256 currentTimestamp);
event AdminRemoved(address indexed account, uint256 currentTimestamp);
event AdminRoleTransferred(address indexed from, address indexed to, uint256 currentTimestamp);
event AdminRoleRenounced(address indexed account, uint256 currentTimestamp);
// ==========Constructor========================================
// constructor() {
// _admin = msg.sender;
// _roles[DEFAULT_ADMIN_ROLE][msg.sender] = true;
// }
// function initialize() external initializer {
// _admin = msg.sender;
// _roles[DEFAULT_ADMIN_ROLE][msg.sender] = true;
// }
function setAdmin(/*address account*/) internal {
// require(account != address(0), "invalid account");
if(initialized) revert();
// _admin = account;
// _roles[DEFAULT_ADMIN_ROLE][account] = true;
_admin = msg.sender;
_roles[DEFAULT_ADMIN_ROLE][msg.sender] = true;
initialized = true;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyAdmin() {
require(_admin == msg.sender, "ContractB: caller is not the owner");
_;
}
// ==========Functions==========================================
/**
* @dev Returns the address of the current owner.
*/
function getOwner() public view returns (address) {
return _admin;
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view returns (bool) {
return _roles[role][account];
}
function addAdmin(address account) external onlyAdmin returns (bool) {
require(account != address(0), "invalid account");
if(!hasRole(DEFAULT_ADMIN_ROLE, account)) {
_roles[DEFAULT_ADMIN_ROLE][account] = true;
emit AdminAdded(account, block.timestamp);
return true;
}
return false;
}
function removeAdmin(address account) external onlyAdmin returns (bool) {
require(account != address(0), "invalid account");
if(hasRole(DEFAULT_ADMIN_ROLE, account)) {
_roles[DEFAULT_ADMIN_ROLE][account] = false;
emit AdminRemoved(account, block.timestamp);
return true;
}
return false;
}
function transferAdminRole(address from, address to) external onlyAdmin returns (bool) {
require(from != address(0), "invalid account");
require(to != address(0), "invalid account");
if(!hasRole(DEFAULT_ADMIN_ROLE, to)) {
_roles[DEFAULT_ADMIN_ROLE][from] = false;
_roles[DEFAULT_ADMIN_ROLE][to] = true;
emit AdminRoleTransferred(from, to, block.timestamp);
return true;
}
return false;
}
function renounceAdminRole() external onlyAdmin returns (bool) {
_roles[DEFAULT_ADMIN_ROLE][msg.sender] = false;
_roles[DEFAULT_ADMIN_ROLE][address(0)] = true;
emit AdminRoleRenounced(msg.sender, block.timestamp);
return true;
}
// Reserved storage space to allow for layout changes in the future.
// uint256[46] private ______gap;
}