Contract 0xa0b327d2cc524942ae8b0c6862e71576b0305837

 

TxHash Block Age From To Value [TxFee]
0x20a6eeae2bac44da43fd6809a239840ce1207179dab3256a8c87f69cb0b5acda72084046 days 5 hrs ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.002432202
0x930dd88ea9e6cce8d6612c4474024ddf4756b8bc030ab2e034c4b3adde38ad4b72083986 days 5 hrs ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.00306557
0x544212fe73c5776711800b8e3255e069255f45be447311612dd723438847e0c572038777 days 7 hrs ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.002432202
0x22709faf0cb4d43795c0ae13b3a04a20f6c748e0014a902bb2929bd11107984b72038267 days 8 hrs ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.002455818
0x6eb167806ef3c37130fc8101c38495687537ef2097ed53c1e107478025c0a3d7712731222 days 23 hrs ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.002458442
0x8a4c48bb3defc4984bcb874ca264a961ecdd980d0484490f4d7c2d8f3ffae5e6712730722 days 23 hrs ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.002455818
0x5a913219f6fa4079a29fea96d604684adbe37702fd2109c7f4a62cc13f0b3ad3712730222 days 23 hrs ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.003068194
0xdbcb21637ded8f1af8fa198b8cdf236654930c2baa220d7dfca6ab8821f0cf8f712720023 days 21 mins ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.00306557
0x72660a5816a8957bc4f15c3a65baa61626cf82c880e537656da1dd5fdf535233707010233 days 16 hrs ago0xee8baf47b74c1b3dcedcbff7c776995baa6642e6  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.425529 Ether0.0005151918
0x7937f71428d99970ef9264fd6d1039e32577097d45096c52b9408331b2d1ee4a704209438 days 16 hrs ago0xe38a285d02fea11ab215fc9ee55b1e1f62cddc64  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.67 Ether0.000201618
0x5c4f766da0586a985478fbf33d4e39236f8d6fa7d9a9236c7e9d8f60adc9d465704207938 days 16 hrs ago0xe38a285d02fea11ab215fc9ee55b1e1f62cddc64  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.4 Ether0.000291618
0xa69c2fa6710d4677c5d48ac2db2bd59cc7a3b9962616c1f5e4b2622ec7e3cbab702065542 days 12 hrs ago0x74accde6d11b2dc5a8e0b5ca9880469ddcc125fe  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058376.4 Ether0.000194412
0x545b842cc3de2764af41a0fb8e1b8560d39f52aedde1593ed06dcdc69228cd14700643045 days 2 hrs ago0xc337a369cc6f030e905f619901ae0a98384e768d  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.4 Ether0.000134412
0xad7d73154ae2cce35018ea43397b44f7060e85cda7b7b91d4a8a2a6ca61eca02699033947 days 20 hrs ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.001345005
0x033417b008b1521fe3e8c65480ac36493a89cda0d95b574d106e92a45043c4c5699033647 days 20 hrs ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.001345005
0xed025d11dc1684e295316bafd41d94dc76054d0db429d2a9bd6312e02a910dcf699031547 days 21 hrs ago0x0e8a8067190d917f6f03c12be3992c82ea1ac4f2  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370 Ether0.002461066
0x7869f365678b8f055f79baabdd5a084bb9db94dba79fff58d82be1e05784d88c697577150 days 8 hrs ago0xe4f1a039568c7d3df565e59e2032285fec44fe5c  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.7 Ether0.000291618
0x4210341f0ad0c9295212459e7e74f286e807e6e88a49afcc1fd1a5195543d825697565350 days 8 hrs ago0xc337a369cc6f030e905f619901ae0a98384e768d  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.43446956 Ether0.000134412
0x29d06d517b120a76f852dafc5a9955da42a5651432205a1e4825ed7ca8248f84697556950 days 8 hrs ago0x9f901ecc0ed58b53b1e4d9e471bc94d2924e63f1  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.40291156 Ether0.000168015
0xddd6dcd496b706aba22d66cd97e7c47855fa932c81f610ad980cd3655c71d8a3697019851 days 6 hrs ago0x2509e8cb2a7ca0b8e1dd69a33b3afe3386d54f89  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.4 Ether0.000291618
0xa54d73c376394f08b32842900c6a360fe451fa5bec7f3c2cc313cfad395cb515693880656 days 13 hrs ago0x9f901ecc0ed58b53b1e4d9e471bc94d2924e63f1  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.40818058 Ether0.000291618
0x0922aeee270e04565f8a929420dd402775131c32e24d6473e25378f4fb7d5fc4692154559 days 12 hrs ago0x7a9b428eb8f84d0c7f470473a86d6c34aed0865b  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.45184204 Ether0.000583236
0xa888d44f9deba2a6cdf7f8d2e510f114269b35b3df15930816851b757468099f691943659 days 20 hrs ago0xc337a369cc6f030e905f619901ae0a98384e768d  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.4104168 Ether0.000201618
0x09efeadb779f056701486c5d6a227fa25d265760b23c25474c06ff76170b38d5691443660 days 17 hrs ago0x3deec91c893636dbd1c3e6263e1d5d0c7e13cb48  IN  0xa0b327d2cc524942ae8b0c6862e71576b030583711.41187913 Ether0.00048603
0xcfd2846bbac3900f8a202e82b29a8ce53889fc6d31d98dce798eaaec2387fba3690978561 days 12 hrs ago0x1cb70eff632da7ea7ac88cfc5a609dab2e91fd6b  IN  0xa0b327d2cc524942ae8b0c6862e71576b03058370.51311073 Ether0.000403236
[ Download CSV Export 

Latest 25 Internal Transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x72660a5816a8957bc4f15c3a65baa61626cf82c880e537656da1dd5fdf535233707010233 days 16 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.425529 Ether
0x7937f71428d99970ef9264fd6d1039e32577097d45096c52b9408331b2d1ee4a704209438 days 16 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.67 Ether
0x5c4f766da0586a985478fbf33d4e39236f8d6fa7d9a9236c7e9d8f60adc9d465704207938 days 16 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.4 Ether
0xa69c2fa6710d4677c5d48ac2db2bd59cc7a3b9962616c1f5e4b2622ec7e3cbab702065542 days 12 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03086.4 Ether
0x545b842cc3de2764af41a0fb8e1b8560d39f52aedde1593ed06dcdc69228cd14700643045 days 2 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.4 Ether
0x7869f365678b8f055f79baabdd5a084bb9db94dba79fff58d82be1e05784d88c697577150 days 8 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.7 Ether
0x4210341f0ad0c9295212459e7e74f286e807e6e88a49afcc1fd1a5195543d825697565350 days 8 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.43446956 Ether
0x29d06d517b120a76f852dafc5a9955da42a5651432205a1e4825ed7ca8248f84697556950 days 8 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.40291156 Ether
0xddd6dcd496b706aba22d66cd97e7c47855fa932c81f610ad980cd3655c71d8a3697019851 days 6 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.4 Ether
0xa54d73c376394f08b32842900c6a360fe451fa5bec7f3c2cc313cfad395cb515693880656 days 13 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.40818058 Ether
0x0922aeee270e04565f8a929420dd402775131c32e24d6473e25378f4fb7d5fc4692154559 days 12 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.45184204 Ether
0xa888d44f9deba2a6cdf7f8d2e510f114269b35b3df15930816851b757468099f691943659 days 20 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.4104168 Ether
0x09efeadb779f056701486c5d6a227fa25d265760b23c25474c06ff76170b38d5691443660 days 17 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b030811.41187913 Ether
0xcfd2846bbac3900f8a202e82b29a8ce53889fc6d31d98dce798eaaec2387fba3690978561 days 12 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.51311073 Ether
0x297f466d1bd094dda2167620cbe176536699756cb1af945128dbff7b9809c3f7690892861 days 15 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.4265504 Ether
0x31b4b8993f212fc4156f5e12516cb38774b51d8632e8cb2a75c00cf29daf1416690673662 days 53 mins ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.52 Ether
0x3ab8f3f3890d9e8c6a89375cd07cc10e8dc9786faa8794ec66cdd5019338bc73688432365 days 18 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03082.50242613 Ether
0x4f1ca2ba48c9d51c49ed8e0fd8a5a3439464bb0250fdbdb344f36e38a8c9f10b684627272 days 49 mins ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03082.41178843 Ether
0x534311922a9db5ec8343489f233f5c5c26585703c689cce600d503dc34fa9756682926374 days 20 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03085.58902599 Ether
0x670f4804dbeeafcf12c5c2739f1b23e319fc4febc311b1739ea10607502f844b682131576 days 4 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.5049822 Ether
0x16f3cb02dbef74227d9215c374328c0aedb52c0ac7cadbb5377fbcbab70f222b682095676 days 5 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03081.39539033 Ether
0x45d7b9e041c5cdf1032d958371a34fbbaa34a0c472ad7e56a449ab937e17fc6c681961776 days 10 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03081.36514074 Ether
0xd6290e672d6df5b8aef35ecbbe6da860abd89ba58694bb382a1606c0a70a3f0d681797976 days 17 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03081.59341559 Ether
0xf0cca54ae3a23aa9c8320f40d9dcf777e0ff183bbb205ff3903c43e497f7a7df680436178 days 23 hrs ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03089.98902599 Ether
0xc281cc5200e35e6fd971f970e604e07064b4323e1fdb5af7fed94c84cb3cd178680409879 days 40 mins ago0xa0b327d2cc524942ae8b0c6862e71576b03058370xba0de8a41f8698a144595d22edf8ff943a5b03080.98991339 Ether
[ Download CSV Export 
Contract Source Code Verified (Exact Match)
Contract Name: JavvyCrowdsale
Compiler Version: v0.4.25+commit.59dbf8f1
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.24;

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

contract Config {
    uint256 public constant jvySupply = 333333333333333;
    uint256 public constant bonusSupply = 83333333333333;
    uint256 public constant saleSupply =  250000000000000;
    uint256 public constant hardCapUSD = 8000000;

    uint256 public constant preIcoBonus = 25;
    uint256 public constant minimalContributionAmount = 0.4 ether;

    function getStartPreIco() public view returns (uint256) {
        // solium-disable-next-line security/no-block-members
        uint256 nowTime = block.timestamp;
        uint256 _preIcoStartTime = nowTime + 1 minutes;
        return _preIcoStartTime;
    }

    function getStartIco() public view returns (uint256) {
        uint256 _icoStartTime = 1543554000;
        return _icoStartTime;
    }

    function getEndIco() public view returns (uint256) {
        uint256 _icoEndTime = 1551416400;
        return _icoEndTime;
    }
}

contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address _who) public view returns (uint256);
  function transfer(address _to, uint256 _value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}


contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender)
    public view returns (uint256);

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

  function approve(address _spender, uint256 _value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}


