* fix: bounty tests, superceeds #799 * fix: updates from PR notespull/1117/head^2
parent
e6c15b34da
commit
6e19ed47be
@ -1,113 +1,97 @@ |
|||||||
const { ethGetBalance, ethSendTransaction } = require('./helpers/web3'); |
const { ethGetBalance, ethSendTransaction } = require('./helpers/web3'); |
||||||
|
const expectEvent = require('./helpers/expectEvent'); |
||||||
|
const { assertRevert } = require('./helpers/assertRevert'); |
||||||
|
|
||||||
var SecureTargetBounty = artifacts.require('SecureTargetBounty'); |
const SecureTargetBounty = artifacts.require('SecureTargetBounty'); |
||||||
var InsecureTargetBounty = artifacts.require('InsecureTargetBounty'); |
const InsecureTargetBounty = artifacts.require('InsecureTargetBounty'); |
||||||
|
|
||||||
|
require('chai') |
||||||
|
.use(require('chai-bignumber')(web3.BigNumber)) |
||||||
|
.should(); |
||||||
|
|
||||||
const sendReward = async (from, to, value) => ethSendTransaction({ |
const sendReward = async (from, to, value) => ethSendTransaction({ |
||||||
from, to, value, |
from, |
||||||
|
to, |
||||||
|
value, |
||||||
}); |
}); |
||||||
|
|
||||||
function awaitEvent (event, handler) { |
const reward = new web3.BigNumber(web3.toWei(1, 'ether')); |
||||||
return new Promise((resolve, reject) => { |
|
||||||
function wrappedHandler (...args) { |
|
||||||
Promise.resolve(handler(...args)).then(resolve).catch(reject); |
|
||||||
} |
|
||||||
|
|
||||||
event.watch(wrappedHandler); |
contract('Bounty', function ([_, owner, researcher]) { |
||||||
}); |
context('against secure contract', function () { |
||||||
} |
beforeEach(async function () { |
||||||
|
this.bounty = await SecureTargetBounty.new({ from: owner }); |
||||||
|
}); |
||||||
|
|
||||||
contract('Bounty', function (accounts) { |
it('can set reward', async function () { |
||||||
it('sets reward', async function () { |
await sendReward(owner, this.bounty.address, reward); |
||||||
let owner = accounts[0]; |
|
||||||
let reward = web3.toWei(1, 'ether'); |
|
||||||
let bounty = await SecureTargetBounty.new(); |
|
||||||
await sendReward(owner, bounty.address, reward); |
|
||||||
|
|
||||||
const balance = await ethGetBalance(bounty.address); |
const balance = await ethGetBalance(this.bounty.address); |
||||||
assert.equal(reward, balance.toNumber()); |
balance.should.be.bignumber.eq(reward); |
||||||
}); |
}); |
||||||
|
|
||||||
it('empties itself when destroyed', async function () { |
context('with reward', function () { |
||||||
let owner = accounts[0]; |
beforeEach(async function () { |
||||||
let reward = web3.toWei(1, 'ether'); |
const result = await this.bounty.createTarget({ from: researcher }); |
||||||
let bounty = await SecureTargetBounty.new(); |
const event = await expectEvent.inLogs(result.logs, 'TargetCreated'); |
||||||
await sendReward(owner, bounty.address, reward); |
|
||||||
|
|
||||||
const balance = await ethGetBalance(bounty.address); |
this.targetAddress = event.args.createdAddress; |
||||||
assert.equal(reward, balance.toNumber()); |
|
||||||
|
|
||||||
await bounty.destroy(); |
await sendReward(owner, this.bounty.address, reward); |
||||||
const updatedBalance = await ethGetBalance(bounty.address); |
|
||||||
assert.equal(0, updatedBalance.toNumber()); |
const balance = await ethGetBalance(this.bounty.address); |
||||||
}); |
balance.should.be.bignumber.eq(reward); |
||||||
|
}); |
||||||
|
|
||||||
describe('Against secure contract', function () { |
it('cannot claim reward', async function () { |
||||||
it('cannot claim reward', async function () { |
await assertRevert( |
||||||
let owner = accounts[0]; |
this.bounty.claim(this.targetAddress, { from: researcher }), |
||||||
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; |
|
||||||
await sendReward(owner, bounty.address, reward); |
|
||||||
|
|
||||||
const balance = await ethGetBalance(bounty.address); |
|
||||||
assert.equal(reward, balance.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) { |
|
||||||
const updatedBalance = await ethGetBalance(bounty.address); |
|
||||||
assert.equal(reward, updatedBalance.toNumber()); |
|
||||||
} |
|
||||||
}; |
|
||||||
await bounty.createTarget({ from: researcher }); |
|
||||||
await awaitEvent(event, watcher); |
|
||||||
}); |
}); |
||||||
}); |
}); |
||||||
|
|
||||||
describe('Against broken contract', function () { |
context('against broken contract', function () { |
||||||
it('claims reward', async function () { |
beforeEach(async function () { |
||||||
let owner = accounts[0]; |
this.bounty = await InsecureTargetBounty.new(); |
||||||
let researcher = accounts[1]; |
|
||||||
let reward = web3.toWei(1, 'ether'); |
const result = await this.bounty.createTarget({ from: researcher }); |
||||||
let bounty = await InsecureTargetBounty.new(); |
const event = await expectEvent.inLogs(result.logs, 'TargetCreated'); |
||||||
let event = bounty.TargetCreated({}); |
|
||||||
|
this.targetAddress = event.args.createdAddress; |
||||||
let watcher = async function (err, result) { |
await sendReward(owner, this.bounty.address, reward); |
||||||
event.stopWatching(); |
}); |
||||||
if (err) { throw err; } |
|
||||||
let targetAddress = result.args.createdAddress; |
it('can claim reward', async function () { |
||||||
await sendReward(owner, bounty.address, reward); |
await this.bounty.claim(this.targetAddress, { from: researcher }); |
||||||
|
const claim = await this.bounty.claimed(); |
||||||
const balance = await ethGetBalance(bounty.address); |
|
||||||
assert.equal(reward, balance.toNumber()); |
claim.should.eq(true); |
||||||
|
|
||||||
await bounty.claim(targetAddress, { from: researcher }); |
const researcherPrevBalance = await ethGetBalance(researcher); |
||||||
let claim = await bounty.claimed.call(); |
|
||||||
|
const gas = await this.bounty.withdrawPayments.estimateGas({ from: researcher }); |
||||||
assert.isTrue(claim); |
const gasPrice = web3.toWei(1, 'gwei'); |
||||||
|
const gasCost = (new web3.BigNumber(gas)).times(gasPrice); |
||||||
await bounty.withdrawPayments({ from: researcher }); |
|
||||||
const updatedBalance = await ethGetBalance(bounty.address); |
await this.bounty.withdrawPayments({ from: researcher, gasPrice: gasPrice }); |
||||||
assert.equal(0, updatedBalance.toNumber()); |
const updatedBalance = await ethGetBalance(this.bounty.address); |
||||||
}; |
updatedBalance.should.be.bignumber.eq(0); |
||||||
await bounty.createTarget({ from: researcher }); |
|
||||||
await awaitEvent(event, watcher); |
const researcherCurrBalance = await ethGetBalance(researcher); |
||||||
|
researcherCurrBalance.sub(researcherPrevBalance).should.be.bignumber.eq(reward.sub(gasCost)); |
||||||
|
}); |
||||||
|
|
||||||
|
context('reward claimed', function () { |
||||||
|
beforeEach(async function () { |
||||||
|
await this.bounty.claim(this.targetAddress, { from: researcher }); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should no longer be payable', async function () { |
||||||
|
await assertRevert( |
||||||
|
sendReward(owner, this.bounty.address, reward) |
||||||
|
); |
||||||
|
}); |
||||||
}); |
}); |
||||||
}); |
}); |
||||||
}); |
}); |
||||||
|
Loading…
Reference in new issue