automatically close disputes on startup when payout is published

This commit is contained in:
woodser 2025-09-28 14:01:58 -04:00
parent 2d0d03337e
commit 4e09a83e40
No known key found for this signature in database
GPG key ID: 55A10DD48ADEE5EF
2 changed files with 38 additions and 0 deletions

View file

@ -1182,6 +1182,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
}
public boolean canSendChatMessages(Dispute dispute) {
if (dispute.isClosed()) return false;
Optional<Trade> tradeOptional = findTrade(dispute);
if (!tradeOptional.isPresent()) {
log.warn("Dispute trade {} does not exist", dispute.getTradeId());

View file

@ -225,6 +225,43 @@ public final class ArbitrationManager extends DisputeManager<ArbitrationDisputeL
}
trade.setDisputeState(DisputeState.NO_DISPUTE);
}
// close open disputes with published payout
for (Dispute dispute : disputes) {
// skip if dispute is closed
if (dispute.isClosed()) continue;
// get dispute's trade
final Trade trade = tradeManager.getTrade(dispute.getTradeId());
if (trade == null) {
log.warn("Dispute trade {} does not exist", dispute.getTradeId());
continue;
}
// skip if trade's payout is not published
if (!trade.isPayoutPublished()) continue;
// skip if arbitrator's peer dispute is closed
Optional<Dispute> 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);
}
}
}