ETH Price: $2,451.66 (-0.83%)

Contract

0xB9aac097F4DADcD6F06761EB470346415eF28D5A
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy42838912017-09-17 12:24:552583 days ago1505651095IN
HubiiNetwork: Token Sale
1.685 ETH0.007525
Buy42568542017-09-09 23:28:092590 days ago1504999689IN
HubiiNetwork: Token Sale
0.16 ETH0.006321
Buy42568222017-09-09 23:15:372590 days ago1504998937IN
HubiiNetwork: Token Sale
0.16615841 ETH0.006321
Finalize42543412017-09-09 6:33:582591 days ago1504938838IN
HubiiNetwork: Token Sale
0 ETH0.000572935
Finalize42542092017-09-09 5:39:232591 days ago1504935563IN
HubiiNetwork: Token Sale
0 ETH0.00055
Finalize42542082017-09-09 5:39:182591 days ago1504935558IN
HubiiNetwork: Token Sale
0 ETH0.00055
Buy42540912017-09-09 4:52:082591 days ago1504932728IN
HubiiNetwork: Token Sale
4 ETH0.0034632525
Buy42540582017-09-09 4:38:052591 days ago1504931885IN
HubiiNetwork: Token Sale
14.8 ETH0.0022078725
Buy42538712017-09-09 3:21:372591 days ago1504927297IN
HubiiNetwork: Token Sale
20 ETH0.0034632525
Buy42538192017-09-09 2:55:492591 days ago1504925749IN
HubiiNetwork: Token Sale
100 ETH0.0034632525
Buy42538102017-09-09 2:48:372591 days ago1504925317IN
HubiiNetwork: Token Sale
0.05 ETH0.0029091321
Buy42535992017-09-09 1:21:492591 days ago1504920109IN
HubiiNetwork: Token Sale
16.8 ETH0.0034632525
Buy42534652017-09-09 0:31:342591 days ago1504917094IN
HubiiNetwork: Token Sale
0.04 ETH00.00000002
Buy42532972017-09-08 23:27:472591 days ago1504913267IN
HubiiNetwork: Token Sale
3.185 ETH0.0018546121
Buy42532852017-09-08 23:23:442591 days ago1504913024IN
HubiiNetwork: Token Sale
1 ETH0.0034632525
Buy42532422017-09-08 23:06:142591 days ago1504911974IN
HubiiNetwork: Token Sale
1 ETH0.0029091321
Buy42531762017-09-08 22:37:312591 days ago1504910251IN
HubiiNetwork: Token Sale
2 ETH0.0029091321
Transfer42531232017-09-08 22:08:532591 days ago1504908533IN
HubiiNetwork: Token Sale
2 ETH0.0006321
Transfer42531022017-09-08 22:01:282591 days ago1504908088IN
HubiiNetwork: Token Sale
2 ETH0.0006321
Buy42530472017-09-08 21:41:002591 days ago1504906860IN
HubiiNetwork: Token Sale
0.322879 ETH0.0029091321
Buy42529622017-09-08 21:07:092591 days ago1504904829IN
HubiiNetwork: Token Sale
1 ETH0.0034632525
Buy42528122017-09-08 20:10:572591 days ago1504901457IN
HubiiNetwork: Token Sale
1.47 ETH0.0029091321
Buy42527252017-09-08 19:33:112591 days ago1504899191IN
HubiiNetwork: Token Sale
2 ETH0.0034632525
Buy42526062017-09-08 18:51:082592 days ago1504896668IN
HubiiNetwork: Token Sale
1.2 ETH0.0022078725
Buy42524322017-09-08 17:41:442592 days ago1504892504IN
HubiiNetwork: Token Sale
3.4 ETH0.0022078725
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
42540912017-09-09 4:52:082591 days ago1504932728
HubiiNetwork: Token Sale
4 ETH
42540582017-09-09 4:38:052591 days ago1504931885
HubiiNetwork: Token Sale
14.8 ETH
42538712017-09-09 3:21:372591 days ago1504927297
HubiiNetwork: Token Sale
20 ETH
42538192017-09-09 2:55:492591 days ago1504925749
HubiiNetwork: Token Sale
100 ETH
42538102017-09-09 2:48:372591 days ago1504925317
HubiiNetwork: Token Sale
0.05 ETH
42535992017-09-09 1:21:492591 days ago1504920109
HubiiNetwork: Token Sale
16.8 ETH
42534652017-09-09 0:31:342591 days ago1504917094
HubiiNetwork: Token Sale
0.04 ETH
42532972017-09-08 23:27:472591 days ago1504913267
HubiiNetwork: Token Sale
3.185 ETH
42532852017-09-08 23:23:442591 days ago1504913024
HubiiNetwork: Token Sale
1 ETH
42532422017-09-08 23:06:142591 days ago1504911974
HubiiNetwork: Token Sale
1 ETH
42531762017-09-08 22:37:312591 days ago1504910251
HubiiNetwork: Token Sale
2 ETH
42530472017-09-08 21:41:002591 days ago1504906860
HubiiNetwork: Token Sale
0.322879 ETH
42529622017-09-08 21:07:092591 days ago1504904829
HubiiNetwork: Token Sale
1 ETH
42528122017-09-08 20:10:572591 days ago1504901457
HubiiNetwork: Token Sale
1.47 ETH
42527252017-09-08 19:33:112591 days ago1504899191
HubiiNetwork: Token Sale
2 ETH
42526062017-09-08 18:51:082592 days ago1504896668
HubiiNetwork: Token Sale
1.2 ETH
42524322017-09-08 17:41:442592 days ago1504892504
HubiiNetwork: Token Sale
3.4 ETH
42523772017-09-08 17:20:112592 days ago1504891211
HubiiNetwork: Token Sale
2 ETH
42521312017-09-08 15:39:542592 days ago1504885194
HubiiNetwork: Token Sale
5 ETH
42521082017-09-08 15:34:142592 days ago1504884854
HubiiNetwork: Token Sale
1 ETH
42520822017-09-08 15:25:032592 days ago1504884303
HubiiNetwork: Token Sale
0.42 ETH
42519792017-09-08 14:45:172592 days ago1504881917
HubiiNetwork: Token Sale
2 ETH
42518602017-09-08 13:59:452592 days ago1504879185
HubiiNetwork: Token Sale
21.4937 ETH
42518202017-09-08 13:47:062592 days ago1504878426
HubiiNetwork: Token Sale
29.5 ETH
42518172017-09-08 13:46:122592 days ago1504878372
HubiiNetwork: Token Sale
0.43 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HubiiCrowdsale

Compiler Version
v0.4.13+commit.fb4cb1a

Optimization Enabled:
Yes with 0 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2017-08-22
*/

pragma solidity ^0.4.13;


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control 
 * functions, this simplifies the implementation of "user permissions". 
 */
contract Ownable {
  address public owner;


  /** 
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() {
    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 transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to. 
   */
  function transferOwnership(address newOwner) onlyOwner {
    require(newOwner != address(0));
    owner = newOwner;
  }

}

/**
 * Abstract contract that allows children to implement an
 * emergency stop mechanism. Differs from Pausable by causing a throw when in halt mode.
 *
 */
contract Haltable is Ownable {
  bool public halted;

  event Halted(bool halted);

  modifier stopInEmergency {
    require(!halted);
    _;
  }

  modifier onlyInEmergency {
    require(halted);
    _;
  }

  // called by the owner on emergency, triggers stopped state
  function halt() external onlyOwner {
    halted = true;
    Halted(true);
  }

  // called by the owner on end of emergency, returns to normal state
  function unhalt() external onlyOwner onlyInEmergency {
    halted = false;
    Halted(false);
  }

}

/**
 * Math operations with safety checks
 */
library SafeMath {
  function mul(uint a, uint b) internal returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint a, uint b) internal returns (uint) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint a, uint b) internal returns (uint) {
    assert(b <= a);
    return a - b;
  }

  function add(uint a, uint b) internal returns (uint) {
    uint c = a + b;
    assert(c >= a);
    return c;
  }

  function max64(uint64 a, uint64 b) internal constant returns (uint64) {
    return a >= b ? a : b;
  }

  function min64(uint64 a, uint64 b) internal constant returns (uint64) {
    return a < b ? a : b;
  }

  function max256(uint a, uint b) internal constant returns (uint) {
    return a >= b ? a : b;
  }

  function min256(uint a, uint b) internal constant returns (uint) {
    return a < b ? a : b;
  }
}

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20Basic {
  uint public totalSupply;
  function balanceOf(address who) public constant returns (uint);
  function transfer(address to, uint value) public returns (bool ok);
  event Transfer(address indexed from, address indexed to, uint value);
}


/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public constant returns (uint);
  function transferFrom(address from, address to, uint value) public returns (bool ok);
  function approve(address spender, uint value) public returns (bool ok);
  event Approval(address indexed owner, address indexed spender, uint value);
}

/**
 * A token that defines fractional units as decimals.
 */
