ETH Price: $3,149.06 (+3.07%)
Gas: 5 Gwei

Contract

0x8D4B2cfFE2dcbBF06EaA5920401dB86cA5Fb8177
 
Transaction Hash
Method
Block
From
To
Value
Release Lock190142982024-01-15 19:13:4796 days ago1705346027IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0012678133.02731967
Release Lock Fou...110925782020-10-20 10:56:591278 days ago1603191419IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.00076522.11
Release Lock73139652019-03-06 5:50:251872 days ago1551851425IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0004858420
Release Lock Fou...59565992018-07-13 11:58:072108 days ago1531483087IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0005658220
Release Lock59565332018-07-13 11:39:422108 days ago1531481982IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.000590720
Release Lock59565072018-07-13 11:34:092108 days ago1531481649IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0009239220
Release Lock59564932018-07-13 11:31:112108 days ago1531481471IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.000590720
Release Lock59564802018-07-13 11:28:222108 days ago1531481302IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0006239220
Release Lock59564682018-07-13 11:26:172108 days ago1531481177IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0009239220
Release Lock59564642018-07-13 11:25:302108 days ago1531481130IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0006239220
Release Lock59564452018-07-13 11:21:352108 days ago1531480895IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0009226420
Release Lock59564262018-07-13 11:18:322108 days ago1531480712IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0006239220
Release Lock59564122018-07-13 11:15:302108 days ago1531480530IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0009239220
Release Lock59564052018-07-13 11:14:172108 days ago1531480457IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0006239220
Release Lock59564012018-07-13 11:12:432108 days ago1531480363IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0006239220
Release Lock59563632018-07-13 11:04:212108 days ago1531479861IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0009226420
Release Lock59563472018-07-13 11:00:092108 days ago1531479609IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0006239220
Release Lock59555142018-07-13 7:41:312108 days ago1531467691IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0006239220
Release Lock59555062018-07-13 7:39:272108 days ago1531467567IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.0009239220
Verify KYC49911442018-01-29 1:32:132274 days ago1517189533IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.000045091
Verify KYC49911022018-01-29 1:23:192274 days ago1517188999IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.000045021
Verify KYC49910892018-01-29 1:20:432274 days ago1517188843IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.000045021
Verify KYC49910712018-01-29 1:17:492274 days ago1517188669IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.000045091
Verify KYC49877702018-01-28 12:10:022274 days ago1517141402IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.000120364
Verify KYC49877702018-01-28 12:10:022274 days ago1517141402IN
0x8D4B2cfF...cA5Fb8177
0 ETH0.000180364
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
49056522018-01-14 6:42:202288 days ago1515912140
0x8D4B2cfF...cA5Fb8177
0.075 ETH
49042372018-01-14 0:37:382289 days ago1515890258
0x8D4B2cfF...cA5Fb8177
0.002 ETH
49041492018-01-14 0:15:482289 days ago1515888948
0x8D4B2cfF...cA5Fb8177
0.03402306 ETH
49041422018-01-14 0:13:472289 days ago1515888827
0x8D4B2cfF...cA5Fb8177
0.03564444 ETH
49041302018-01-14 0:11:132289 days ago1515888673
0x8D4B2cfF...cA5Fb8177
0.2 ETH
49041302018-01-14 0:11:132289 days ago1515888673
0x8D4B2cfF...cA5Fb8177
0.25 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
0.2 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
1 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
0.67 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
0.5 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
0.1 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
2.329 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
2.195985 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
0.98 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
0.45 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
2.32919254 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
1.4 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
2.329 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
0.65 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
0.5 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
2.05 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
2.329 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
2.2802 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
1 ETH
49041292018-01-14 0:11:062289 days ago1515888666
0x8D4B2cfF...cA5Fb8177
1 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SelfKeyCrowdsale

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-02-08
*/

pragma solidity ^0.4.18;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

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

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

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



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









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


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
    assert(token.transfer(to, value));
  }

  function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
    assert(token.transferFrom(from, to, value));
  }

  function safeApprove(ERC20 token, address spender, uint256 value) internal {
    assert(token.approve(spender, value));
  }
}



/**
 * @title CrowdsaleConfig
 * @dev Holds all constants for SelfKeyCrowdsale contract
*/
contract CrowdsaleConfig {
    uint256 public constant TOKEN_DECIMALS = 18;
    uint256 public constant MIN_TOKEN_UNIT = 10 ** uint256(TOKEN_DECIMALS);

    // Initial distribution amounts
    uint256 public constant TOTAL_SUPPLY_CAP = 6000000000 * MIN_TOKEN_UNIT;

    // 33% of the total supply cap
    uint256 public constant SALE_CAP = 1980000000 * MIN_TOKEN_UNIT;

    // Minimum cap per purchaser on public sale = $100 in KEY (at $0.015)
    uint256 public constant PURCHASER_MIN_TOKEN_CAP = 6666 * MIN_TOKEN_UNIT;

    // Maximum cap per purchaser on first day of public sale = $3,000 in KEY (at $0.015)
    uint256 public constant PURCHASER_MAX_TOKEN_CAP_DAY1 = 200000 * MIN_TOKEN_UNIT;

    // Maximum cap per purchaser on public sale = $18,000 in KEY (at $0.015)
    uint256 public constant PURCHASER_MAX_TOKEN_CAP = 1200000 * MIN_TOKEN_UNIT;

    // 16.5%
    uint256 public constant FOUNDATION_POOL_TOKENS = 876666666 * MIN_TOKEN_UNIT;
    uint256 public constant FOUNDATION_POOL_TOKENS_VESTED = 113333334 * MIN_TOKEN_UNIT;

    // Approx 33%
    uint256 public constant COMMUNITY_POOL_TOKENS = 1980000000 * MIN_TOKEN_UNIT;

    // Founders' distribution. Total = 16.5%
    uint256 public constant FOUNDERS_TOKENS = 330000000 * MIN_TOKEN_UNIT;
    uint256 public constant FOUNDERS_TOKENS_VESTED_1 = 330000000 * MIN_TOKEN_UNIT;
    uint256 public constant FOUNDERS_TOKENS_VESTED_2 = 330000000 * MIN_TOKEN_UNIT;

    // 1% for legal advisors
    uint256 public constant LEGAL_EXPENSES_1_TOKENS = 54000000 * MIN_TOKEN_UNIT;
    uint256 public constant LEGAL_EXPENSES_2_TOKENS = 6000000 * MIN_TOKEN_UNIT;

    // KEY price in USD (thousandths)
    uint256 public constant TOKEN_PRICE_THOUSANDTH = 15;  // $0.015 per KEY

    // Contract wallet addresses for initial allocation
    address public constant CROWDSALE_WALLET_ADDR = 0xE0831b1687c9faD3447a517F9371E66672505dB0;
    address public constant FOUNDATION_POOL_ADDR = 0xD68947892Ef4D94Cdef7165b109Cf6Cd3f58A8e8;
    address public constant FOUNDATION_POOL_ADDR_VEST = 0xd0C24Bb82e71A44eA770e84A3c79979F9233308D;
    address public constant COMMUNITY_POOL_ADDR = 0x0506c5485AE54aB14C598Ef16C459409E5d8Fc03;
    address public constant FOUNDERS_POOL_ADDR = 0x4452d6454e777743a5Ee233fbe873055008fF528;
    address public constant LEGAL_EXPENSES_ADDR_1 = 0xb57911380F13A0a9a6Ba6562248674B5f56D7BFE;
    address public constant LEGAL_EXPENSES_ADDR_2 = 0x9be281CdcF34B3A01468Ad1008139410Ba5BB2fB;

    // 6 months period, in seconds, for pre-commitment half-vesting
    uint64 public constant PRECOMMITMENT_VESTING_SECONDS = 15552000;
}



/**
 * @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;


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


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


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


  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}















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

  mapping(address => uint256) balances;

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

    // SafeMath.sub will throw if there is not enough balance.
    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 uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return balances[_owner];
  }

}




/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

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


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

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

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

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

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

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

}





/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * @dev Issue: * https://github.com/OpenZeppelin/zeppelin-solidity/issues/120
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 */

contract MintableToken is StandardToken, Ownable {
  event Mint(address indexed to, uint256 amount);
  event MintFinished();

  bool public mintingFinished = false;


  modifier canMint() {
    require(!mintingFinished);
    _;
  }

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool) {
    totalSupply = totalSupply.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    Mint(_to, _amount);
    Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Function to stop minting new tokens.
   * @return True if the operation was successful.
   */
  function finishMinting() onlyOwner canMint public returns (bool) {
    mintingFinished = true;
    MintFinished();
    return true;
  }
}

