<p><b>@ManfredKarrer</b> commented on this pull request.</p>

<hr>

<p>In <a href="https://github.com/bisq-network/bisq/pull/3044#discussion_r315920461">core/src/main/java/bisq/core/offer/OpenOfferManager.java</a>:</p>
<pre style='color:#555'>> @@ -97,6 +98,8 @@
     private final P2PService p2PService;
     private final BtcWalletService btcWalletService;
     private final TradeWalletService tradeWalletService;
+    @Inject
+    private TradeManager tradeManager;
</pre>
<p>With a 3rd component as listener for both open offer and trades it works:<br>
Here is a patch:</p>
<pre><code>Index: core/src/main/java/bisq/core/RemoveTradeOrOpenOfferListener.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- core/src/main/java/bisq/core/RemoveTradeOrOpenOfferListener.java    (date 1566337782000)
+++ core/src/main/java/bisq/core/RemoveTradeOrOpenOfferListener.java    (date 1566337782000)
@@ -0,0 +1,88 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bisq is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bisq. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package bisq.core;
+
+import bisq.core.offer.OpenOfferManager;
+import bisq.core.trade.Trade;
+import bisq.core.trade.TradeManager;
+
+import bisq.network.p2p.NodeAddress;
+import bisq.network.p2p.P2PService;
+
+import bisq.common.crypto.PubKeyRing;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Singleton
+public class RemoveTradeOrOpenOfferListener implements TradeManager.RemoveTradeListener, OpenOfferManager.RemoveOpenOfferListener {
+
+    private final TradeManager tradeManager;
+    private final OpenOfferManager openOfferManager;
+    private final P2PService p2PService;
+    private final PubKeyRing pubKeyRing;
+
+    @Inject
+    public RemoveTradeOrOpenOfferListener(TradeManager tradeManager,
+                                          OpenOfferManager openOfferManager,
+                                          P2PService p2PService,
+                                          PubKeyRing pubKeyRing) {
+        this.tradeManager = tradeManager;
+        this.openOfferManager = openOfferManager;
+        this.p2PService = p2PService;
+        this.pubKeyRing = pubKeyRing;
+
+        tradeManager.addRemoveTradeListener(this);
+        openOfferManager.addRemoveOpenOfferListener(this);
+    }
+
+    @Override
+    public void onRemoveTrade() {
+        reportRequiredHiddenServices();
+    }
+
+
+    @Override
+    public void onRemoveOpenOffer() {
+        reportRequiredHiddenServices();
+
+    }
+
+    private void reportRequiredHiddenServices() {
+        // collect all node addresses (hidden services) we still need for active offers/trades
+        Set<NodeAddress> result = new HashSet<>();
+        result.addAll(openOfferManager.getOpenOffers().stream()
+                .map(openOffer -> openOffer.getOffer().getOfferPayload().getOwnerNodeAddress())
+                .collect(Collectors.toSet()));
+        result.addAll(tradeManager.getTradableList().stream()
+                .map(Trade::getContract)
+                .filter(Objects::nonNull)
+                .map(contract -> contract.getMyNodeAddress(pubKeyRing))
+                .collect(Collectors.toSet()));
+
+        p2PService.reportRequiredHiddenServices(result);
+    }
+}
Index: core/src/main/java/bisq/core/app/BisqSetup.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- core/src/main/java/bisq/core/app/BisqSetup.java     (date 1566334741000)
+++ core/src/main/java/bisq/core/app/BisqSetup.java     (date 1566337886000)
@@ -17,6 +17,7 @@
 
 package bisq.core.app;
 
+import bisq.core.RemoveTradeOrOpenOfferListener;
 import bisq.core.account.witness.AccountAgeWitnessService;
 import bisq.core.alert.Alert;
 import bisq.core.alert.AlertManager;
@@ -154,6 +155,8 @@
     private final AssetService assetService;
     private final TorSetup torSetup;
     private final TradeLimits tradeLimits;
+    // Need to keep a reference for RemoveTradeOrOpenOfferListener
+    private final RemoveTradeOrOpenOfferListener removeTradeOrOpenOfferListener;
     private final BSFormatter formatter;
     @Setter
     @Nullable
