From 513be9f298968ae3546965b3391565d09d4ecb27 Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Sat, 12 Apr 2025 06:32:53 -0400 Subject: [PATCH] reset offer protocol after first result --- .../haveno/core/offer/OpenOfferManager.java | 29 ++++++++++++------- .../offer/placeoffer/PlaceOfferProtocol.java | 26 +++++++++++++---- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/haveno/core/offer/OpenOfferManager.java b/core/src/main/java/haveno/core/offer/OpenOfferManager.java index 64c6c86a15..37983347af 100644 --- a/core/src/main/java/haveno/core/offer/OpenOfferManager.java +++ b/core/src/main/java/haveno/core/offer/OpenOfferManager.java @@ -937,9 +937,9 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe log.info("Adding open offer {}", openOffer.getId()); synchronized (openOffers.getList()) { openOffers.add(openOffer); - } - if (openOffer.getOffer().getOfferPayload().getReserveTxKeyImages() != null) { - xmrConnectionService.getKeyImagePoller().addKeyImages(openOffer.getOffer().getOfferPayload().getReserveTxKeyImages(), OPEN_OFFER_GROUP_KEY_IMAGE_ID); + if (openOffer.getOffer().getOfferPayload().getReserveTxKeyImages() != null) { + xmrConnectionService.getKeyImagePoller().addKeyImages(openOffer.getOffer().getOfferPayload().getReserveTxKeyImages(), OPEN_OFFER_GROUP_KEY_IMAGE_ID); + } } } @@ -947,14 +947,20 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe log.info("Removing open offer {}", openOffer.getId()); synchronized (openOffers.getList()) { openOffers.remove(openOffer); + if (openOffer.getOffer().getOfferPayload().getReserveTxKeyImages() != null) { + xmrConnectionService.getKeyImagePoller().removeKeyImages(openOffer.getOffer().getOfferPayload().getReserveTxKeyImages(), OPEN_OFFER_GROUP_KEY_IMAGE_ID); + } } - synchronized (placeOfferProtocols) { - PlaceOfferProtocol protocol = placeOfferProtocols.remove(openOffer.getId()); - if (protocol != null) protocol.cancelOffer(); - } - if (openOffer.getOffer().getOfferPayload().getReserveTxKeyImages() != null) { - xmrConnectionService.getKeyImagePoller().removeKeyImages(openOffer.getOffer().getOfferPayload().getReserveTxKeyImages(), OPEN_OFFER_GROUP_KEY_IMAGE_ID); - } + + // cancel place offer protocol + ThreadUtils.execute(() -> { + synchronized (processOffersLock) { + synchronized (placeOfferProtocols) { + PlaceOfferProtocol protocol = placeOfferProtocols.remove(openOffer.getId()); + if (protocol != null) protocol.cancelOffer(); + } + } + }, THREAD_ID); } private void cancelOpenOffersOnSpent(String keyImage) { @@ -1455,7 +1461,8 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe private void signAndPostOffer(OpenOffer openOffer, boolean useSavingsWallet, // TODO: remove this? - TransactionResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + TransactionResultHandler resultHandler, + ErrorMessageHandler errorMessageHandler) { log.info("Signing and posting offer " + openOffer.getId()); // create model diff --git a/core/src/main/java/haveno/core/offer/placeoffer/PlaceOfferProtocol.java b/core/src/main/java/haveno/core/offer/placeoffer/PlaceOfferProtocol.java index 91e413eed4..f5def0a433 100644 --- a/core/src/main/java/haveno/core/offer/placeoffer/PlaceOfferProtocol.java +++ b/core/src/main/java/haveno/core/offer/placeoffer/PlaceOfferProtocol.java @@ -31,6 +31,8 @@ import haveno.core.offer.placeoffer.tasks.ValidateOffer; import haveno.core.trade.handlers.TransactionResultHandler; import haveno.core.trade.protocol.TradeProtocol; import haveno.network.p2p.NodeAddress; + +import org.bitcoinj.core.Transaction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,8 +41,8 @@ public class PlaceOfferProtocol { private final PlaceOfferModel model; private Timer timeoutTimer; - private final TransactionResultHandler resultHandler; - private final ErrorMessageHandler errorMessageHandler; + private TransactionResultHandler resultHandler; + private ErrorMessageHandler errorMessageHandler; private TaskRunner taskRunner; @@ -118,7 +120,7 @@ public class PlaceOfferProtocol { () -> { log.debug("sequence at handleSignOfferResponse completed"); stopTimeoutTimer(); - resultHandler.handleResult(model.getTransaction()); // TODO (woodser): XMR transaction instead + handleResult(model.getTransaction()); // TODO: use XMR transaction instead }, (errorMessage) -> { if (model.isOfferAddedToOfferBook()) { @@ -140,21 +142,27 @@ public class PlaceOfferProtocol { taskRunner.run(); } - public void startTimeoutTimer() { + public synchronized void startTimeoutTimer() { + if (resultHandler == null) return; stopTimeoutTimer(); timeoutTimer = UserThread.runAfter(() -> { handleError(Res.get("createOffer.timeoutAtPublishing")); }, TradeProtocol.TRADE_STEP_TIMEOUT_SECONDS); } - private void stopTimeoutTimer() { + private synchronized void stopTimeoutTimer() { if (timeoutTimer != null) { timeoutTimer.stop(); timeoutTimer = null; } } - private void handleError(String errorMessage) { + private synchronized void handleResult(Transaction transaction) { + resultHandler.handleResult(transaction); + resetHandlers(); + } + + private synchronized void handleError(String errorMessage) { if (timeoutTimer != null) { taskRunner.cancel(); if (!model.getOpenOffer().isCanceled()) { @@ -163,5 +171,11 @@ public class PlaceOfferProtocol { stopTimeoutTimer(); errorMessageHandler.handleErrorMessage(errorMessage); } + resetHandlers(); + } + + private synchronized void resetHandlers() { + resultHandler = null; + errorMessageHandler = null; } }