reset offer protocol after first result

This commit is contained in:
woodser 2025-04-12 06:32:53 -04:00 committed by woodser
parent 31782e5255
commit 9a5d2d5862
2 changed files with 38 additions and 17 deletions

View file

@ -937,9 +937,9 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
log.info("Adding open offer {}", openOffer.getId()); log.info("Adding open offer {}", openOffer.getId());
synchronized (openOffers.getList()) { synchronized (openOffers.getList()) {
openOffers.add(openOffer); openOffers.add(openOffer);
} if (openOffer.getOffer().getOfferPayload().getReserveTxKeyImages() != null) {
if (openOffer.getOffer().getOfferPayload().getReserveTxKeyImages() != null) { xmrConnectionService.getKeyImagePoller().addKeyImages(openOffer.getOffer().getOfferPayload().getReserveTxKeyImages(), OPEN_OFFER_GROUP_KEY_IMAGE_ID);
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()); log.info("Removing open offer {}", openOffer.getId());
synchronized (openOffers.getList()) { synchronized (openOffers.getList()) {
openOffers.remove(openOffer); 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()); // cancel place offer protocol
if (protocol != null) protocol.cancelOffer(); ThreadUtils.execute(() -> {
} synchronized (processOffersLock) {
if (openOffer.getOffer().getOfferPayload().getReserveTxKeyImages() != null) { synchronized (placeOfferProtocols) {
xmrConnectionService.getKeyImagePoller().removeKeyImages(openOffer.getOffer().getOfferPayload().getReserveTxKeyImages(), OPEN_OFFER_GROUP_KEY_IMAGE_ID); PlaceOfferProtocol protocol = placeOfferProtocols.remove(openOffer.getId());
} if (protocol != null) protocol.cancelOffer();
}
}
}, THREAD_ID);
} }
private void cancelOpenOffersOnSpent(String keyImage) { private void cancelOpenOffersOnSpent(String keyImage) {
@ -1455,7 +1461,8 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
private void signAndPostOffer(OpenOffer openOffer, private void signAndPostOffer(OpenOffer openOffer,
boolean useSavingsWallet, // TODO: remove this? boolean useSavingsWallet, // TODO: remove this?
TransactionResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { TransactionResultHandler resultHandler,
ErrorMessageHandler errorMessageHandler) {
log.info("Signing and posting offer " + openOffer.getId()); log.info("Signing and posting offer " + openOffer.getId());
// create model // create model

View file

@ -31,6 +31,8 @@ import haveno.core.offer.placeoffer.tasks.ValidateOffer;
import haveno.core.trade.handlers.TransactionResultHandler; import haveno.core.trade.handlers.TransactionResultHandler;
import haveno.core.trade.protocol.TradeProtocol; import haveno.core.trade.protocol.TradeProtocol;
import haveno.network.p2p.NodeAddress; import haveno.network.p2p.NodeAddress;
import org.bitcoinj.core.Transaction;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -39,8 +41,8 @@ public class PlaceOfferProtocol {
private final PlaceOfferModel model; private final PlaceOfferModel model;
private Timer timeoutTimer; private Timer timeoutTimer;
private final TransactionResultHandler resultHandler; private TransactionResultHandler resultHandler;
private final ErrorMessageHandler errorMessageHandler; private ErrorMessageHandler errorMessageHandler;
private TaskRunner<PlaceOfferModel> taskRunner; private TaskRunner<PlaceOfferModel> taskRunner;
@ -118,7 +120,7 @@ public class PlaceOfferProtocol {
() -> { () -> {
log.debug("sequence at handleSignOfferResponse completed"); log.debug("sequence at handleSignOfferResponse completed");
stopTimeoutTimer(); stopTimeoutTimer();
resultHandler.handleResult(model.getTransaction()); // TODO (woodser): XMR transaction instead handleResult(model.getTransaction()); // TODO: use XMR transaction instead
}, },
(errorMessage) -> { (errorMessage) -> {
if (model.isOfferAddedToOfferBook()) { if (model.isOfferAddedToOfferBook()) {
@ -140,21 +142,27 @@ public class PlaceOfferProtocol {
taskRunner.run(); taskRunner.run();
} }
public void startTimeoutTimer() { public synchronized void startTimeoutTimer() {
if (resultHandler == null) return;
stopTimeoutTimer(); stopTimeoutTimer();
timeoutTimer = UserThread.runAfter(() -> { timeoutTimer = UserThread.runAfter(() -> {
handleError(Res.get("createOffer.timeoutAtPublishing")); handleError(Res.get("createOffer.timeoutAtPublishing"));
}, TradeProtocol.TRADE_STEP_TIMEOUT_SECONDS); }, TradeProtocol.TRADE_STEP_TIMEOUT_SECONDS);
} }
private void stopTimeoutTimer() { private synchronized void stopTimeoutTimer() {
if (timeoutTimer != null) { if (timeoutTimer != null) {
timeoutTimer.stop(); timeoutTimer.stop();
timeoutTimer = null; 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) { if (timeoutTimer != null) {
taskRunner.cancel(); taskRunner.cancel();
if (!model.getOpenOffer().isCanceled()) { if (!model.getOpenOffer().isCanceled()) {
@ -163,5 +171,11 @@ public class PlaceOfferProtocol {
stopTimeoutTimer(); stopTimeoutTimer();
errorMessageHandler.handleErrorMessage(errorMessage); errorMessageHandler.handleErrorMessage(errorMessage);
} }
resetHandlers();
}
private synchronized void resetHandlers() {
resultHandler = null;
errorMessageHandler = null;
} }
} }