do not remove maker offer on nack due to send message error

This commit is contained in:
woodser 2025-08-15 10:48:11 -04:00 committed by woodser
parent 5b08c66174
commit b0e1d5b4ce
2 changed files with 14 additions and 9 deletions

View file

@ -104,6 +104,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
public static final int REQUEST_CONNECTION_SWITCH_EVERY_NUM_ATTEMPTS = 2; // request connection switch on even attempts public static final int REQUEST_CONNECTION_SWITCH_EVERY_NUM_ATTEMPTS = 2; // request connection switch on even attempts
public static final long REPROCESS_DELAY_MS = 5000; public static final long REPROCESS_DELAY_MS = 5000;
public static final String LOG_HIGHLIGHT = ""; // TODO: how to highlight some logs with cyan? ("\u001B[36m")? coloring works in the terminal but prints character literals to .log files public static final String LOG_HIGHLIGHT = ""; // TODO: how to highlight some logs with cyan? ("\u001B[36m")? coloring works in the terminal but prints character literals to .log files
public static final String SEND_INIT_TRADE_REQUEST_FAILED = "Sending InitTradeRequest failed";
protected final ProcessModel processModel; protected final ProcessModel processModel;
protected final Trade trade; protected final Trade trade;
@ -116,7 +117,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
private boolean depositsConfirmedTasksCalled; private boolean depositsConfirmedTasksCalled;
private int reprocessPaymentSentMessageCount; private int reprocessPaymentSentMessageCount;
private int reprocessPaymentReceivedMessageCount; private int reprocessPaymentReceivedMessageCount;
private boolean makerInitTradeRequestNacked = false; private boolean makerInitTradeRequestHasBeenNacked = false;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Constructor // Constructor
@ -767,13 +768,17 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
// TODO: arbitrator may nack maker's InitTradeRequest if reserve tx has become invalid (e.g. check_tx_key shows 0 funds received). recreate reserve tx in this case // TODO: arbitrator may nack maker's InitTradeRequest if reserve tx has become invalid (e.g. check_tx_key shows 0 funds received). recreate reserve tx in this case
if (!ackMessage.isSuccess() && trade.isMaker() && peer == trade.getArbitrator() && ackMessage.getSourceMsgClassName().equals(InitTradeRequest.class.getSimpleName())) { if (!ackMessage.isSuccess() && trade.isMaker() && peer == trade.getArbitrator() && ackMessage.getSourceMsgClassName().equals(InitTradeRequest.class.getSimpleName())) {
if (makerInitTradeRequestNacked) { if (ackMessage.getErrorMessage() != null && ackMessage.getErrorMessage().contains(SEND_INIT_TRADE_REQUEST_FAILED)) {
handleSecondMakerInitTradeRequestNack(ackMessage); // use default postprocessing to cancel maker's trade if arbitrator cannot send message to taker
// use default postprocessing
} else { } else {
makerInitTradeRequestNacked = true; if (makerInitTradeRequestHasBeenNacked) {
handleFirstMakerInitTradeRequestNack(ackMessage); handleSecondMakerInitTradeRequestNack(ackMessage);
return; // use default postprocessing to cancel maker's trade
} else {
makerInitTradeRequestHasBeenNacked = true;
handleFirstMakerInitTradeRequestNack(ackMessage);
return;
}
} }
} }

View file

@ -25,6 +25,7 @@ import haveno.core.trade.Trade;
import haveno.core.trade.messages.InitMultisigRequest; import haveno.core.trade.messages.InitMultisigRequest;
import haveno.core.trade.messages.InitTradeRequest; import haveno.core.trade.messages.InitTradeRequest;
import haveno.core.trade.protocol.TradePeer; import haveno.core.trade.protocol.TradePeer;
import haveno.core.trade.protocol.TradeProtocol;
import haveno.network.p2p.SendDirectMessageListener; import haveno.network.p2p.SendDirectMessageListener;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import monero.wallet.MoneroWallet; import monero.wallet.MoneroWallet;
@ -95,8 +96,7 @@ public class ArbitratorSendInitTradeOrMultisigRequests extends TradeTask {
} }
@Override @Override
public void onFault(String errorMessage) { public void onFault(String errorMessage) {
log.error("Sending {} failed: uid={}; peer={}; error={}", takerRequest.getClass().getSimpleName(), takerRequest.getUid(), trade.getTaker().getNodeAddress(), errorMessage); appendToErrorMessage(TradeProtocol.SEND_INIT_TRADE_REQUEST_FAILED + ": message=" + takerRequest + "\nerrorMessage=" + errorMessage);
appendToErrorMessage("Sending message failed: message=" + takerRequest + "\nerrorMessage=" + errorMessage);
failed(); failed();
} }
} }