contract DetailedERC20 is ERC20 {
  string public name;
  string public symbol;
  uint8 public decimals;

  constructor(string _name, string _symbol, uint8 _decimals) public {
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
  }
}

contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) internal balances;

  uint256 internal totalSupply_;

  /**
  * @dev Total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev Transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_value <= balances[msg.sender]);
    require(_to != address(0));

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }

}


contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  )
    public
    returns (bool)
  {
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);
    require(_to != address(0));

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(
    address _owner,
    address _spender
   )
    public
    view
    returns (uint256)
  {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(
    address _spender,
    uint256 _addedValue
  )
    public
    returns (bool)
  {
    allowed[msg.sender][_spender] = (
      allowed[msg.sender][_spender].add(_addedValue));
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(
    address _spender,
    uint256 _subtractedValue
  )
    public
    returns (bool)
  {
    uint256 oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue >= oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract Escrow is Ownable {
  using SafeMath for uint256;

  event Deposited(address indexed payee, uint256 weiAmount);
  event Withdrawn(address indexed payee, uint256 weiAmount);

  mapping(address => uint256) private deposits;

  function depositsOf(address _payee) public view returns (uint256) {
    return deposits[_payee];
  }

  /**
  * @dev Stores the sent amount as credit to be withdrawn.
  * @param _payee The destination address of the funds.
  */
  function deposit(address _payee) public onlyOwner payable {
    uint256 amount = msg.value;
    deposits[_payee] = deposits[_payee].add(amount);

    emit Deposited(_payee, amount);
  }

  /**
  * @dev Withdraw accumulated balance for a payee.
  * @param _payee The address whose funds will be withdrawn and transferred to.
  */
  function withdraw(address _payee) public onlyOwner {
    uint256 payment = deposits[_payee];
    assert(address(this).balance >= payment);

    deposits[_payee] = 0;

    _payee.transfer(payment);

    emit Withdrawn(_payee, payment);
  }
}


contract Crowdsale {
  using SafeMath for uint256;
  using SafeERC20 for ERC20;

  // The token being sold
  ERC20 public token;

  // Address where funds are collected
  address public wallet;

  // How many token units a buyer gets per wei.
  // The rate is the conversion between wei and the smallest and indivisible token unit.
  // So, if you are using a rate of 1 with a DetailedERC20 token with 3 decimals called TOK
  // 1 wei will give you 1 unit, or 0.001 TOK.
  uint256 public rate;

  // Amount of wei raised
  uint256 public weiRaised;

  /**
   * Event for token purchase logging
   * @param purchaser who paid for the tokens
   * @param beneficiary who got the tokens
   * @param value weis paid for purchase
   * @param amount amount of tokens purchased
   */
  event TokenPurchase(
    address indexed purchaser,
    address indexed beneficiary,
    uint256 value,
    uint256 amount
  );

  /**
   * @param _rate Number of token units a buyer gets per wei
   * @param _wallet Address where collected funds will be forwarded to
   * @param _token Address of the token being sold
   */
  constructor(uint256 _rate, address _wallet, ERC20 _token) public {
    require(_rate > 0);
    require(_wallet != address(0));
    require(_token != address(0));

    rate = _rate;
    wallet = _wallet;
    token = _token;
  }

  // -----------------------------------------
  // Crowdsale external interface
  // -----------------------------------------

  /**
   * @dev fallback function ***DO NOT OVERRIDE***
   */
  function () external payable {
    buyTokens(msg.sender);
  }

  /**
   * @dev low level token purchase ***DO NOT OVERRIDE***
   * @param _beneficiary Address performing the token purchase
   */
  function buyTokens(address _beneficiary) public payable {

    uint256 weiAmount = msg.value;
    _preValidatePurchase(_beneficiary, weiAmount);

    // calculate token amount to be created
    uint256 tokens = _getTokenAmount(weiAmount);

    // update state
    weiRaised = weiRaised.add(weiAmount);

    _processPurchase(_beneficiary, tokens);
    emit TokenPurchase(
      msg.sender,
      _beneficiary,
      weiAmount,
      tokens
    );

    _updatePurchasingState(_beneficiary, weiAmount);

    _forwardFunds();
    _postValidatePurchase(_beneficiary, weiAmount);
  }

  // -----------------------------------------
  // Internal interface (extensible)
  // -----------------------------------------

  /**
   * @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met. Use `super` in contracts that inherit from Crowdsale to extend their validations.
   * Example from CappedCrowdsale.sol's _preValidatePurchase method: 
   *   super._preValidatePurchase(_beneficiary, _weiAmount);
   *   require(weiRaised.add(_weiAmount) <= cap);
   * @param _beneficiary Address performing the token purchase
   * @param _weiAmount Value in wei involved in the purchase
   */
  function _preValidatePurchase(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    require(_beneficiary != address(0));
    require(_weiAmount != 0);
  }

  /**
   * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid conditions are not met.
   * @param _beneficiary Address performing the token purchase
   * @param _weiAmount Value in wei involved in the purchase
   */
  function _postValidatePurchase(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    // optional override
  }

  /**
   * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends its tokens.
   * @param _beneficiary Address performing the token purchase
   * @param _tokenAmount Number of tokens to be emitted
   */
  function _deliverTokens(
    address _beneficiary,
    uint256 _tokenAmount
  )
    internal
  {
    token.safeTransfer(_beneficiary, _tokenAmount);
  }

  /**
   * @dev Executed when a purchase has been validated and is ready to be executed. Not necessarily emits/sends tokens.
   * @param _beneficiary Address receiving the tokens
   * @param _tokenAmount Number of tokens to be purchased
   */
  function _processPurchase(
    address _beneficiary,
    uint256 _tokenAmount
  )
    internal
  {
    _deliverTokens(_beneficiary, _tokenAmount);
  }

  /**
   * @dev Override for extensions that require an internal state to check for validity (current user contributions, etc.)
   * @param _beneficiary Address receiving the tokens
   * @param _weiAmount Value in wei involved in the purchase
   */
  function _updatePurchasingState(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    // optional override
  }

  /**
   * @dev Override to extend the way in which ether is converted to tokens.
   * @param _weiAmount Value in wei to be converted into tokens
   * @return Number of tokens that can be purchased with the specified _weiAmount
   */
  function _getTokenAmount(uint256 _weiAmount)
    internal view returns (uint256)
  {
    return _weiAmount.mul(rate);
  }

  /**
   * @dev Determines how ETH is stored/forwarded on purchases.
   */
  function _forwardFunds() internal {
    wallet.transfer(msg.value);
  }
}

