function buyTokens() public payable {
        require(state == State.Active &&
                block.timestamp <= endAt &&
                msg.value >= lowCapTxWei &&
                msg.value <= hardCapTxWei &&
                collectedWei + msg.value <= hardCapWei &&
                whitelisted(msg.sender));
        uint iwei = msg.value;
        uint itokens = iwei * ETH_TOKEN_EXCHANGE_RATIO;
        token.icoInvestment(msg.sender, itokens); 
        collectedWei = collectedWei.add(iwei);
        ICOInvestment(msg.sender, iwei, itokens, 0);
        forwardFunds();
        touch();
    }