Program: 30980
Project: 30980
Buggy source:
public ProjectModel(LHProtos.ProjectDetails.Builder liveProto){
  this.proto=liveProto;
  final LHProtos.Project.Builder wrapper=LHProtos.Project.newBuilder().setSerializedPaymentDetails(liveProto.build().toByteString());
  Project project=unchecked(() -> new Project(wrapper.build()));
  title.set(project.getTitle());
  memo.set(project.getMemo());
  goalAmount.set(project.getGoalAmount().value);
  minPledgeAmount.set(recalculateMinPledgeAmount(goalAmount.longValue()));
  if (liveProto.hasPaymentUrl()) {
    String host=LHUtils.validateServerPath(liveProto.getPaymentUrl());
    if (host == null)     throw new IllegalArgumentException("String_Node_Str" + liveProto.getPaymentUrl());
    serverName.set(host);
  }
  InvalidationListener pathSetter=o -> {
    final String name=serverName.get();
    if (name == null || name.isEmpty())     proto.clearPaymentUrl();
 else     proto.setPaymentUrl(LHUtils.makeServerPath(name,LHUtils.titleToUrlString(title.get())));
  }
;
  serverName.addListener(pathSetter);
  title.addListener(o -> {
    proto.getExtraDetailsBuilder().setTitle(title.get());
    pathSetter.invalidated(null);
  }
);
  memo.addListener(o -> proto.setMemo(memo.get()));
  goalAmount.addListener(o -> {
    long value=goalAmount.longValue();
    minPledgeAmount.set(recalculateMinPledgeAmount(value));
    proto.getOutputsBuilder(0).setAmount(value);
  }
);
  minPledgeAmount.addListener(o -> proto.getExtraDetailsBuilder().setMinPledgeSize(minPledgeAmountProperty().get()));
  TransactionOutput output=project.getOutputs().get(0);
  Address addr=output.getAddressFromP2PKHScript(project.getParams());
  if (addr == null)   addr=output.getAddressFromP2SH(project.getParams());
  if (addr == null)   throw new IllegalArgumentException("String_Node_Str" + output);
  address.set(addr.toString());
  address.addListener(o -> {
    try {
      Address addr2=new Address(project.getParams(),address.get());
      proto.getOutputsBuilder(0).setScript(ByteString.copyFrom(ScriptBuilder.createOutputScript(addr2).getProgram()));
    }
 catch (    AddressFormatException e) {
    }
  }
);
  if (proto.getExtraDetailsBuilder().hasCoverImage())   image.set(proto.getExtraDetailsBuilder().getCoverImage());
  image.addListener(o -> {
    proto.getExtraDetailsBuilder().setCoverImage(image.get());
  }
);
}

Fixed version (ground truth):
public ProjectModel(LHProtos.ProjectDetails.Builder liveProto){
  this.proto=liveProto;
  final LHProtos.Project.Builder wrapper=LHProtos.Project.newBuilder().setSerializedPaymentDetails(liveProto.build().toByteString());
  Project project=unchecked(() -> new Project(wrapper.build()));
  title.set(project.getTitle());
  memo.set(project.getMemo());
  goalAmount.set(project.getGoalAmount().value);
  if (liveProto.getExtraDetails().hasMinPledgeSize())   minPledgeAmount.set(project.getMinPledgeAmount().value);
 else   minPledgeAmount.set(recalculateMinPledgeAmount(goalAmount.longValue()));
  if (liveProto.hasPaymentUrl()) {
    String host=LHUtils.validateServerPath(liveProto.getPaymentUrl());
    if (host == null)     throw new IllegalArgumentException("String_Node_Str" + liveProto.getPaymentUrl());
    serverName.set(host);
  }
  InvalidationListener pathSetter=o -> {
    final String name=serverName.get();
    if (name == null || name.isEmpty())     proto.clearPaymentUrl();
 else     proto.setPaymentUrl(LHUtils.makeServerPath(name,LHUtils.titleToUrlString(title.get())));
  }
;
  serverName.addListener(pathSetter);
  title.addListener(o -> {
    proto.getExtraDetailsBuilder().setTitle(title.get());
    pathSetter.invalidated(null);
  }
);
  memo.addListener(o -> proto.setMemo(memo.get()));
  goalAmount.addListener(o -> {
    long value=goalAmount.longValue();
    minPledgeAmount.set(recalculateMinPledgeAmount(value));
    proto.getOutputsBuilder(0).setAmount(value);
  }
);
  minPledgeAmount.addListener(o -> proto.getExtraDetailsBuilder().setMinPledgeSize(minPledgeAmountProperty().get()));
  TransactionOutput output=project.getOutputs().get(0);
  Address addr=output.getAddressFromP2PKHScript(project.getParams());
  if (addr == null)   addr=output.getAddressFromP2SH(project.getParams());
  if (addr == null)   throw new IllegalArgumentException("String_Node_Str" + output);
  address.set(addr.toString());
  address.addListener(o -> {
    try {
      Address addr2=new Address(project.getParams(),address.get());
      proto.getOutputsBuilder(0).setScript(ByteString.copyFrom(ScriptBuilder.createOutputScript(addr2).getProgram()));
    }
 catch (    AddressFormatException e) {
    }
  }
);
  if (proto.getExtraDetailsBuilder().hasCoverImage())   image.set(proto.getExtraDetailsBuilder().getCoverImage());
  image.addListener(o -> {
    proto.getExtraDetailsBuilder().setCoverImage(image.get());
  }
);
}