aboutsummaryrefslogtreecommitdiffstats
path: root/test/compilationTests/zeppelin/Bounty.sol
blob: 55e6407156ef1148207f0c8ae6fe905240b7ffc2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
pragma solidity ^0.4.11;


import './payment/PullPayment.sol';
import './lifecycle/Destructible.sol';


/**
 * @title Bounty
 * @dev This bounty will pay out to a researcher if they break invariant logic of the contract.
 */
contract Bounty is PullPayment, Destructible {
  bool public claimed;
  mapping(address => address) public researchers;

  event TargetCreated(address createdAddress);

  /**
   * @dev Fallback function allowing the contract to receive funds, if they haven't already been claimed.
   */
  function() external payable {
    if (claimed) {
      revert();
    }
  }

  /**
   * @dev Create and deploy the target contract (extension of Target contract), and sets the 
   * msg.sender as a researcher
   * @return A target contract
   */
  function createTarget() public returns(Target) {
    Target target = Target(deployContract());
    researchers[target] = msg.sender;
    emit TargetCreated(target);
    return target;
  }

  /**
   * @dev Internal function to deploy the target contract.
   * @return A target contract address
   */
  function deployContract() internal returns(address);

  /**
   * @dev Sends the contract funds to the researcher that proved the contract is broken.
   * @param target contract
   */
  function claim(Target target) public {
    address researcher = researchers[target];
    if (researcher == address(0)) {
      revert();
    }
    // Check Target contract invariants
    if (target.checkInvariant()) {
      revert();
    }
    asyncSend(researcher, address(this).balance);
    claimed = true;
  }

}


/**
 * @title Target
 * @dev Your main contract should inherit from this class and implement the checkInvariant method.
 */
contract Target {

   /**
    * @dev Checks all values a contract assumes to be true all the time. If this function returns 
    * false, the contract is broken in some way and is in an inconsistent state. 
    * In order to win the bounty, security researchers will try to cause this broken state. 
    * @return True if all invariant values are correct, false otherwise. 
    */
  function checkInvariant() public returns(bool);
}