Skip to content

Commit 30bc070

Browse files
committed
do not reset states on restart or payout error
1 parent 654c7c2 commit 30bc070

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -850,15 +850,15 @@ private void checkForUnconfirmedTimeout() {
850850
private void maybeResetTradeState() {
851851
if (isPayoutPublished()) return;
852852

853-
// reset buyer's payment sent state if no ack received
854-
if (this instanceof BuyerTrade && getState().ordinal() >= Trade.State.BUYER_CONFIRMED_PAYMENT_SENT.ordinal() && getState().ordinal() < Trade.State.SELLER_RECEIVED_PAYMENT_SENT_MSG.ordinal() && getState() != Trade.State.BUYER_STORED_IN_MAILBOX_PAYMENT_SENT_MSG) {
855-
log.warn("Resetting state of {} {} from {} to {} because payout is not published", getClass().getSimpleName(), getId(), getState(), Trade.State.DEPOSIT_TXS_UNLOCKED_IN_BLOCKCHAIN);
853+
// reset buyer's payment sent state if applicable
854+
if (this instanceof BuyerTrade && (getState().ordinal() == Trade.State.BUYER_CONFIRMED_PAYMENT_SENT.ordinal() || getState() == State.BUYER_SEND_FAILED_PAYMENT_SENT_MSG)) {
855+
log.warn("Resetting state of {} {} from {} to {} because sending PaymentSentMessage failed", getClass().getSimpleName(), getId(), getState(), Trade.State.DEPOSIT_TXS_UNLOCKED_IN_BLOCKCHAIN);
856856
setState(Trade.State.DEPOSIT_TXS_UNLOCKED_IN_BLOCKCHAIN);
857857
}
858858

859-
// reset seller's payment received state unless stored in mailbox
860-
if (this instanceof SellerTrade && getState().ordinal() >= Trade.State.SELLER_CONFIRMED_PAYMENT_RECEIPT.ordinal() && getState().ordinal() != Trade.State.SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG.ordinal()) {
861-
log.warn("Resetting state of {} {} from {} to {} because payout is not published", getClass().getSimpleName(), getId(), getState(), Trade.State.BUYER_SENT_PAYMENT_SENT_MSG);
859+
// reset seller's payment received state if applicable
860+
if (this instanceof SellerTrade && (getState().ordinal() == Trade.State.SELLER_CONFIRMED_PAYMENT_RECEIPT.ordinal() || getState() == State.SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG)) {
861+
log.warn("Resetting state of {} {} from {} to {} because sending PaymentReceivedMessage failed", getClass().getSimpleName(), getId(), getState(), Trade.State.BUYER_SENT_PAYMENT_SENT_MSG);
862862
resetToPaymentSentState();
863863
}
864864
}
@@ -2405,6 +2405,10 @@ public boolean isPaymentSent() {
24052405
return getState().getPhase().ordinal() >= Phase.PAYMENT_SENT.ordinal() && getState() != State.BUYER_SEND_FAILED_PAYMENT_SENT_MSG;
24062406
}
24072407

2408+
public boolean hasPaymentSentMessage() {
2409+
return (isBuyer() ? getSeller() : getBuyer()).getPaymentSentMessage() != null; // buyer stores message to seller and arbitrator, peers store message from buyer
2410+
}
2411+
24082412
public boolean hasPaymentReceivedMessage() {
24092413
return (isSeller() ? getBuyer() : getSeller()).getPaymentReceivedMessage() != null; // seller stores message to buyer and arbitrator, peers store message from seller
24102414
}
@@ -3050,13 +3054,18 @@ public boolean onPayoutError(boolean syncAndPoll, boolean autoMarkPaymentReceive
30503054
log.warn("Error syncing and polling wallet for {} {}: {}", getClass().getSimpleName(), getId(), e.getMessage());
30513055
}
30523056
}
3053-
if (isPayoutPublished() || !isPaymentSent()) return false;
3057+
if (isPayoutPublished()) return false;
30543058

30553059
// reset trade state
3056-
log.warn("Resetting state to PAYMENT_SENT and clearing previously signed txs for {} {}", getClass().getSimpleName(), getId());
3057-
resetToPaymentSentState();
3060+
log.warn("Resetting trade state after payout error for {} {}", getClass().getSimpleName(), getId());
30583061
getProcessModel().setPaymentSentPayoutTxStale(true);
30593062
getSelf().setUnsignedPayoutTxHex(null);
3063+
setPayoutTxHex(null);
3064+
for (TradePeer peer : getAllPeers()) {
3065+
peer.setPaymentReceivedMessage(null);
3066+
peer.setPaymentReceivedMessageState(MessageState.UNDEFINED);
3067+
}
3068+
30603069
persistNow(null);
30613070

30623071
// automatically mark payment received

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ protected void onInitialized() {
7777
given(anyPhase(Trade.Phase.PAYMENT_RECEIVED)
7878
.with(SellerEvent.STARTUP))
7979
.setup(tasks(
80+
SellerPreparePaymentReceivedMessage.class,
8081
SellerSendPaymentReceivedMessageToBuyer.class,
8182
SellerSendPaymentReceivedMessageToArbitrator.class)
8283
.using(new TradeTaskRunner(trade,

0 commit comments

Comments
 (0)