Bounty.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. 'use strict';
  2. let sendReward = function(sender, receiver, value){
  3. web3.eth.sendTransaction({
  4. from:sender,
  5. to:receiver,
  6. value: value
  7. });
  8. };
  9. var SecureTargetBounty = artifacts.require('helpers/SecureTargetBounty.sol');
  10. var InsecureTargetBounty = artifacts.require('helpers/InsecureTargetBounty.sol');
  11. function awaitEvent(event, handler) {
  12. return new Promise((resolve, reject) => {
  13. function wrappedHandler(...args) {
  14. Promise.resolve(handler(...args)).then(resolve).catch(reject);
  15. }
  16. event.watch(wrappedHandler);
  17. });
  18. }
  19. contract('Bounty', function(accounts) {
  20. it('sets reward', async function() {
  21. let owner = accounts[0];
  22. let reward = web3.toWei(1, 'ether');
  23. let bounty = await SecureTargetBounty.new();
  24. sendReward(owner, bounty.address, reward);
  25. assert.equal(reward, web3.eth.getBalance(bounty.address).toNumber());
  26. });
  27. it('empties itself when destroyed', async function(){
  28. let owner = accounts[0];
  29. let reward = web3.toWei(1, 'ether');
  30. let bounty = await SecureTargetBounty.new();
  31. sendReward(owner, bounty.address, reward);
  32. assert.equal(reward, web3.eth.getBalance(bounty.address).toNumber());
  33. await bounty.destroy();
  34. assert.equal(0, web3.eth.getBalance(bounty.address).toNumber());
  35. });
  36. describe('Against secure contract', function(){
  37. it('cannot claim reward', async function(){
  38. let owner = accounts[0];
  39. let researcher = accounts[1];
  40. let reward = web3.toWei(1, 'ether');
  41. let bounty = await SecureTargetBounty.new();
  42. let event = bounty.TargetCreated({});
  43. let watcher = async function(err, result) {
  44. event.stopWatching();
  45. if (err) { throw err; }
  46. var targetAddress = result.args.createdAddress;
  47. sendReward(owner, bounty.address, reward);
  48. assert.equal(reward,
  49. web3.eth.getBalance(bounty.address).toNumber());
  50. try {
  51. await bounty.claim(targetAddress, {from:researcher});
  52. assert.isTrue(false); // should never reach here
  53. } catch(error) {
  54. let reClaimedBounty = await bounty.claimed.call();
  55. assert.isFalse(reClaimedBounty);
  56. }
  57. try {
  58. await bounty.withdrawPayments({from:researcher});
  59. assert.isTrue(false); // should never reach here
  60. } catch (err) {
  61. assert.equal(reward,
  62. web3.eth.getBalance(bounty.address).toNumber());
  63. }
  64. };
  65. bounty.createTarget({from:researcher});
  66. await awaitEvent(event, watcher);
  67. });
  68. });
  69. describe('Against broken contract', function(){
  70. it('claims reward', async function() {
  71. let owner = accounts[0];
  72. let researcher = accounts[1];
  73. let reward = web3.toWei(1, 'ether');
  74. let bounty = await InsecureTargetBounty.new();
  75. let event = bounty.TargetCreated({});
  76. let watcher = async function(err, result) {
  77. event.stopWatching();
  78. if (err) { throw err; }
  79. let targetAddress = result.args.createdAddress;
  80. sendReward(owner, bounty.address, reward);
  81. assert.equal(reward, web3.eth.getBalance(bounty.address).toNumber());
  82. await bounty.claim(targetAddress, {from:researcher});
  83. let claim = await bounty.claimed.call();
  84. assert.isTrue(claim);
  85. await bounty.withdrawPayments({from:researcher});
  86. assert.equal(0, web3.eth.getBalance(bounty.address).toNumber());
  87. };
  88. bounty.createTarget({from:researcher});
  89. await awaitEvent(event, watcher);
  90. });
  91. });
  92. });