contract TraxionToken is PausableToken {

  string public constant name = "Traxion Token";
  string public constant symbol = "TXN";
  uint8 public constant decimals = 18;
  uint public constant INITIAL_SUPPLY = 5e8 * 10**uint(decimals);

  event TransferData(bytes);
  event TransferFromData(bytes);
  event ApproveData(bytes);
  event IncreaseApprovalData(bytes);
  event DecreaseApprovalData(bytes);

  constructor()  public {
    totalSupply_ = INITIAL_SUPPLY;
    transferOwnership(0xdf4CF47303a3607732f9bF193771F54Bb288a2dF);
    balances[0xdf4CF47303a3607732f9bF193771F54Bb288a2dF] = INITIAL_SUPPLY;
    emit Transfer(0x0, 0xdf4CF47303a3607732f9bF193771F54Bb288a2dF, INITIAL_SUPPLY);
  }

  // The following functions cannot be executed when the contract is paused,
  // given that they call functions from PausableToken.

  function transferWithData(address to, uint value, bytes data) public returns (bool) {
    emit TransferData(data);
    return super.transfer(to, value);
  }


  function transferFromWithData(address from, address to, uint value, bytes data) public returns (bool) {
    emit TransferFromData(data);
    return super.transferFrom(from, to, value);
  }

  function approveWithData(address spender, uint value, bytes data) public returns (bool) {
    emit ApproveData(data);
    return super.approve(spender, value);
  }

  function increaseApprovalWithData(address spender, uint addedValue, bytes data) public returns (bool) {
    emit IncreaseApprovalData(data);
    return super.increaseApproval(spender, addedValue);
  }

  function decreaseApprovalWithData(address spender, uint subtractedValue, bytes data) public returns (bool) {
    emit DecreaseApprovalData(data);
    return super.decreaseApproval(spender, subtractedValue);
  }
}
function transferWithData(address to, uint value, bytes data) public returns (bool) {
  emit TransferData(data);
  return super.transfer(to, value);
}

// The following functions cannot be executed when the contract is paused,
// given that they call functions from PausableToken.