From 4e09a83e400d928c2de370657845c134e3c4582e Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Sun, 28 Sep 2025 14:01:58 -0400 Subject: [PATCH] automatically close disputes on startup when payout is published --- .../core/support/dispute/DisputeManager.java | 1 + .../arbitration/ArbitrationManager.java | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/core/src/main/java/haveno/core/support/dispute/DisputeManager.java b/core/src/main/java/haveno/core/support/dispute/DisputeManager.java index b7fe445d70..db293d542c 100644 --- a/core/src/main/java/haveno/core/support/dispute/DisputeManager.java +++ b/core/src/main/java/haveno/core/support/dispute/DisputeManager.java @@ -1182,6 +1182,7 @@ public abstract class DisputeManager> extends Sup } public boolean canSendChatMessages(Dispute dispute) { + if (dispute.isClosed()) return false; Optional tradeOptional = findTrade(dispute); if (!tradeOptional.isPresent()) { log.warn("Dispute trade {} does not exist", dispute.getTradeId()); diff --git a/core/src/main/java/haveno/core/support/dispute/arbitration/ArbitrationManager.java b/core/src/main/java/haveno/core/support/dispute/arbitration/ArbitrationManager.java index 163eb15477..74345fa398 100644 --- a/core/src/main/java/haveno/core/support/dispute/arbitration/ArbitrationManager.java +++ b/core/src/main/java/haveno/core/support/dispute/arbitration/ArbitrationManager.java @@ -225,6 +225,43 @@ public final class ArbitrationManager extends DisputeManager peersDisputeOptional = null; + if (trade.isArbitrator()) { + peersDisputeOptional = getDisputesAsObservableList().stream() + .filter(d -> dispute.getTradeId().equals(d.getTradeId()) && dispute.getTraderId() != d.getTraderId()) + .findFirst(); + if (peersDisputeOptional.isPresent()) { + if (peersDisputeOptional.get().isClosed()) continue; + } else { + log.warn("No peer dispute found for disputeId={}, tradeId={}", dispute.getId(), dispute.getTradeId()); + continue; + } + } + + // close trade disputes if payout published + log.warn("Auto-closing dispute for {} {} with published payout, disputeId={}", trade.getClass().getSimpleName(), trade.getId(), dispute.getId()); + dispute.setIsClosed(); + if (peersDisputeOptional != null && peersDisputeOptional.isPresent()) peersDisputeOptional.get().setIsClosed(); + trade.setDisputeState(Trade.DisputeState.DISPUTE_CLOSED); + } } }