/* solhint-disable not-rely-on-time */









/**
 * @title SelfKeyToken
 * @dev SelfKey Token implementation.
 */
contract SelfKeyToken is MintableToken {
    string public constant name = 'SelfKey'; //solhint-disable-line const-name-snakecase
    string public constant symbol = 'KEY'; //solhint-disable-line const-name-snakecase
    uint256 public constant decimals = 18; //solhint-disable-line const-name-snakecase

    uint256 public cap;
    bool private transfersEnabled = false;

    event Burned(address indexed burner, uint256 value);

    /**
     * @dev Only the contract owner can transfer without restrictions.
     *      Regular holders need to wait until sale is finalized.
     * @param _sender — The address sending the tokens
     * @param _value — The number of tokens to send
     */
    modifier canTransfer(address _sender, uint256 _value) {
        require(transfersEnabled || _sender == owner);
        _;
    }

    /**
     * @dev Constructor that sets a maximum supply cap.
     * @param _cap — The maximum supply cap.
     */
    function SelfKeyToken(uint256 _cap) public {
        cap = _cap;
    }

    /**
     * @dev Overrides MintableToken.mint() for restricting supply under cap
     * @param _to — The address to receive minted tokens
     * @param _value — The number of tokens to mint
     */
    function mint(address _to, uint256 _value) public onlyOwner canMint returns (bool) {
        require(totalSupply.add(_value) <= cap);
        return super.mint(_to, _value);
    }

    /**
     * @dev Checks modifier and allows transfer if tokens are not locked.
     * @param _to — The address to receive tokens
     * @param _value — The number of tokens to send
     */
    function transfer(address _to, uint256 _value)
        public canTransfer(msg.sender, _value) returns (bool)
    {
        return super.transfer(_to, _value);
    }

    /**
     * @dev Checks modifier and allows transfer if tokens are not locked.
     * @param _from — The address to send tokens from
     * @param _to — The address to receive tokens
     * @param _value — The number of tokens to send
     */
    function transferFrom(address _from, address _to, uint256 _value)
        public canTransfer(_from, _value) returns (bool)
    {
        return super.transferFrom(_from, _to, _value);
    }

    /**
     * @dev Enables token transfers.
     *      Called when the token sale is successfully finalized
     */
    function enableTransfers() public onlyOwner {
        transfersEnabled = true;
    }

    /**
    * @dev Burns a specific number of tokens.
    * @param _value — The number of tokens to be burned.
    */
    function burn(uint256 _value) public onlyOwner {
        require(_value > 0);

        address burner = msg.sender;
        balances[burner] = balances[burner].sub(_value);
        totalSupply = totalSupply.sub(_value);
        Burned(burner, _value);
    }
}












/**
 * @title TokenTimelock
 * @dev TokenTimelock is a token holder contract that will allow a
 * beneficiary to extract the tokens after a given release time
 */
contract TokenTimelock {
  using SafeERC20 for ERC20Basic;

  // ERC20 basic token contract being held
  ERC20Basic public token;

  // beneficiary of tokens after they are released
  address public beneficiary;

  // timestamp when token release is enabled
  uint256 public releaseTime;

  function TokenTimelock(ERC20Basic _token, address _beneficiary, uint256 _releaseTime) public {
    require(_releaseTime > now);
    token = _token;
    beneficiary = _beneficiary;
    releaseTime = _releaseTime;
  }

  /**
   * @notice Transfers tokens held by timelock to beneficiary.
   */
  function release() public {
    require(now >= releaseTime);

    uint256 amount = token.balanceOf(this);
    require(amount > 0);

    token.safeTransfer(beneficiary, amount);
  }
}






/**
 * @title RefundVault
 * @dev This contract is used for storing funds while a crowdsale
 * is in progress. Supports refunding the money if crowdsale fails,
 * and forwarding it if crowdsale is successful.
 */
contract RefundVault is Ownable {
  using SafeMath for uint256;

  enum State { Active, Refunding, Closed }

  mapping (address => uint256) public deposited;
  address public wallet;
  State public state;

  event Closed();
  event RefundsEnabled();
  event Refunded(address indexed beneficiary, uint256 weiAmount);

  function RefundVault(address _wallet) public {
    require(_wallet != address(0));
    wallet = _wallet;
    state = State.Active;
  }

  function deposit(address investor) onlyOwner public payable {
    require(state == State.Active);
    deposited[investor] = deposited[investor].add(msg.value);
  }

  function close() onlyOwner public {
    require(state == State.Active);
    state = State.Closed;
    Closed();
    wallet.transfer(this.balance);
  }

  function enableRefunds() onlyOwner public {
    require(state == State.Active);
    state = State.Refunding;
    RefundsEnabled();
  }

  function refund(address investor) public {
    require(state == State.Refunding);
    uint256 depositedValue = deposited[investor];
    deposited[investor] = 0;
    investor.transfer(depositedValue);
    Refunded(investor, depositedValue);
  }
}



/**
 * @title SelfKeyCrowdsale
 * @dev SelfKey Token Crowdsale implementation.
 */
