contract N2C is ReleaseableToken {
  string public name = 'N2Chain';
  string public symbol = 'N2C';
  uint8 public decimals = 4;

  // Set in case the core contract is broken and an upgrade is required
  address public newContractAddress;

  function N2C() public ReleaseableToken(1000000000, 200000000, 200000000) {}

  /// @dev Used to mark the smart contract as upgraded, in case there is a serious
  ///  breaking bug. This method does nothing but keep track of the new contract and
  ///  emit a message indicating that the new address is set. It's up to clients of this
  ///  contract to update to the new contract address in that case. (This contract will
  ///  be paused indefinitely if such an upgrade takes place.)
  /// @param _v2Address new address
  function setNewAddress(address _v2Address) external onlyOwner whenPaused {
    newContractAddress = _v2Address;
    emit ContractUpgrade(_v2Address);
  }

  /// @dev Override unpause so it requires all external contract addresses
  ///  to be set before contract can be unpaused. Also, we can't have
  ///  newContractAddress set either, because then the contract was upgraded.
  /// @notice This is public rather than external so we can call super.unpause
  ///  without using an expensive CALL.
  function unpause() public onlyOwner whenPaused {
    require(newContractAddress == address(0));

    // Actually unpause the contract.
    super.unpause();
  }
}
function setNewAddress(address _v2Address) external onlyOwner whenPaused {
  newContractAddress = _v2Address;
  emit ContractUpgrade(_v2Address);
}

/// @dev Used to mark the smart contract as upgraded, in case there is a serious
///  breaking bug. This method does nothing but keep track of the new contract and
///  emit a message indicating that the new address is set. It's up to clients of this
///  contract to update to the new contract address in that case. (This contract will
///  be paused indefinitely if such an upgrade takes place.)
/// @param _v2Address new address