contract ConditionalEscrow is Escrow {
  /**
  * @dev Returns whether an address is allowed to withdraw their funds. To be
  * implemented by derived contracts.
  * @param _payee The destination address of the funds.
  */
  function withdrawalAllowed(address _payee) public view returns (bool);

  function withdraw(address _payee) public {
    require(withdrawalAllowed(_payee));
    super.withdraw(_payee);
  }
}


contract RefundEscrow is Ownable, ConditionalEscrow {
  enum State { Active, Refunding, Closed }

  event Closed();
  event RefundsEnabled();

  State public state;
  address public beneficiary;

  /**
   * @dev Constructor.
   * @param _beneficiary The beneficiary of the deposits.
   */
  constructor(address _beneficiary) public {
    require(_beneficiary != address(0));
    beneficiary = _beneficiary;
    state = State.Active;
  }

  /**
   * @dev Stores funds that may later be refunded.
   * @param _refundee The address funds will be sent to if a refund occurs.
   */
  function deposit(address _refundee) public payable {
    require(state == State.Active);
    super.deposit(_refundee);
  }

  /**
   * @dev Allows for the beneficiary to withdraw their funds, rejecting
   * further deposits.
   */
  function close() public onlyOwner {
    require(state == State.Active);
    state = State.Closed;
    emit Closed();
  }

  /**
   * @dev Allows for refunds to take place, rejecting further deposits.
   */
  function enableRefunds() public onlyOwner {
    require(state == State.Active);
    state = State.Refunding;
    emit RefundsEnabled();
  }

  /**
   * @dev Withdraws the beneficiary's funds.
   */
  function beneficiaryWithdraw() public {
    require(state == State.Closed);
    beneficiary.transfer(address(this).balance);
  }

  /**
   * @dev Returns whether refundees can withdraw their deposits (be refunded).
   */
  function withdrawalAllowed(address _payee) public view returns (bool) {
    return state == State.Refunding;
  }
}

library SafeERC20 {
  function safeTransfer(
    ERC20Basic _token,
    address _to,
    uint256 _value
  )
    internal
  {
    require(_token.transfer(_to, _value));
  }

  function safeTransferFrom(
    ERC20 _token,
    address _from,
    address _to,
    uint256 _value
  )
    internal
  {
    require(_token.transferFrom(_from, _to, _value));
  }

  function safeApprove(
    ERC20 _token,
    address _spender,
    uint256 _value
  )
    internal
  {
    require(_token.approve(_spender, _value));
  }
}

contract CappedCrowdsale is Crowdsale {
  using SafeMath for uint256;

  uint256 public cap;

  /**
   * @dev Constructor, takes maximum amount of wei accepted in the crowdsale.
   * @param _cap Max amount of wei to be contributed
   */
  constructor(uint256 _cap) public {
    require(_cap > 0);
    cap = _cap;
  }

  /**
   * @dev Checks whether the cap has been reached.
   * @return Whether the cap was reached
   */
  function capReached() public view returns (bool) {
    return weiRaised >= cap;
  }

  /**
   * @dev Extend parent behavior requiring purchase to respect the funding cap.
   * @param _beneficiary Token purchaser
   * @param _weiAmount Amount of wei contributed
   */
  function _preValidatePurchase(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    super._preValidatePurchase(_beneficiary, _weiAmount);
    require(weiRaised.add(_weiAmount) <= cap);
  }

}