// solhint-disable-next-line max-states-count
contract SelfKeyCrowdsale is Ownable, CrowdsaleConfig {
    using SafeMath for uint256;
    using SafeERC20 for SelfKeyToken;

    // whitelist of addresses that can perform precommitments and KYC verifications
    mapping(address => bool) public isVerifier;

    // Token contract
    SelfKeyToken public token;

    uint64 public startTime;
    uint64 public endTime;

    // Minimum tokens expected to sell
    uint256 public goal;

    // How many tokens a buyer gets per ETH
    uint256 public rate = 51800;

    // ETH price in USD, can be later updated until start date
    uint256 public ethPrice = 777;

    // Total amount of tokens purchased, including pre-sale
    uint256 public totalPurchased = 0;

    mapping(address => bool) public kycVerified;
    mapping(address => uint256) public tokensPurchased;

    // a mapping of dynamically instantiated token timelocks for each pre-commitment beneficiary
    mapping(address => address) public vestedTokens;

    bool public isFinalized = false;

    // Token Timelocks
    TokenTimelock public foundersTimelock1;
    TokenTimelock public foundersTimelock2;
    TokenTimelock public foundationTimelock;

    // Vault to hold funds until crowdsale is finalized. Allows refunding if crowdsale is not successful.
    RefundVault public vault;

    // Crowdsale events
    event TokenPurchase(
        address indexed purchaser,
        address indexed beneficiary,
        uint256 value,
        uint256 amount
    );

    event VerifiedKYC(address indexed participant);

    event AddedPrecommitment(
        address indexed participant,
        uint256 tokensAllocated
    );

    event Finalized();

    modifier verifierOnly() {
        require(isVerifier[msg.sender]);
        _;
    }

    /**
     * @dev Crowdsale contract constructor
     * @param _startTime — Unix timestamp representing the crowdsale start time
     * @param _endTime — Unix timestamp representing the crowdsale start time
     * @param _goal — Minimum amount of tokens expected to sell.
     */
    function SelfKeyCrowdsale(
        uint64 _startTime,
        uint64 _endTime,
        uint256 _goal
    ) public
    {
        require(_endTime > _startTime);

        // sets contract owner as a verifier
        isVerifier[msg.sender] = true;

        token = new SelfKeyToken(TOTAL_SUPPLY_CAP);

        // mints all possible tokens to the crowdsale contract
        token.mint(address(this), TOTAL_SUPPLY_CAP);
        token.finishMinting();

        startTime = _startTime;
        endTime = _endTime;
        goal = _goal;

        vault = new RefundVault(CROWDSALE_WALLET_ADDR);

        // Set timelocks to 6 months and a year after startTime, respectively
        uint64 sixMonthLock = uint64(startTime + 15552000);
        uint64 yearLock = uint64(startTime + 31104000);

        // Instantiation of token timelocks
        foundersTimelock1 = new TokenTimelock(token, FOUNDERS_POOL_ADDR, sixMonthLock);
        foundersTimelock2 = new TokenTimelock(token, FOUNDERS_POOL_ADDR, yearLock);
        foundationTimelock = new TokenTimelock(token, FOUNDATION_POOL_ADDR_VEST, yearLock);

        // Genesis allocation of tokens
        token.safeTransfer(FOUNDATION_POOL_ADDR, FOUNDATION_POOL_TOKENS);
        token.safeTransfer(COMMUNITY_POOL_ADDR, COMMUNITY_POOL_TOKENS);
        token.safeTransfer(FOUNDERS_POOL_ADDR, FOUNDERS_TOKENS);
        token.safeTransfer(LEGAL_EXPENSES_ADDR_1, LEGAL_EXPENSES_1_TOKENS);
        token.safeTransfer(LEGAL_EXPENSES_ADDR_2, LEGAL_EXPENSES_2_TOKENS);

        // Allocation of vested tokens
        token.safeTransfer(foundersTimelock1, FOUNDERS_TOKENS_VESTED_1);
        token.safeTransfer(foundersTimelock2, FOUNDERS_TOKENS_VESTED_2);
        token.safeTransfer(foundationTimelock, FOUNDATION_POOL_TOKENS_VESTED);
    }

    /**
     * @dev Fallback function is used to buy tokens.
     *      It's the only entry point since `buyTokens` is internal
     */
    function () public payable {
        buyTokens(msg.sender);
    }

    /**
     * @dev Adds an address to the whitelist of Verifiers
     * @param _address - address of the verifier
     */
    function addVerifier (address _address) public onlyOwner {
        isVerifier[_address] = true;
    }

    /**
     * @dev Removes an address from the whitelist of Verifiers
     * @param _address - address of the verifier to be removed
     */
    function removeVerifier (address _address) public onlyOwner {
        isVerifier[_address] = false;
    }

    /**
     * @dev Sets a new start date as long as token hasn't started yet
     * @param _startTime - unix timestamp of the new start time
     */
    function setStartTime (uint64 _startTime) public onlyOwner {
        require(now < startTime);
        require(_startTime > now);
        require(_startTime < endTime);

        startTime = _startTime;
    }

    /**
     * @dev Sets a new end date as long as end date hasn't been reached
     * @param _endTime - unix timestamp of the new end time
     */
    function setEndTime (uint64 _endTime) public onlyOwner {
        require(now < endTime);
        require(_endTime > now);
        require(_endTime > startTime);

        endTime = _endTime;
    }

    /**
     * @dev Updates the ETH/USD conversion rate as long as the public sale hasn't started
     * @param _ethPrice - Updated conversion rate
     */
    function setEthPrice(uint256 _ethPrice) public onlyOwner {
        require(now < startTime);
        require(_ethPrice > 0);

        ethPrice = _ethPrice;
        rate = ethPrice.mul(1000).div(TOKEN_PRICE_THOUSANDTH);
    }

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

        finalization();
        Finalized();

        isFinalized = true;
    }

    /**
     * @dev If crowdsale is unsuccessful, a refund can be claimed back
     */
    function claimRefund(address participant) public {
        // requires sale to be finalized and goal not reached,
        require(isFinalized);
        require(!goalReached());

        vault.refund(participant);
    }

    /**
     * @dev If crowdsale is unsuccessful, participants can claim refunds
     */
    function goalReached() public constant returns (bool) {
        return totalPurchased >= goal;
    }

    /**
     * @dev Release time-locked tokens
     */
    function releaseLockFounders1() public {
        foundersTimelock1.release();
    }

    function releaseLockFounders2() public {
        foundersTimelock2.release();
    }

    function releaseLockFoundation() public {
        foundationTimelock.release();
    }

    /**
     * @dev Release time-locked tokens for any vested address
     */
    function releaseLock(address participant) public {
        require(vestedTokens[participant] != 0x0);

        TokenTimelock timelock = TokenTimelock(vestedTokens[participant]);
        timelock.release();
    }

    /**
     * @dev Verifies KYC for given participant.
     *      This enables token purchases by the participant addres
     */
    function verifyKYC(address participant) public verifierOnly {
        kycVerified[participant] = true;

        VerifiedKYC(participant);
    }

    /**
     * @dev Adds an address for pre-sale commitments made off-chain.
     * @param beneficiary — Address of the already verified participant
     * @param tokensAllocated — Exact amount of KEY tokens (including decimal places) to allocate
     * @param halfVesting — determines whether the half the tokens will be time-locked or not
     */
    function addPrecommitment(
        address beneficiary,
        uint256 tokensAllocated,
        bool halfVesting
    ) public verifierOnly
    {
        // requires to be on pre-sale
        require(now < startTime); // solhint-disable-line not-rely-on-time

        kycVerified[beneficiary] = true;

        uint256 tokens = tokensAllocated;
        totalPurchased = totalPurchased.add(tokens);
        tokensPurchased[beneficiary] = tokensPurchased[beneficiary].add(tokens);

        if (halfVesting) {
            // half the tokens are put into a time-lock for a pre-defined period
            uint64 endTimeLock = uint64(startTime + PRECOMMITMENT_VESTING_SECONDS);

            // Sets a timelock for half the tokens allocated
            uint256 half = tokens.div(2);
            TokenTimelock timelock;

            if (vestedTokens[beneficiary] == 0x0) {
                timelock = new TokenTimelock(token, beneficiary, endTimeLock);
                vestedTokens[beneficiary] = address(timelock);
            } else {
                timelock = TokenTimelock(vestedTokens[beneficiary]);
            }

            token.safeTransfer(beneficiary, half);
            token.safeTransfer(timelock, tokens.sub(half));
        } else {
            // all tokens are sent to the participant's address
            token.safeTransfer(beneficiary, tokens);
        }

        AddedPrecommitment(
            beneficiary,
            tokens
        );
    }

    /**
     * @dev Additional finalization logic. Enables token transfers.
     */
    function finalization() internal {
        if (goalReached()) {
            burnUnsold();
            vault.close();
            token.enableTransfers();
        } else {
            vault.enableRefunds();
        }
    }

    /**
     *  @dev Low level token purchase. Only callable internally. Participants MUST be KYC-verified before purchase
     *  @param participant — The address of the token purchaser
     */
    function buyTokens(address participant) internal {
        require(kycVerified[participant]);
        require(now >= startTime);
        require(now < endTime);
        require(!isFinalized);
        require(msg.value != 0);

        // Calculate the token amount to be allocated
        uint256 weiAmount = msg.value;
        uint256 tokens = weiAmount.mul(rate);

        // Update state
        tokensPurchased[participant] = tokensPurchased[participant].add(tokens);
        totalPurchased = totalPurchased.add(tokens);

        require(totalPurchased <= SALE_CAP);
        require(tokensPurchased[participant] >= PURCHASER_MIN_TOKEN_CAP);

        if (now < startTime + 86400) {
            // if still during the first day of token sale, apply different max cap
            require(tokensPurchased[participant] <= PURCHASER_MAX_TOKEN_CAP_DAY1);
        } else {
            require(tokensPurchased[participant] <= PURCHASER_MAX_TOKEN_CAP);
        }

        // Sends ETH contribution to the RefundVault and tokens to participant
        vault.deposit.value(msg.value)(participant);
        token.safeTransfer(participant, tokens);

        TokenPurchase(
            msg.sender,
            participant,
            weiAmount,
            tokens
        );
    }

    /**
     * @dev Burn all remaining (unsold) tokens.
     *      This should be called after sale finalization
     */
    function burnUnsold() internal {
        // All tokens held by this contract get burned
        token.burn(token.balanceOf(this));
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_ethPrice","type":"uint256"}],"name":"setEthPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"releaseLockFounders1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SALE_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_TOKEN_UNIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PURCHASER_MIN_TOKEN_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokensPurchased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isVerifier","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint64"}],"name":"setStartTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"releaseLockFoundation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"participant","type":"address"}],"name":"verifyKYC","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"vestedTokens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"tokensAllocated","type":"uint256"},{"name":"halfVesting","type":"bool"}],"name":"addPrecommitment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"goal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FOUNDATION_POOL_ADDR","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FOUNDERS_POOL_ADDR","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOTAL_SUPPLY_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"COMMUNITY_POOL_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PURCHASER_MAX_TOKEN_CAP_DAY1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FOUNDATION_POOL_TOKENS_VESTED","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_DECIMALS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRECOMMITMENT_VESTING_SECONDS","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FOUNDERS_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"releaseLockFounders2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"LEGAL_EXPENSES_2_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FOUNDERS_TOKENS_VESTED_2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"goalReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CROWDSALE_WALLET_ADDR","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addVerifier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"FOUNDERS_TOKENS_VESTED_1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FOUNDATION_POOL_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"kycVerified","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LEGAL_EXPENSES_ADDR_2","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LEGAL_EXPENSES_1_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMMUNITY_POOL_ADDR","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"participant","type":"address"}],"name":"claimRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"foundersTimelock1","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"foundersTimelock2","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removeVerifier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"participant","type":"address"}],"name":"releaseLock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PURCHASER_MAX_TOKEN_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LEGAL_EXPENSES_ADDR_1","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FOUNDATION_POOL_ADDR_VEST","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPurchased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_endTime","type":"uint64"}],"name":"setEndTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"foundationTimelock","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_PRICE_THOUSANDTH","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"vault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_startTime","type":"uint64"},{"name":"_endTime","type":"uint64"},{"name":"_goal","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"participant","type":"address"}],"name":"VerifiedKYC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"participant","type":"address"},{"indexed":false,"name":"tokensAllocated","type":"uint256"}],"name":"AddedPrecommitment","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

