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());
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

View File

@ -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<PlaceOfferModel> 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;
}
}