@@ -232,6 +235,7 @@
                      AssetService assetService,
                      TorSetup torSetup,
                      TradeLimits tradeLimits,
+                     RemoveTradeOrOpenOfferListener removeTradeOrOpenOfferListener,
                      BSFormatter formatter) {
 
 
@@ -272,6 +276,7 @@
         this.assetService = assetService;
         this.torSetup = torSetup;
         this.tradeLimits = tradeLimits;
+        this.removeTradeOrOpenOfferListener = removeTradeOrOpenOfferListener;
         this.formatter = formatter;
     }
 
Index: core/src/main/java/bisq/core/offer/OpenOfferManager.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- core/src/main/java/bisq/core/offer/OpenOfferManager.java    (date 1566334741000)
+++ core/src/main/java/bisq/core/offer/OpenOfferManager.java    (date 1566337963000)
@@ -78,6 +78,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import lombok.Getter;
+
 import org.jetbrains.annotations.NotNull;
 
 import javax.annotation.Nullable;
@@ -87,6 +89,10 @@
 public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMessageListener, PersistedDataHost {
     private static final Logger log = LoggerFactory.getLogger(OpenOfferManager.class);
 
+    public interface RemoveOpenOfferListener {
+        void onRemoveOpenOffer();
+    }
+
     private static final long RETRY_REPUBLISH_DELAY_SEC = 10;
     private static final long REPUBLISH_AGAIN_AT_STARTUP_DELAY_SEC = 30;
     private static final long REPUBLISH_INTERVAL_MS = TimeUnit.MINUTES.toMillis(40);
@@ -108,7 +114,9 @@
     private final Map<String, OpenOffer> offersToBeEdited = new HashMap<>();
     private boolean stopped;
     private Timer periodicRepublishOffersTimer, periodicRefreshOffersTimer, retryRepublishOffersTimer;
+    @Getter
     private TradableList<OpenOffer> openOffers;
+    private List<RemoveOpenOfferListener> removeOpenOfferListeners = new ArrayList<>();
 
 
     ///////////////////////////////////////////////////////////////////////////////////////////
@@ -479,6 +487,7 @@
         }
     }
 
+    //todo
     private void onRemoved(@NotNull OpenOffer openOffer, ResultHandler resultHandler, Offer offer) {
         offer.setState(Offer.State.REMOVED);
         openOffer.setState(OpenOffer.State.CANCELED);
@@ -487,6 +496,8 @@
         log.info("onRemoved offerId={}", offer.getId());
         btcWalletService.resetAddressEntriesForOpenOffer(offer.getId());
         resultHandler.handleResult();
+
+        removeOpenOfferListeners.forEach(RemoveOpenOfferListener::onRemoveOpenOffer);
     }
 
     // Close openOffer after deposit published
@@ -497,6 +508,8 @@
             offerBookService.removeOffer(openOffer.getOffer().getOfferPayload(),
                     () -> log.trace("Successful removed offer"),
                     log::error);
+
+            removeOpenOfferListeners.forEach(RemoveOpenOfferListener::onRemoveOpenOffer);
         });
     }
 
@@ -792,6 +805,10 @@
         startPeriodicRepublishOffersTimer();
     }
 
+    public void addRemoveOpenOfferListener(RemoveOpenOfferListener removeOpenOfferListener) {
+        removeOpenOfferListeners.add(removeOpenOfferListener);
+    }
+
 
     ///////////////////////////////////////////////////////////////////////////////////////////
     // Private
Index: core/src/main/java/bisq/core/trade/Contract.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- core/src/main/java/bisq/core/trade/Contract.java    (date 1566334741000)
+++ core/src/main/java/bisq/core/trade/Contract.java    (date 1566337963000)
@@ -193,6 +193,13 @@
         return isBuyerMakerAndSellerTaker ? makerPubKeyRing : takerPubKeyRing;
     }
 
+    public NodeAddress getMyNodeAddress(PubKeyRing myPubKeyRing) {
+        if (myPubKeyRing.equals(getBuyerPubKeyRing()))
+            return buyerNodeAddress;
+        else
+            return sellerNodeAddress;
+    }
+
     public PubKeyRing getSellerPubKeyRing() {
         return isBuyerMakerAndSellerTaker ? takerPubKeyRing : makerPubKeyRing;
     }