606060405261ca586005556103096006556000600755600b805460ff1916905534156200002b57600080fd5b604051606080620038f183398101604052808051919060200180519190602001805160008054600160a060020a03191633600160a060020a03161781559092509050806001604060020a03858116908516116200008757600080fd5b600160a060020a0333166000908152600160208190526040909120805460ff191690911790556b1363156bbee3016d70000000620000c462000749565b908152602001604051809103906000f0801515620000e157600080fd5b60028054600160a060020a031916600160a060020a039283161790819055166340c10f19306b1363156bbee3016d700000006000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200017957600080fd5b6102c65a03f115156200018b57600080fd5b50505060405180515050600254600160a060020a0316637d64bcb46000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620001f757600080fd5b6102c65a03f115156200020957600080fd5b505050604051805150506002805460a060020a60e060020a031916740100000000000000000000000000000000000000006001604060020a0388811691909102919091179091556003805467ffffffffffffffff1916918616919091179055600483905573e0831b1687c9fad3447a517f9371e66672505db06200028c6200075a565b600160a060020a039091168152602001604051809103906000f0801515620002b357600080fd5b600e8054600160a060020a031916600160a060020a039283161790556002547401000000000000000000000000000000000000000081046001604060020a031662ed4e00810194506301da9c0001925016734452d6454e777743a5ee233fbe873055008ff52883620003246200076b565b600160a060020a0393841681529190921660208201526001604060020a0390911660408083019190915260609091019051809103906000f08015156200036957600080fd5b600b805461010060a860020a031916610100600160a060020a039384160217905560025416734452d6454e777743a5ee233fbe873055008ff52882620003ae6200076b565b600160a060020a0393841681529190921660208201526001604060020a0390911660408083019190915260609091019051809103906000f0801515620003f357600080fd5b600c8054600160a060020a031916600160a060020a039283161790556002541673d0c24bb82e71a44ea770e84a3c79979f9233308d82620004336200076b565b600160a060020a0393841681529190921660208201526001604060020a0390911660408083019190915260609091019051809103906000f08015156200047857600080fd5b600d8054600160a060020a031916600160a060020a03928316179055600254620004d3911673d68947892ef4d94cdef7165b109cf6cd3f58a8e86b02d5296330eea14992680000640100000000620006a881026200151f1704565b6002546200051a90600160a060020a0316730506c5485ae54ab14c598ef16c459409e5d8fc036b0665d14f1378fde93c0000006401000000006200151f620006a882021704565b6002546200056190600160a060020a0316734452d6454e777743a5ee233fbe873055008ff5286b0110f837d8942a518a0000006401000000006200151f620006a882021704565b600254620005a790600160a060020a031673b57911380f13a0a9a6ba6562248674b5f56d7bfe6a2caaf1dd9f3a1ff60000006401000000006200151f620006a882021704565b600254620005ed90600160a060020a0316739be281cdcf34b3a01468ad1008139410ba5bb2fb6a04f68ca6d8cd91c60000006401000000006200151f620006a882021704565b600b546002546200062c91600160a060020a0391821691610100909104166b0110f837d8942a518a0000006401000000006200151f620006a882021704565b600c546002546200066591600160a060020a0391821691166b0110f837d8942a518a0000006401000000006200151f620006a882021704565b600d546002546200069d91600160a060020a0391821691166a5dbf4458cdddab0b9800006401000000006200151f620006a882021704565b50505050506200077c565b82600160a060020a031663a9059cbb83836000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200071f57600080fd5b6102c65a03f115156200073157600080fd5b5050506040518051905015156200074457fe5b505050565b604051610ded806200221d83390190565b60405161060c806200300a83390190565b6040516102db806200361683390190565b611a91806200078c6000396000f3006060604052600436106102835763ffffffff60e060020a6000350416629f9262811461028e57806309d929d6146102a45780630b45e8db146102b75780632803d8e5146102dc57806328675325146102ef5780632ad92740146103025780632c4e722e146103215780633197cbb614610334578063331052181461036457806338812e58146103975780633888188d146103b757806338d16011146103ca5780633dee0397146103e95780633e5b5e3914610424578063401938831461044b5780634451967c1461045e57806346602ce71461047157806348931352146104845780634bb278f314610497578063515f128b146102b757806353fe7a59146104aa57806355176f51146104bd5780635b7f415c146104d057806365d5b48d146104e357806365f6d6a2146104f65780636a4113c7146105095780637619d22e1461051c578063769f194f146104f657806378e979251461052f5780637d3d6522146105425780638d4e4083146105555780638da5cb5b146105685780638e1b9f421461057b5780639000b3d61461058e57806397fdf5f2146104f65780639e43692c146105ad578063a5410a66146105c0578063abbcb24b146105df578063accfaeba146105f2578063bdf5fba114610605578063bffa55d514610618578063c0489af514610637578063c61f11031461064a578063ca2dfd0a1461065d578063d1c469161461067c578063d1ff535e1461069b578063daa0f79f146106ae578063e565b387146106c1578063e632c2f3146106d4578063e945c391146106e7578063ec0de26e14610707578063f0757a911461071a578063f2fde38b1461072d578063fbfa77cf1461074c578063fc0c546a1461075f578063ff186b2e14610772575b61028c33610785565b005b341561029957600080fd5b61028c600435610a1d565b34156102af57600080fd5b61028c610a92565b34156102c257600080fd5b6102ca610aec565b60405190815260200160405180910390f35b34156102e757600080fd5b6102ca610afc565b34156102fa57600080fd5b6102ca610b08565b341561030d57600080fd5b6102ca600160a060020a0360043516610b16565b341561032c57600080fd5b6102ca610b28565b341561033f57600080fd5b610347610b2e565b60405167ffffffffffffffff909116815260200160405180910390f35b341561036f57600080fd5b610383600160a060020a0360043516610b3e565b604051901515815260200160405180910390f35b34156103a257600080fd5b61028c67ffffffffffffffff60043516610b53565b34156103c257600080fd5b61028c610c01565b34156103d557600080fd5b61028c600160a060020a0360043516610c40565b34156103f457600080fd5b610408600160a060020a0360043516610cba565b604051600160a060020a03909116815260200160405180910390f35b341561042f57600080fd5b61028c600160a060020a03600435166024356044351515610cd5565b341561045657600080fd5b6102ca610f63565b341561046957600080fd5b610408610f69565b341561047c57600080fd5b610408610f81565b341561048f57600080fd5b6102ca610f99565b34156104a257600080fd5b61028c610fa9565b34156104b557600080fd5b6102ca611036565b34156104c857600080fd5b6102ca611044565b34156104db57600080fd5b6102ca611053565b34156104ee57600080fd5b610347611058565b341561050157600080fd5b6102ca61105f565b341561051457600080fd5b61028c61106f565b341561052757600080fd5b6102ca6110ae565b341561053a57600080fd5b6103476110bd565b341561054d57600080fd5b6103836110d4565b341561056057600080fd5b6103836110df565b341561057357600080fd5b6104086110e8565b341561058657600080fd5b6104086110f7565b341561059957600080fd5b61028c600160a060020a036004351661110f565b34156105b857600080fd5b6102ca611151565b34156105cb57600080fd5b610383600160a060020a0360043516611161565b34156105ea57600080fd5b610408611176565b34156105fd57600080fd5b6102ca61118e565b341561061057600080fd5b61040861119d565b341561062357600080fd5b61028c600160a060020a03600435166111b5565b341561064257600080fd5b61040861123f565b341561065557600080fd5b610408611253565b341561066857600080fd5b61028c600160a060020a0360043516611262565b341561068757600080fd5b61028c600160a060020a036004351661129e565b34156106a657600080fd5b6102ca611333565b34156106b957600080fd5b610408611341565b34156106cc57600080fd5b610408611359565b34156106df57600080fd5b6102ca611371565b34156106f257600080fd5b61028c67ffffffffffffffff60043516611377565b341561071257600080fd5b610408611407565b341561072557600080fd5b6102ca611416565b341561073857600080fd5b61028c600160a060020a036004351661141b565b341561075757600080fd5b6104086114b6565b341561076a57600080fd5b6104086114c5565b341561077d57600080fd5b6102ca6114d4565b600160a060020a038116600090815260086020526040812054819060ff1615156107ae57600080fd5b60025460a060020a900467ffffffffffffffff164210156107ce57600080fd5b60035467ffffffffffffffff1642106107e657600080fd5b600b5460ff16156107f657600080fd5b34151561080257600080fd5b60055434925061081990839063ffffffff6114da16565b600160a060020a038416600090815260096020526040902054909150610845908263ffffffff61151016565b600160a060020a038416600090815260096020526040902055600754610871908263ffffffff61151016565b60078190556b0665d14f1378fde93c00000090111561088f57600080fd5b600160a060020a0383166000908152600960205260409020546901695d556204b1e800009010156108bf57600080fd5b6002546201518067ffffffffffffffff60a060020a9092048216011642101561091757600160a060020a038316600090815260096020526040902054692a5a058fc295ed00000090111561091257600080fd5b610947565b600160a060020a03831660009081526009602052604090205469fe1c215e8f838e00000090111561094757600080fd5b600e54600160a060020a031663f340fa01348560405160e060020a63ffffffff8516028152600160a060020a0390911660048201526024016000604051808303818588803b151561099757600080fd5b6125ee5a03f115156109a857600080fd5b50506002546109ca9250600160a060020a03169050848363ffffffff61151f16565b82600160a060020a031633600160a060020a03167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad18848460405191825260208201526040908101905180910390a3505050565b60005433600160a060020a03908116911614610a3857600080fd5b60025460a060020a900467ffffffffffffffff164210610a5757600080fd5b60008111610a6457600080fd5b6006819055610a8c600f610a80836103e863ffffffff6114da16565b9063ffffffff61159f16565b60055550565b600b546101009004600160a060020a03166386d1a69f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610ad657600080fd5b6102c65a03f11515610ae757600080fd5b505050565b6b0665d14f1378fde93c00000081565b670de0b6b3a764000081565b6901695d556204b1e8000081565b60096020526000908152604090205481565b60055481565b60035467ffffffffffffffff1681565b60016020526000908152604090205460ff1681565b60005433600160a060020a03908116911614610b6e57600080fd5b60025460a060020a900467ffffffffffffffff164210610b8d57600080fd5b4267ffffffffffffffff821611610ba357600080fd5b60035467ffffffffffffffff90811690821610610bbf57600080fd5b6002805467ffffffffffffffff90921660a060020a027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600d54600160a060020a03166386d1a69f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610ad657600080fd5b600160a060020a03331660009081526001602052604090205460ff161515610c6757600080fd5b600160a060020a03811660008181526008602052604090819020805460ff191660011790557f98cc2c535b6060b431d35630893358290dcd38687f6487e2882d331955020805905160405180910390a250565b600a60205260009081526040902054600160a060020a031681565b600160a060020a03331660009081526001602052604081205481908190819060ff161515610d0257600080fd5b60025460a060020a900467ffffffffffffffff164210610d2157600080fd5b600160a060020a0387166000908152600860205260409020805460ff19166001179055600754869450610d5a908563ffffffff61151016565b600755600160a060020a038716600090815260096020526040902054610d86908563ffffffff61151016565b600160a060020a0388166000908152600960205260409020558415610f00576002805467ffffffffffffffff60a060020a9091041662ed4e00019350610dd390859063ffffffff61159f16565b600160a060020a038089166000908152600a6020526040902054919350161515610e9457600254600160a060020a03168784610e0d61177a565b600160a060020a03938416815291909216602082015267ffffffffffffffff90911660408083019190915260609091019051809103906000f0801515610e5257600080fd5b600160a060020a038881166000908152600a60205260409020805473ffffffffffffffffffffffffffffffffffffffff19169183169190911790559050610eb1565b50600160a060020a038087166000908152600a6020526040902054165b600254610ece90600160a060020a0316888463ffffffff61151f16565b610efb81610ee2868563ffffffff6115b616565b600254600160a060020a0316919063ffffffff61151f16565b610f1d565b600254610f1d90600160a060020a0316888663ffffffff61151f16565b86600160a060020a03167fd4cab39bf07f5b24c1fa485061de865fae1bb7f0bcf434dd70bf1a33689ca4068560405190815260200160405180910390a250505050505050565b60045481565b73d68947892ef4d94cdef7165b109cf6cd3f58a8e881565b734452d6454e777743a5ee233fbe873055008ff52881565b6b1363156bbee3016d7000000081565b60005433600160a060020a03908116911614610fc457600080fd5b60025460a060020a900467ffffffffffffffff164211610fe357600080fd5b600b5460ff1615610ff357600080fd5b610ffb6115c8565b7f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a1600b805460ff19166001179055565b692a5a058fc295ed00000081565b6a5dbf4458cdddab0b98000081565b601281565b62ed4e0081565b6b0110f837d8942a518a00000081565b600c54600160a060020a03166386d1a69f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610ad657600080fd5b6a04f68ca6d8cd91c600000081565b60025460a060020a900467ffffffffffffffff1681565b600454600754101590565b600b5460ff1681565b600054600160a060020a031681565b73e0831b1687c9fad3447a517f9371e66672505db081565b60005433600160a060020a0390811691161461112a57600080fd5b600160a060020a03166000908152600160208190526040909120805460ff19169091179055565b6b02d5296330eea1499268000081565b60086020526000908152604090205460ff1681565b739be281cdcf34b3a01468ad1008139410ba5bb2fb81565b6a2caaf1dd9f3a1ff600000081565b730506c5485ae54ab14c598ef16c459409e5d8fc0381565b600b5460ff1615156111c657600080fd5b6111ce6110d4565b156111d857600080fd5b600e54600160a060020a031663fa89401a8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561122857600080fd5b6102c65a03f1151561123957600080fd5b50505050565b600b546101009004600160a060020a031681565b600c54600160a060020a031681565b60005433600160a060020a0390811691161461127d57600080fd5b600160a060020a03166000908152600160205260409020805460ff19169055565b600160a060020a038082166000908152600a602052604081205490911615156112c657600080fd5b50600160a060020a038082166000908152600a602052604090819020549091169081906386d1a69f90518163ffffffff1660e060020a028152600401600060405180830381600087803b151561131b57600080fd5b6102c65a03f1151561132c57600080fd5b5050505050565b69fe1c215e8f838e00000081565b73b57911380f13a0a9a6ba6562248674b5f56d7bfe81565b73d0c24bb82e71a44ea770e84a3c79979f9233308d81565b60075481565b60005433600160a060020a0390811691161461139257600080fd5b60035467ffffffffffffffff1642106113aa57600080fd5b4267ffffffffffffffff8216116113c057600080fd5b60025467ffffffffffffffff60a060020a9091048116908216116113e357600080fd5b6003805467ffffffffffffffff191667ffffffffffffffff92909216919091179055565b600d54600160a060020a031681565b600f81565b60005433600160a060020a0390811691161461143657600080fd5b600160a060020a038116151561144b57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600e54600160a060020a031681565b600254600160a060020a031681565b60065481565b6000808315156114ed5760009150611509565b508282028284828115156114fd57fe5b041461150557fe5b8091505b5092915050565b60008282018381101561150557fe5b82600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561157c57600080fd5b6102c65a03f1151561158d57600080fd5b505050604051805190501515610ae757fe5b60008082848115156115ad57fe5b04949350505050565b6000828211156115c257fe5b50900390565b6115d06110d4565b15611689576115dd6116ca565b600e54600160a060020a03166343d726d66040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561161c57600080fd5b6102c65a03f1151561162d57600080fd5b5050600254600160a060020a0316905063af35c6c76040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561167057600080fd5b6102c65a03f1151561168157600080fd5b5050506116c8565b600e54600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610ad657600080fd5b565b600254600160a060020a03166342966c68816370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561172957600080fd5b6102c65a03f1151561173a57600080fd5b5050506040518051905060405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610ad657600080fd5b6040516102db8061178b8339019056006060604052341561000f57600080fd5b6040516060806102db83398101604052808051919060200180519190602001805191505042811161003f57600080fd5b60008054600160a060020a03948516600160a060020a031991821617909155600180549390941692169190911790915560025561025a806100816000396000f3006060604052600436106100485763ffffffff60e060020a60003504166338af3eed811461004d57806386d1a69f1461007c578063b91d400114610091578063fc0c546a146100b6575b600080fd5b341561005857600080fd5b6100606100c9565b604051600160a060020a03909116815260200160405180910390f35b341561008757600080fd5b61008f6100d8565b005b341561009c57600080fd5b6100a4610194565b60405190815260200160405180910390f35b34156100c157600080fd5b61006061019a565b600154600160a060020a031681565b6002546000904210156100ea57600080fd5b60008054600160a060020a0316906370a082319030906040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561014557600080fd5b6102c65a03f1151561015657600080fd5b50505060405180519150506000811161016e57600080fd5b60015460005461019191600160a060020a0391821691168363ffffffff6101a916565b50565b60025481565b600054600160a060020a031681565b82600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561020657600080fd5b6102c65a03f1151561021757600080fd5b50505060405180519050151561022957fe5b5050505600a165627a7a72305820eeace2909ad96851c2cbf01b9bbc7140e82c263f6ff3790a8a0e12d0640aff770029a165627a7a72305820c3ad1fcd1df61752f4ec3ce0d3bdcac8b42dc2436f35caf58d05e1ba22122dcb002960606040526003805460a060020a60ff02191690556005805460ff19169055341561002957600080fd5b604051602080610ded8339810160405280805160038054600160a060020a03191633600160a060020a031617905560045550610d8190508061006c6000396000f3006060604052600436106101065763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305d2035b811461010b57806306fdde0314610132578063095ea7b3146101bc57806318160ddd146101de57806323b872dd14610203578063313ce5671461022b578063355274ea1461023e57806340c10f191461025157806342966c6814610273578063661884631461028b57806370a08231146102ad5780637d64bcb4146102cc5780638da5cb5b146102df57806395d89b411461030e578063a9059cbb14610321578063af35c6c714610343578063d73dd62314610356578063dd62ed3e14610378578063f2fde38b1461039d575b600080fd5b341561011657600080fd5b61011e6103bc565b604051901515815260200160405180910390f35b341561013d57600080fd5b6101456103cc565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610181578082015183820152602001610169565b50505050905090810190601f1680156101ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101c757600080fd5b61011e600160a060020a0360043516602435610403565b34156101e957600080fd5b6101f161046f565b60405190815260200160405180910390f35b341561020e57600080fd5b61011e600160a060020a0360043581169060243516604435610475565b341561023657600080fd5b6101f16104ba565b341561024957600080fd5b6101f16104bf565b341561025c57600080fd5b61011e600160a060020a03600435166024356104c5565b341561027e57600080fd5b61028960043561052c565b005b341561029657600080fd5b61011e600160a060020a03600435166024356105ed565b34156102b857600080fd5b6101f1600160a060020a03600435166106e7565b34156102d757600080fd5b61011e610702565b34156102ea57600080fd5b6102f261078d565b604051600160a060020a03909116815260200160405180910390f35b341561031957600080fd5b61014561079c565b341561032c57600080fd5b61011e600160a060020a03600435166024356107d3565b341561034e57600080fd5b610289610816565b341561036157600080fd5b61011e600160a060020a0360043516602435610840565b341561038357600080fd5b6101f1600160a060020a03600435811690602435166108e4565b34156103a857600080fd5b610289600160a060020a036004351661090f565b60035460a060020a900460ff1681565b60408051908101604052600781527f53656c664b657900000000000000000000000000000000000000000000000000602082015281565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b60005481565b6005546000908490839060ff168061049a5750600354600160a060020a038381169116145b15156104a557600080fd5b6104b08686866109aa565b9695505050505050565b601281565b60045481565b60035460009033600160a060020a039081169116146104e357600080fd5b60035460a060020a900460ff16156104fa57600080fd5b600454600054610510908463ffffffff610b2c16565b111561051b57600080fd5b6105258383610b3b565b9392505050565b60035460009033600160a060020a0390811691161461054a57600080fd5b6000821161055757600080fd5b5033600160a060020a03811660009081526001602052604090205461057c9083610c48565b600160a060020a038216600090815260016020526040812091909155546105a9908363ffffffff610c4816565b600055600160a060020a0381167f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df78360405190815260200160405180910390a25050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561064a57600160a060020a033381166000908152600260209081526040808320938816835292905290812055610681565b61065a818463ffffffff610c4816565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b600160a060020a031660009081526001602052604090205490565b60035460009033600160a060020a0390811691161461072057600080fd5b60035460a060020a900460ff161561073757600080fd5b6003805474ff0000000000000000000000000000000000000000191660a060020a1790557fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a150600190565b600354600160a060020a031681565b60408051908101604052600381527f4b45590000000000000000000000000000000000000000000000000000000000602082015281565b6005546000903390839060ff16806107f85750600354600160a060020a038381169116145b151561080357600080fd5b61080d8585610c5a565b95945050505050565b60035433600160a060020a0390811691161461083157600080fd5b6005805460ff19166001179055565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054610878908363ffffffff610b2c16565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60035433600160a060020a0390811691161461092a57600080fd5b600160a060020a038116151561093f57600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000600160a060020a03831615156109c157600080fd5b600160a060020a0384166000908152600160205260409020548211156109e657600080fd5b600160a060020a0380851660009081526002602090815260408083203390941683529290522054821115610a1957600080fd5b600160a060020a038416600090815260016020526040902054610a42908363ffffffff610c4816565b600160a060020a038086166000908152600160205260408082209390935590851681522054610a77908363ffffffff610b2c16565b600160a060020a03808516600090815260016020908152604080832094909455878316825260028152838220339093168252919091522054610abf908363ffffffff610c4816565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b60008282018381101561052557fe5b60035460009033600160a060020a03908116911614610b5957600080fd5b60035460a060020a900460ff1615610b7057600080fd5b600054610b83908363ffffffff610b2c16565b6000908155600160a060020a038416815260016020526040902054610bae908363ffffffff610b2c16565b600160a060020a0384166000818152600160205260409081902092909255907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859084905190815260200160405180910390a2600160a060020a03831660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350600192915050565b600082821115610c5457fe5b50900390565b6000600160a060020a0383161515610c7157600080fd5b600160a060020a033316600090815260016020526040902054821115610c9657600080fd5b600160a060020a033316600090815260016020526040902054610cbf908363ffffffff610c4816565b600160a060020a033381166000908152600160205260408082209390935590851681522054610cf4908363ffffffff610b2c16565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001929150505600a165627a7a72305820a0db4a7417f51dac893a505484403c713964d24a776ca71d61c0b642f6760aae00296060604052341561000f57600080fd5b60405160208061060c8339810160405280805160008054600160a060020a03191633600160a060020a039081169190911790915590925082161515905061005557600080fd5b60028054600160a060020a031916600160a060020a03929092169190911760a060020a60ff021916905561057e8061008e6000396000f3006060604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166343d726d6811461009d578063521eb273146100b25780638c52dc41146100e15780638da5cb5b146100f4578063c19d93fb14610107578063cb13cddb1461013e578063f2fde38b1461016f578063f340fa011461018e578063fa89401a146101a2575b600080fd5b34156100a857600080fd5b6100b06101c1565b005b34156100bd57600080fd5b6100c561029c565b604051600160a060020a03909116815260200160405180910390f35b34156100ec57600080fd5b6100b06102ab565b34156100ff57600080fd5b6100c561033c565b341561011257600080fd5b61011a61034b565b6040518082600281111561012a57fe5b60ff16815260200191505060405180910390f35b341561014957600080fd5b61015d600160a060020a036004351661035b565b60405190815260200160405180910390f35b341561017a57600080fd5b6100b0600160a060020a036004351661036d565b6100b0600160a060020a0360043516610408565b34156101ad57600080fd5b6100b0600160a060020a036004351661048c565b60005433600160a060020a039081169116146101dc57600080fd5b60006002805460a060020a900460ff16908111156101f657fe5b1461020057600080fd5b6002805474ff00000000000000000000000000000000000000001916740200000000000000000000000000000000000000001790557f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a60405160405180910390a1600254600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050151561029a57600080fd5b565b600254600160a060020a031681565b60005433600160a060020a039081169116146102c657600080fd5b60006002805460a060020a900460ff16908111156102e057fe5b146102ea57600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a1790557f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8960405160405180910390a1565b600054600160a060020a031681565b60025460a060020a900460ff1681565b60016020526000908152604090205481565b60005433600160a060020a0390811691161461038857600080fd5b600160a060020a038116151561039d57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60005433600160a060020a0390811691161461042357600080fd5b60006002805460a060020a900460ff169081111561043d57fe5b1461044757600080fd5b600160a060020a038116600090815260016020526040902054610470903463ffffffff61053c16565b600160a060020a03909116600090815260016020526040902055565b600060016002805460a060020a900460ff16908111156104a857fe5b146104b257600080fd5b50600160a060020a038116600081815260016020526040808220805492905590919082156108fc0290839051600060405180830381858888f1935050505015156104fb57600080fd5b81600160a060020a03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405190815260200160405180910390a25050565b60008282018381101561054b57fe5b93925050505600a165627a7a72305820b275974688f037b488146289ceb926584b3323febeb882aeae13bf10f90e62ab00296060604052341561000f57600080fd5b6040516060806102db83398101604052808051919060200180519190602001805191505042811161003f57600080fd5b60008054600160a060020a03948516600160a060020a031991821617909155600180549390941692169190911790915560025561025a806100816000396000f3006060604052600436106100485763ffffffff60e060020a60003504166338af3eed811461004d57806386d1a69f1461007c578063b91d400114610091578063fc0c546a146100b6575b600080fd5b341561005857600080fd5b6100606100c9565b604051600160a060020a03909116815260200160405180910390f35b341561008757600080fd5b61008f6100d8565b005b341561009c57600080fd5b6100a4610194565b60405190815260200160405180910390f35b34156100c157600080fd5b61006061019a565b600154600160a060020a031681565b6002546000904210156100ea57600080fd5b60008054600160a060020a0316906370a082319030906040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561014557600080fd5b6102c65a03f1151561015657600080fd5b50505060405180519150506000811161016e57600080fd5b60015460005461019191600160a060020a0391821691168363ffffffff6101a916565b50565b60025481565b600054600160a060020a031681565b82600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561020657600080fd5b6102c65a03f1151561021757600080fd5b50505060405180519050151561022957fe5b5050505600a165627a7a72305820eeace2909ad96851c2cbf01b9bbc7140e82c263f6ff3790a8a0e12d0640aff770029000000000000000000000000000000000000000000000000000000005a5a9d80000000000000000000000000000000000000000000000000000000005a72588000000000000000000000000000000000000000000089dd0a1aa2c008994d6800