contract FractionalERC20 is ERC20 {

  uint8 public decimals;

}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances. 
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint;

  mapping(address => uint) balances;

  /**
   * Obsolete. Removed this check based on:
   * https://blog.coinfabrik.com/smart-contract-short-address-attack-mitigation-failure/
   * @dev Fix for the ERC20 short address attack.
   *
   * modifier onlyPayloadSize(uint size) {
   *    require(msg.data.length >= size + 4);
   *    _;
   * }
   */

  /**
  * @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, uint _value) public returns (bool success) {
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    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 uint representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public constant returns (uint balance) {
    return balances[_owner];
  }
  
}

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 */
contract StandardToken is BasicToken, ERC20 {

  /* Token supply got increased and a new owner received these tokens */
  event Minted(address receiver, uint amount);

  mapping (address => mapping (address => uint)) allowed;

  /* Interface declaration */
  function isToken() public constant returns (bool weAre) {
    return true;
  }

  /**
   * @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 uint the amout of tokens to be transfered
   */
  function transferFrom(address _from, address _to, uint _value) public returns (bool success) {
    uint _allowance = allowed[_from][msg.sender];

    // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
    // require(_value <= _allowance);
    // SafeMath uses assert instead of require though, beware when using an analysis tool

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

  /**
   * @dev Aprove the passed address to spend the specified amount of tokens on behalf of msg.sender.
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint _value) public returns (bool success) {

    // To change the approve amount you first have to reduce the addresses'
    //  allowance to zero by calling `approve(_spender, 0)` if it is not
    //  already 0 to mitigate the race condition described here:
    //  https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    require (_value == 0 || allowed[msg.sender][_spender] == 0);

    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens than 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 uint specifing the amount of tokens still avaible for the spender.
   */
  function allowance(address _owner, address _spender) public constant returns (uint remaining) {
    return allowed[_owner][_spender];
  }

  /**
   * Atomic increment of approved spending
   *
   * Works around https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   */
  function addApproval(address _spender, uint _addedValue) public
  returns (bool success) {
      uint oldValue = allowed[msg.sender][_spender];
      allowed[msg.sender][_spender] = oldValue.add(_addedValue);
      Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
      return true;
  }

  /**
   * Atomic decrement of approved spending.
   *
   * Works around https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   */
  function subApproval(address _spender, uint _subtractedValue) public
  returns (bool success) {

      uint oldVal = allowed[msg.sender][_spender];

      if (_subtractedValue > oldVal) {
          allowed[msg.sender][_spender] = 0;
      } else {
          allowed[msg.sender][_spender] = oldVal.sub(_subtractedValue);
      }
      Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
      return true;
  }
  
}

/**
 * Define interface for releasing the token transfer after a successful crowdsale.
 */
contract ReleasableToken is StandardToken, Ownable {

  /* The finalizer contract that allows lifting the transfer limits on this token */
  address public releaseAgent;

  /** A crowdsale contract can release us to the wild if ICO success. If false we are are in transfer lock up period.*/
  bool public released = false;

  /** Map of agents that are allowed to transfer tokens regardless of the lock down period. These are crowdsale contracts and possible the team multisig itself. */
  mapping (address => bool) public transferAgents;

  /**
   * Set the contract that can call release and make the token transferable.
   *
   * Since the owner of this contract is (or should be) the crowdsale,
   * it can only be called by a corresponding exposed API in the crowdsale contract in case of input error.
   */
  function setReleaseAgent(address addr) onlyOwner inReleaseState(false) public {
    // We don't do interface check here as we might want to have a normal wallet address to act as a release agent.
    releaseAgent = addr;
  }

  /**
   * Owner can allow a particular address (e.g. a crowdsale contract) to transfer tokens despite the lock up period.
   */
  function setTransferAgent(address addr, bool state) onlyOwner inReleaseState(false) public {
    transferAgents[addr] = state;
  }

  /**
   * One way function to release the tokens into the wild.
   *
   * Can be called only from the release agent that should typically be the finalize agent ICO contract.
   * In the scope of the crowdsale, it is only called if the crowdsale has been a success (first milestone reached).
   */
  function releaseTokenTransfer() public onlyReleaseAgent {
    released = true;
  }

  /**
   * Limit token transfer until the crowdsale is over.
   */
  modifier canTransfer(address _sender) {
    require(released || transferAgents[_sender]);
    _;
  }

  /** The function can be called only before or after the tokens have been released */
  modifier inReleaseState(bool releaseState) {
    require(releaseState == released);
    _;
  }

  /** The function can be called only by a whitelisted release agent. */
  modifier onlyReleaseAgent() {
    require(msg.sender == releaseAgent);
    _;
  }

  /** We restrict transfer by overriding it */
  function transfer(address _to, uint _value) public canTransfer(msg.sender) returns (bool success) {
    // Call StandardToken.transfer()
   return super.transfer(_to, _value);
  }

  /** We restrict transferFrom by overriding it */
  function transferFrom(address _from, address _to, uint _value) public canTransfer(_from) returns (bool success) {
    // Call StandardToken.transferForm()
    return super.transferFrom(_from, _to, _value);
  }

}

/**
 * A token that can increase its supply by another contract.
 *
 * This allows uncapped crowdsale by dynamically increasing the supply when money pours in.
 * Only mint agents, contracts whitelisted by owner, can mint new tokens.
 *
 */
contract MintableToken is StandardToken, Ownable {

  using SafeMath for uint;

  bool public mintingFinished = false;

  /** List of agents that are allowed to create new tokens */
  mapping (address => bool) public mintAgents;

  event MintingAgentChanged(address addr, bool state);


  function MintableToken(uint _initialSupply, address _multisig, bool _mintable) internal {
    require(_multisig != address(0));
    // Cannot create a token without supply and no minting
    require(_mintable || _initialSupply != 0);
    // Create initially all balance on the team multisig
    if (_initialSupply > 0)
        mintInternal(_multisig, _initialSupply);
    // No more new supply allowed after the token creation
    mintingFinished = !_mintable;
  }

  /**
   * Create new tokens and allocate them to an address.
   *
   * Only callable by a crowdsale contract (mint agent).
   */
  function mint(address receiver, uint amount) onlyMintAgent public {
    mintInternal(receiver, amount);
  }

  function mintInternal(address receiver, uint amount) canMint private {
    totalSupply = totalSupply.add(amount);
    balances[receiver] = balances[receiver].add(amount);

    // Removed because this may be confused with anonymous transfers in the upcoming fork.
    // This will make the mint transaction appear in EtherScan.io
    // We can remove this after there is a standardized minting event
    // Transfer(0, receiver, amount);

    Minted(receiver, amount);
  }

  /**
   * Owner can allow a crowdsale contract to mint new tokens.
   */
  function setMintAgent(address addr, bool state) onlyOwner canMint public {
    mintAgents[addr] = state;
    MintingAgentChanged(addr, state);
  }

  modifier onlyMintAgent() {
    // Only mint agents are allowed to mint new tokens
    require(mintAgents[msg.sender]);
    _;
  }

  /** Make sure we are not done yet. */
  modifier canMint() {
    require(!mintingFinished);
    _;
  }
}

/**
 * Upgrade agent transfers tokens to a new contract.
 * Upgrade agent itself can be the token contract, or just a middle man contract doing the heavy lifting.
 *
 * The Upgrade agent is the interface used to implement a token
 * migration in the case of an emergency.
 * The function upgradeFrom has to implement the part of the creation
 * of new tokens on behalf of the user doing the upgrade.
 *
 * The new token can implement this interface directly, or use.
 */
contract UpgradeAgent {

  /** This value should be the same as the original token's total supply */
  uint public originalSupply;

  /** Interface to ensure the contract is correctly configured */
  function isUpgradeAgent() public constant returns (bool) {
    return true;
  }

  /**
  Upgrade an account

  When the token contract is in the upgrade status the each user will
  have to call `upgrade(value)` function from UpgradeableToken.

  The upgrade function adjust the balance of the user and the supply
  of the previous token and then call `upgradeFrom(value)`.

  The UpgradeAgent is the responsible to create the tokens for the user
  in the new contract.

  * @param _from Account to upgrade.
  * @param _value Tokens to upgrade.

  */
  function upgradeFrom(address _from, uint _value) public;

}

/**
 * A token upgrade mechanism where users can opt-in amount of tokens to the next smart contract revision.
 *
 */
contract UpgradeableToken is StandardToken {

  /** Contract / person who can set the upgrade path. This can be the same as team multisig wallet, as what it is with its default value. */
  address public upgradeMaster;

  /** The next contract where the tokens will be migrated. */
  UpgradeAgent public upgradeAgent;

  /** How many tokens we have upgraded by now. */
  uint public totalUpgraded;

  /**
   * Upgrade states.
   *
   * - NotAllowed: The child contract has not reached a condition where the upgrade can bgun
   * - WaitingForAgent: Token allows upgrade, but we don't have a new agent yet
   * - ReadyToUpgrade: The agent is set, but not a single token has been upgraded yet
   * - Upgrading: Upgrade agent is set and the balance holders can upgrade their tokens
   *
   */
  enum UpgradeState {Unknown, NotAllowed, WaitingForAgent, ReadyToUpgrade, Upgrading}

  /**
   * Somebody has upgraded some of his tokens.
   */
  event Upgrade(address indexed _from, address indexed _to, uint _value);

  /**
   * New upgrade agent available.
   */
  event UpgradeAgentSet(address agent);

  /**
   * Do not allow construction without upgrade master set.
   */
  function UpgradeableToken(address _upgradeMaster) {
    setUpgradeMaster(_upgradeMaster);
  }

  /**
   * Allow the token holder to upgrade some of their tokens to a new contract.
   */
  function upgrade(uint value) public {
    UpgradeState state = getUpgradeState();
    // Ensure it's not called in a bad state
    require(state == UpgradeState.ReadyToUpgrade || state == UpgradeState.Upgrading);

    // Validate input value.
    require(value != 0);

    balances[msg.sender] = balances[msg.sender].sub(value);

    // Take tokens out from circulation
    totalSupply = totalSupply.sub(value);
    totalUpgraded = totalUpgraded.add(value);

    // Upgrade agent reissues the tokens
    upgradeAgent.upgradeFrom(msg.sender, value);
    Upgrade(msg.sender, upgradeAgent, value);
  }

  /**
   * Set an upgrade agent that handles the upgrade process
   */
  function setUpgradeAgent(address agent) external {
    // Check whether the token is in a state that we could think of upgrading
    require(canUpgrade());

    require(agent != 0x0);
    // Only a master can designate the next agent
    require(msg.sender == upgradeMaster);
    // Upgrade has already begun for an agent
    require(getUpgradeState() != UpgradeState.Upgrading);

    upgradeAgent = UpgradeAgent(agent);

    // Bad interface
    require(upgradeAgent.isUpgradeAgent());
    // Make sure that token supplies match in source and target
    require(upgradeAgent.originalSupply() == totalSupply);

    UpgradeAgentSet(upgradeAgent);
  }

  /**
   * Get the state of the token upgrade.
   */
  function getUpgradeState() public constant returns(UpgradeState) {
    if (!canUpgrade()) return UpgradeState.NotAllowed;
    else if (address(upgradeAgent) == 0x00) return UpgradeState.WaitingForAgent;
    else if (totalUpgraded == 0) return UpgradeState.ReadyToUpgrade;
    else return UpgradeState.Upgrading;
  }

  /**
   * Change the upgrade master.
   *
   * This allows us to set a new owner for the upgrade mechanism.
   */
  function changeUpgradeMaster(address new_master) public {
    require(msg.sender == upgradeMaster);
    setUpgradeMaster(new_master);
  }

  /**
   * Internal upgrade master setter.
   */
  function setUpgradeMaster(address new_master) private {
    require(new_master != 0x0);
    upgradeMaster = new_master;
  }

  /**
   * Child contract can enable to provide the condition when the upgrade can begin.
   */
  function canUpgrade() public constant returns(bool) {
     return true;
  }

}


/**
 * A crowdsale token.
 *
 * An ERC-20 token designed specifically for crowdsales with investor protection and further development path.
 *
 * - The token transfer() is disabled until the crowdsale is over
 * - The token contract gives an opt-in upgrade path to a new contract
 * - The same token can be part of several crowdsales through the approve() mechanism
 * - The token can be capped (supply set in the constructor) or uncapped (crowdsale contract can mint new tokens)
 *
 */
contract CrowdsaleToken is ReleasableToken, MintableToken, UpgradeableToken, FractionalERC20 {

  event UpdatedTokenInformation(string newName, string newSymbol);

  string public name;

  string public symbol;

  /**
   * Construct the token.
   *
   * This token must be created through a team multisig wallet, so that it is owned by that wallet.
   *
   * @param _name Token name
   * @param _symbol Token symbol - typically it's all caps
   * @param _initialSupply How many tokens we start with
   * @param _decimals Number of decimal places
   * @param _mintable Are new tokens created over the crowdsale or do we distribute only the initial supply? Note that when the token becomes transferable the minting always ends.
   */
  function CrowdsaleToken(string _name, string _symbol, uint _initialSupply, uint8 _decimals, address _multisig, bool _mintable)
    UpgradeableToken(_multisig) MintableToken(_initialSupply, _multisig, _mintable) {
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
  }

  /**
   * When token is released to be transferable, prohibit new token creation.
   */
  function releaseTokenTransfer() public onlyReleaseAgent {
    mintingFinished = true;
    super.releaseTokenTransfer();
  }

  /**
   * Allow upgrade agent functionality to kick in only if the crowdsale was a success.
   */
  function canUpgrade() public constant returns(bool) {
    return released && super.canUpgrade();
  }

  /**
   * Owner can update token information here
   */
  function setTokenInformation(string _name, string _symbol) onlyOwner {
    name = _name;
    symbol = _symbol;

    UpdatedTokenInformation(name, symbol);
  }

}

/**
 * Abstract base contract for token sales.
 *
 * Handles
 * - start and end dates
 * - accepting investments
 * - minimum funding goal and refund
 * - various statistics during the crowdfund
 * - different pricing strategies
 * - different investment policies (require server side customer id, allow only whitelisted addresses)
 *
 */
contract Crowdsale is Haltable {

  using SafeMath for uint;

  /* The token we are selling */
  CrowdsaleToken public token;

  /* How we are going to price our offering */
  PricingStrategy public pricingStrategy;

  /* How we are going to limit our offering */
  CeilingStrategy public ceilingStrategy;

  /* Post-success callback */
  FinalizeAgent public finalizeAgent;

  /* ether will be transferred to this address */
  address public multisigWallet;

  /* if the funding goal is not reached, investors may withdraw their funds */
  uint public minimumFundingGoal;

  /* the funding cannot exceed this cap; may be set later on during the crowdsale */
  uint public weiFundingCap = 0;

  /* the starting block number of the crowdsale */
  uint public startsAt;

  /* the ending block number of the crowdsale */
  uint public endsAt;

  /* the number of tokens already sold through this contract*/
  uint public tokensSold = 0;

  /* How many wei of funding we have raised */
  uint public weiRaised = 0;

  /* How many distinct addresses have invested */
  uint public investorCount = 0;

  /* How many wei we have returned back to the contract after a failed crowdfund. */
  uint public loadedRefund = 0;

  /* How many wei we have given back to investors.*/
  uint public weiRefunded = 0;

  /* Has this crowdsale been finalized */
  bool public finalized;

  /* Do we need to have a unique contributor id for each customer */
  bool public requireCustomerId;

  /** How many ETH each address has invested in this crowdsale */
  mapping (address => uint) public investedAmountOf;

  /** How many tokens this crowdsale has credited for each investor address */
  mapping (address => uint) public tokenAmountOf;

  /** Addresses that are allowed to invest even before ICO offical opens. For testing, for ICO partners, etc. */
  mapping (address => bool) public earlyParticipantWhitelist;

  /** This is for manual testing of the interaction with the owner's wallet. You can set it to any value and inspect this in a blockchain explorer to see that crowdsale interaction works. */
  uint8 public ownerTestValue;

  /** State machine
   *
   * - Prefunding: We have not reached the starting block yet
   * - Funding: Active crowdsale
   * - Success: Minimum funding goal reached
   * - Failure: Minimum funding goal not reached before the ending block
   * - Finalized: The finalize function has been called and succesfully executed
   * - Refunding: Refunds are loaded on the contract to be reclaimed by investors.
   */
  enum State{Unknown, PreFunding, Funding, Success, Failure, Finalized, Refunding}


  // A new investment was made
  event Invested(address investor, uint weiAmount, uint tokenAmount, uint128 customerId);

  // Refund was processed for a contributor
  event Refund(address investor, uint weiAmount);

  // The rules about what kind of investments we accept were changed
  event InvestmentPolicyChanged(bool requireCId);

  // Address early participation whitelist status changed
  event Whitelisted(address addr, bool status);

  // Crowdsale's finalize function has been called
  event Finalized();

  // A new funding cap has been set
  event FundingCapSet(uint newFundingCap);

  function Crowdsale(address _multisigWallet, uint _start, uint _end, uint _minimumFundingGoal) internal {
    setMultisig(_multisigWallet);

    // Don't mess the dates
    require(_start != 0 && _end != 0);
    require(block.number < _start && _start < _end);
    startsAt = _start;
    endsAt = _end;

    // Minimum funding goal can be zero
    minimumFundingGoal = _minimumFundingGoal;
  }

  /**
   * Don't expect to just send in money and get tokens.
   */
  function() payable {
    require(false);
  }

  /**
   * Make an investment.
   *
   * Crowdsale must be running for one to invest.
   * We must have not pressed the emergency brake.
   *
   * @param receiver The Ethereum address who receives the tokens
   * @param customerId (optional) UUID v4 to track the successful payments on the server side
   *
   */
  function investInternal(address receiver, uint128 customerId) stopInEmergency notFinished private {
    // Determine if it's a good time to accept investment from this participant
    if (getState() == State.PreFunding) {
      // Are we whitelisted for early deposit
      require(earlyParticipantWhitelist[receiver]);
    }

    uint weiAmount = ceilingStrategy.weiAllowedToReceive(msg.value, weiRaised, investedAmountOf[receiver], weiFundingCap);
    uint tokenAmount = pricingStrategy.calculatePrice(weiAmount, weiRaised, tokensSold, msg.sender, token.decimals());
    
    // Dust transaction if no tokens can be given
    require(tokenAmount != 0);

    if (investedAmountOf[receiver] == 0) {
      // A new investor
      investorCount++;
    }
    updateInvestorFunds(tokenAmount, weiAmount, receiver, customerId);

    // Pocket the money
    multisigWallet.transfer(weiAmount);

    // Return excess of money
    uint weiToReturn = msg.value.sub(weiAmount);
    if (weiToReturn > 0) {
      msg.sender.transfer(weiToReturn);
    }
  }

  /**
   * Preallocate tokens for the early investors.
   *
   * Preallocated tokens have been sold before the actual crowdsale opens.
   * This function mints the tokens and moves the crowdsale needle.
   *
   * No money is exchanged, as the crowdsale team already have received the payment.
   *
   * @param fullTokens tokens as full tokens - decimal places added internally
   * @param weiPrice Price of a single full token in wei
   *
   */
  function preallocate(address receiver, uint fullTokens, uint weiPrice) public onlyOwner notFinished {
    require(receiver != address(0));
    uint tokenAmount = fullTokens.mul(10**uint(token.decimals()));
    require(tokenAmount != 0);
    uint weiAmount = weiPrice.mul(tokenAmount); // This can also be 0, in which case we give out tokens for free
    updateInvestorFunds(tokenAmount, weiAmount, receiver , 0);
  }

  /**
   * Private function to update accounting in the crowdsale.
   */
  function updateInvestorFunds(uint tokenAmount, uint weiAmount, address receiver, uint128 customerId) private {
    // Update investor
    investedAmountOf[receiver] = investedAmountOf[receiver].add(weiAmount);
    tokenAmountOf[receiver] = tokenAmountOf[receiver].add(tokenAmount);

    // Update totals
    weiRaised = weiRaised.add(weiAmount);
    tokensSold = tokensSold.add(tokenAmount);

    assignTokens(receiver, tokenAmount);
    // Tell us that the investment was completed successfully
    Invested(receiver, weiAmount, tokenAmount, customerId);
  }


  /**
   * Allow the owner to set a funding cap on the crowdsale.
   * The new cap should be higher than the minimum funding goal.
   * 
   * @param newCap minimum target cap that may be relaxed if it was already broken.
   */
  function setFundingCap(uint newCap) public onlyOwner notFinished {
    weiFundingCap = ceilingStrategy.relaxFundingCap(newCap, weiRaised);
    require(weiFundingCap >= minimumFundingGoal);
    FundingCapSet(weiFundingCap);
  }

  /**
   * Invest to tokens, recognize the payer.
   *
   */
  function buyWithCustomerId(uint128 customerId) public payable {
    require(customerId != 0);  // UUIDv4 sanity check
    investInternal(msg.sender, customerId);
  }

  /**
   * The basic entry point to participate in the crowdsale process.
   *
   * Pay for funding, get invested tokens back in the sender address.
   */
  function buy() public payable {
    require(!requireCustomerId); // Crowdsale needs to track participants for thank you email
    investInternal(msg.sender, 0);
  }

  /**
   * Finalize a succcesful crowdsale.
   *
   * The owner can trigger a call the contract that provides post-crowdsale actions, like releasing the tokens.
   */
  function finalize() public inState(State.Success) onlyOwner stopInEmergency {
    finalizeAgent.finalizeCrowdsale(token);
    finalized = true;
    Finalized();
  }

  /**
   * Set policy do we need to have server-side customer ids for the investments.
   *
   */
  function setRequireCustomerId(bool value) public onlyOwner stopInEmergency {
    requireCustomerId = value;
    InvestmentPolicyChanged(requireCustomerId);
  }

  /**
   * Allow addresses to do early participation.
   *
   */
  function setEarlyParticipantWhitelist(address addr, bool status) public onlyOwner notFinished stopInEmergency {
    earlyParticipantWhitelist[addr] = status;
    Whitelisted(addr, status);
  }

  /**
   * Allow to (re)set pricing strategy.
   */
  function setPricingStrategy(PricingStrategy addr) internal {
    // Disallow setting a bad agent
    require(addr.isPricingStrategy());
    pricingStrategy = addr;
  }

  /**
   * Allow to (re)set ceiling strategy.
   */
  function setCeilingStrategy(CeilingStrategy addr) internal {
    // Disallow setting a bad agent
    require(addr.isCeilingStrategy());
    ceilingStrategy = addr;
  }

  /**
   * Allow to (re)set finalize agent.
   */
  function setFinalizeAgent(FinalizeAgent addr) internal {
    // Disallow setting a bad agent
    require(addr.isFinalizeAgent());
    finalizeAgent = addr;
    require(isFinalizerSane());
  }

  /**
   * Internal setter for the multisig wallet
   */
  function setMultisig(address addr) internal {
    require(addr != 0);
    multisigWallet = addr;
  }

  /**
   * Allow load refunds back on the contract for the refunding.
   *
   * The team can transfer the funds back on the smart contract in the case that the minimum goal was not reached.
   */
  function loadRefund() public payable inState(State.Failure) stopInEmergency {
    require(msg.value >= weiRaised);
    require(weiRefunded == 0);
    uint excedent = msg.value.sub(weiRaised);
    loadedRefund = loadedRefund.add(msg.value.sub(excedent));
    investedAmountOf[msg.sender].add(excedent);
  }

  /**
   * Investors can claim refund.
   */
  function refund() public inState(State.Refunding) stopInEmergency {
    uint weiValue = investedAmountOf[msg.sender];
    require(weiValue != 0);
    investedAmountOf[msg.sender] = 0;
    weiRefunded = weiRefunded.add(weiValue);
    Refund(msg.sender, weiValue);
    msg.sender.transfer(weiValue);
  }

  /**
   * @return true if the crowdsale has raised enough money to be a success
   */
  function isMinimumGoalReached() public constant returns (bool reached) {
    return weiRaised >= minimumFundingGoal;
  }

  /**
   * Check if the contract relationship looks good.
   */
  function isFinalizerSane() public constant returns (bool sane) {
    return finalizeAgent.isSane(token);
  }

  /**
   * Crowdfund state machine management.
   *
   * This function has the timed transition builtin.
   * So there is no chance of the variable being stale.
   */
  function getState() public constant returns (State) {
    if (finalized) return State.Finalized;
    else if (block.number < startsAt) return State.PreFunding;
    else if (block.number <= endsAt && !ceilingStrategy.isCrowdsaleFull(weiRaised, weiFundingCap)) return State.Funding;
    else if (isMinimumGoalReached()) return State.Success;
    else if (!isMinimumGoalReached() && weiRaised > 0 && loadedRefund >= weiRaised) return State.Refunding;
    else return State.Failure;
  }

  /** This is for manual testing of multisig wallet interaction */
  function setOwnerTestValue(uint8 val) public onlyOwner stopInEmergency {
    ownerTestValue = val;
  }

  function assignTokens(address receiver, uint tokenAmount) private {
    token.mint(receiver, tokenAmount);
  }

  /** Interface marker. */
  function isCrowdsale() public constant returns (bool) {
    return true;
  }

  //
  // Modifiers
  //

  /** Modifier allowing execution only if the crowdsale is currently running.  */
  modifier inState(State state) {
    require(getState() == state);
    _;
  }

  modifier notFinished() {
    State current_state = getState();
    require(current_state == State.PreFunding || current_state == State.Funding);
    _;
  }

}

/**
 * Interface for defining crowdsale pricing.
 */
contract PricingStrategy {

  /** Interface declaration. */
  function isPricingStrategy() public constant returns (bool) {
    return true;
  }

  /**
   * When somebody tries to buy tokens for X eth, calculate how many tokens they get.
   *
   *
   * @param value - What is the value of the transaction sent in as wei
   * @param weiRaised - how much money has been raised this far
   * @param tokensSold - how many tokens have been sold this far
   * @param msgSender - who is the investor of this transaction
   * @param decimals - how many decimal units the token has
   * @return Amount of tokens the investor receives
   */
  function calculatePrice(uint value, uint weiRaised, uint tokensSold, address msgSender, uint decimals) public constant returns (uint tokenAmount);
}

/**
 * Fixed crowdsale pricing - everybody gets the same price.
 */
contract FlatPricing is PricingStrategy {

  using SafeMath for uint;

  /* How many weis one token costs */
  uint public oneTokenInWei;

  function FlatPricing(uint _oneTokenInWei) {
    oneTokenInWei = _oneTokenInWei;
  }

  /**
   * Calculate the current price for buy in amount.
   *
   * @ param  {uint value} Buy-in value in wei.
   * @ param
   * @ param
   * @ param
   * @ param  {uint decimals} The decimals used by the token representation (e.g. given by FractionalERC20).
   */
  function calculatePrice(uint value, uint, uint, address, uint decimals) public constant returns (uint) {
    uint multiplier = 10 ** decimals;
    return value.mul(multiplier).div(oneTokenInWei);
  }

}

/**
 * Interface for defining crowdsale ceiling.
 */
contract CeilingStrategy {

  /** Interface declaration. */
  function isCeilingStrategy() public constant returns (bool) {
    return true;
  }

  /**
   * When somebody tries to buy tokens for X wei, calculate how many weis they are allowed to use.
   *
   *
   * @param _value - What is the value of the transaction sent in as wei.
   * @param _weiRaised - How much money has been raised so far.
   * @param _weiInvestedBySender - the investment made by the address that is sending the transaction.
   * @param _weiFundingCap - the caller's declared total cap. May be reinterpreted by the implementation of the CeilingStrategy.
   * @return Amount of wei the crowdsale can receive.
   */
  function weiAllowedToReceive(uint _value, uint _weiRaised, uint _weiInvestedBySender, uint _weiFundingCap) public constant returns (uint amount);

  function isCrowdsaleFull(uint _weiRaised, uint _weiFundingCap) public constant returns (bool);

  /**
   * Calculate a new cap if the provided one is not above the amount already raised.
   *
   *
   * @param _newCap - The potential new cap.
   * @param _weiRaised - How much money has been raised so far.
   * @return The adjusted cap.
   */
  function relaxFundingCap(uint _newCap, uint _weiRaised) public constant returns (uint);

}

/**
 * Fixed cap investment per address and crowdsale
 */
contract FixedCeiling is CeilingStrategy {
    using SafeMath for uint;

    /* When relaxing a cap is necessary, we use this multiple to determine the relaxed cap */
    uint public chunkedWeiMultiple;
    /* The limit an individual address can invest */
    uint public weiLimitPerAddress;

    function FixedCeiling(uint multiple, uint limit) {
        chunkedWeiMultiple = multiple;
        weiLimitPerAddress = limit;
    }

    function weiAllowedToReceive(uint tentativeAmount, uint weiRaised, uint weiInvestedBySender, uint weiFundingCap) public constant returns (uint) {
        // First, we limit per address investment
        uint totalOfSender = tentativeAmount.add(weiInvestedBySender);
        if (totalOfSender > weiLimitPerAddress) tentativeAmount = weiLimitPerAddress.sub(weiInvestedBySender);
        // Then, we check the funding cap
        if (weiFundingCap == 0) return tentativeAmount;
        uint total = tentativeAmount.add(weiRaised);
        if (total < weiFundingCap) return tentativeAmount;
        else return weiFundingCap.sub(weiRaised);
    }

    function isCrowdsaleFull(uint weiRaised, uint weiFundingCap) public constant returns (bool) {
        return weiFundingCap > 0 && weiRaised >= weiFundingCap;
    }

    /* If the new target cap has not been reached yet, it's fine as it is */
    function relaxFundingCap(uint newCap, uint weiRaised) public constant returns (uint) {
        if (newCap > weiRaised) return newCap;
        else return weiRaised.div(chunkedWeiMultiple).add(1).mul(chunkedWeiMultiple);
    }

}

/**
 * Finalize agent defines what happens at the end of a succesful crowdsale.
 *
 * - Allocate tokens for founders, bounties and community
 * - Make tokens transferable
 * - etc.
 */
contract FinalizeAgent {

  function isFinalizeAgent() public constant returns(bool) {
    return true;
  }

  /** Return true if we can run finalizeCrowdsale() properly.
   *
   * This is a safety check function that doesn't allow crowdsale to begin
   * unless the finalizer has been set up properly.
   */
  function isSane(CrowdsaleToken token) public constant returns (bool);

  /** Called once by crowdsale finalize() if the sale was a success. */
  function finalizeCrowdsale(CrowdsaleToken token) public;

}

/**
 * At the end of the successful crowdsale allocate % bonus of tokens to the team.
 *
 * Unlock tokens.
 *
 * BonusAllocationFinal must be set as the minting agent for the MintableToken.
 *
 */
contract BonusFinalizeAgent is FinalizeAgent {

  using SafeMath for uint;

  Crowdsale public crowdsale;

  /** Total percent of tokens minted to the team at the end of the sale as base points
  bonus tokens = tokensSold * bonusBasePoints * 0.0001         */
  uint public bonusBasePoints;

  /** Implementation detail. This is the divisor of the base points **/
  uint private constant basePointsDivisor = 10000;

  /** Where we move the tokens at the end of the sale. */
  address public teamMultisig;

  /* How many bonus tokens we allocated */
  uint public allocatedBonus;

  function BonusFinalizeAgent(Crowdsale _crowdsale, uint _bonusBasePoints, address _teamMultisig) {
    require(address(_crowdsale) != 0 && address(_teamMultisig) != 0);
    crowdsale = _crowdsale;
    teamMultisig = _teamMultisig;
    bonusBasePoints = _bonusBasePoints;
  }

  /* Can we run finalize properly */
  function isSane(CrowdsaleToken token) public constant returns (bool) {
    return token.mintAgents(address(this)) && token.releaseAgent() == address(this);
  }

  /** Called once by crowdsale finalize() if the sale was a success. */
  function finalizeCrowdsale(CrowdsaleToken token) {
    require(msg.sender == address(crowdsale));

    // How many % points of tokens the founders and others get
    uint tokensSold = crowdsale.tokensSold();
    uint saleBasePoints = basePointsDivisor.sub(bonusBasePoints);
    allocatedBonus = tokensSold.mul(bonusBasePoints).div(saleBasePoints);

    // Move tokens to the team multisig wallet
    token.mint(teamMultisig, allocatedBonus);

    // Make token transferable
    token.releaseTokenTransfer();
  }

}

// This contract has the sole objective of providing a sane concrete instance of the Crowdsale contract.
contract HubiiCrowdsale is Crowdsale {
    uint private constant chunked_multiple = 18000 * (10 ** 18); // in wei
    uint private constant limit_per_address = 100000 * (10 ** 18); // in wei
    uint private constant hubii_minimum_funding = 17000 * (10 ** 18); // in wei
    uint private constant token_initial_supply = 0;
    uint8 private constant token_decimals = 15;
    bool private constant token_mintable = true;
    string private constant token_name = "Hubiits";
    string private constant token_symbol = "HBT";
    uint private constant token_in_wei = 10 ** 15;
    // The fraction of 10,000 out of the total target tokens that is used to mint bonus tokens. These are allocated to the team's multisig wallet.
    uint private constant bonus_base_points = 3000;
    function HubiiCrowdsale(address _teamMultisig, uint _start, uint _end) Crowdsale(_teamMultisig, _start, _end, hubii_minimum_funding) public {
        PricingStrategy p_strategy = new FlatPricing(token_in_wei);
        CeilingStrategy c_strategy = new FixedCeiling(chunked_multiple, limit_per_address);
        FinalizeAgent f_agent = new BonusFinalizeAgent(this, bonus_base_points, _teamMultisig); 
        setPricingStrategy(p_strategy);
        setCeilingStrategy(c_strategy);
        // Testing values
        token = new CrowdsaleToken(token_name, token_symbol, token_initial_supply, token_decimals, _teamMultisig, token_mintable);
        token.setMintAgent(address(this), true);
        token.setMintAgent(address(f_agent), true);
        token.setReleaseAgent(address(f_agent));
        setFinalizeAgent(f_agent);
    }

    // These two setters are present only to correct block numbers if they are off from their target date by more than, say, a day
    function setStartingBlock(uint startingBlock) public onlyOwner inState(State.PreFunding) {
        require(startingBlock > block.number && startingBlock < endsAt);
        startsAt = startingBlock;
    }

    function setEndingBlock(uint endingBlock) public onlyOwner notFinished {
        require(endingBlock > block.number && endingBlock > startsAt);
        endsAt = endingBlock;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"ownerTestValue","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"requireCustomerId","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"endsAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minimumFundingGoal","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getState","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"investedAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"finalizeAgent","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newCap","type":"uint256"}],"name":"setFundingCap","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"fullTokens","type":"uint256"},{"name":"weiPrice","type":"uint256"}],"name":"preallocate","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isCrowdsale","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"endingBlock","type":"uint256"}],"name":"setEndingBlock","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"weiFundingCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"status","type":"bool"}],"name":"setEarlyParticipantWhitelist","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"weiRefunded","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"halt","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"pricingStrategy","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"loadedRefund","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isMinimumGoalReached","outputs":[{"name":"reached","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bool"}],"name":"setRequireCustomerId","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"loadRefund","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"multisigWallet","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"customerId","type":"uint128"}],"name":"buyWithCustomerId","outputs":[],"payable":true,"type":"function"},{"constant":false,"inputs":[],"name":"buy","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"isFinalizerSane","outputs":[{"name":"sane","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"startsAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"halted","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint8"}],"name":"setOwnerTestValue","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"earlyParticipantWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"unhalt","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"investorCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"startingBlock","type":"uint256"}],"name":"setStartingBlock","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ceilingStrategy","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"inputs":[{"name":"_teamMultisig","type":"address"},{"name":"_start","type":"uint256"},{"name":"_end","type":"uint256"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"investor","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"customerId","type":"uint128"}],"name":"Invested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"investor","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"requireCId","type":"bool"}],"name":"InvestmentPolicyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"status","type":"bool"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newFundingCap","type":"uint256"}],"name":"FundingCapSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"halted","type":"bool"}],"name":"Halted","type":"event"}]

