function approvePreSigned(
    address _to,
    uint256 _value,
    uint256 _fee,
    uint256 _nonce,
    uint8 _version,
    bytes _sig
  )
    public
    onlyNotFrozenAddress(msg.sender)
    whenNotPaused
    returns (bool)
  {
    require(_signatures[_sig] == false);

    address _from = _preSignedContract.approvePreSignedCheck(
      address(this),
      _to,
      _value,
      _fee,
      _nonce,
      _version,
      _sig
    );

    require(!frozenAddress[_from]);
    require(_fee <= balances[_from]);

    allowed[_from][_to] = _value;
    emit Approval(_from, _to, _value);

    if (_fee > 0) {
      balances[_from] = balances[_from].sub(_fee);
      balances[msg.sender] = balances[msg.sender].add(_fee);
      emit Transfer(_from, msg.sender, _fee);
    }

    _signatures[_sig] = true;
    emit ApprovalPreSigned(_from, _to, msg.sender, _value, _fee);

    return true;
  }