contract TimedCrowdsale is Crowdsale {
  using SafeMath for uint256;

  uint256 public openingTime;
  uint256 public closingTime;

  /**
   * @dev Reverts if not in crowdsale time range.
   */
  modifier onlyWhileOpen {
    // solium-disable-next-line security/no-block-members
    require(block.timestamp >= openingTime && block.timestamp <= closingTime);
    _;
  }

  /**
   * @dev Constructor, takes crowdsale opening and closing times.
   * @param _openingTime Crowdsale opening time
   * @param _closingTime Crowdsale closing time
   */
  constructor(uint256 _openingTime, uint256 _closingTime) public {
    // solium-disable-next-line security/no-block-members
    require(_openingTime >= block.timestamp);
    require(_closingTime >= _openingTime);

    openingTime = _openingTime;
    closingTime = _closingTime;
  }

  /**
   * @dev Checks whether the period in which the crowdsale is open has already elapsed.
   * @return Whether crowdsale period has elapsed
   */
  function hasClosed() public view returns (bool) {
    // solium-disable-next-line security/no-block-members
    return block.timestamp > closingTime;
  }

  /**
   * @dev Extend parent behavior requiring to be within contributing period
   * @param _beneficiary Token purchaser
   * @param _weiAmount Amount of wei contributed
   */
  function _preValidatePurchase(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
    onlyWhileOpen
  {
    super._preValidatePurchase(_beneficiary, _weiAmount);
  }

}

contract FinalizableCrowdsale is Ownable, TimedCrowdsale {
  using SafeMath for uint256;

  bool public isFinalized = false;

  event Finalized();

  /**
   * @dev Must be called after crowdsale ends, to do some extra finalization
   * work. Calls the contract's finalization function.
   */
  function finalize() public onlyOwner {
    require(!isFinalized);
    require(hasClosed());

    finalization();
    emit Finalized();

    isFinalized = true;
  }

  /**
   * @dev Can be overridden to add finalization logic. The overriding function
   * should call super.finalization() to ensure the chain of finalization is
   * executed entirely.
   */
  function finalization() internal {
  }

}

contract RefundableCrowdsale is FinalizableCrowdsale {
  using SafeMath for uint256;

  // minimum amount of funds to be raised in weis
  uint256 public goal;

  // refund escrow used to hold funds while crowdsale is running
  RefundEscrow private escrow;

  /**
   * @dev Constructor, creates RefundEscrow.
   * @param _goal Funding goal
   */
  constructor(uint256 _goal) public {
    require(_goal > 0);
    escrow = new RefundEscrow(wallet);
    goal = _goal;
  }

  /**
   * @dev Investors can claim refunds here if crowdsale is unsuccessful
   */
  function claimRefund() public {
    require(isFinalized);
    require(!goalReached());

    escrow.withdraw(msg.sender);
  }

  /**
   * @dev Checks whether funding goal was reached.
   * @return Whether funding goal was reached
   */
  function goalReached() public view returns (bool) {
    return weiRaised >= goal;
  }

  /**
   * @dev escrow finalization task, called when owner calls finalize()
   */
  function finalization() internal {
    if (goalReached()) {
      escrow.close();
      escrow.beneficiaryWithdraw();
    } else {
      escrow.enableRefunds();
    }

    super.finalization();
  }

  /**
   * @dev Overrides Crowdsale fund forwarding, sending funds to escrow.
   */
  function _forwardFunds() internal {
    escrow.deposit.value(msg.value)(msg.sender);
  }

}

contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() public onlyOwner whenNotPaused {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() public onlyOwner whenPaused {
    paused = false;
    emit Unpause();
  }
}

contract MultiSigWallet {
    uint constant public MAX_OWNER_COUNT = 50;

    event Confirmation(address indexed sender, uint indexed transactionId);
    event Revocation(address indexed sender, uint indexed transactionId);
    event Submission(uint indexed transactionId);
    event Execution(uint indexed transactionId);
    event ExecutionFailure(uint indexed transactionId);
    event Deposit(address indexed sender, uint value);
    event OwnerAddition(address indexed owner);
    event OwnerRemoval(address indexed owner);
    event RequirementChange(uint required);

    mapping (uint => Transaction) public transactions;
    mapping (uint => mapping (address => bool)) public confirmations;
    mapping (address => bool) public isOwner;

    address[] public owners;
    uint public required;
    uint public transactionCount;

    struct Transaction {
        address destination;
        uint value;
        bytes data;
        bool executed;
    }

    modifier onlyWallet() {
        require(msg.sender == address(this));
        _;
    }

    modifier ownerDoesNotExist(address owner) {
        require(!isOwner[owner]);
        _;
    }

    modifier ownerExists(address owner) {
        require(isOwner[owner]);
        _;
    }

    modifier transactionExists(uint transactionId) {
        require(transactions[transactionId].destination != 0);
        _;
    }

    modifier confirmed(uint transactionId, address owner) {
        require(confirmations[transactionId][owner]);
        _;
    }

    modifier notConfirmed(uint transactionId, address owner) {
        require(!confirmations[transactionId][owner]);
        _;
    }

    modifier notExecuted(uint transactionId) {
        require(!transactions[transactionId].executed);
        _;
    }

    modifier notNull(address _address) {
        require(_address != address(0));
        _;
    }

    modifier validRequirement(uint ownerCount, uint _required) {
        bool ownerValid = ownerCount <= MAX_OWNER_COUNT;
        bool ownerNotZero = ownerCount != 0;
        bool requiredValid = _required <= ownerCount;
        bool requiredNotZero = _required != 0;
        require(ownerValid && ownerNotZero && requiredValid && requiredNotZero);
        _;
    }

    /// @dev Fallback function allows to deposit ether.
    function() payable public {
        fallback();
    }

    function fallback() payable public {
        if (msg.value > 0) {
            emit Deposit(msg.sender, msg.value);
        }
    }

    /*
     * Public functions
     */
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    constructor(
        address[] _owners, 
        uint _required
    ) public validRequirement(_owners.length, _required) 
    {
        for (uint i = 0; i<_owners.length; i++) {
            require(!isOwner[_owners[i]] && _owners[i] != 0);
            isOwner[_owners[i]] = true;
        }
        owners = _owners;
        required = _required;
    }

    /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of new owner.
    function addOwner(address owner)
        public
        onlyWallet
        ownerDoesNotExist(owner)
        notNull(owner)
        validRequirement(owners.length + 1, required)
    {
        isOwner[owner] = true;
        owners.push(owner);
        emit OwnerAddition(owner);
    }

    /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner.
    function removeOwner(address owner)
        public
        onlyWallet
        ownerExists(owner)
    {
        isOwner[owner] = false;
        for (uint i = 0; i < owners.length - 1; i++)
            if (owners[i] == owner) {
                owners[i] = owners[owners.length - 1];
                break;
            }
        owners.length -= 1;
        if (required > owners.length)
            changeRequirement(owners.length);
        emit OwnerRemoval(owner);
    }

    /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner to be replaced.
    /// @param newOwner Address of new owner.
    function replaceOwner(address owner, address newOwner)
        public
        onlyWallet
        ownerExists(owner)
        ownerDoesNotExist(newOwner)
    {
        for (uint i = 0; i < owners.length; i++)
            if (owners[i] == owner) {
                owners[i] = newOwner;
                break;
            }
        isOwner[owner] = false;
        isOwner[newOwner] = true;
        emit OwnerRemoval(owner);
        emit OwnerAddition(newOwner);
    }

    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
    /// @param _required Number of required confirmations.
    function changeRequirement(uint _required)
        public
        onlyWallet
        validRequirement(owners.length, _required)
    {
        required = _required;
        emit RequirementChange(_required);
    }

    /// @dev Allows an owner to submit and confirm a transaction.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function submitTransaction(address destination, uint value, bytes data)
        public
        returns (uint transactionId)
    {
        transactionId = addTransaction(destination, value, data);
        confirmTransaction(transactionId);
    }

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint transactionId)
        public
        ownerExists(msg.sender)
        transactionExists(transactionId)
        notConfirmed(transactionId, msg.sender)
    {
        confirmations[transactionId][msg.sender] = true;
        emit Confirmation(msg.sender, transactionId);
        executeTransaction(transactionId);
    }

    /// @dev Allows an owner to revoke a confirmation for a transaction.
    /// @param transactionId Transaction ID.
    function revokeConfirmation(uint transactionId)
        public
        ownerExists(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        confirmations[transactionId][msg.sender] = false;
        emit Revocation(msg.sender, transactionId);
    }

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint transactionId)
        public
        ownerExists(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        if (isConfirmed(transactionId)) {
            Transaction storage txn = transactions[transactionId];
            txn.executed = true;
            if (txn.destination.call.value(txn.value)(txn.data))
                emit Execution(transactionId);
            else {
                emit ExecutionFailure(transactionId);
                txn.executed = false;
            }
        }
    }

    /// @dev Returns the confirmation status of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Confirmation status.
    function isConfirmed(uint transactionId) public view returns (bool) {
        uint count = 0;
        for (uint i = 0; i < owners.length; i++) {
            if (confirmations[transactionId][owners[i]])
                count += 1;
            if (count == required)
                return true;
        }
    }

    /*
     * Internal functions
     */
    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function addTransaction(address destination, uint value, bytes data)
        internal
        notNull(destination)
        returns (uint transactionId)
    {
        transactionId = transactionCount;
        transactions[transactionId] = Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        });
        transactionCount += 1;
        emit Submission(transactionId);
    }

    /*
     * Web3 call functions
     */
    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Number of confirmations.
    function getConfirmationCount(uint transactionId) public view returns (uint count) {
        for (uint i = 0; i < owners.length; i++) {
            if (confirmations[transactionId][owners[i]]) {
                count += 1;
            }
        }
    }

    /// @dev Returns total number of transactions after filers are applied.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Total number of transactions after filters are applied.
    function getTransactionCount(
        bool pending, 
        bool executed
    ) public view returns (uint count) {
        for (uint i = 0; i < transactionCount; i++) {
            if (pending && 
                !transactions[i].executed || 
                executed && 
                transactions[i].executed
            ) {
                count += 1;
            }
        }
    }

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOwners() public view returns (address[]) {
        return owners;
    }

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return Returns array of owner addresses.
    function getConfirmations(
        uint transactionId
    ) public view returns (address[] _confirmations) {
        address[] memory confirmationsTemp = new address[](owners.length);
        uint count = 0;
        uint i;
        for (i = 0; i < owners.length; i++)
            if (confirmations[transactionId][owners[i]]) {
                confirmationsTemp[count] = owners[i];
                count += 1;
            }
        _confirmations = new address[](count);
        for (i = 0; i < count; i++)
            _confirmations[i] = confirmationsTemp[i];
    }

    /// @dev Returns list of transaction IDs in defined range.
    /// @param from Index start position of transaction array.
    /// @param to Index end position of transaction array.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Returns array of transaction IDs.
    function getTransactionIds(
        uint from, 
        uint to, 
        bool pending, 
        bool executed
    ) public view returns (uint[] _transactionIds) {
        uint[] memory transactionIdsTemp = new uint[](transactionCount);
        uint count = 0;
        uint i;
        for (i = 0; i < transactionCount; i++)
            if (pending && 
                !transactions[i].executed || 
                executed && 
                transactions[i].executed
            ) {
                transactionIdsTemp[count] = i;
                count += 1;
            }
        _transactionIds = new uint[](to - from);
        for (i = from; i < to; i++)
            _transactionIds[i - from] = transactionIdsTemp[i];
    }
}