606060405260006007556000600a556000600b556000600c556000600d556000600e5534156200002e57600080fd5b604051606080620049028339810160405280805191906020018051919060200180519150505b600080600085858569039992648a23c8a000005b5b60008054600160a060020a03191633600160a060020a03161790555b6200009e846401000000006200182d6200054882021704565b8215801590620000ad57508115155b1515620000b957600080fd5b8243108015620000c857508183105b1515620000d457600080fd5b6008839055600982905560068190555b5050505066038d7ea4c68000620000fa62000833565b908152602001604051809103906000f08015156200011757600080fd5b92506903cfc82e37e9a740000069152d02c7e14af68000006200013962000844565b918252602082015260409081019051809103906000f08015156200015c57600080fd5b915030610bb8876200016d62000855565b600160a060020a039384168152602081019290925290911660408083019190915260609091019051809103906000f0801515620001a957600080fd5b9050620001c483640100000000620018616200057d82021704565b620001dd82640100000000620018ec6200062482021704565b604080519081016040908152600782527f487562696974730000000000000000000000000000000000000000000000000060208301528051908101604052600381527f484254000000000000000000000000000000000000000000000000000000000060208201526000600f8960016200025662000866565b6040810185905260ff84166060820152600160a060020a038316608082015281151560a082015260c080825281906020820190820189818151815260200191508051906020019080838360005b83811015620002be5780820151818401525b602001620002a3565b50505050905090810190601f168015620002ec5780820380516001836020036101000a031916815260200191505b50838103825288818151815260200191508051906020019080838360005b83811015620003255780820151818401525b6020016200030a565b50505050905090810190601f168015620003535780820380516001836020036101000a031916815260200191505b5098505050505050505050604051809103906000f08015156200037557600080fd5b60018054600160a060020a031916600160a060020a03928316178082559091169063432146759030906040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515620003fd57600080fd5b6102c65a03f115156200040f57600080fd5b505060018054600160a060020a0316915063432146759083906040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b15156200048757600080fd5b6102c65a03f115156200049957600080fd5b5050600154600160a060020a031690506329ff4f53826040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200050757600080fd5b6102c65a03f115156200051957600080fd5b5050506200053b81620006cb6401000000000262001977176401000000009004565b5b50505050505062000877565b600160a060020a03811615156200055e57600080fd5b60058054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a03166304bbc2556000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620005dd57600080fd5b6102c65a03f11515620005ef57600080fd5b5050506040518051905015156200060557600080fd5b60028054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a0316638dbe3be56000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200068457600080fd5b6102c65a03f115156200069657600080fd5b505050604051805190501515620006ac57600080fd5b60038054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a031663614cb9046000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200072b57600080fd5b6102c65a03f115156200073d57600080fd5b5050506040518051905015156200075357600080fd5b60048054600160a060020a031916600160a060020a03831617905562000786640100000000620007968102620011021704565b15156200057a57600080fd5b5b50565b600454600154600091600160a060020a0390811691638e768288911683604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200081257600080fd5b6102c65a03f115156200082457600080fd5b50505060405180519150505b90565b6040516101ba80620022e883390190565b60405161034d80620024a283390190565b60405161057b80620027ef83390190565b604051611b988062002d6a83390190565b611a6180620008876000396000f300606060405236156101dd5763ffffffff60e060020a6000350416630226401d81146101eb57806303ca0eed146102145780630a09284a1461023b57806313f4e977146102605780631865c57d146102855780631aae3460146102bc57806321d5c0f6146102ed5780632a0139251461031c57806332013ac3146103345780634042b66f1461035b5780634551dd591461038057806346755c68146103a75780634bb278f3146103bf5780634da1b25d146103d4578063518ab2a8146103f957806358bad3eb1461041e578063590e1ae3146104445780635da89ac0146104595780635ed7ca5b1461047e57806378b99c2414610493578063797d9437146104c25780637c2e08a3146104e75780637f7d711e1461050e57806387612102146105285780638da5cb5b146105325780639075becf1461056157806397b150ca1461059057806399e9376c146105c1578063a6f2ae3a146105d7578063a7ba44c3146105e1578063af46868214610608578063b3f05b971461062d578063b9b8af0b14610654578063bb23ef741461067b578063cb16e6d014610696578063cb3e64fd146106c9578063d7e64c00146106de578063ec17b20e14610703578063ee51b8791461071b578063f2fde38b1461074a578063fc0c546a1461076b575b6101e95b600080fd5b5b565b005b34156101f657600080fd5b6101fe61079a565b60405160ff909116815260200160405180910390f35b341561021f57600080fd5b6102276107a3565b604051901515815260200160405180910390f35b341561024657600080fd5b61024e6107b1565b60405190815260200160405180910390f35b341561026b57600080fd5b61024e6107b7565b60405190815260200160405180910390f35b341561029057600080fd5b6102986107bd565b604051808260068111156102a857fe5b60ff16815260200191505060405180910390f35b34156102c757600080fd5b61024e600160a060020a03600435166108d1565b60405190815260200160405180910390f35b34156102f857600080fd5b6103006108e3565b604051600160a060020a03909116815260200160405180910390f35b341561032757600080fd5b6101e96004356108f2565b005b341561033f57600080fd5b6101e9600160a060020a0360043516602435604435610a14565b005b341561036657600080fd5b61024e610b36565b60405190815260200160405180910390f35b341561038b57600080fd5b610227610b3c565b604051901515815260200160405180910390f35b34156103b257600080fd5b6101e9600435610b42565b005b34156103ca57600080fd5b6101e9610bc2565b005b34156103df57600080fd5b61024e610cc0565b60405190815260200160405180910390f35b341561040457600080fd5b61024e610cc6565b60405190815260200160405180910390f35b341561042957600080fd5b6101e9600160a060020a03600435166024351515610ccc565b005b341561044f57600080fd5b6101e9610db2565b005b341561046457600080fd5b61024e610ebe565b60405190815260200160405180910390f35b341561048957600080fd5b6101e9610ec4565b005b341561049e57600080fd5b610300610f1d565b604051600160a060020a03909116815260200160405180910390f35b34156104cd57600080fd5b61024e610f2c565b60405190815260200160405180910390f35b34156104f257600080fd5b610227610f32565b604051901515815260200160405180910390f35b341561051957600080fd5b6101e96004351515610f3e565b005b6101e9610fca565b005b341561053d57600080fd5b61030061108c565b604051600160a060020a03909116815260200160405180910390f35b341561056c57600080fd5b61030061109b565b604051600160a060020a03909116815260200160405180910390f35b341561059b57600080fd5b61024e600160a060020a03600435166110aa565b60405190815260200160405180910390f35b6101e96001608060020a03600435166110bc565b005b6101e96110df565b005b34156105ec57600080fd5b610227611102565b604051901515815260200160405180910390f35b341561061357600080fd5b61024e611184565b60405190815260200160405180910390f35b341561063857600080fd5b61022761118a565b604051901515815260200160405180910390f35b341561065f57600080fd5b610227611193565b604051901515815260200160405180910390f35b341561068657600080fd5b6101e960ff600435166111a3565b005b34156106a157600080fd5b610227600160a060020a03600435166111ea565b604051901515815260200160405180910390f35b34156106d457600080fd5b6101e96111ff565b005b34156106e957600080fd5b61024e61126a565b60405190815260200160405180910390f35b341561070e57600080fd5b6101e9600435611270565b005b341561072657600080fd5b6103006112d3565b604051600160a060020a03909116815260200160405180910390f35b341561075557600080fd5b6101e9600160a060020a03600435166112e2565b005b341561077657600080fd5b610300611332565b604051600160a060020a03909116815260200160405180910390f35b60135460ff1681565b600f54610100900460ff1681565b60095481565b60065481565b600f5460009060ff16156107d3575060056108c9565b6008544310156107e5575060016108c9565b600954431115801561086f5750600354600b54600754600160a060020a039092169163d0bc97d0919060006040516020015260405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b151561085257600080fd5b6102c65a03f1151561086357600080fd5b50505060405180519050155b1561087c575060026108c9565b610884610f32565b15610891575060036108c9565b610899610f32565b1580156108a857506000600b54115b80156108b85750600b54600d5410155b156108c5575060066108c9565b5060045b5b5b5b5b5b90565b60106020526000908152604090205481565b600454600160a060020a031681565b60005433600160a060020a0390811691161461090d57600080fd5b60006109176107bd565b905060015b81600681111561092857fe5b1480610940575060025b81600681111561093e57fe5b145b151561094b57600080fd5b600354600b54600160a060020a039091169063b12dff6590849060006040516020015260405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b15156109a957600080fd5b6102c65a03f115156109ba57600080fd5b5050506040518051600781905560065490101590506109d857600080fd5b7f90a72a3ffe1b2fb74f2660b6f57990bc203fa5c7b4a6eed6a7f7a3b48abc1a4060075460405190815260200160405180910390a15b5b505b50565b60008054819033600160a060020a03908116911614610a3257600080fd5b6000610a3c6107bd565b905060015b816006811115610a4d57fe5b1480610a65575060025b816006811115610a6357fe5b145b1515610a7057600080fd5b600160a060020a0386161515610a8557600080fd5b600154610afe90600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610ad157600080fd5b6102c65a03f11515610ae257600080fd5b505050604051805187915060ff16600a0a63ffffffff61134116565b9250821515610b0c57600080fd5b610b1c848463ffffffff61134116565b9150610b2b8383886000611370565b5b5b505b5050505050565b600b5481565b60015b90565b60005433600160a060020a03908116911614610b5d57600080fd5b6000610b676107bd565b905060015b816006811115610b7857fe5b1480610b90575060025b816006811115610b8e57fe5b145b1515610b9b57600080fd5b4382118015610bab575060085482115b1515610bb657600080fd5b60098290555b5b505b50565b6003805b610bce6107bd565b6006811115610bd957fe5b14610be357600080fd5b60005433600160a060020a03908116911614610bfe57600080fd5b60005460a060020a900460ff1615610c1557600080fd5b600454600154600160a060020a0391821691634cb6d6af911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c6c57600080fd5b6102c65a03f11515610c7d57600080fd5b5050600f805460ff19166001179055507f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a15b5b5b5b50565b60075481565b600a5481565b60005433600160a060020a03908116911614610ce757600080fd5b6000610cf16107bd565b905060015b816006811115610d0257fe5b1480610d1a575060025b816006811115610d1857fe5b145b1515610d2557600080fd5b60005460a060020a900460ff1615610d3c57600080fd5b600160a060020a03831660009081526012602052604090819020805460ff19168415151790557fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440908490849051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b505b5050565b60006006805b610dc06107bd565b6006811115610dcb57fe5b14610dd557600080fd5b60005460a060020a900460ff1615610dec57600080fd5b600160a060020a0333166000908152601060205260409020549150811515610e1357600080fd5b600160a060020a033316600090815260106020526040812055600e54610e3f908363ffffffff61148616565b600e557fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d3383604051600160a060020a03909216825260208201526040908101905180910390a1600160a060020a03331682156108fc0283604051600060405180830381858888f193505050501515610a0e57600080fd5b5b5b5b5050565b600e5481565b60005433600160a060020a03908116911614610edf57600080fd5b6000805460a060020a60ff02191660a060020a179055600080516020611a168339815191526001604051901515815260200160405180910390a15b5b565b600254600160a060020a031681565b600d5481565b600654600b5410155b90565b60005433600160a060020a03908116911614610f5957600080fd5b60005460a060020a900460ff1615610f7057600080fd5b600f805461ff001916610100831515810291909117918290557f18e146f9f57083907720563bd8f8ca0ae35b6ade53ed888590d597ec7f576ad99160ff91900416604051901515815260200160405180910390a15b5b5b50565b60006004805b610fd86107bd565b6006811115610fe357fe5b14610fed57600080fd5b60005460a060020a900460ff161561100457600080fd5b600b5434101561101357600080fd5b600e541561102057600080fd5b600b5461103490349063ffffffff6114a016565b9150611058611049348463ffffffff6114a016565b600d549063ffffffff61148616565b600d55600160a060020a033316600090815260106020526040902054610daa908363ffffffff61148616565b505b5b5b5050565b600054600160a060020a031681565b600554600160a060020a031681565b60116020526000908152604090205481565b6001608060020a03811615156110d157600080fd5b610a1133826114b7565b5b50565b600f54610100900460ff16156110f457600080fd5b6101e63360006114b7565b5b565b600454600154600091600160a060020a0390811691638e7682889116836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561116457600080fd5b6102c65a03f1151561117557600080fd5b50505060405180519150505b90565b60085481565b600f5460ff1681565b60005460a060020a900460ff1681565b60005433600160a060020a039081169116146111be57600080fd5b60005460a060020a900460ff16156111d557600080fd5b6013805460ff191660ff83161790555b5b5b50565b60126020526000908152604090205460ff1681565b60005433600160a060020a0390811691161461121a57600080fd5b60005460a060020a900460ff16151561123257600080fd5b6000805460a060020a60ff0219168155600080516020611a1683398151915290604051901515815260200160405180910390a15b5b5b565b600c5481565b60005433600160a060020a0390811691161461128b57600080fd5b6001805b6112976107bd565b60068111156112a257fe5b146112ac57600080fd5b43821180156112bc575060095482105b15156112c757600080fd5b60088290555b5b505b50565b600354600160a060020a031681565b60005433600160a060020a039081169116146112fd57600080fd5b600160a060020a038116151561131257600080fd5b60008054600160a060020a031916600160a060020a0383161790555b5b50565b600154600160a060020a031681565b600082820283158061135d575082848281151561135a57fe5b04145b151561136557fe5b8091505b5092915050565b600160a060020a038216600090815260106020526040902054611399908463ffffffff61148616565b600160a060020a0383166000908152601060209081526040808320939093556011905220546113ce908563ffffffff61148616565b600160a060020a038316600090815260116020526040902055600b546113fa908463ffffffff61148616565b600b55600a54611410908563ffffffff61148616565b600a5561141d82856117be565b7f0396f60aaad038749091d273dc13aaabc63db6e2271c7bad442d5cf25cc4335082848684604051600160a060020a03909416845260208401929092526040808401919091526001608060020a0390911660608301526080909101905180910390a15b50505050565b60008282018381101561136557fe5b8091505b5092915050565b6000828211156114ac57fe5b508082035b92915050565b600080548190819060a060020a900460ff16156114d357600080fd5b60006114dd6107bd565b905060015b8160068111156114ee57fe5b1480611506575060025b81600681111561150457fe5b145b151561151157600080fd5b60015b61151c6107bd565b600681111561152757fe5b141561155457600160a060020a03861660009081526012602052604090205460ff16151561155457600080fd5b5b600354600b54600160a060020a0388811660009081526010602052604080822054600754939095169463a04e34bc94349490939192909190516020015260405160e060020a63ffffffff87160281526004810194909452602484019290925260448301526064820152608401602060405180830381600087803b15156115da57600080fd5b6102c65a03f115156115eb57600080fd5b5050506040518051600254600b54600a54600154939850600160a060020a0392831694506318a4155e93899333911663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561165657600080fd5b6102c65a03f1151561166757600080fd5b5050506040518051905060006040516020015260405160e060020a63ffffffff8816028152600481019590955260248501939093526044840191909152600160a060020a0316606483015260ff16608482015260a401602060405180830381600087803b15156116d657600080fd5b6102c65a03f115156116e757600080fd5b50505060405180519350508215156116fe57600080fd5b600160a060020a038616600090815260106020526040902054151561172757600c805460010190555b61173383858888611370565b600554600160a060020a031684156108fc0285604051600060405180830381858888f19350505050151561176657600080fd5b611776348563ffffffff6114a016565b91506000821115610b2b57600160a060020a03331682156108fc0283604051600060405180830381858888f193505050501515610b2b57600080fd5b5b5b5b505b5050505050565b600154600160a060020a03166340c10f19838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561181457600080fd5b6102c65a03f11515610b2f57600080fd5b5050505b5050565b600160a060020a038116151561184257600080fd5b60058054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a03166304bbc2556000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b5050506040518051905015156118cd57600080fd5b60028054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a0316638dbe3be56000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561193257600080fd5b6102c65a03f1151561194357600080fd5b50505060405180519050151561195857600080fd5b60038054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a031663614cb9046000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156119bd57600080fd5b6102c65a03f115156119ce57600080fd5b5050506040518051905015156119e357600080fd5b60048054600160a060020a031916600160a060020a038316179055611a06611102565b1515610a1157600080fd5b5b50560092333b0b676476985757350034668cb9ee247674ac7a7479de10cd761381f733a165627a7a723058202fb751fcca7b341ef504eed002ca773b243d14d42b03312ecee53d8751b9d6b500296060604052341561000f57600080fd5b6040516020806101ba833981016040528080519150505b60008190555b505b61017d8061003d6000396000f300606060405263ffffffff60e060020a60003504166304bbc255811461003a57806318a4155e1461006157806384e3ac941461009e575b600080fd5b341561004557600080fd5b61004d6100c3565b604051901515815260200160405180910390f35b341561006c57600080fd5b61008c600435602435604435600160a060020a03606435166084356100c9565b60405190815260200160405180910390f35b34156100a957600080fd5b61008c610100565b60405190815260200160405180910390f35b60015b90565b60008054600a83900a906100f3906100e7898463ffffffff61010616565b9063ffffffff61013516565b91505b5095945050505050565b60005481565b6000828202831580610122575082848281151561011f57fe5b04145b151561012a57fe5b8091505b5092915050565b600080828481151561014357fe5b0490508091505b50929150505600a165627a7a72305820f2cacf89a34fc95861df87df2cba39e74ca0b8eff78a379b92366bb3bb50d77d00296060604052341561000f57600080fd5b60405160408061034d83398101604052808051919060200180519150505b600082905560018190555b50505b6103038061004a6000396000f3006060604052361561005c5763ffffffff60e060020a600035041663296ca48a811461006157806360f6fb2e146100865780638dbe3be5146100ab578063a04e34bc146100d2578063b12dff6514610103578063d0bc97d01461012e575b600080fd5b341561006c57600080fd5b61007461015b565b60405190815260200160405180910390f35b341561009157600080fd5b610074610161565b60405190815260200160405180910390f35b34156100b657600080fd5b6100be610167565b604051901515815260200160405180910390f35b34156100dd57600080fd5b61007460043560243560443560643561016d565b60405190815260200160405180910390f35b341561010e57600080fd5b6100746004356024356101f2565b60405190815260200160405180910390f35b341561013957600080fd5b6100be600435602435610241565b604051901515815260200160405180910390f35b60015481565b60005481565b60015b90565b60008080610181878663ffffffff61025b16565b91506001548211156101a3576001546101a0908663ffffffff61027516565b96505b8315156101b2578692506101e7565b6101c2878763ffffffff61025b16565b9050838110156101d4578692506101e7565b6101e4848763ffffffff61027516565b92505b5b5050949350505050565b60008183111561020357508161023a565b6000546102379061022b600161021f868463ffffffff61028c16565b9063ffffffff61025b16565b9063ffffffff6102a816565b90505b5b92915050565b600080821180156102375750818310155b90505b92915050565b60008282018381101561026a57fe5b8091505b5092915050565b60008282111561028157fe5b508082035b92915050565b600080828481151561029a57fe5b0490508091505b5092915050565b60008282028315806102c457508284828115156102c157fe5b04145b151561026a57fe5b8091505b50929150505600a165627a7a72305820a52c9bca7cbc4d524dfd6b63f6c5ae8f01cbffb0e33ed72a9dd41acb49de0e1800296060604052341561000f57600080fd5b60405160608061057b8339810160405280805191906020018051919060200180519150505b600160a060020a038316158015906100545750600160a060020a03811615155b151561005f57600080fd5b60008054600160a060020a03808616600160a060020a031992831617909255600280549284169290911691909117905560018290555b5050505b6104d3806100a86000396000f300606060405236156100675763ffffffff60e060020a6000350416634cb6d6af811461006c578063614cb9041461008d5780636a457ee9146100b45780637424bebc146100d95780638e768288146100fe5780639c1e03a014610131578063dbc0c08514610160575b600080fd5b341561007757600080fd5b61008b600160a060020a036004351661018f565b005b341561009857600080fd5b6100a061031c565b604051901515815260200160405180910390f35b34156100bf57600080fd5b6100c7610322565b60405190815260200160405180910390f35b34156100e457600080fd5b6100c7610328565b60405190815260200160405180910390f35b341561010957600080fd5b6100a0600160a060020a036004351661032e565b604051901515815260200160405180910390f35b341561013c57600080fd5b610144610427565b604051600160a060020a03909116815260200160405180910390f35b341561016b57600080fd5b610144610436565b604051600160a060020a03909116815260200160405180910390f35b60008054819033600160a060020a039081169116146101ad57600080fd5b60008054600160a060020a03169063518ab2a890604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156101f657600080fd5b6102c65a03f1151561020757600080fd5b505050604051805160015490935061022991506127109063ffffffff61044516565b9050610250816102446001548561045c90919063ffffffff16565b9063ffffffff61048b16565b6003819055600254600160a060020a03808616926340c10f19929091169060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156102b157600080fd5b6102c65a03f115156102c257600080fd5b50505082600160a060020a0316635f412d4f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561030257600080fd5b6102c65a03f1151561031357600080fd5b5050505b505050565b60015b90565b60035481565b60015481565b600081600160a060020a03166342c1867b3060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561038757600080fd5b6102c65a03f1151561039857600080fd5b50505060405180519050801561041f575030600160a060020a031682600160a060020a031663d1f276d36000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156103f957600080fd5b6102c65a03f1151561040a57600080fd5b50505060405180519050600160a060020a0316145b90505b919050565b600054600160a060020a031681565b600254600160a060020a031681565b60008282111561045157fe5b508082035b92915050565b6000828202831580610478575082848281151561047557fe5b04145b151561048057fe5b8091505b5092915050565b600080828481151561049957fe5b0490508091505b50929150505600a165627a7a723058208c3e8aafa45fe0ec40295a985ca9c7030124689ff513961d3cb9ef0f75e44d06002960606040526004805460a060020a60ff02191690556006805460ff1916905534156200002a57600080fd5b60405162001b9838038062001b98833981016040528080518201919060200180518201919060200180519190602001805191906020018051919060200180519150505b815b8483835b5b60038054600160a060020a03191633600160a060020a03161790555b600160a060020a0382161515620000a657600080fd5b8080620000b257508215155b1515620000be57600080fd5b6000831115620000e257620000e28284640100000000620015546200015d82021704565b5b6006805460ff191682151790555b5050506200011381620002296401000000000262001725176401000000009004565b5b50600c8680516200012a92916020019062000279565b50600d8580516200014092916020019062000279565b50600b805460ff191660ff85161790555b50505050505062000323565b60065460ff16156200016e57600080fd5b6000546200018b9082640100000000620016226200025e82021704565b6000908155600160a060020a038316815260016020526040902054620001c09082640100000000620016226200025e82021704565b600160a060020a03831660009081526001602052604090819020919091557f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe908390839051600160a060020a03909216825260208201526040908101905180910390a15b5b5050565b600160a060020a03811615156200023f57600080fd5b60088054600160a060020a031916600160a060020a0383161790555b50565b6000828201838110156200026e57fe5b8091505b5092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002bc57805160ff1916838001178555620002ec565b82800160010185558215620002ec579182015b82811115620002ec578251825591602001919060010190620002cf565b5b50620002fb929150620002ff565b5090565b6200032091905b80821115620002fb576000815560010162000306565b5090565b90565b61186580620003336000396000f300606060405236156101855763ffffffff60e060020a60003504166302f652a3811461018a57806305d2035b146101b057806306fdde03146101d7578063095ea7b31461026257806318160ddd1461029857806323b872dd146102bd57806329ff4f53146102f9578063313ce5671461031a57806340c10f191461034357806342c1867b14610367578063432146751461039a57806345977d03146103c05780634eee966f146103d85780635de4ccb01461046d5780635f412d4f1461049c578063600440cb146104b157806370a08231146104e05780638444b39114610511578063867c2857146105485780638da5cb5b1461057b57806395d89b41146105aa57806396132521146106355780639738968c1461065c578063a9059cbb14610683578063ac3cb72c146106b9578063c752ff62146106ef578063d1f276d314610714578063d7e7088a14610743578063dd62ed3e14610764578063e2301d021461079b578063ea56a44d146107d1578063eefa597b146107f2578063f2fde38b14610819575b600080fd5b341561019557600080fd5b6101ae600160a060020a0360043516602435151561083a565b005b34156101bb57600080fd5b6101c361089b565b604051901515815260200160405180910390f35b34156101e257600080fd5b6101ea6108a4565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102275780820151818401525b60200161020e565b50505050905090810190601f1680156102545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561026d57600080fd5b6101c3600160a060020a0360043516602435610942565b604051901515815260200160405180910390f35b34156102a357600080fd5b6102ab6109d7565b60405190815260200160405180910390f35b34156102c857600080fd5b6101c3600160a060020a03600435811690602435166044356109dd565b604051901515815260200160405180910390f35b341561030457600080fd5b6101ae600160a060020a0360043516610a34565b005b341561032557600080fd5b61032d610a8b565b60405160ff909116815260200160405180910390f35b341561034e57600080fd5b6101ae600160a060020a0360043516602435610a94565b005b341561037257600080fd5b6101c3600160a060020a0360043516610acb565b604051901515815260200160405180910390f35b34156103a557600080fd5b6101ae600160a060020a03600435166024351515610ae0565b005b34156103cb57600080fd5b6101ae600435610b7f565b005b34156103e357600080fd5b6101ae60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650610ceb95505050505050565b005b341561047857600080fd5b610480610e5b565b604051600160a060020a03909116815260200160405180910390f35b34156104a757600080fd5b6101ae610e6a565b005b34156104bc57600080fd5b610480610e9e565b604051600160a060020a03909116815260200160405180910390f35b34156104eb57600080fd5b6102ab600160a060020a0360043516610ead565b60405190815260200160405180910390f35b341561051c57600080fd5b610524610ecc565b6040518082600481111561053457fe5b60ff16815260200191505060405180910390f35b341561055357600080fd5b6101c3600160a060020a0360043516610f19565b604051901515815260200160405180910390f35b341561058657600080fd5b610480610f2e565b604051600160a060020a03909116815260200160405180910390f35b34156105b557600080fd5b6101ea610f3d565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102275780820151818401525b60200161020e565b50505050905090810190601f1680156102545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064057600080fd5b6101c3610fdb565b604051901515815260200160405180910390f35b341561066757600080fd5b6101c3610feb565b604051901515815260200160405180910390f35b341561068e57600080fd5b6101c3600160a060020a0360043516602435611011565b604051901515815260200160405180910390f35b34156106c457600080fd5b6101c3600160a060020a0360043516602435611066565b604051901515815260200160405180910390f35b34156106fa57600080fd5b6102ab6110fb565b60405190815260200160405180910390f35b341561071f57600080fd5b610480611101565b604051600160a060020a03909116815260200160405180910390f35b341561074e57600080fd5b6101ae600160a060020a0360043516611110565b005b341561076f57600080fd5b6102ab600160a060020a03600435811690602435166112bc565b60405190815260200160405180910390f35b34156107a657600080fd5b6101c3600160a060020a03600435166024356112e9565b604051901515815260200160405180910390f35b34156107dc57600080fd5b6101ae600160a060020a03600435166113d3565b005b34156107fd57600080fd5b6101c36113fb565b604051901515815260200160405180910390f35b341561082457600080fd5b6101ae600160a060020a0360043516611401565b005b60035433600160a060020a0390811691161461085557600080fd5b60045460009060a060020a900460ff161561086f57600080fd5b600160a060020a0383166000908152600560205260409020805460ff19168315151790555b5b505b5050565b60065460ff1681565b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561093a5780601f1061090f5761010080835404028352916020019161093a565b820191906000526020600020905b81548152906001019060200180831161091d57829003601f168201915b505050505081565b60008115806109745750600160a060020a03338116600090815260026020908152604080832093871683529290522054155b151561097f57600080fd5b600160a060020a033381166000818152600260209081526040808320948816808452949091529081902085905560008051602061181a8339815191529085905190815260200160405180910390a35060015b92915050565b60005481565b600454600090849060a060020a900460ff1680610a125750600160a060020a03811660009081526005602052604090205460ff165b1515610a1d57600080fd5b610a28858585611451565b91505b5b509392505050565b60035433600160a060020a03908116911614610a4f57600080fd5b60045460009060a060020a900460ff1615610a6957600080fd5b60048054600160a060020a031916600160a060020a0384161790555b5b505b50565b600b5460ff1681565b600160a060020a03331660009081526007602052604090205460ff161515610abb57600080fd5b6108978282611554565b5b5b5050565b60076020526000908152604090205460ff1681565b60035433600160a060020a03908116911614610afb57600080fd5b60065460ff1615610b0b57600080fd5b600160a060020a03821660009081526007602052604090819020805460ff19168315151790557f4b0adf6c802794c7dde28a08a4e07131abcff3bf9603cd71f14f90bec7865efa908390839051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b5050565b6000610b89610ecc565b905060035b816004811115610b9a57fe5b1480610bb2575060045b816004811115610bb057fe5b145b1515610bbd57600080fd5b811515610bc957600080fd5b600160a060020a033316600090815260016020526040902054610bf2908363ffffffff61160b16565b600160a060020a03331660009081526001602052604081209190915554610c1f908363ffffffff61160b16565b600055600a54610c35908363ffffffff61162216565b600a55600954600160a060020a031663753e88e5338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515610c8e57600080fd5b6102c65a03f11515610c9f57600080fd5b5050600954600160a060020a03908116915033167f7e5c344a8141a805725cb476f76c6953b842222b967edd1f78ddb6e8b3f397ac8460405190815260200160405180910390a35b5050565b60035433600160a060020a03908116911614610d0657600080fd5b600c828051610d19929160200190611759565b50600d818051610d2d929160200190611759565b507fd131ab1e6f279deea74e13a18477e13e2107deb6dc8ae955648948be5841fb46600c600d604051604080825283546002600019610100600184161502019091160490820181905281906020820190606083019086908015610dd15780601f10610da657610100808354040283529160200191610dd1565b820191906000526020600020905b815481529060010190602001808311610db457829003601f168201915b5050838103825284546002600019610100600184161502019091160480825260209091019085908015610e455780601f10610e1a57610100808354040283529160200191610e45565b820191906000526020600020905b815481529060010190602001808311610e2857829003601f168201915b505094505050505060405180910390a15b5b5050565b600954600160a060020a031681565b60045433600160a060020a03908116911614610e8557600080fd5b6006805460ff19166001179055610e9a61163c565b5b5b565b600854600160a060020a031681565b600160a060020a0381166000908152600160205260409020545b919050565b6000610ed6610feb565b1515610ee457506001610f13565b600954600160a060020a03161515610efe57506002610f13565b600a541515610f0f57506003610f13565b5060045b5b5b5b90565b60056020526000908152604090205460ff1681565b600354600160a060020a031681565b600d8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561093a5780601f1061090f5761010080835404028352916020019161093a565b820191906000526020600020905b81548152906001019060200180831161091d57829003601f168201915b505050505081565b60045460a060020a900460ff1681565b60045460009060a060020a900460ff16801561100a575061100a6113fb565b5b90505b90565b600454600090339060a060020a900460ff16806110465750600160a060020a03811660009081526005602052604090205460ff165b151561105157600080fd5b61105b8484611677565b91505b5b5092915050565b600160a060020a03338116600090815260026020908152604080832093861683529290529081205461109e818463ffffffff61162216565b600160a060020a033381166000818152600260209081526040808320948a1680845294909152908190208490559192909160008051602061181a83398151915291905190815260200160405180910390a3600191505b5092915050565b600a5481565b600454600160a060020a031681565b611118610feb565b151561112357600080fd5b600160a060020a038116151561113857600080fd5b60085433600160a060020a0390811691161461115357600080fd5b60045b61115e610ecc565b600481111561116957fe5b141561117457600080fd5b60098054600160a060020a031916600160a060020a038381169190911791829055166361d3d7a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156111d257600080fd5b6102c65a03f115156111e357600080fd5b5050506040518051905015156111f857600080fd5b600080546009549091600160a060020a0390911690634b2ba0dd90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561124857600080fd5b6102c65a03f1151561125957600080fd5b5050506040518051905014151561126f57600080fd5b6009547f7845d5aa74cc410e35571258d954f23b82276e160fe8c188fa80566580f279cc90600160a060020a0316604051600160a060020a03909116815260200160405180910390a15b50565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561134657600160a060020a03338116600090815260026020908152604080832093881683529290529081205561137d565b61109e818463ffffffff61160b16565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a03338116600081815260026020908152604080832094891680845294909152908190205460008051602061181a833981519152915190815260200160405180910390a3600191505b5092915050565b60085433600160a060020a039081169116146113ee57600080fd5b610a8881611725565b5b50565b60015b90565b60035433600160a060020a0390811691161461141c57600080fd5b600160a060020a038116151561143157600080fd5b60038054600160a060020a031916600160a060020a0383161790555b5b50565b600160a060020a038084166000908152600260209081526040808320338516845282528083205493861683526001909152812054909190611498908463ffffffff61162216565b600160a060020a0380861660009081526001602052604080822093909355908716815220546114cd908463ffffffff61160b16565b600160a060020a0386166000908152600160205260409020556114f6818463ffffffff61160b16565b600160a060020a03808716600081815260026020908152604080832033861684529091529081902093909355908616916000805160206117fa8339815191529086905190815260200160405180910390a3600191505b509392505050565b60065460ff161561156457600080fd5b600054611577908263ffffffff61162216565b6000908155600160a060020a0383168152600160205260409020546115a2908263ffffffff61162216565b600160a060020a03831660009081526001602052604090819020919091557f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe908390839051600160a060020a03909216825260208201526040908101905180910390a15b5b5050565b60008282111561161757fe5b508082035b92915050565b60008282018381101561163157fe5b8091505b5092915050565b60045433600160a060020a0390811691161461165757600080fd5b6004805460a060020a60ff02191660a060020a1790555b5b565b60015b90565b600160a060020a0333166000908152600160205260408120546116a0908363ffffffff61160b16565b600160a060020a0333811660009081526001602052604080822093909355908516815220546116d5908363ffffffff61162216565b600160a060020a0380851660008181526001602052604090819020939093559133909116906000805160206117fa8339815191529085905190815260200160405180910390a35060015b92915050565b600160a060020a038116151561173a57600080fd5b60088054600160a060020a031916600160a060020a0383161790555b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061179a57805160ff19168380011785556117c7565b828001600101855582156117c7579182015b828111156117c75782518255916020019190600101906117ac565b5b506117d49291506117d8565b5090565b610f1391905b808211156117d457600081556001016117de565b5090565b905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a165627a7a7230582081828f9ae489ed77919587782a892cfe871396b934c3819f5804c4d9732b6c1e0029000000000000000000000000800e1dcc20d95e60ff8b3106e6eaa1cb73d5d16f0000000000000000000000000000000000000000000000000000000000400f9c000000000000000000000000000000000000000000000000000000000040e9a7

