From 166a1070e57d9aeab59c042d77ebd070f31a0851 Mon Sep 17 00:00:00 2001 From: Remco Bloemen Date: Thu, 23 Mar 2017 15:43:52 +0000 Subject: [PATCH] Add HasNoContracts --- contracts/ownership/HasNoContracts.sol | 18 +++++++++++++ test/HasNoContracts.js | 35 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 contracts/ownership/HasNoContracts.sol create mode 100644 test/HasNoContracts.js diff --git a/contracts/ownership/HasNoContracts.sol b/contracts/ownership/HasNoContracts.sol new file mode 100644 index 000000000..842638dc2 --- /dev/null +++ b/contracts/ownership/HasNoContracts.sol @@ -0,0 +1,18 @@ +pragma solidity ^0.4.8; + +import "./Ownable.sol"; + +/// @title Contracts that should not own Contracts +/// @author Remco Bloemen +/// +/// Should contracts (anything Ownable) end up being owned by +/// this contract, it allows the owner of this contract to +/// reclaim ownership of the contracts. +contract HasNoContracts is Ownable { + + /// Reclaim ownership of Ownable contracts + function reclaimContract(address contractAddr) external onlyOwner { + Ownable contractInst = Ownable(contractAddr); + contractInst.transferOwnership(owner); + } +} diff --git a/test/HasNoContracts.js b/test/HasNoContracts.js new file mode 100644 index 000000000..cfe879ad4 --- /dev/null +++ b/test/HasNoContracts.js @@ -0,0 +1,35 @@ +'use strict'; +import expectThrow from './helpers/expectThrow'; +import toPromise from './helpers/toPromise'; +const Ownable = artifacts.require('../contracts/ownership/Ownable.sol'); +const HasNoContracts = artifacts.require( + '../contracts/ownership/HasNoContracts.sol', +); + +contract('HasNoContracts', function(accounts) { + let hasNoContracts = null; + let ownable = null; + + beforeEach(async () => { + // Create contract and token + hasNoContracts = await HasNoContracts.new(); + ownable = await Ownable.new(); + + // Force ownership into contract + await ownable.transferOwnership(hasNoContracts.address); + const owner = await ownable.owner(); + assert.equal(owner, hasNoContracts.address); + }); + + it('should allow owner to reclaim contracts', async function() { + await hasNoContracts.reclaimContract(ownable.address); + const owner = await ownable.owner(); + assert.equal(owner, accounts[0]); + }); + + it('should allow only owner to reclaim contracts', async function() { + await expectThrow( + hasNoContracts.reclaimContract(ownable.address, {from: accounts[1]}), + ); + }); +});