contract JavvyMultiSig is MultiSigWallet {
    constructor(
        address[] _owners, 
        uint _required
    )
    MultiSigWallet(_owners, _required)
    public {}
}

contract JavvyToken is DetailedERC20, StandardToken, Ownable, Config {
    address public crowdsaleAddress;
    address public bonusAddress;
    address public multiSigAddress;

    constructor(
        string _name, 
        string _symbol, 
        uint8 _decimals
    ) public
    DetailedERC20(_name, _symbol, _decimals) {
        require(
            jvySupply == saleSupply + bonusSupply,
            "Sum of provided supplies is not equal to declared total Javvy supply. Check config!"
        );
        totalSupply_ = tokenToDecimals(jvySupply);
    }

    function initializeBalances(
        address _crowdsaleAddress,
        address _bonusAddress,
        address _multiSigAddress
    ) public 
    onlyOwner() {
        crowdsaleAddress = _crowdsaleAddress;
        bonusAddress = _bonusAddress;
        multiSigAddress = _multiSigAddress;

        _initializeBalance(_crowdsaleAddress, saleSupply);
        _initializeBalance(_bonusAddress, bonusSupply);
    }

    function _initializeBalance(address _address, uint256 _supply) private {
        require(_address != address(0), "Address cannot be equal to 0x0!");
        require(_supply != 0, "Supply cannot be equal to 0!");
        balances[_address] = tokenToDecimals(_supply);
        emit Transfer(address(0), _address, _supply);
    }

    function tokenToDecimals(uint256 _amount) private view returns (uint256){
        // NOTE for additional accuracy, we're using 6 decimal places in supply
        return _amount * (10 ** 12);
    }

    function getRemainingSaleTokens() external view returns (uint256) {
        return balanceOf(crowdsaleAddress);
    }

}


contract JavvyCrowdsale is RefundableCrowdsale, CappedCrowdsale, Pausable, Config {
    uint256 public icoStartTime;
    address public transminingAddress;
    address public bonusAddress;
    uint256 private USDETHRate;

    mapping (address => bool) public blacklisted;

    JavvyToken token;
    
    enum Stage {
        NotStarted,
        PreICO,
        ICO,
        AfterICO
    }

    function getStage() public view returns (Stage) {
        // solium-disable-next-line security/no-block-members
        uint256 blockTime = block.timestamp;
        if (blockTime < openingTime) return Stage.NotStarted;
        if (blockTime < icoStartTime) return Stage.PreICO;
        if (blockTime < closingTime) return Stage.ICO;
        else return Stage.AfterICO;
    }

    constructor(
        uint256 _rate,  
        JavvyMultiSig _wallet,
        JavvyToken _token,
        uint256 _cap,  // Should be in USD!
        uint256 _goal,
        address _bonusAddress,
        address[] _blacklistAddresses,
        uint256 _USDETHRate
    ) 
    Crowdsale(_rate, _wallet, _token)
    CappedCrowdsale(_cap)
    TimedCrowdsale(getStartPreIco(), getEndIco())
    RefundableCrowdsale(_goal)
    public {
        require(getStartIco() > block.timestamp, "ICO has to begin in the future");
        require(getEndIco() > block.timestamp, "ICO has to end in the future");
        require(_goal <= _cap, "Soft cap should be equal or smaller than hard cap");
        icoStartTime = getStartIco();
        bonusAddress = _bonusAddress;
        token = _token;
        for (uint256 i = 0; i < _blacklistAddresses.length; i++) {
            blacklisted[_blacklistAddresses[i]] = true;
        }
        setUSDETHRate(_USDETHRate);
    }

    function buyTokens(address _beneficiary) public payable {
        bool preallocated = false;
        uint256 preallocatedTokens = 0;

        _buyTokens(
            _beneficiary, 
            msg.sender, 
            msg.value,
            preallocated,
            preallocatedTokens
        );
    }

    function bulkPreallocate(address[] _owners, uint256[] _tokens, uint256[] _paid)
    public
    onlyOwner() {
        require(
            _owners.length == _tokens.length,
            "Lengths of parameter lists have to be equal"
        );
        require(
            _owners.length == _paid.length,
            "Lengths of parameter lists have to be equal"
        );
        for (uint256 i=0; i< _owners.length; i++) {
            preallocate(_owners[i], _tokens[i], _paid[i]);
        }
    }

    function preallocate(address _owner, uint256 _tokens, uint256 _paid)
    public
    onlyOwner() {
        require(!blacklisted[_owner], "Address where tokens will be sent is blacklisted");
        bool preallocated = true;
        uint256 preallocatedTokens = _tokens;

        _buyTokens(
            _owner, 
            _owner, 
            _paid,
            preallocated,
            preallocatedTokens
        );
    }

    function setTransminingAddress(address _transminingAddress) public
    onlyOwner() {
        transminingAddress = _transminingAddress;
    }

    // Created for moving funds later to transmining address
    function moveTokensToTransmining(uint256 _amount) public
    onlyOwner() {
        uint256 remainingTokens = token.getRemainingSaleTokens();
        require(
            transminingAddress != address(0),
            "Transmining address must be set!"
        );
        require(
            remainingTokens >= _amount,
            "Balance of remaining tokens for sale is smaller than requested amount for trans-mining"
        );
        uint256 weiNeeded = cap - weiRaised;
        uint256 tokensNeeded = weiNeeded * rate;
        
        if (getStage() != Stage.AfterICO){
            require(remainingTokens - _amount > tokensNeeded, "You need to leave enough tokens to reach hard cap");
        }
        _deliverTokens(transminingAddress, _amount, this);
    }

    function _buyTokens(
        address _beneficiary, 
        address _sender, 
        uint256 _value,
        bool _preallocated,
        uint256 _tokens
    ) internal
    whenNotPaused() {
        require(!blacklisted[_beneficiary], "Beneficiary is blacklisted");
        uint256 tokens;
        
        if (!_preallocated) {
            // pre validate params
            require(
                _value >= minimalContributionAmount, 
                "Amount contributed should be greater than required minimal contribution"
            );
            require(_tokens == 0, "Not preallocated tokens should be zero");
            _preValidatePurchase(_beneficiary, _value);
        } else {
            require(_tokens != 0, "Preallocated tokens should be greater than zero");
            require(weiRaised.add(_value) <= cap, "Raised tokens should not exceed hard cap");
        }

        // calculate tokens
        if (!_preallocated) {
            tokens = _getTokenAmount(_value);
        } else {
            tokens = _tokens;
        }

        // increase wei
        weiRaised = weiRaised.add(_value);

        _processPurchase(_beneficiary, tokens, this);
        
        emit TokenPurchase(
            _sender,
            _beneficiary,
            _value,
            tokens
        );

        // transfer payment
        _updatePurchasingState(_beneficiary, _value);
        _forwardFunds();

        // post validate
        if (!_preallocated) {
            _postValidatePurchase(_beneficiary, _value);
        }
    }

    function _getBaseTokens(uint256 _value) internal view returns (uint256) {
        return _value.mul(rate);
    }

    function _getTokenAmount(uint256 _weiAmount)
    internal view returns (uint256) {
        uint256 baseTokens = _getBaseTokens(_weiAmount);
        if (getStage() == Stage.PreICO) {
            return baseTokens.mul(100 + preIcoBonus).div(100);
        } else {
            return baseTokens;
        }
    }

    function _processPurchase(
        address _beneficiary,
        uint256 _tokenAmount,
        address _sourceAddress
    ) internal {
        _deliverTokens(_beneficiary, _tokenAmount, _sourceAddress);
    }

    function _deliverTokens(
        address _beneficiary,
        uint256 _tokenAmount,
        address _sourceAddress
    ) internal {
        if (_sourceAddress == address(this)) {
            token.transfer(_beneficiary, _tokenAmount);
        } else {
            token.transferFrom(_sourceAddress, _beneficiary, _tokenAmount);
        }
    }

    function finalization() internal {
        require(
            transminingAddress != address(0),
            "Transmining address must be set!"
        );
        super.finalization();
        
        _deliverTokens(transminingAddress, token.getRemainingSaleTokens(), this);
    }

    function setUSDETHRate(uint256 _USDETHRate) public 
    onlyOwner(){
        require(_USDETHRate > 0, "USDETH rate should not be zero");
        USDETHRate = _USDETHRate;
        cap = hardCapUSD * USDETHRate;
    }
}

