parent
b50894aabe
commit
406004a99a
@ -0,0 +1,24 @@ |
|||||||
|
pragma solidity ^0.4.11; |
||||||
|
|
||||||
|
import "./Ownable.sol"; |
||||||
|
import "../token/ERC20Basic.sol"; |
||||||
|
|
||||||
|
/** |
||||||
|
* @title Contracts that should be able to recover tokens |
||||||
|
* @author SylTi |
||||||
|
* @dev This allow a contract to recover any ERC20 token received in a contract by transfering the balance to the contract owner. |
||||||
|
* This will prevent any accidental loss of tokens. |
||||||
|
*/ |
||||||
|
contract CanReclaimToken is Ownable { |
||||||
|
|
||||||
|
/** |
||||||
|
* @dev Reclaim all ERC20Basic compatible tokens |
||||||
|
* @param tokenAddr address The address of the token contract |
||||||
|
*/ |
||||||
|
function reclaimToken(address tokenAddr) external onlyOwner { |
||||||
|
ERC20Basic tokenInst = ERC20Basic(tokenAddr); |
||||||
|
uint256 balance = tokenInst.balanceOf(this); |
||||||
|
tokenInst.transfer(owner, balance); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
'use strict'; |
||||||
|
import expectThrow from './helpers/expectThrow'; |
||||||
|
import toPromise from './helpers/toPromise'; |
||||||
|
const CanReclaimToken = artifacts.require('../contracts/ownership/CanReclaimToken.sol'); |
||||||
|
const BasicTokenMock = artifacts.require("./helpers/BasicTokenMock.sol"); |
||||||
|
|
||||||
|
contract('CanReclaimToken', function(accounts) { |
||||||
|
let token = null; |
||||||
|
let canReclaimToken = null; |
||||||
|
|
||||||
|
beforeEach(async () => { |
||||||
|
// Create contract and token
|
||||||
|
token = await BasicTokenMock.new(accounts[0], 100); |
||||||
|
canReclaimToken = await CanReclaimToken.new(); |
||||||
|
// Force token into contract
|
||||||
|
await token.transfer(canReclaimToken.address, 10); |
||||||
|
const startBalance = await token.balanceOf(canReclaimToken.address); |
||||||
|
assert.equal(startBalance, 10); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should allow owner to reclaim tokens', async function() { |
||||||
|
const ownerStartBalance = await token.balanceOf(accounts[0]); |
||||||
|
await canReclaimToken.reclaimToken(token.address); |
||||||
|
const ownerFinalBalance = await token.balanceOf(accounts[0]); |
||||||
|
const finalBalance = await token.balanceOf(canReclaimToken.address); |
||||||
|
assert.equal(finalBalance, 0); |
||||||
|
assert.equal(ownerFinalBalance - ownerStartBalance, 10); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should allow only owner to reclaim tokens', async function() { |
||||||
|
await expectThrow( |
||||||
|
canReclaimToken.reclaimToken(token.address, {from: accounts[1]}), |
||||||
|
); |
||||||
|
}); |
||||||
|
}); |
Loading…
Reference in new issue