function transferFrom(address _from, address _to, uint256 _value) onlyWorking returns (bool success) {
        if (balanceOf(_from) < _value) throw;
        if (balanceOf(_to).add(_value) < balanceOf(_to)) throw;
        if (_value > allowance(_from, tx.origin)) throw;
        subtractBalance(_from, _value);
        if (offChainManager.isToOffChainAddress(_to)) {
            addBalance(offChainManager.getOffChainRootAddress(), _value);
            ToOffChainTransfer(tx.origin, _to, _to, _value);
        } else {
            addBalance(_to, _value);
        }
        subtractAllowed(_from, tx.origin, _value);
        return true;
    }