You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.5 KiB
115 lines
3.5 KiB
'use strict';
|
|
|
|
let sendReward = function(sender, receiver, value){
|
|
web3.eth.sendTransaction({
|
|
from:sender,
|
|
to:receiver,
|
|
value: value
|
|
});
|
|
};
|
|
var SecureTargetBounty = artifacts.require('helpers/SecureTargetBounty.sol');
|
|
var InsecureTargetBounty = artifacts.require('helpers/InsecureTargetBounty.sol');
|
|
|
|
function awaitEvent(event, handler) {
|
|
return new Promise((resolve, reject) => {
|
|
function wrappedHandler(...args) {
|
|
Promise.resolve(handler(...args)).then(resolve).catch(reject);
|
|
}
|
|
|
|
event.watch(wrappedHandler);
|
|
});
|
|
}
|
|
|
|
contract('Bounty', function(accounts) {
|
|
|
|
it('sets reward', async function() {
|
|
let owner = accounts[0];
|
|
let reward = web3.toWei(1, 'ether');
|
|
let bounty = await SecureTargetBounty.new();
|
|
sendReward(owner, bounty.address, reward);
|
|
|
|
assert.equal(reward, web3.eth.getBalance(bounty.address).toNumber());
|
|
});
|
|
|
|
it('empties itself when destroyed', async function(){
|
|
let owner = accounts[0];
|
|
let reward = web3.toWei(1, 'ether');
|
|
let bounty = await SecureTargetBounty.new();
|
|
sendReward(owner, bounty.address, reward);
|
|
|
|
assert.equal(reward, web3.eth.getBalance(bounty.address).toNumber());
|
|
|
|
await bounty.destroy();
|
|
assert.equal(0, web3.eth.getBalance(bounty.address).toNumber());
|
|
});
|
|
|
|
describe('Against secure contract', function(){
|
|
|
|
it('cannot claim reward', async function(){
|
|
let owner = accounts[0];
|
|
let researcher = accounts[1];
|
|
let reward = web3.toWei(1, 'ether');
|
|
let bounty = await SecureTargetBounty.new();
|
|
let event = bounty.TargetCreated({});
|
|
|
|
let watcher = async function(err, result) {
|
|
event.stopWatching();
|
|
if (err) { throw err; }
|
|
|
|
var targetAddress = result.args.createdAddress;
|
|
sendReward(owner, bounty.address, reward);
|
|
|
|
assert.equal(reward,
|
|
web3.eth.getBalance(bounty.address).toNumber());
|
|
|
|
try {
|
|
await bounty.claim(targetAddress, {from:researcher});
|
|
assert.isTrue(false); // should never reach here
|
|
} catch(error) {
|
|
let reClaimedBounty = await bounty.claimed.call();
|
|
assert.isFalse(reClaimedBounty);
|
|
|
|
}
|
|
try {
|
|
await bounty.withdrawPayments({from:researcher});
|
|
assert.isTrue(false); // should never reach here
|
|
} catch (err) {
|
|
assert.equal(reward,
|
|
web3.eth.getBalance(bounty.address).toNumber());
|
|
}
|
|
};
|
|
bounty.createTarget({from:researcher});
|
|
await awaitEvent(event, watcher);
|
|
});
|
|
});
|
|
|
|
describe('Against broken contract', function(){
|
|
it('claims reward', async function() {
|
|
let owner = accounts[0];
|
|
let researcher = accounts[1];
|
|
let reward = web3.toWei(1, 'ether');
|
|
let bounty = await InsecureTargetBounty.new();
|
|
let event = bounty.TargetCreated({});
|
|
|
|
let watcher = async function(err, result) {
|
|
event.stopWatching();
|
|
if (err) { throw err; }
|
|
let targetAddress = result.args.createdAddress;
|
|
sendReward(owner, bounty.address, reward);
|
|
|
|
assert.equal(reward, web3.eth.getBalance(bounty.address).toNumber());
|
|
|
|
await bounty.claim(targetAddress, {from:researcher});
|
|
let claim = await bounty.claimed.call();
|
|
|
|
assert.isTrue(claim);
|
|
|
|
await bounty.withdrawPayments({from:researcher});
|
|
|
|
assert.equal(0, web3.eth.getBalance(bounty.address).toNumber());
|
|
};
|
|
bounty.createTarget({from:researcher});
|
|
await awaitEvent(event, watcher);
|
|
});
|
|
});
|
|
});
|
|
|