Program: 30998
Project: 30998
Buggy source:
/** 
 * Given a pledge protobuf, double spends the stub so the pledge can no longer be claimed. The pledge is removed from the wallet once the double spend propagates successfully.
 * @throws org.bitcoinj.core.InsufficientMoneyException if we can't afford to revoke.
 */
public Revocation revokePledge(LHProtos.Pledge proto,@Nullable KeyParameter aesKey) throws InsufficientMoneyException {
  TransactionOutput stub;
synchronized (this) {
    stub=pledges.inverse().get(proto);
  }
  checkArgument(stub != null,"String_Node_Str",proto);
  Transaction revocation=new Transaction(params);
  revocation.addInput(stub);
  revocation.addOutput(stub.getValue().subtract(Transaction.REFERENCE_DEFAULT_MIN_TX_FEE),freshReceiveKey().toAddress(params));
  SendRequest request=SendRequest.forTx(revocation);
  request.aesKey=aesKey;
  completeTx(request);
synchronized (this) {
    revokeInProgress.add(request.tx);
  }
  log.info("String_Node_Str",stub.getValue());
  log.info("String_Node_Str",stub);
  log.info("String_Node_Str",revocation);
  final ListenableFuture<Transaction> future=vTransactionBroadcaster.broadcastTransaction(revocation);
  Futures.addCallback(future,new FutureCallback<Transaction>(){
    @Override public void onSuccess(    @Nullable Transaction result){
      final Sha256Hash hash=hashFromPledge(proto);
      log.info("String_Node_Str",hash);
      log.info("String_Node_Str",proto.getTransactionsCount());
      updateForRevoke(hash,result,proto,stub);
      saveNow();
      for (      ListenerRegistration<OnRevokeHandler> handler : onRevokeHandlers) {
        handler.executor.execute(() -> handler.listener.onRevoke(proto));
      }
      lock.lock();
      try {
        maybeQueueOnWalletChanged();
      }
  finally {
        lock.unlock();
      }
    }
    @Override public void onFailure(    Throwable t){
      log.error("String_Node_Str",t);
    }
  }
);
  return new Revocation(future,revocation);
}

Fixed version (ground truth):
/** 
 * Given a pledge protobuf, double spends the stub so the pledge can no longer be claimed. The pledge is removed from the wallet once the double spend propagates successfully.
 * @throws org.bitcoinj.core.InsufficientMoneyException if we can't afford to revoke.
 */
public Revocation revokePledge(LHProtos.Pledge proto,@Nullable KeyParameter aesKey) throws InsufficientMoneyException {
  TransactionOutput stub;
synchronized (this) {
    stub=pledges.inverse().get(proto);
  }
  checkArgument(stub != null,"String_Node_Str",proto);
  Transaction revocation=new Transaction(params);
  revocation.addInput(stub);
  revocation.addOutput(stub.getValue().subtract(Transaction.REFERENCE_DEFAULT_MIN_TX_FEE),freshReceiveKey().toAddress(params));
  SendRequest request=SendRequest.forTx(revocation);
  request.aesKey=aesKey;
  completeTx(request);
synchronized (this) {
    revokeInProgress.add(request.tx);
  }
  log.info("String_Node_Str",stub.getValue());
  log.info("String_Node_Str",stub);
  log.info("String_Node_Str",revocation);
  final ListenableFuture<Transaction> future=vTransactionBroadcaster.broadcastTransaction(revocation);
  Futures.addCallback(future,new FutureCallback<Transaction>(){
    @Override public void onSuccess(    @Nullable Transaction result){
      log.info("String_Node_Str",hashFromPledge(proto));
      log.info("String_Node_Str",proto.getTransactionsCount());
      updateForRevoke(result,proto,stub);
      saveNow();
      for (      ListenerRegistration<OnRevokeHandler> handler : onRevokeHandlers) {
        handler.executor.execute(() -> handler.listener.onRevoke(proto));
      }
      lock.lock();
      try {
        maybeQueueOnWalletChanged();
      }
  finally {
        lock.unlock();
      }
    }
    @Override public void onFailure(    Throwable t){
      log.error("String_Node_Str",t);
    }
  }
);
  return new Revocation(future,revocation);
}