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 0ac6aa432b8..8082aad475e 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 @@ -511,6 +511,7 @@ private MoneroTxSet signAndPublishDisputePayoutTx(Trade trade) { break; } catch (Exception e) { if (trade.isPayoutPublished()) throw new IllegalStateException("Payout tx already published for " + trade.getClass().getSimpleName() + " " + trade.getShortId()); + if (HavenoUtils.isNotEnoughSigners(e)) throw new IllegalArgumentException(e); log.warn("Failed to submit dispute payout tx, tradeId={}, attempt={}/{}, error={}", trade.getShortId(), i + 1, TradeProtocol.MAX_ATTEMPTS, e.getMessage()); if (i == TradeProtocol.MAX_ATTEMPTS - 1) throw e; if (trade.getXmrConnectionService().isConnected()) trade.requestSwitchToNextBestConnection(sourceConnection); diff --git a/core/src/main/java/haveno/core/trade/HavenoUtils.java b/core/src/main/java/haveno/core/trade/HavenoUtils.java index 5b9386af40b..065d587f5ae 100644 --- a/core/src/main/java/haveno/core/trade/HavenoUtils.java +++ b/core/src/main/java/haveno/core/trade/HavenoUtils.java @@ -521,4 +521,8 @@ public static boolean isReadTimeout(Exception e) { public static boolean isUnresponsive(Exception e) { return isConnectionRefused(e) || isReadTimeout(e); } + + public static boolean isNotEnoughSigners(Exception e) { + return e != null && e.getMessage().contains("Not enough signers"); + } } diff --git a/core/src/main/java/haveno/core/trade/Trade.java b/core/src/main/java/haveno/core/trade/Trade.java index 143f000f3f0..ca3df853580 100644 --- a/core/src/main/java/haveno/core/trade/Trade.java +++ b/core/src/main/java/haveno/core/trade/Trade.java @@ -1381,6 +1381,8 @@ private void doProcessPayoutTx(String payoutTxHex, boolean sign, boolean publish wallet.submitMultisigTxHex(payoutTxHex); setPayoutStatePublished(); } catch (Exception e) { + if (isPayoutPublished()) throw new IllegalStateException("Payout tx already published for " + getClass().getSimpleName() + " " + getShortId()); + if (HavenoUtils.isNotEnoughSigners(e)) throw new IllegalArgumentException(e); throw new RuntimeException("Failed to submit payout tx for " + getClass().getSimpleName() + " " + getId(), e); } }