Deployed Bytecode

0x6060604052600436106102835763ffffffff60e060020a6000350416629f9262811461028e57806309d929d6146102a45780630b45e8db146102b75780632803d8e5146102dc57806328675325146102ef5780632ad92740146103025780632c4e722e146103215780633197cbb614610334578063331052181461036457806338812e58146103975780633888188d146103b757806338d16011146103ca5780633dee0397146103e95780633e5b5e3914610424578063401938831461044b5780634451967c1461045e57806346602ce71461047157806348931352146104845780634bb278f314610497578063515f128b146102b757806353fe7a59146104aa57806355176f51146104bd5780635b7f415c146104d057806365d5b48d146104e357806365f6d6a2146104f65780636a4113c7146105095780637619d22e1461051c578063769f194f146104f657806378e979251461052f5780637d3d6522146105425780638d4e4083146105555780638da5cb5b146105685780638e1b9f421461057b5780639000b3d61461058e57806397fdf5f2146104f65780639e43692c146105ad578063a5410a66146105c0578063abbcb24b146105df578063accfaeba146105f2578063bdf5fba114610605578063bffa55d514610618578063c0489af514610637578063c61f11031461064a578063ca2dfd0a1461065d578063d1c469161461067c578063d1ff535e1461069b578063daa0f79f146106ae578063e565b387146106c1578063e632c2f3146106d4578063e945c391146106e7578063ec0de26e14610707578063f0757a911461071a578063f2fde38b1461072d578063fbfa77cf1461074c578063fc0c546a1461075f578063ff186b2e14610772575b61028c33610785565b005b341561029957600080fd5b61028c600435610a1d565b34156102af57600080fd5b61028c610a92565b34156102c257600080fd5b6102ca610aec565b60405190815260200160405180910390f35b34156102e757600080fd5b6102ca610afc565b34156102fa57600080fd5b6102ca610b08565b341561030d57600080fd5b6102ca600160a060020a0360043516610b16565b341561032c57600080fd5b6102ca610b28565b341561033f57600080fd5b610347610b2e565b60405167ffffffffffffffff909116815260200160405180910390f35b341561036f57600080fd5b610383600160a060020a0360043516610b3e565b604051901515815260200160405180910390f35b34156103a257600080fd5b61028c67ffffffffffffffff60043516610b53565b34156103c257600080fd5b61028c610c01565b34156103d557600080fd5b61028c600160a060020a0360043516610c40565b34156103f457600080fd5b610408600160a060020a0360043516610cba565b604051600160a060020a03909116815260200160405180910390f35b341561042f57600080fd5b61028c600160a060020a03600435166024356044351515610cd5565b341561045657600080fd5b6102ca610f63565b341561046957600080fd5b610408610f69565b341561047c57600080fd5b610408610f81565b341561048f57600080fd5b6102ca610f99565b34156104a257600080fd5b61028c610fa9565b34156104b557600080fd5b6102ca611036565b34156104c857600080fd5b6102ca611044565b34156104db57600080fd5b6102ca611053565b34156104ee57600080fd5b610347611058565b341561050157600080fd5b6102ca61105f565b341561051457600080fd5b61028c61106f565b341561052757600080fd5b6102ca6110ae565b341561053a57600080fd5b6103476110bd565b341561054d57600080fd5b6103836110d4565b341561056057600080fd5b6103836110df565b341561057357600080fd5b6104086110e8565b341561058657600080fd5b6104086110f7565b341561059957600080fd5b61028c600160a060020a036004351661110f565b34156105b857600080fd5b6102ca611151565b34156105cb57600080fd5b610383600160a060020a0360043516611161565b34156105ea57600080fd5b610408611176565b34156105fd57600080fd5b6102ca61118e565b341561061057600080fd5b61040861119d565b341561062357600080fd5b61028c600160a060020a03600435166111b5565b341561064257600080fd5b61040861123f565b341561065557600080fd5b610408611253565b341561066857600080fd5b61028c600160a060020a0360043516611262565b341561068757600080fd5b61028c600160a060020a036004351661129e565b34156106a657600080fd5b6102ca611333565b34156106b957600080fd5b610408611341565b34156106cc57600080fd5b610408611359565b34156106df57600080fd5b6102ca611371565b34156106f257600080fd5b61028c67ffffffffffffffff60043516611377565b341561071257600080fd5b610408611407565b341561072557600080fd5b6102ca611416565b341561073857600080fd5b61028c600160a060020a036004351661141b565b341561075757600080fd5b6104086114b6565b341561076a57600080fd5b6104086114c5565b341561077d57600080fd5b6102ca6114d4565b600160a060020a038116600090815260086020526040812054819060ff1615156107ae57600080fd5b60025460a060020a900467ffffffffffffffff164210156107ce57600080fd5b60035467ffffffffffffffff1642106107e657600080fd5b600b5460ff16156107f657600080fd5b34151561080257600080fd5b60055434925061081990839063ffffffff6114da16565b600160a060020a038416600090815260096020526040902054909150610845908263ffffffff61151016565b600160a060020a038416600090815260096020526040902055600754610871908263ffffffff61151016565b60078190556b0665d14f1378fde93c00000090111561088f57600080fd5b600160a060020a0383166000908152600960205260409020546901695d556204b1e800009010156108bf57600080fd5b6002546201518067ffffffffffffffff60a060020a9092048216011642101561091757600160a060020a038316600090815260096020526040902054692a5a058fc295ed00000090111561091257600080fd5b610947565b600160a060020a03831660009081526009602052604090205469fe1c215e8f838e00000090111561094757600080fd5b600e54600160a060020a031663f340fa01348560405160e060020a63ffffffff8516028152600160a060020a0390911660048201526024016000604051808303818588803b151561099757600080fd5b6125ee5a03f115156109a857600080fd5b50506002546109ca9250600160a060020a03169050848363ffffffff61151f16565b82600160a060020a031633600160a060020a03167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad18848460405191825260208201526040908101905180910390a3505050565b60005433600160a060020a03908116911614610a3857600080fd5b60025460a060020a900467ffffffffffffffff164210610a5757600080fd5b60008111610a6457600080fd5b6006819055610a8c600f610a80836103e863ffffffff6114da16565b9063ffffffff61159f16565b60055550565b600b546101009004600160a060020a03166386d1a69f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610ad657600080fd5b6102c65a03f11515610ae757600080fd5b505050565b6b0665d14f1378fde93c00000081565b670de0b6b3a764000081565b6901695d556204b1e8000081565b60096020526000908152604090205481565b60055481565b60035467ffffffffffffffff1681565b60016020526000908152604090205460ff1681565b60005433600160a060020a03908116911614610b6e57600080fd5b60025460a060020a900467ffffffffffffffff164210610b8d57600080fd5b4267ffffffffffffffff821611610ba357600080fd5b60035467ffffffffffffffff90811690821610610bbf57600080fd5b6002805467ffffffffffffffff90921660a060020a027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600d54600160a060020a03166386d1a69f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610ad657600080fd5b600160a060020a03331660009081526001602052604090205460ff161515610c6757600080fd5b600160a060020a03811660008181526008602052604090819020805460ff191660011790557f98cc2c535b6060b431d35630893358290dcd38687f6487e2882d331955020805905160405180910390a250565b600a60205260009081526040902054600160a060020a031681565b600160a060020a03331660009081526001602052604081205481908190819060ff161515610d0257600080fd5b60025460a060020a900467ffffffffffffffff164210610d2157600080fd5b600160a060020a0387166000908152600860205260409020805460ff19166001179055600754869450610d5a908563ffffffff61151016565b600755600160a060020a038716600090815260096020526040902054610d86908563ffffffff61151016565b600160a060020a0388166000908152600960205260409020558415610f00576002805467ffffffffffffffff60a060020a9091041662ed4e00019350610dd390859063ffffffff61159f16565b600160a060020a038089166000908152600a6020526040902054919350161515610e9457600254600160a060020a03168784610e0d61177a565b600160a060020a03938416815291909216602082015267ffffffffffffffff90911660408083019190915260609091019051809103906000f0801515610e5257600080fd5b600160a060020a038881166000908152600a60205260409020805473ffffffffffffffffffffffffffffffffffffffff19169183169190911790559050610eb1565b50600160a060020a038087166000908152600a6020526040902054165b600254610ece90600160a060020a0316888463ffffffff61151f16565b610efb81610ee2868563ffffffff6115b616565b600254600160a060020a0316919063ffffffff61151f16565b610f1d565b600254610f1d90600160a060020a0316888663ffffffff61151f16565b86600160a060020a03167fd4cab39bf07f5b24c1fa485061de865fae1bb7f0bcf434dd70bf1a33689ca4068560405190815260200160405180910390a250505050505050565b60045481565b73d68947892ef4d94cdef7165b109cf6cd3f58a8e881565b734452d6454e777743a5ee233fbe873055008ff52881565b6b1363156bbee3016d7000000081565b60005433600160a060020a03908116911614610fc457600080fd5b60025460a060020a900467ffffffffffffffff164211610fe357600080fd5b600b5460ff1615610ff357600080fd5b610ffb6115c8565b7f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a1600b805460ff19166001179055565b692a5a058fc295ed00000081565b6a5dbf4458cdddab0b98000081565b601281565b62ed4e0081565b6b0110f837d8942a518a00000081565b600c54600160a060020a03166386d1a69f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610ad657600080fd5b6a04f68ca6d8cd91c600000081565b60025460a060020a900467ffffffffffffffff1681565b600454600754101590565b600b5460ff1681565b600054600160a060020a031681565b73e0831b1687c9fad3447a517f9371e66672505db081565b60005433600160a060020a0390811691161461112a57600080fd5b600160a060020a03166000908152600160208190526040909120805460ff19169091179055565b6b02d5296330eea1499268000081565b60086020526000908152604090205460ff1681565b739be281cdcf34b3a01468ad1008139410ba5bb2fb81565b6a2caaf1dd9f3a1ff600000081565b730506c5485ae54ab14c598ef16c459409e5d8fc0381565b600b5460ff1615156111c657600080fd5b6111ce6110d4565b156111d857600080fd5b600e54600160a060020a031663fa89401a8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561122857600080fd5b6102c65a03f1151561123957600080fd5b50505050565b600b546101009004600160a060020a031681565b600c54600160a060020a031681565b60005433600160a060020a0390811691161461127d57600080fd5b600160a060020a03166000908152600160205260409020805460ff19169055565b600160a060020a038082166000908152600a602052604081205490911615156112c657600080fd5b50600160a060020a038082166000908152600a602052604090819020549091169081906386d1a69f90518163ffffffff1660e060020a028152600401600060405180830381600087803b151561131b57600080fd5b6102c65a03f1151561132c57600080fd5b5050505050565b69fe1c215e8f838e00000081565b73b57911380f13a0a9a6ba6562248674b5f56d7bfe81565b73d0c24bb82e71a44ea770e84a3c79979f9233308d81565b60075481565b60005433600160a060020a0390811691161461139257600080fd5b60035467ffffffffffffffff1642106113aa57600080fd5b4267ffffffffffffffff8216116113c057600080fd5b60025467ffffffffffffffff60a060020a9091048116908216116113e357600080fd5b6003805467ffffffffffffffff191667ffffffffffffffff92909216919091179055565b600d54600160a060020a031681565b600f81565b60005433600160a060020a0390811691161461143657600080fd5b600160a060020a038116151561144b57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600e54600160a060020a031681565b600254600160a060020a031681565b60065481565b6000808315156114ed5760009150611509565b508282028284828115156114fd57fe5b041461150557fe5b8091505b5092915050565b60008282018381101561150557fe5b82600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561157c57600080fd5b6102c65a03f1151561158d57600080fd5b505050604051805190501515610ae757fe5b60008082848115156115ad57fe5b04949350505050565b6000828211156115c257fe5b50900390565b6115d06110d4565b15611689576115dd6116ca565b600e54600160a060020a03166343d726d66040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561161c57600080fd5b6102c65a03f1151561162d57600080fd5b5050600254600160a060020a0316905063af35c6c76040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561167057600080fd5b6102c65a03f1151561168157600080fd5b5050506116c8565b600e54600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610ad657600080fd5b565b600254600160a060020a03166342966c68816370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561172957600080fd5b6102c65a03f1151561173a57600080fd5b5050506040518051905060405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610ad657600080fd5b6040516102db8061178b8339019056006060604052341561000f57600080fd5b6040516060806102db83398101604052808051919060200180519190602001805191505042811161003f57600080fd5b60008054600160a060020a03948516600160a060020a031991821617909155600180549390941692169190911790915560025561025a806100816000396000f3006060604052600436106100485763ffffffff60e060020a60003504166338af3eed811461004d57806386d1a69f1461007c578063b91d400114610091578063fc0c546a146100b6575b600080fd5b341561005857600080fd5b6100606100c9565b604051600160a060020a03909116815260200160405180910390f35b341561008757600080fd5b61008f6100d8565b005b341561009c57600080fd5b6100a4610194565b60405190815260200160405180910390f35b34156100c157600080fd5b61006061019a565b600154600160a060020a031681565b6002546000904210156100ea57600080fd5b60008054600160a060020a0316906370a082319030906040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561014557600080fd5b6102c65a03f1151561015657600080fd5b50505060405180519150506000811161016e57600080fd5b60015460005461019191600160a060020a0391821691168363ffffffff6101a916565b50565b60025481565b600054600160a060020a031681565b82600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561020657600080fd5b6102c65a03f1151561021757600080fd5b50505060405180519050151561022957fe5b5050505600a165627a7a72305820eeace2909ad96851c2cbf01b9bbc7140e82c263f6ff3790a8a0e12d0640aff770029a165627a7a72305820c3ad1fcd1df61752f4ec3ce0d3bdcac8b42dc2436f35caf58d05e1ba22122dcb0029

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

000000000000000000000000000000000000000000000000000000005a5a9d80000000000000000000000000000000000000000000000000000000005a72588000000000000000000000000000000000000000000089dd0a1aa2c008994d6800

-----Decoded View---------------
Arg [0] : _startTime (uint64): 1515888000
Arg [1] : _endTime (uint64): 1517443200
Arg [2] : _goal (uint256): 166666666666666660000000000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000005a5a9d80
Arg [1] : 000000000000000000000000000000000000000000000000000000005a725880
Arg [2] : 00000000000000000000000000000000000000000089dd0a1aa2c008994d6800


Swarm Source

bzzr://eeace2909ad96851c2cbf01b9bbc7140e82c263f6ff3790a8a0e12d0640aff77

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
[ 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.