Index: core/src/main/java/bisq/core/trade/TradeManager.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- core/src/main/java/bisq/core/trade/TradeManager.java        (date 1566334741000)
+++ core/src/main/java/bisq/core/trade/TradeManager.java        (date 1566337963000)
@@ -104,6 +104,11 @@
 public class TradeManager implements PersistedDataHost {
     private static final Logger log = LoggerFactory.getLogger(TradeManager.class);
 
+
+    public interface RemoveTradeListener {
+        void onRemoveTrade();
+    }
+
     private final User user;
     private final KeyRing keyRing;
     private final BtcWalletService btcWalletService;
@@ -130,6 +135,7 @@
     private ErrorMessageHandler takeOfferRequestErrorMessageHandler;
     @Getter
     private final LongProperty numPendingTrades = new SimpleLongProperty();
+    private List<RemoveTradeListener> removeTradeListeners = new ArrayList<>();
 
 
     ///////////////////////////////////////////////////////////////////////////////////////////
@@ -543,6 +549,7 @@
         cleanUpAddressEntries();
     }
 
+    //todo
     private void removeTrade(Trade trade) {
         tradableList.remove(trade);
 
@@ -553,6 +560,8 @@
         result.addAll(getTradableList().stream().map(Trade::getContract).filter(Objects::nonNull).map(contract -> contract.getSellerNodeAddress()).collect(Collectors.toSet()));
 
         p2PService.reportRequiredHiddenServices(result);
+
+        removeTradeListeners.forEach(RemoveTradeListener::onRemoveTrade);
     }
 
 
@@ -660,4 +669,8 @@
             }
         });
     }
+
+    public void addRemoveTradeListener(RemoveTradeListener removeTradeListener) {
+        removeTradeListeners.add(removeTradeListener);
+    }
 }

</code></pre>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br />You are receiving this because you are subscribed to this thread.<br />Reply to this email directly, <a href="https://github.com/bisq-network/bisq/pull/3044?email_source=notifications&email_token=AJFFTNVOI3FH52VXIHACKDLQFRRYXA5CNFSM4IIPXYQ2YY3PNVWWK3TUL52HS4DFWFIHK3DMKJSXC5LFON2FEZLWNFSXPKTDN5WW2ZLOORPWSZGOCCE3ZCQ#discussion_r315920461">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/AJFFTNRCLDSJDUEHO7RJYD3QFRRYXANCNFSM4IIPXYQQ">mute the thread</a>.<img src="https://github.com/notifications/beacon/AJFFTNQ2JY7YADEVBHGODA3QFRRYXA5CNFSM4IIPXYQ2YY3PNVWWK3TUL52HS4DFWFIHK3DMKJSXC5LFON2FEZLWNFSXPKTDN5WW2ZLOORPWSZGOCCE3ZCQ.gif" height="1" width="1" alt="" /></p>
<script type="application/ld+json">[
{
"@context": "http://schema.org",
"@type": "EmailMessage",
"potentialAction": {
"@type": "ViewAction",
"target": "https://github.com/bisq-network/bisq/pull/3044?email_source=notifications\u0026email_token=AJFFTNVOI3FH52VXIHACKDLQFRRYXA5CNFSM4IIPXYQ2YY3PNVWWK3TUL52HS4DFWFIHK3DMKJSXC5LFON2FEZLWNFSXPKTDN5WW2ZLOORPWSZGOCCE3ZCQ#discussion_r315920461",
"url": "https://github.com/bisq-network/bisq/pull/3044?email_source=notifications\u0026email_token=AJFFTNVOI3FH52VXIHACKDLQFRRYXA5CNFSM4IIPXYQ2YY3PNVWWK3TUL52HS4DFWFIHK3DMKJSXC5LFON2FEZLWNFSXPKTDN5WW2ZLOORPWSZGOCCE3ZCQ#discussion_r315920461",
"name": "View Pull Request"
},
"description": "View this Pull Request on GitHub",
"publisher": {
"@type": "Organization",
"name": "GitHub",
"url": "https://github.com"
}
}
]</script>