From 3f7b97f4d08457e5879a49b4f99e72df745727e3 Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:18:16 -0500 Subject: [PATCH] improve error message on payment received nack max attempts --- .../haveno/core/trade/protocol/TradeProtocol.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java b/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java index 4655c57a4b..48867006be 100644 --- a/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java +++ b/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java @@ -119,8 +119,6 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D private int reprocessPaymentReceivedMessageCount; private boolean makerInitTradeRequestHasBeenNacked = false; private PaymentReceivedMessage lastAckedPaymentReceivedMessage = null; - - private static int MAX_PAYMENT_RECEIVED_NACKS = 6; private int numPaymentReceivedNacks = 0; /////////////////////////////////////////////////////////////////////////////////////////// @@ -960,7 +958,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D if (ackMessage.getUpdatedMultisigHex() != null) { trade.getBuyer().setUpdatedMultisigHex(ackMessage.getUpdatedMultisigHex()); processModel.getTradeManager().persistNow(null); - boolean autoResent = onPaymentReceivedNack(true, peer); + boolean autoResent = onPaymentReceivedNack(true, peer, ackMessage); if (autoResent) return; // skip remaining processing if auto resent } } @@ -979,7 +977,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D if (ackMessage.getUpdatedMultisigHex() != null) { trade.getArbitrator().setUpdatedMultisigHex(ackMessage.getUpdatedMultisigHex()); processModel.getTradeManager().persistNow(null); - boolean autoResent = onPaymentReceivedNack(true, peer); + boolean autoResent = onPaymentReceivedNack(true, peer, ackMessage); if (autoResent) return; // skip remaining processing if auto resent } } @@ -1025,12 +1023,12 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D return ackMessage.getErrorMessage() != null && ackMessage.getErrorMessage().contains(SEND_INIT_TRADE_REQUEST_FAILED); // ignore if arbitrator's request failed to taker } - private boolean onPaymentReceivedNack(boolean syncAndPoll, TradePeer peer) { + private boolean onPaymentReceivedNack(boolean syncAndPoll, TradePeer peer, AckMessage ackMessage) { // prevent infinite nack loop with max attempts numPaymentReceivedNacks++; - if (numPaymentReceivedNacks > MAX_PAYMENT_RECEIVED_NACKS) { - String errorMsg = "The maximum number of attempts to process the payment confirmation has been reached for " + trade.getClass().getSimpleName() + " " + trade.getId() + ". Restart the application to try again."; + if (numPaymentReceivedNacks > MAX_ATTEMPTS) { + String errorMsg = "Failed to process the payment confirmation after " + MAX_ATTEMPTS + " attempts for " + trade.getClass().getSimpleName() + " " + trade.getId() + ". Restart the application to try again.\n\nMessage from peer:\n" + ackMessage.getErrorMessage(); log.warn(errorMsg); trade.setErrorMessage(errorMsg); return false;