Deployed Bytecode

0x606060405236156101dd5763ffffffff60e060020a6000350416630226401d81146101eb57806303ca0eed146102145780630a09284a1461023b57806313f4e977146102605780631865c57d146102855780631aae3460146102bc57806321d5c0f6146102ed5780632a0139251461031c57806332013ac3146103345780634042b66f1461035b5780634551dd591461038057806346755c68146103a75780634bb278f3146103bf5780634da1b25d146103d4578063518ab2a8146103f957806358bad3eb1461041e578063590e1ae3146104445780635da89ac0146104595780635ed7ca5b1461047e57806378b99c2414610493578063797d9437146104c25780637c2e08a3146104e75780637f7d711e1461050e57806387612102146105285780638da5cb5b146105325780639075becf1461056157806397b150ca1461059057806399e9376c146105c1578063a6f2ae3a146105d7578063a7ba44c3146105e1578063af46868214610608578063b3f05b971461062d578063b9b8af0b14610654578063bb23ef741461067b578063cb16e6d014610696578063cb3e64fd146106c9578063d7e64c00146106de578063ec17b20e14610703578063ee51b8791461071b578063f2fde38b1461074a578063fc0c546a1461076b575b6101e95b600080fd5b5b565b005b34156101f657600080fd5b6101fe61079a565b60405160ff909116815260200160405180910390f35b341561021f57600080fd5b6102276107a3565b604051901515815260200160405180910390f35b341561024657600080fd5b61024e6107b1565b60405190815260200160405180910390f35b341561026b57600080fd5b61024e6107b7565b60405190815260200160405180910390f35b341561029057600080fd5b6102986107bd565b604051808260068111156102a857fe5b60ff16815260200191505060405180910390f35b34156102c757600080fd5b61024e600160a060020a03600435166108d1565b60405190815260200160405180910390f35b34156102f857600080fd5b6103006108e3565b604051600160a060020a03909116815260200160405180910390f35b341561032757600080fd5b6101e96004356108f2565b005b341561033f57600080fd5b6101e9600160a060020a0360043516602435604435610a14565b005b341561036657600080fd5b61024e610b36565b60405190815260200160405180910390f35b341561038b57600080fd5b610227610b3c565b604051901515815260200160405180910390f35b34156103b257600080fd5b6101e9600435610b42565b005b34156103ca57600080fd5b6101e9610bc2565b005b34156103df57600080fd5b61024e610cc0565b60405190815260200160405180910390f35b341561040457600080fd5b61024e610cc6565b60405190815260200160405180910390f35b341561042957600080fd5b6101e9600160a060020a03600435166024351515610ccc565b005b341561044f57600080fd5b6101e9610db2565b005b341561046457600080fd5b61024e610ebe565b60405190815260200160405180910390f35b341561048957600080fd5b6101e9610ec4565b005b341561049e57600080fd5b610300610f1d565b604051600160a060020a03909116815260200160405180910390f35b34156104cd57600080fd5b61024e610f2c565b60405190815260200160405180910390f35b34156104f257600080fd5b610227610f32565b604051901515815260200160405180910390f35b341561051957600080fd5b6101e96004351515610f3e565b005b6101e9610fca565b005b341561053d57600080fd5b61030061108c565b604051600160a060020a03909116815260200160405180910390f35b341561056c57600080fd5b61030061109b565b604051600160a060020a03909116815260200160405180910390f35b341561059b57600080fd5b61024e600160a060020a03600435166110aa565b60405190815260200160405180910390f35b6101e96001608060020a03600435166110bc565b005b6101e96110df565b005b34156105ec57600080fd5b610227611102565b604051901515815260200160405180910390f35b341561061357600080fd5b61024e611184565b60405190815260200160405180910390f35b341561063857600080fd5b61022761118a565b604051901515815260200160405180910390f35b341561065f57600080fd5b610227611193565b604051901515815260200160405180910390f35b341561068657600080fd5b6101e960ff600435166111a3565b005b34156106a157600080fd5b610227600160a060020a03600435166111ea565b604051901515815260200160405180910390f35b34156106d457600080fd5b6101e96111ff565b005b34156106e957600080fd5b61024e61126a565b60405190815260200160405180910390f35b341561070e57600080fd5b6101e9600435611270565b005b341561072657600080fd5b6103006112d3565b604051600160a060020a03909116815260200160405180910390f35b341561075557600080fd5b6101e9600160a060020a03600435166112e2565b005b341561077657600080fd5b610300611332565b604051600160a060020a03909116815260200160405180910390f35b60135460ff1681565b600f54610100900460ff1681565b60095481565b60065481565b600f5460009060ff16156107d3575060056108c9565b6008544310156107e5575060016108c9565b600954431115801561086f5750600354600b54600754600160a060020a039092169163d0bc97d0919060006040516020015260405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b151561085257600080fd5b6102c65a03f1151561086357600080fd5b50505060405180519050155b1561087c575060026108c9565b610884610f32565b15610891575060036108c9565b610899610f32565b1580156108a857506000600b54115b80156108b85750600b54600d5410155b156108c5575060066108c9565b5060045b5b5b5b5b5b90565b60106020526000908152604090205481565b600454600160a060020a031681565b60005433600160a060020a0390811691161461090d57600080fd5b60006109176107bd565b905060015b81600681111561092857fe5b1480610940575060025b81600681111561093e57fe5b145b151561094b57600080fd5b600354600b54600160a060020a039091169063b12dff6590849060006040516020015260405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b15156109a957600080fd5b6102c65a03f115156109ba57600080fd5b5050506040518051600781905560065490101590506109d857600080fd5b7f90a72a3ffe1b2fb74f2660b6f57990bc203fa5c7b4a6eed6a7f7a3b48abc1a4060075460405190815260200160405180910390a15b5b505b50565b60008054819033600160a060020a03908116911614610a3257600080fd5b6000610a3c6107bd565b905060015b816006811115610a4d57fe5b1480610a65575060025b816006811115610a6357fe5b145b1515610a7057600080fd5b600160a060020a0386161515610a8557600080fd5b600154610afe90600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610ad157600080fd5b6102c65a03f11515610ae257600080fd5b505050604051805187915060ff16600a0a63ffffffff61134116565b9250821515610b0c57600080fd5b610b1c848463ffffffff61134116565b9150610b2b8383886000611370565b5b5b505b5050505050565b600b5481565b60015b90565b60005433600160a060020a03908116911614610b5d57600080fd5b6000610b676107bd565b905060015b816006811115610b7857fe5b1480610b90575060025b816006811115610b8e57fe5b145b1515610b9b57600080fd5b4382118015610bab575060085482115b1515610bb657600080fd5b60098290555b5b505b50565b6003805b610bce6107bd565b6006811115610bd957fe5b14610be357600080fd5b60005433600160a060020a03908116911614610bfe57600080fd5b60005460a060020a900460ff1615610c1557600080fd5b600454600154600160a060020a0391821691634cb6d6af911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c6c57600080fd5b6102c65a03f11515610c7d57600080fd5b5050600f805460ff19166001179055507f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a15b5b5b5b50565b60075481565b600a5481565b60005433600160a060020a03908116911614610ce757600080fd5b6000610cf16107bd565b905060015b816006811115610d0257fe5b1480610d1a575060025b816006811115610d1857fe5b145b1515610d2557600080fd5b60005460a060020a900460ff1615610d3c57600080fd5b600160a060020a03831660009081526012602052604090819020805460ff19168415151790557fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440908490849051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b505b5050565b60006006805b610dc06107bd565b6006811115610dcb57fe5b14610dd557600080fd5b60005460a060020a900460ff1615610dec57600080fd5b600160a060020a0333166000908152601060205260409020549150811515610e1357600080fd5b600160a060020a033316600090815260106020526040812055600e54610e3f908363ffffffff61148616565b600e557fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d3383604051600160a060020a03909216825260208201526040908101905180910390a1600160a060020a03331682156108fc0283604051600060405180830381858888f193505050501515610a0e57600080fd5b5b5b5b5050565b600e5481565b60005433600160a060020a03908116911614610edf57600080fd5b6000805460a060020a60ff02191660a060020a179055600080516020611a168339815191526001604051901515815260200160405180910390a15b5b565b600254600160a060020a031681565b600d5481565b600654600b5410155b90565b60005433600160a060020a03908116911614610f5957600080fd5b60005460a060020a900460ff1615610f7057600080fd5b600f805461ff001916610100831515810291909117918290557f18e146f9f57083907720563bd8f8ca0ae35b6ade53ed888590d597ec7f576ad99160ff91900416604051901515815260200160405180910390a15b5b5b50565b60006004805b610fd86107bd565b6006811115610fe357fe5b14610fed57600080fd5b60005460a060020a900460ff161561100457600080fd5b600b5434101561101357600080fd5b600e541561102057600080fd5b600b5461103490349063ffffffff6114a016565b9150611058611049348463ffffffff6114a016565b600d549063ffffffff61148616565b600d55600160a060020a033316600090815260106020526040902054610daa908363ffffffff61148616565b505b5b5b5050565b600054600160a060020a031681565b600554600160a060020a031681565b60116020526000908152604090205481565b6001608060020a03811615156110d157600080fd5b610a1133826114b7565b5b50565b600f54610100900460ff16156110f457600080fd5b6101e63360006114b7565b5b565b600454600154600091600160a060020a0390811691638e7682889116836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561116457600080fd5b6102c65a03f1151561117557600080fd5b50505060405180519150505b90565b60085481565b600f5460ff1681565b60005460a060020a900460ff1681565b60005433600160a060020a039081169116146111be57600080fd5b60005460a060020a900460ff16156111d557600080fd5b6013805460ff191660ff83161790555b5b5b50565b60126020526000908152604090205460ff1681565b60005433600160a060020a0390811691161461121a57600080fd5b60005460a060020a900460ff16151561123257600080fd5b6000805460a060020a60ff0219168155600080516020611a1683398151915290604051901515815260200160405180910390a15b5b5b565b600c5481565b60005433600160a060020a0390811691161461128b57600080fd5b6001805b6112976107bd565b60068111156112a257fe5b146112ac57600080fd5b43821180156112bc575060095482105b15156112c757600080fd5b60088290555b5b505b50565b600354600160a060020a031681565b60005433600160a060020a039081169116146112fd57600080fd5b600160a060020a038116151561131257600080fd5b60008054600160a060020a031916600160a060020a0383161790555b5b50565b600154600160a060020a031681565b600082820283158061135d575082848281151561135a57fe5b04145b151561136557fe5b8091505b5092915050565b600160a060020a038216600090815260106020526040902054611399908463ffffffff61148616565b600160a060020a0383166000908152601060209081526040808320939093556011905220546113ce908563ffffffff61148616565b600160a060020a038316600090815260116020526040902055600b546113fa908463ffffffff61148616565b600b55600a54611410908563ffffffff61148616565b600a5561141d82856117be565b7f0396f60aaad038749091d273dc13aaabc63db6e2271c7bad442d5cf25cc4335082848684604051600160a060020a03909416845260208401929092526040808401919091526001608060020a0390911660608301526080909101905180910390a15b50505050565b60008282018381101561136557fe5b8091505b5092915050565b6000828211156114ac57fe5b508082035b92915050565b600080548190819060a060020a900460ff16156114d357600080fd5b60006114dd6107bd565b905060015b8160068111156114ee57fe5b1480611506575060025b81600681111561150457fe5b145b151561151157600080fd5b60015b61151c6107bd565b600681111561152757fe5b141561155457600160a060020a03861660009081526012602052604090205460ff16151561155457600080fd5b5b600354600b54600160a060020a0388811660009081526010602052604080822054600754939095169463a04e34bc94349490939192909190516020015260405160e060020a63ffffffff87160281526004810194909452602484019290925260448301526064820152608401602060405180830381600087803b15156115da57600080fd5b6102c65a03f115156115eb57600080fd5b5050506040518051600254600b54600a54600154939850600160a060020a0392831694506318a4155e93899333911663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561165657600080fd5b6102c65a03f1151561166757600080fd5b5050506040518051905060006040516020015260405160e060020a63ffffffff8816028152600481019590955260248501939093526044840191909152600160a060020a0316606483015260ff16608482015260a401602060405180830381600087803b15156116d657600080fd5b6102c65a03f115156116e757600080fd5b50505060405180519350508215156116fe57600080fd5b600160a060020a038616600090815260106020526040902054151561172757600c805460010190555b61173383858888611370565b600554600160a060020a031684156108fc0285604051600060405180830381858888f19350505050151561176657600080fd5b611776348563ffffffff6114a016565b91506000821115610b2b57600160a060020a03331682156108fc0283604051600060405180830381858888f193505050501515610b2b57600080fd5b5b5b5b505b5050505050565b600154600160a060020a03166340c10f19838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561181457600080fd5b6102c65a03f11515610b2f57600080fd5b5050505b5050565b600160a060020a038116151561184257600080fd5b60058054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a03166304bbc2556000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b5050506040518051905015156118cd57600080fd5b60028054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a0316638dbe3be56000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561193257600080fd5b6102c65a03f1151561194357600080fd5b50505060405180519050151561195857600080fd5b60038054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a031663614cb9046000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156119bd57600080fd5b6102c65a03f115156119ce57600080fd5b5050506040518051905015156119e357600080fd5b60048054600160a060020a031916600160a060020a038316179055611a06611102565b1515610a1157600080fd5b5b50560092333b0b676476985757350034668cb9ee247674ac7a7479de10cd761381f733a165627a7a723058202fb751fcca7b341ef504eed002ca773b243d14d42b03312ecee53d8751b9d6b50029

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

000000000000000000000000800E1Dcc20D95e60fF8B3106e6EaA1cB73D5D16f0000000000000000000000000000000000000000000000000000000000400F9C000000000000000000000000000000000000000000000000000000000040E9A7

-----Decoded View---------------
Arg [0] : _teamMultisig (address): 0x800E1Dcc20D95e60fF8B3106e6EaA1cB73D5D16f
Arg [1] : _start (uint256): 4198300
Arg [2] : _end (uint256): 4254119

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000800E1Dcc20D95e60fF8B3106e6EaA1cB73D5D16f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000400F9C
Arg [2] : 000000000000000000000000000000000000000000000000000000000040E9A7


Swarm Source

bzzr://81828f9ae489ed77919587782a892cfe871396b934c3819f5804c4d9732b6c1e

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.