Adding new Superuser contract with test (#952)
* Adding new Superuser contract + tests
This commit is contained in:
committed by
Matt Condon
parent
e3f866c982
commit
a0c03ee61c
62
contracts/ownership/Superuser.sol
Normal file
62
contracts/ownership/Superuser.sol
Normal file
@ -0,0 +1,62 @@
|
||||
pragma solidity ^0.4.23;
|
||||
|
||||
|
||||
import "./Ownable.sol";
|
||||
import "./rbac/RBAC.sol";
|
||||
|
||||
|
||||
/**
|
||||
* @title Superuser
|
||||
* @dev The Superuser contract defines a single superuser who can transfer the ownership
|
||||
* @dev of a contract to a new address, even if he is not the owner.
|
||||
* @dev A superuser can transfer his role to a new address.
|
||||
*/
|
||||
contract Superuser is Ownable, RBAC {
|
||||
string public constant ROLE_SUPERUSER = "superuser";
|
||||
|
||||
constructor () public {
|
||||
addRole(msg.sender, ROLE_SUPERUSER);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Throws if called by any account that's not a superuser.
|
||||
*/
|
||||
modifier onlySuperuser() {
|
||||
checkRole(msg.sender, ROLE_SUPERUSER);
|
||||
_;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev getter to determine if address has superuser role
|
||||
*/
|
||||
function isSuperuser(address _addr)
|
||||
public
|
||||
view
|
||||
returns (bool)
|
||||
{
|
||||
return hasRole(_addr, ROLE_SUPERUSER);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Allows the current superuser to transfer his role to a newSuperuser.
|
||||
* @param _newSuperuser The address to transfer ownership to.
|
||||
*/
|
||||
function transferSuperuser(address _newSuperuser)
|
||||
onlySuperuser
|
||||
public
|
||||
{
|
||||
require(_newSuperuser != address(0));
|
||||
removeRole(msg.sender, ROLE_SUPERUSER);
|
||||
addRole(_newSuperuser, ROLE_SUPERUSER);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Allows the current superuser to transfer control of the contract to a newOwner.
|
||||
* @param _newOwner The address to transfer ownership to.
|
||||
*/
|
||||
function transferOwnership(address _newOwner) public onlySuperuser {
|
||||
require(_newOwner != address(0));
|
||||
owner = _newOwner;
|
||||
emit OwnershipTransferred(owner, _newOwner);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user