From 8b1d2aa203d4a680fe69ce502955232f9947ebcd Mon Sep 17 00:00:00 2001
From: woodser <13068859+woodser@users.noreply.github.com>
Date: Thu, 6 Mar 2025 10:53:18 -0500
Subject: [PATCH] fix bug to delete scheduled failed trade after restart

---
 core/src/main/java/haveno/core/trade/Trade.java     | 13 +++++++++----
 .../main/java/haveno/core/trade/TradeManager.java   |  8 ++++----
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/core/src/main/java/haveno/core/trade/Trade.java b/core/src/main/java/haveno/core/trade/Trade.java
index 6ad8e7aef3..ed4a8ce8b0 100644
--- a/core/src/main/java/haveno/core/trade/Trade.java
+++ b/core/src/main/java/haveno/core/trade/Trade.java
@@ -1618,15 +1618,16 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
         // done if wallet already deleted
         if (!walletExists()) return;
 
-        // move to failed trades
-        processModel.getTradeManager().onMoveInvalidTradeToFailedTrades(this);
-
         // set error height
         if (processModel.getTradeProtocolErrorHeight() == 0) {
             log.warn("Scheduling to remove trade if unfunded for {} {} from height {}", getClass().getSimpleName(), getId(), xmrConnectionService.getLastInfo().getHeight());
-            processModel.setTradeProtocolErrorHeight(xmrConnectionService.getLastInfo().getHeight());
+            processModel.setTradeProtocolErrorHeight(xmrConnectionService.getLastInfo().getHeight()); // height denotes scheduled error handling
         }
 
+        // move to failed trades
+        processModel.getTradeManager().onMoveInvalidTradeToFailedTrades(this);
+        requestPersistence();
+
         // listen for deposits published to restore trade
         protocolErrorStateSubscription = EasyBind.subscribe(stateProperty(), state -> {
             if (isDepositsPublished()) {
@@ -1680,6 +1681,10 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
         });
     }
 
+    public boolean isProtocolErrorHandlingScheduled() {
+        return processModel.getTradeProtocolErrorHeight() > 0;
+    }
+
     private void restoreDepositsPublishedTrade() {
 
         // close open offer
diff --git a/core/src/main/java/haveno/core/trade/TradeManager.java b/core/src/main/java/haveno/core/trade/TradeManager.java
index caabdb384a..8e5b5d9dd8 100644
--- a/core/src/main/java/haveno/core/trade/TradeManager.java
+++ b/core/src/main/java/haveno/core/trade/TradeManager.java
@@ -450,8 +450,8 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
                             return;
                         }
 
-                        // skip if marked as failed
-                        if (failedTradesManager.getObservableList().contains(trade)) {
+                        // skip if failed and error handling not scheduled
+                        if (failedTradesManager.getObservableList().contains(trade) && !trade.isProtocolErrorHandlingScheduled()) {
                             log.warn("Skipping initialization of failed trade {} {}", trade.getClass().getSimpleName(), trade.getId());
                             tradesToSkip.add(trade);
                             return;
@@ -460,8 +460,8 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
                         // initialize trade
                         initPersistedTrade(trade);
 
-                        // remove trade if protocol didn't initialize
-                        if (getOpenTradeByUid(trade.getUid()).isPresent() && !trade.isDepositsPublished()) {
+                        // record if protocol didn't initialize
+                        if (!trade.isDepositsPublished()) {
                             uninitializedTrades.add(trade);
                         }
                     } catch (Exception e) {