docs: @Override
      public void connectionOpen() {
          lock.lock();
          try {
              connectionOpen = true;
  
              StoredPaymentChannelClientStates channels = (StoredPaymentChannelClientStates) wallet.getExtensions().get(StoredPaymentChannelClientStates.EXTENSION_ID);
              if (channels != null)
                  storedChannel = channels.getUsableChannelForServerID(serverId);
  
              step = InitStep.WAITING_FOR_VERSION_NEGOTIATION;
  
              Protos.ClientVersion.Builder versionNegotiationBuilder = Protos.ClientVersion.newBuilder()
                      .setMajor(versionSelector.getRequestedMajorVersion())
                      .setMinor(versionSelector.getRequestedMinorVersion())
                      .setTimeWindowSecs(timeWindow);
  
              if (storedChannel != null) {
                  versionNegotiationBuilder.setPreviousChannelContractHash(ByteString.copyFrom(storedChannel.contract.getTxId().getBytes()));
                  log.info("Begun version handshake, attempting to reopen channel with contract hash {}", storedChannel.contract.getTxId());
              } else
                  log.info("Begun version handshake creating new channel");
  
              conn.sendToServer(Protos.TwoWayChannelMessage.newBuilder()
                      .setType(Protos.TwoWayChannelMessage.MessageType.CLIENT_VERSION)
                      .setClientVersion(versionNegotiationBuilder)
                      .build());
          } finally {
              lock.unlock();
          }
      }