Skip to content

Commit

Permalink
Refactoring Superuser contract to allow Owners to transfer ownership … (
Browse files Browse the repository at this point in the history
OpenZeppelin#978)

* Refactoring Superuser contract to allow Owners to transfer ownership when they are not superusers OpenZeppelin#50

* Refactoring tests to create a contract instance for each of them OpenZeppelin#50
  • Loading branch information
pmosse authored and frangio committed Jun 5, 2018
1 parent 5db0d7d commit 7fb84b4
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 23 deletions.
26 changes: 17 additions & 9 deletions contracts/ownership/Ownable.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,29 @@ contract Ownable {
_;
}

/**
* @dev Allows the current owner to relinquish control of the contract.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipRenounced(owner);
owner = address(0);
}

/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
* @param _newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
function transferOwnership(address _newOwner) public onlyOwner {
_transferOwnership(_newOwner);
}

/**
* @dev Allows the current owner to relinquish control of the contract.
* @dev Transfers control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipRenounced(owner);
owner = address(0);
function _transferOwnership(address _newOwner) internal {
require(_newOwner != address(0));
emit OwnershipTransferred(owner, _newOwner);
owner = _newOwner;
}
}
18 changes: 9 additions & 9 deletions contracts/ownership/Superuser.sol
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ contract Superuser is Ownable, RBAC {
_;
}

modifier onlyOwnerOrSuperuser() {
require(msg.sender == owner || isSuperuser(msg.sender));
_;
}

/**
* @dev getter to determine if address has superuser role
*/
Expand All @@ -41,22 +46,17 @@ contract Superuser is Ownable, RBAC {
* @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
{
function transferSuperuser(address _newSuperuser) public onlySuperuser {
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.
* @dev Allows the current superuser or owner 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);
function transferOwnership(address _newOwner) public onlyOwnerOrSuperuser {
_transferOwnership(_newOwner);
}
}
22 changes: 17 additions & 5 deletions test/ownership/Superuser.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ contract('Superuser', function (accounts) {
anyone,
] = accounts;

before(async function () {
beforeEach(async function () {
this.superuser = await Superuser.new();
});

Expand All @@ -31,11 +31,13 @@ contract('Superuser', function (accounts) {
const ownerIsSuperuser = await this.superuser.isSuperuser(firstOwner);
ownerIsSuperuser.should.be.equal(false);

const address1IsSuperuser = await this.superuser.isSuperuser(newSuperuser);
address1IsSuperuser.should.be.equal(true);
const newSuperuserIsSuperuser = await this.superuser.isSuperuser(newSuperuser);
newSuperuserIsSuperuser.should.be.equal(true);
});

it('should change owner after transferring', async function () {
it('should change owner after the superuser transfers the ownership', async function () {
await this.superuser.transferSuperuser(newSuperuser, { from: firstOwner });

await expectEvent.inTransaction(
this.superuser.transferOwnership(newOwner, { from: newSuperuser }),
'OwnershipTransferred'
Expand All @@ -44,6 +46,16 @@ contract('Superuser', function (accounts) {
const currentOwner = await this.superuser.owner();
currentOwner.should.be.equal(newOwner);
});

it('should change owner after the owner transfers the ownership', async function () {
await expectEvent.inTransaction(
this.superuser.transferOwnership(newOwner, { from: firstOwner }),
'OwnershipTransferred'
);

const currentOwner = await this.superuser.owner();
currentOwner.should.be.equal(newOwner);
});
});

context('in adversarial conditions', () => {
Expand All @@ -53,7 +65,7 @@ contract('Superuser', function (accounts) {
);
});

it('should prevent non-superusers from setting a new owner', async function () {
it('should prevent users that are not superuser nor owner from setting a new owner', async function () {
await expectThrow(
this.superuser.transferOwnership(newOwner, { from: anyone })
);
Expand Down

0 comments on commit 7fb84b4

Please sign in to comment.