Skip to content

Commit 0a31dd4

Browse files
committed
remove potentially stale multisig state on payment received nack
1 parent eb4bfb0 commit 0a31dd4

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

core/src/main/java/haveno/core/trade/protocol/SellerProtocol.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ public void onPaymentReceived(ResultHandler resultHandler, ErrorMessageHandler e
133133
.using(new TradeTaskRunner(trade, () -> {
134134
stopTimeout();
135135
this.errorMessageHandler = null;
136+
buyerNackedPaymentReceivedMessage = false;
137+
arbitratorNackedPaymentReceivedMessage = false;
136138
handleTaskRunnerSuccess(event);
137139
resultHandler.handleResult();
138140
}, (errorMessage) -> {

core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import haveno.common.handlers.ErrorMessageHandler;
4343
import haveno.common.proto.network.NetworkEnvelope;
4444
import haveno.common.taskrunner.Task;
45-
import haveno.core.network.MessageState;
4645
import haveno.core.offer.OpenOffer;
4746
import haveno.core.support.messages.ChatMessage;
4847
import haveno.core.trade.ArbitratorTrade;
@@ -120,6 +119,8 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
120119
private int reprocessPaymentReceivedMessageCount;
121120
private boolean makerInitTradeRequestHasBeenNacked = false;
122121
private boolean autoMarkPaymentReceivedOnNack = true;
122+
protected boolean arbitratorNackedPaymentReceivedMessage = false;
123+
protected boolean buyerNackedPaymentReceivedMessage = false;
123124

124125

125126
///////////////////////////////////////////////////////////////////////////////////////////
@@ -861,6 +862,13 @@ private void onAckMessageAux(AckMessage ackMessage, NodeAddress sender) {
861862
// handle nack
862863
else {
863864
log.warn("We received a NACK for our PaymentReceivedMessage to the buyer for {} {}: {}", trade.getClass().getSimpleName(), trade.getId(), ackMessage.getErrorMessage());
865+
buyerNackedPaymentReceivedMessage = true;
866+
867+
// unless nacked, remove arbitrator's multisig state which can be stale
868+
if (!arbitratorNackedPaymentReceivedMessage) {
869+
log.warn("Resetting arbitrator's multisig state after arbitrator NACKed PaymentReceivedMessage for {} {}", trade.getClass().getSimpleName(), trade.getId());
870+
trade.getArbitrator().setUpdatedMultisigHex(null);
871+
}
864872

865873
// nack includes updated multisig hex since v1.1.1
866874
if (ackMessage.getUpdatedMultisigHex() != null) {
@@ -881,6 +889,13 @@ else if (peer == trade.getArbitrator()) {
881889
// handle nack
882890
if (!ackMessage.isSuccess()) {
883891
log.warn("We received a NACK for our PaymentReceivedMessage to the arbitrator for {} {}: {}", trade.getClass().getSimpleName(), trade.getId(), ackMessage.getErrorMessage());
892+
arbitratorNackedPaymentReceivedMessage = true;
893+
894+
// unless nacked, remove buyer's multisig state which can be stale
895+
if (!buyerNackedPaymentReceivedMessage) {
896+
log.warn("Resetting buyer's multisig state after arbitrator NACKed PaymentReceivedMessage for {} {}", trade.getClass().getSimpleName(), trade.getId());
897+
trade.getBuyer().setUpdatedMultisigHex(null);
898+
}
884899

885900
// nack includes updated multisig hex since v1.1.1
886901
if (ackMessage.getUpdatedMultisigHex() != null) {

0 commit comments

Comments
 (0)