Contract ABI
[{"constant":true,"inputs":[],"name":"getStartIco","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasClosed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owners","type":"address[]"},{"name":"_tokens","type":"uint256[]"},{"name":"_paid","type":"uint256[]"}],"name":"bulkPreallocate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokens","type":"uint256"},{"name":"_paid","type":"uint256"}],"name":"preallocate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"goal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minimalContributionAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"closingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"capReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"moveTokensToTransmining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"preIcoBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"goalReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_USDETHRate","type":"uint256"}],"name":"setUSDETHRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transminingAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getEndIco","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jvySupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"icoStartTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"openingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_transminingAddress","type":"address"}],"name":"setTransminingAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"blacklisted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hardCapUSD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getStartPreIco","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_rate","type":"uint256"},{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_cap","type":"uint256"},{"name":"_goal","type":"uint256"},{"name":"_bonusAddress","type":"address"},{"name":"_blacklistAddresses","type":"address[]"},{"name":"_USDETHRate","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

Contract Creation Code
60806040526007805460ff19908116909155600b805490911690553480156200002757600080fd5b50604051620025ae380380620025ae83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151959794959394929391920190600085856200008664010000000062000426810204565b620000996401000000006200042d810204565b60008054600160a060020a031916331781558d908d908d908311620000bd57600080fd5b600160a060020a0382161515620000d357600080fd5b600160a060020a0381161515620000e957600080fd5b60039290925560028054600160a060020a03928316600160a060020a03199182161790915560018054929093169116179055428210156200012957600080fd5b818110156200013757600080fd5b600591909155600655600081116200014e57600080fd5b600254600160a060020a031662000164620004d4565b600160a060020a03909116815260405190819003602001906000f08015801562000192573d6000803e3d6000fd5b5060098054600160a060020a031916600160a060020a039290921691909117905560085560008111620001c457600080fd5b600a5542620001db64010000000062000435810204565b116200024857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f49434f2068617320746f20626567696e20696e20746865206675747572650000604482015290519081900360640190fd5b426200025c6401000000006200042d810204565b11620002c957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f49434f2068617320746f20656e6420696e207468652066757475726500000000604482015290519081900360640190fd5b858511156200035f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f536f6674206361702073686f756c6420626520657175616c206f7220736d616c60448201527f6c6572207468616e206861726420636170000000000000000000000000000000606482015290519081900360840190fd5b6200037264010000000062000435810204565b600c5550600e8054600160a060020a03808616600160a060020a031992831617909255601180549289169290911691909117905560005b825181101562000403576001601060008584815181101515620003c857fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff1916911515919091179055600101620003a9565b62000417826401000000006200043d810204565b505050505050505050620004e5565b42603c0190565b635c78bc5090565b635c00c3d090565b600054600160a060020a031633146200045557600080fd5b60008111620004c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f55534445544820726174652073686f756c64206e6f74206265207a65726f0000604482015290519081900360640190fd5b600f819055627a120002600a55565b6040516107578062001e5783390190565b61196280620004f56000396000f3006080604052600436106101d45763ffffffff60e060020a6000350416630d950a0281146101df5780631515bc2b146102065780632c4e722e1461022f5780633056df7f1461024457806332013ac31461030b578063355274ea146103325780633f4ba83a14610347578063401938831461035c5780634042b66f1461037157806348ef200f146103865780634b6753bc1461039b5780634bb278f3146103b05780634f935945146103c5578063521eb273146103da5780635c975abb1461040b578063622ed15f1461042057806362492e9d14610438578063715018a61461044d5780637d3d652214610462578063825e35c2146104775780638456cb591461048f5780638506eecb146104a4578063863843bc146104b95780638d4e4083146104ce5780638da5cb5b146104e357806392417064146104f8578063a381de541461050d578063a4c2001d14610522578063a7c3d71b14610537578063a96af0f41461054c578063b5545a3c14610561578063b7a8807c14610576578063d03eef521461058b578063dbac26e9146105ac578063de81aaaa146105cd578063ec8ac4d8146105e2578063f073e3ef146105f6578063f2fde38b1461060b578063fc0c546a1461062c578063fcaa766414610641575b6101dd3361067a565b005b3480156101eb57600080fd5b506101f461068f565b60408051918252519081900360200190f35b34801561021257600080fd5b5061021b61069a565b604080519115158252519081900360200190f35b34801561023b57600080fd5b506101f46106a2565b34801561025057600080fd5b50604080516020600480358082013583810280860185019096528085526101dd95369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506106a89650505050505050565b34801561031757600080fd5b506101dd600160a060020a0360043516602435604435610829565b34801561033e57600080fd5b506101f46108f4565b34801561035357600080fd5b506101dd6108fa565b34801561036857600080fd5b506101f4610957565b34801561037d57600080fd5b506101f461095d565b34801561039257600080fd5b506101f4610963565b3480156103a757600080fd5b506101f461096f565b3480156103bc57600080fd5b506101dd610975565b3480156103d157600080fd5b5061021b6109ef565b3480156103e657600080fd5b506103ef6109fa565b60408051600160a060020a039092168252519081900360200190f35b34801561041757600080fd5b5061021b610a09565b34801561042c57600080fd5b506101dd600435610a12565b34801561044457600080fd5b506101f4610c78565b34801561045957600080fd5b506101dd610c7d565b34801561046e57600080fd5b5061021b610ce9565b34801561048357600080fd5b506101dd600435610cf4565b34801561049b57600080fd5b506101dd610d72565b3480156104b057600080fd5b506103ef610dd1565b3480156104c557600080fd5b506101f4610de0565b3480156104da57600080fd5b5061021b610dea565b3480156104ef57600080fd5b506103ef610df3565b34801561050457600080fd5b506101f4610e02565b34801561051957600080fd5b506103ef610e0a565b34801561052e57600080fd5b506101f4610e19565b34801561054357600080fd5b506101f4610e24565b34801561055857600080fd5b506101f4610e2a565b34801561056d57600080fd5b506101dd610e34565b34801561058257600080fd5b506101f4610ed0565b34801561059757600080fd5b506101dd600160a060020a0360043516610ed6565b3480156105b857600080fd5b5061021b600160a060020a0360043516610f1c565b3480156105d957600080fd5b506101f4610f31565b6101dd600160a060020a036004351661067a565b34801561060257600080fd5b506101f4610f38565b34801561061757600080fd5b506101dd600160a060020a0360043516610f3f565b34801561063857600080fd5b506103ef610f62565b34801561064d57600080fd5b50610656610f71565b6040518082600381111561066657fe5b60ff16815260200191505060405180910390f35b60008061068a8333348480610fb8565b505050565b635c00c3d0805b5090565b600654421190565b60035481565b60008054600160a060020a031633146106c057600080fd5b825184511461073f576040805160e560020a62461bcd02815260206004820152602b60248201527f4c656e67746873206f6620706172616d65746572206c6973747320686176652060448201527f746f20626520657175616c000000000000000000000000000000000000000000606482015290519081900360840190fd5b81518451146107be576040805160e560020a62461bcd02815260206004820152602b60248201527f4c656e67746873206f6620706172616d65746572206c6973747320686176652060448201527f746f20626520657175616c000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060005b83518110156108235761081b84828151811015156107dc57fe5b9060200190602002015184838151811015156107f457fe5b90602001906020020151848481518110151561080c57fe5b90602001906020020151610829565b6001016107c2565b50505050565b600080548190600160a060020a0316331461084357600080fd5b600160a060020a03851660009081526010602052604090205460ff16156108da576040805160e560020a62461bcd02815260206004820152603060248201527f4164647265737320776865726520746f6b656e732077696c6c2062652073656e60448201527f7420697320626c61636b6c697374656400000000000000000000000000000000606482015290519081900360840190fd5b5060019050826108ed8580858585610fb8565b5050505050565b600a5481565b600054600160a060020a0316331461091157600080fd5b600b5460ff16151561092257600080fd5b600b805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60085481565b60045481565b67058d15e17628000081565b60065481565b600054600160a060020a0316331461098c57600080fd5b60075460ff161561099c57600080fd5b6109a461069a565b15156109af57600080fd5b6109b7611342565b6040517f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768190600090a16007805460ff19166001179055565b600a54600454101590565b600254600160a060020a031681565b600b5460ff1681565b6000805481908190600160a060020a03163314610a2e57600080fd5b601160009054906101000a9004600160a060020a0316600160a060020a031663a55df3f96040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a8157600080fd5b505af1158015610a95573d6000803e3d6000fd5b505050506040513d6020811015610aab57600080fd5b5051600d54909350600160a060020a03161515610b12576040805160e560020a62461bcd02815260206004820181905260248201527f5472616e736d696e696e672061646472657373206d7573742062652073657421604482015290519081900360640190fd5b83831015610bb6576040805160e560020a62461bcd02815260206004820152605660248201527f42616c616e6365206f662072656d61696e696e6720746f6b656e7320666f722060448201527f73616c6520697320736d616c6c6572207468616e20726571756573746564206160648201527f6d6f756e7420666f72207472616e732d6d696e696e6700000000000000000000608482015290519081900360a40190fd5b5050600454600a54600380549290910391820290610bd2610f71565b6003811115610bdd57fe5b14610c61578383038110610c61576040805160e560020a62461bcd02815260206004820152603160248201527f596f75206e65656420746f206c6561766520656e6f75676820746f6b656e732060448201527f746f207265616368206861726420636170000000000000000000000000000000606482015290519081900360840190fd5b600d5461082390600160a060020a03168530611448565b601981565b600054600160a060020a03163314610c9457600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600854600454101590565b600054600160a060020a03163314610d0b57600080fd5b60008111610d63576040805160e560020a62461bcd02815260206004820152601e60248201527f55534445544820726174652073686f756c64206e6f74206265207a65726f0000604482015290519081900360640190fd5b600f819055627a120002600a55565b600054600160a060020a03163314610d8957600080fd5b600b5460ff1615610d9957600080fd5b600b805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600d54600160a060020a031681565b654bca8dbb355581565b60075460ff1681565b600054600160a060020a031681565b635c78bc5090565b600e54600160a060020a031681565b66012f2a36ecd55581565b600c5481565b65e35fa931a00081565b60075460ff161515610e4557600080fd5b610e4d610ce9565b15610e5757600080fd5b600954604080517f51cff8d90000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916351cff8d99160248082019260009290919082900301818387803b158015610ebc57600080fd5b505af1158015610823573d6000803e3d6000fd5b60055481565b600054600160a060020a03163314610eed57600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60106020526000908152604090205460ff1681565b627a120081565b42603c0190565b600054600160a060020a03163314610f5657600080fd5b610f5f8161159b565b50565b600154600160a060020a031681565b6005546000904290811015610f895760009150610696565b600c54811015610f9c5760019150610696565b600654811015610faf5760029150610696565b60039150610696565b600b5460009060ff1615610fcb57600080fd5b600160a060020a03861660009081526010602052604090205460ff161561103c576040805160e560020a62461bcd02815260206004820152601a60248201527f42656e656669636961727920697320626c61636b6c6973746564000000000000604482015290519081900360640190fd5b82151561117a5767058d15e1762800008410156110ef576040805160e560020a62461bcd02815260206004820152604760248201527f416d6f756e7420636f6e74726962757465642073686f756c642062652067726560448201527f61746572207468616e207265717569726564206d696e696d616c20636f6e747260648201527f69627574696f6e00000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b811561116b576040805160e560020a62461bcd02815260206004820152602660248201527f4e6f7420707265616c6c6f636174656420746f6b656e732073686f756c64206260448201527f65207a65726f0000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6111758685611618565b611289565b8115156111f7576040805160e560020a62461bcd02815260206004820152602f60248201527f507265616c6c6f636174656420746f6b656e732073686f756c6420626520677260448201527f6561746572207468616e207a65726f0000000000000000000000000000000000606482015290519081900360840190fd5b600a5460045461120d908663ffffffff61164716565b1115611289576040805160e560020a62461bcd02815260206004820152602860248201527f52616973656420746f6b656e732073686f756c64206e6f74206578636565642060448201527f6861726420636170000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8215156112a0576112998461165a565b90506112a3565b50805b6004546112b6908563ffffffff61164716565b6004556112c48682306116b6565b85600160a060020a031685600160a060020a03167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188684604051808381526020018281526020019250505060405180910390a36113218685611643565b6113296116c1565b82151561133a5761133a8685611643565b505050505050565b600d54600160a060020a031615156113a4576040805160e560020a62461bcd02815260206004820181905260248201527f5472616e736d696e696e672061646472657373206d7573742062652073657421604482015290519081900360640190fd5b6113ac61173b565b600d54601154604080517fa55df3f9000000000000000000000000000000000000000000000000000000008152905161144693600160a060020a0390811693169163a55df3f99160048083019260209291908290030181600087803b15801561141457600080fd5b505af1158015611428573d6000803e3d6000fd5b505050506040513d602081101561143e57600080fd5b505130611448565b565b600160a060020a0381163014156114fa57601154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156114c857600080fd5b505af11580156114dc573d6000803e3d6000fd5b505050506040513d60208110156114f257600080fd5b5061068a9050565b601154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152868116602483015260448201869052915191909216916323b872dd9160648083019260209291908290030181600087803b15801561157157600080fd5b505af1158015611585573d6000803e3d6000fd5b505050506040513d60208110156108ed57600080fd5b600160a060020a03811615156115b057600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6116228282611897565b600a54600454611638908363ffffffff61164716565b111561164357600080fd5b5050565b8181018281101561165457fe5b92915050565b600080611666836118c0565b90506001611672610f71565b600381111561167d57fe5b14156116ac576116a5606461169983607d63ffffffff6118d716565b9063ffffffff61190016565b91506116b0565b8091505b50919050565b61068a838383611448565b600954604080517ff340fa010000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a039092169163f340fa01913491602480830192600092919082900301818588803b15801561172757600080fd5b505af11580156108ed573d6000803e3d6000fd5b611743610ce9565b1561182357600960009054906101000a9004600160a060020a0316600160a060020a03166343d726d66040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561179b57600080fd5b505af11580156117af573d6000803e3d6000fd5b50505050600960009054906101000a9004600160a060020a0316600160a060020a0316639af6549a6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561180657600080fd5b505af115801561181a573d6000803e3d6000fd5b5050505061188f565b600960009054906101000a9004600160a060020a0316600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561187657600080fd5b505af115801561188a573d6000803e3d6000fd5b505050505b611446611446565b60055442101580156118ab57506006544211155b15156118b657600080fd5b6116438282611915565b6000611654600354836118d790919063ffffffff16565b60008215156118e857506000611654565b508181028183828115156118f857fe5b041461165457fe5b6000818381151561190d57fe5b049392505050565b600160a060020a038216151561192a57600080fd5b80151561164357600080fd00a165627a7a72305820d964823f3880d915ea0299a4f3df6fa7a48bb6ea8a8970125128ca3dac5f6e0a0029608060405234801561001057600080fd5b50604051602080610757833981016040525160008054600160a060020a03191633179055600160a060020a038116151561004957600080fd5b6002805460ff19600160a060020a03939093166101000261010060a860020a0319909116179190911690556106d4806100836000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166338af3eed81146100be57806343d726d6146100ef57806351cff8d914610106578063685ca19414610127578063715018a61461015c5780638c52dc41146101715780638da5cb5b146101865780639af6549a1461019b578063c19d93fb146101b0578063e3a9db1a146101e9578063f2fde38b1461021c578063f340fa011461023d575b600080fd5b3480156100ca57600080fd5b506100d3610251565b60408051600160a060020a039092168252519081900360200190f35b3480156100fb57600080fd5b50610104610265565b005b34801561011257600080fd5b50610104600160a060020a03600435166102d0565b34801561013357600080fd5b50610148600160a060020a03600435166102f0565b604080519115158252519081900360200190f35b34801561016857600080fd5b5061010461030c565b34801561017d57600080fd5b50610104610378565b34801561019257600080fd5b506100d36103e4565b3480156101a757600080fd5b506101046103f3565b3480156101bc57600080fd5b506101c561044f565b604051808260028111156101d557fe5b60ff16815260200191505060405180910390f35b3480156101f557600080fd5b5061020a600160a060020a0360043516610458565b60408051918252519081900360200190f35b34801561022857600080fd5b50610104600160a060020a0360043516610473565b610104600160a060020a0360043516610493565b6002546101009004600160a060020a031681565b600054600160a060020a0316331461027c57600080fd5b60006002805460ff169081111561028f57fe5b1461029957600080fd5b6002805460ff1916811790556040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a90600090a1565b6102d9816102f0565b15156102e457600080fd5b6102ed816104b9565b50565b600060016002805460ff169081111561030557fe5b1492915050565b600054600160a060020a0316331461032357600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a0316331461038f57600080fd5b60006002805460ff16908111156103a257fe5b146103ac57600080fd5b6002805460ff191660011790556040517f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8990600090a1565b600054600160a060020a031681565b6002805460ff168181111561040457fe5b1461040e57600080fd5b600254604051600160a060020a036101009092049190911690303180156108fc02916000818181858888f193505050501580156102ed573d6000803e3d6000fd5b60025460ff1681565b600160a060020a031660009081526001602052604090205490565b600054600160a060020a0316331461048a57600080fd5b6102ed8161057e565b60006002805460ff16908111156104a657fe5b146104b057600080fd5b6102ed816105fb565b60008054600160a060020a031633146104d157600080fd5b50600160a060020a03811660009081526001602052604090205430318111156104f657fe5b600160a060020a0382166000818152600160205260408082208290555183156108fc0291849190818181858888f1935050505015801561053a573d6000803e3d6000fd5b50604080518281529051600160a060020a038416917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b600160a060020a038116151561059357600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008054600160a060020a0316331461061357600080fd5b50600160a060020a038116600090815260016020526040902054349061063f908263ffffffff61069516565b600160a060020a038316600081815260016020908152604091829020939093558051848152905191927f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c492918290030190a25050565b818101828110156106a257fe5b929150505600a165627a7a72305820b917c1614efb173a42981326ce81c37b6da70726da504fcb3f1d8e85a2ed2647002900000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000112918a54e3ada863cf694970da0756f1eecc68d0000000000000000000000000d3d475f035705a662f5ab34e374e3c44bb5218700000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000000003635c9adc5dea00000000000000000000000000000ea89108712f87282b33b246defc28990029532d000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000004da8d73e4aa7bbc323082c3998fc706063c203260000000000000000000000008c1642b08bcdd934ee312c6438253ff09aab76650000000000000000000000008520ec632233e3d413f8dbc9f75c82e2997f87cb0000000000000000000000008fd24f1ce2e346f13f4cc91e7261bcf445fb49cd0000000000000000000000001f543f769ac192fa72799e1ed10ab1bacda33ef800000000000000000000000059d44173b0a083534c7d542731dc86c48f6a045e000000000000000000000000fa6f4c34706a36ada0d985ef7e78939cd4e81fd1000000000000000000000000d02051cdbeeeec0b285a960b2940457b24f6189200000000000000000000000031d597c414249f181947c607ea1d9dc6cc33b97800000000000000000000000016f24c3b7f1e420bd924ff05e9700a096d83cdda000000000000000000000000703157d186619f5b8f3b189f8bde6c847ccffbdc0000000000000000000000002113f8fbc3c7a0754e954d2c8edde9a9e264f557000000000000000000000000d9cd9fbce23f6feea1d974c49d164d12ae7fc9b5


    Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000112918a54e3ada863cf694970da0756f1eecc68d0000000000000000000000000d3d475f035705a662f5ab34e374e3c44bb5218700000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000000003635c9adc5dea00000000000000000000000000000ea89108712f87282b33b246defc28990029532d000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000004da8d73e4aa7bbc323082c3998fc706063c203260000000000000000000000008c1642b08bcdd934ee312c6438253ff09aab76650000000000000000000000008520ec632233e3d413f8dbc9f75c82e2997f87cb0000000000000000000000008fd24f1ce2e346f13f4cc91e7261bcf445fb49cd0000000000000000000000001f543f769ac192fa72799e1ed10ab1bacda33ef800000000000000000000000059d44173b0a083534c7d542731dc86c48f6a045e000000000000000000000000fa6f4c34706a36ada0d985ef7e78939cd4e81fd1000000000000000000000000d02051cdbeeeec0b285a960b2940457b24f6189200000000000000000000000031d597c414249f181947c607ea1d9dc6cc33b97800000000000000000000000016f24c3b7f1e420bd924ff05e9700a096d83cdda000000000000000000000000703157d186619f5b8f3b189f8bde6c847ccffbdc0000000000000000000000002113f8fbc3c7a0754e954d2c8edde9a9e264f557000000000000000000000000d9cd9fbce23f6feea1d974c49d164d12ae7fc9b5

-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000009c4
Arg [1] : 000000000000000000000000112918a54e3ada863cf694970da0756f1eecc68d
Arg [2] : 0000000000000000000000000d3d475f035705a662f5ab34e374e3c44bb52187
Arg [3] : 00000000000000000000000000000000000000000000152d02c7e14af6800000
Arg [4] : 00000000000000000000000000000000000000000000003635c9adc5dea00000
Arg [5] : 000000000000000000000000ea89108712f87282b33b246defc28990029532d0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [7] : 0000000000000000000000000000000000000000000000000011c37937e08000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [9] : 0000000000000000000000004da8d73e4aa7bbc323082c3998fc706063c20326
Arg [10] : 0000000000000000000000008c1642b08bcdd934ee312c6438253ff09aab7665
Arg [11] : 0000000000000000000000008520ec632233e3d413f8dbc9f75c82e2997f87cb
Arg [12] : 0000000000000000000000008fd24f1ce2e346f13f4cc91e7261bcf445fb49cd
Arg [13] : 0000000000000000000000001f543f769ac192fa72799e1ed10ab1bacda33ef8
Arg [14] : 00000000000000000000000059d44173b0a083534c7d542731dc86c48f6a045e
Arg [15] : 000000000000000000000000fa6f4c34706a36ada0d985ef7e78939cd4e81fd1
Arg [16] : 000000000000000000000000d02051cdbeeeec0b285a960b2940457b24f61892
Arg [17] : 00000000000000000000000031d597c414249f181947c607ea1d9dc6cc33b978
Arg [18] : 00000000000000000000000016f24c3b7f1e420bd924ff05e9700a096d83cdda
Arg [19] : 000000000000000000000000703157d186619f5b8f3b189f8bde6c847ccffbdc
Arg [20] : 0000000000000000000000002113f8fbc3c7a0754e954d2c8edde9a9e264f557
Arg [21] : 000000000000000000000000d9cd9fbce23f6feea1d974c49d164d12ae7fc9b5


   Swarm Source:
bzzr://b917c1614efb173a42981326ce81c37b6da70726da504fcb3f1d8e85a2ed2647
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.