Skip to content

Commit 4497b5c

Browse files
committed
remove third peer's stale multisig state on payment received nack
1 parent 8086a17 commit 4497b5c

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

core/src/main/java/haveno/core/trade/Trade.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2289,6 +2289,14 @@ public boolean isPaymentSent() {
22892289
return getState().getPhase().ordinal() >= Phase.PAYMENT_SENT.ordinal() && getState() != State.BUYER_SEND_FAILED_PAYMENT_SENT_MSG;
22902290
}
22912291

2292+
public boolean isPaymentMarkedSent() {
2293+
return getState().getPhase().ordinal() >= Phase.PAYMENT_SENT.ordinal();
2294+
}
2295+
2296+
public boolean isPaymentMarkedReceived() {
2297+
return getState().getPhase().ordinal() >= Phase.PAYMENT_RECEIVED.ordinal();
2298+
}
2299+
22922300
public boolean hasPaymentReceivedMessage() {
22932301
return (isSeller() ? getBuyer() : getSeller()).getPaymentReceivedMessage() != null; // seller stores message to buyer and arbitrator, peers store message from seller
22942302
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ private void onAckMessage(AckMessage ackMessage, NodeAddress sender) {
802802
}
803803

804804
// handle ack message for PaymentSentMessage, which automatically re-sends if not ACKed in a certain time
805-
if (ackMessage.getSourceMsgClassName().equals(PaymentSentMessage.class.getSimpleName())) {
805+
if (trade.isPaymentMarkedSent() && ackMessage.getSourceMsgClassName().equals(PaymentSentMessage.class.getSimpleName())) {
806806
if (peer == trade.getSeller()) {
807807
trade.getSeller().setPaymentSentAckMessage(ackMessage);
808808
if (ackMessage.isSuccess()) trade.setStateIfValidTransitionTo(Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG);
@@ -818,7 +818,7 @@ private void onAckMessage(AckMessage ackMessage, NodeAddress sender) {
818818
}
819819

820820
// handle ack message for PaymentReceivedMessage, which automatically re-sends if not ACKed in a certain time
821-
if (ackMessage.getSourceMsgClassName().equals(PaymentReceivedMessage.class.getSimpleName())) {
821+
if (trade.isPaymentMarkedReceived() && ackMessage.getSourceMsgClassName().equals(PaymentReceivedMessage.class.getSimpleName())) {
822822

823823
// ack message from buyer
824824
if (peer == trade.getBuyer()) {
@@ -835,6 +835,9 @@ private void onAckMessage(AckMessage ackMessage, NodeAddress sender) {
835835
else {
836836
log.warn("We received a NACK for our PaymentReceivedMessage to the buyer for {} {}", trade.getClass().getSimpleName(), trade.getId());
837837

838+
// remove arbitrator's multisig which can be stale
839+
trade.getArbitrator().setUpdatedMultisigHex(null);
840+
838841
// nack includes updated multisig hex since v1.1.1
839842
if (ackMessage.getUpdatedMultisigHex() != null) {
840843
trade.getBuyer().setUpdatedMultisigHex(ackMessage.getUpdatedMultisigHex());
@@ -854,6 +857,9 @@ else if (peer == trade.getArbitrator()) {
854857
if (!ackMessage.isSuccess()) {
855858
log.warn("We received a NACK for our PaymentReceivedMessage to the arbitrator for {} {}", trade.getClass().getSimpleName(), trade.getId());
856859

860+
// remove buyer's multisig which can be stale
861+
trade.getArbitrator().setUpdatedMultisigHex(null);
862+
857863
// nack includes updated multisig hex since v1.1.1
858864
if (ackMessage.getUpdatedMultisigHex() != null) {
859865
trade.getArbitrator().setUpdatedMultisigHex(ackMessage.getUpdatedMultisigHex());

0 commit comments

Comments
 (0)