Skip to content

Commit fdcfec8

Browse files
committed
do not revert trade funds on init timeout until error processing
1 parent deb92b7 commit fdcfec8

File tree

3 files changed

+27
-15
lines changed

3 files changed

+27
-15
lines changed

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

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1812,27 +1812,17 @@ public void onProtocolInitializationError() {
18121812
return;
18131813
}
18141814

1815-
// unreserve taker's key images
1816-
if (this instanceof TakerTrade) {
1817-
ThreadUtils.submitToPool(() -> {
1818-
xmrWalletService.thawOutputs(getSelf().getReserveTxKeyImages());
1819-
});
1820-
}
1821-
1822-
// unreserve maker's open offer
1823-
Optional<OpenOffer> openOffer = processModel.getOpenOfferManager().getOpenOffer(this.getId());
1824-
if (this instanceof MakerTrade && openOffer.isPresent()) {
1825-
processModel.getOpenOfferManager().unreserveOpenOffer(openOffer.get());
1826-
}
1827-
18281815
// remove if deposit not requested or is failed
18291816
if (!isDepositRequested() || isDepositRequestFailed()) {
18301817
removeTradeOnError();
18311818
return;
18321819
}
18331820

18341821
// done if wallet already deleted
1835-
if (!walletExists()) return;
1822+
if (!walletExists()) {
1823+
removeTradeOnError();
1824+
return;
1825+
}
18361826

18371827
// set error height
18381828
if (processModel.getTradeProtocolErrorHeight() == 0) {
@@ -1927,6 +1917,19 @@ private void removeTradeOnError() {
19271917
forceCloseWallet();
19281918
if (isDepositRequested()) getWallet();
19291919

1920+
// unreserve taker's key images
1921+
if (this instanceof TakerTrade) {
1922+
ThreadUtils.submitToPool(() -> {
1923+
xmrWalletService.thawOutputs(getSelf().getReserveTxKeyImages());
1924+
});
1925+
}
1926+
1927+
// unreserve maker's open offer
1928+
Optional<OpenOffer> openOffer = processModel.getOpenOfferManager().getOpenOffer(this.getId());
1929+
if (this instanceof MakerTrade && openOffer.isPresent()) {
1930+
processModel.getOpenOfferManager().unreserveOpenOffer(openOffer.get());
1931+
}
1932+
19301933
// clear and shut down trade
19311934
onShutDownStarted();
19321935
clearAndShutDown();

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ private void initTrades() {
445445
Set<Trade> uninitializedTrades = new HashSet<Trade>();
446446
for (Trade trade : trades) {
447447
Runnable initTradeTask = getInitTradeTask(trade, trades, tradesToSkip, uninitializedTrades, uids);
448-
if (trade.isDepositsPublished() && !trade.isPayoutUnlocked()) initTasksP1.add(initTradeTask);
448+
if (trade.isDepositRequested() && !trade.isPayoutUnlocked()) initTasksP1.add(initTradeTask);
449449
else initTasksP2.add(initTradeTask);
450450
};
451451
ThreadUtils.awaitTasks(initTasksP1, threadPoolSize);
@@ -920,6 +920,10 @@ public void onTakeOffer(BigInteger amount,
920920
// ensure trade is not already open
921921
Optional<Trade> tradeOptional = getOpenTrade(offer.getId());
922922
if (tradeOptional.isPresent()) throw new RuntimeException("Cannot create trade protocol because trade with ID " + offer.getId() + " is already open");
923+
924+
// ensure failed trade is not processing
925+
tradeOptional = getFailedTrade(offer.getId());
926+
if (tradeOptional.isPresent() && tradeOptional.get().walletExists()) throw new RuntimeException("Cannot create trade protocol because trade with ID " + offer.getId() + " has failed but is not processed");
923927

924928
// create trade
925929
Trade trade;

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,11 @@ protected void handle(PaymentSentMessage message, NodeAddress peer, boolean repr
536536
return;
537537
}
538538

539+
// log warning if trade not open
540+
if (!processModel.getTradeManager().hasOpenTrade(trade)) {
541+
log.warn("We received a PaymentSentMessage for {} {} but it is not an open trade. This can happen if the trade is pending processing as a failed trade.", trade.getClass().getSimpleName(), trade.getId());
542+
}
543+
539544
// validate signature
540545
try {
541546
HavenoUtils.verifyPaymentSentMessage(trade, message);

0 commit comments

Comments
 (0)