🛠️AccessControl
Access Control Template
API:
Source Code:
AccessControl
// SPDX-License-Identifier: UNLICENSED
/* *
* Copyright (c) 2021-2023 LI LI @ JINGTIAN & GONGCHENG.
*
* This WORK is licensed under ComBoox SoftWare License 1.0, a copy of which
* can be obtained at:
* [https://github.com/paul-lee-attorney/comboox]
*
* THIS WORK IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
* WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. IN NO
* EVENT SHALL ANY CONTRIBUTOR BE LIABLE TO YOU FOR ANY DAMAGES.
*
* YOU ARE PROHIBITED FROM DEPLOYING THE SMART CONTRACTS OF THIS WORK, IN WHOLE
* OR IN PART, FOR WHATEVER PURPOSE, ON ANY BLOCKCHAIN NETWORK THAT HAS ONE OR
* MORE NODES THAT ARE OUT OF YOUR CONTROL.
* */
pragma solidity ^0.8.8;
import "./IAccessControl.sol";
contract AccessControl is IAccessControl {
using RolesRepo for RolesRepo.Repo;
bytes32 private constant _ATTORNEYS = bytes32("Attorneys");
RolesRepo.Repo private _roles;
address private _dk;
IRegCenter internal _rc;
IGeneralKeeper internal _gk;
// ################
// ## Modifier ##
// ################
modifier onlyOwner {
require(
_roles.getOwner() == msg.sender,
"AC.onlyOwner: NOT"
);
_;
}
modifier onlyDK {
require(
_dk == msg.sender,
"AC.onlyDK: NOT"
);
_;
}
modifier onlyGC {
require(
_roles.getRoleAdmin(_ATTORNEYS) == msg.sender,
"AC.onlyGC: NOT"
);
_;
}
modifier onlyKeeper {
require(
_gk.isKeeper(msg.sender) ||
_dk == msg.sender,
"AC.onlyKeeper: NOT"
);
_;
}
modifier onlyAttorney {
require(
_roles.hasRole(_ATTORNEYS, msg.sender),
"AC.onlyAttorney: NOT"
);
_;
}
modifier attorneyOrKeeper {
require(
_roles.hasRole(_ATTORNEYS, msg.sender) ||
_gk.isKeeper(msg.sender),
"AC.md.attorneyOrKeeper: NOT"
);
_;
}
// #################
// ## Write ##
// #################
function init(
address owner,
address directKeeper,
address regCenter,
address generalKeeper
) external {
_roles.initDoc(owner);
_dk = directKeeper;
_rc = IRegCenter(regCenter);
_gk = IGeneralKeeper(generalKeeper);
emit Init(owner, directKeeper, regCenter, generalKeeper);
}
function setOwner(address acct) external {
_roles.setOwner(acct, msg.sender);
emit SetOwner(acct);
}
function setDirectKeeper(address acct) external onlyDK {
_dk = acct;
emit SetDirectKeeper(acct);
}
function takeBackKeys (address target) external onlyDK {
IAccessControl(target).setDirectKeeper(msg.sender);
}
function setRoleAdmin(bytes32 role, address acct) external {
_roles.setRoleAdmin(role, acct, msg.sender);
emit SetRoleAdmin(role, acct);
}
function grantRole(bytes32 role, address acct) external {
_roles.grantRole(role, acct, msg.sender);
}
function revokeRole(bytes32 role, address acct) external {
_roles.revokeRole(role, acct, msg.sender);
}
function renounceRole(bytes32 role) external {
_roles.renounceRole(role, msg.sender);
}
function abandonRole(bytes32 role) external {
_roles.abandonRole(role, msg.sender);
}
function lockContents() public {
require(_roles.state == 1, "AC.lockContents: wrong state");
address owner = msg.sender;
_roles.abandonRole(_ATTORNEYS, owner);
_roles.setOwner(address(0), owner);
_roles.state = 2;
emit LockContents();
}
// ##############
// ## Read ##
// ##############
function getOwner() public view returns (address) {
return _roles.getOwner();
}
function getDK() external view returns (address) {
return _dk;
}
function isFinalized() public view returns (bool) {
return _roles.state == 2;
}
function getRoleAdmin(bytes32 role) public view returns (address) {
return _roles.getRoleAdmin(role);
}
function hasRole(bytes32 role, address acct) public view returns (bool) {
return _roles.hasRole(role, acct);
}
}
IAccessControl
// SPDX-License-Identifier: UNLICENSED
/* *
* Copyright (c) 2021-2023 LI LI @ JINGTIAN & GONGCHENG.
*
* This WORK is licensed under ComBoox SoftWare License 1.0, a copy of which
* can be obtained at:
* [https://github.com/paul-lee-attorney/comboox]
*
* THIS WORK IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
* WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. IN NO
* EVENT SHALL ANY CONTRIBUTOR BE LIABLE TO YOU FOR ANY DAMAGES.
*
* YOU ARE PROHIBITED FROM DEPLOYING THE SMART CONTRACTS OF THIS WORK, IN WHOLE
* OR IN PART, FOR WHATEVER PURPOSE, ON ANY BLOCKCHAIN NETWORK THAT HAS ONE OR
* MORE NODES THAT ARE OUT OF YOUR CONTROL.
* */
pragma solidity ^0.8.8;
import "../../../lib/RolesRepo.sol";
import "../../../center/IRegCenter.sol";
import "../../IGeneralKeeper.sol";
interface IAccessControl {
// ##################
// ## Event ##
// ##################
event Init(
address indexed owner,
address indexed directKeeper,
address regCenter,
address indexed generalKeeper
);
event SetOwner(address indexed acct);
event SetDirectKeeper(address indexed keeper);
event SetRoleAdmin(bytes32 indexed role, address indexed acct);
event LockContents();
// ##################
// ## Write ##
// ##################
function init(
address owner,
address directKeeper,
address regCenter,
address generalKeeper
) external;
function setOwner(address acct) external;
function setDirectKeeper(address keeper) external;
function takeBackKeys(address target) external;
function setRoleAdmin(bytes32 role, address acct) external;
function grantRole(bytes32 role, address acct) external;
function revokeRole(bytes32 role, address acct) external;
function renounceRole(bytes32 role) external;
function abandonRole(bytes32 role) external;
function lockContents() external;
// ##################
// ## Read ##
// ##################
function getOwner() external view returns (address);
function getDK() external view returns (address);
function isFinalized() external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (address);
function hasRole(bytes32 role, address acct) external view returns (bool);
}
Last updated