Merge pull request #6998 from jmacxx/allow_mediation_failed_closed_trades

Allow mediation of failed and closed trades
This commit is contained in:
Alejandro García 2024-01-14 11:48:59 +00:00 committed by GitHub
commit 5872e9e1d6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 42 additions and 15 deletions

View file

@ -371,7 +371,7 @@ class CoreTradesService {
failedTradesManager.getTradeById(tradeId).ifPresentOrElse(failedTrade -> { failedTradesManager.getTradeById(tradeId).ifPresentOrElse(failedTrade -> {
verifyCanUnfailTrade(failedTrade); verifyCanUnfailTrade(failedTrade);
failedTradesManager.removeTrade(failedTrade); failedTradesManager.removeTrade(failedTrade);
tradeManager.addFailedTradeToPendingTrades(failedTrade); tradeManager.addTradeToPendingTrades(failedTrade);
log.info("Failed trade {} changed to open trade.", tradeId); log.info("Failed trade {} changed to open trade.", tradeId);
}, () -> { }, () -> {
throw new NotFoundException(format("failed trade '%s' not found", tradeId)); throw new NotFoundException(format("failed trade '%s' not found", tradeId));

View file

@ -38,6 +38,7 @@ import bisq.core.support.dispute.messages.PeerOpenedDisputeMessage;
import bisq.core.support.messages.ChatMessage; import bisq.core.support.messages.ChatMessage;
import bisq.core.trade.ClosedTradableManager; import bisq.core.trade.ClosedTradableManager;
import bisq.core.trade.TradeManager; import bisq.core.trade.TradeManager;
import bisq.core.trade.bisq_v1.FailedTradesManager;
import bisq.core.trade.bisq_v1.TradeDataValidation; import bisq.core.trade.bisq_v1.TradeDataValidation;
import bisq.core.trade.model.bisq_v1.Contract; import bisq.core.trade.model.bisq_v1.Contract;
import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.trade.model.bisq_v1.Trade;
@ -91,6 +92,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
protected final BtcWalletService btcWalletService; protected final BtcWalletService btcWalletService;
protected final TradeManager tradeManager; protected final TradeManager tradeManager;
protected final ClosedTradableManager closedTradableManager; protected final ClosedTradableManager closedTradableManager;
private final FailedTradesManager failedTradesManager;
protected final OpenOfferManager openOfferManager; protected final OpenOfferManager openOfferManager;
protected final PubKeyRing pubKeyRing; protected final PubKeyRing pubKeyRing;
protected final DisputeListService<T> disputeListService; protected final DisputeListService<T> disputeListService;
@ -116,6 +118,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
WalletsSetup walletsSetup, WalletsSetup walletsSetup,
TradeManager tradeManager, TradeManager tradeManager,
ClosedTradableManager closedTradableManager, ClosedTradableManager closedTradableManager,
FailedTradesManager failedTradesManager,
OpenOfferManager openOfferManager, OpenOfferManager openOfferManager,
DaoFacade daoFacade, DaoFacade daoFacade,
KeyRing keyRing, KeyRing keyRing,
@ -128,6 +131,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
this.btcWalletService = btcWalletService; this.btcWalletService = btcWalletService;
this.tradeManager = tradeManager; this.tradeManager = tradeManager;
this.closedTradableManager = closedTradableManager; this.closedTradableManager = closedTradableManager;
this.failedTradesManager = failedTradesManager;
this.openOfferManager = openOfferManager; this.openOfferManager = openOfferManager;
this.daoFacade = daoFacade; this.daoFacade = daoFacade;
this.pubKeyRing = keyRing.getPubKeyRing(); this.pubKeyRing = keyRing.getPubKeyRing();
@ -447,21 +451,37 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
// Not-dispute-requester receives that msg from dispute agent // Not-dispute-requester receives that msg from dispute agent
protected void onPeerOpenedDisputeMessage(PeerOpenedDisputeMessage peerOpenedDisputeMessage) { protected void onPeerOpenedDisputeMessage(PeerOpenedDisputeMessage peerOpenedDisputeMessage) {
Dispute dispute = peerOpenedDisputeMessage.getDispute();
tradeManager.getTradeById(dispute.getTradeId()).ifPresentOrElse(
trade -> peerOpenedDisputeForTrade(peerOpenedDisputeMessage, dispute, trade),
() -> closedTradableManager.getTradableById(dispute.getTradeId()).ifPresentOrElse(
closedTradable -> newDisputeRevertsClosedTrade(peerOpenedDisputeMessage, dispute, (Trade)closedTradable),
() -> failedTradesManager.getTradeById(dispute.getTradeId()).ifPresent(
trade -> newDisputeRevertsFailedTrade(peerOpenedDisputeMessage, dispute, trade))));
}
private void newDisputeRevertsFailedTrade(PeerOpenedDisputeMessage peerOpenedDisputeMessage, Dispute dispute, Trade trade) {
log.info("Peer dispute ticket received, reverting failed trade {} to pending", trade.getShortId());
failedTradesManager.removeTrade(trade);
tradeManager.addTradeToPendingTrades(trade);
peerOpenedDisputeForTrade(peerOpenedDisputeMessage, dispute, trade);
}
private void newDisputeRevertsClosedTrade(PeerOpenedDisputeMessage peerOpenedDisputeMessage, Dispute dispute, Trade trade) {
log.info("Peer dispute ticket received, reverting closed trade {} to pending", trade.getShortId());
closedTradableManager.remove(trade);
tradeManager.addTradeToPendingTrades(trade);
peerOpenedDisputeForTrade(peerOpenedDisputeMessage, dispute, trade);
}
private void peerOpenedDisputeForTrade(PeerOpenedDisputeMessage peerOpenedDisputeMessage, Dispute dispute, Trade trade) {
String errorMessage = null;
T disputeList = getDisputeList(); T disputeList = getDisputeList();
if (disputeList == null) { if (disputeList == null) {
log.warn("disputes is null"); log.warn("disputes is null");
return; return;
} }
String errorMessage = null;
Dispute dispute = peerOpenedDisputeMessage.getDispute();
Optional<Trade> optionalTrade = tradeManager.getTradeById(dispute.getTradeId());
if (optionalTrade.isEmpty()) {
return;
}
Trade trade = optionalTrade.get();
try { try {
DisputeValidation.validateDisputeData(dispute, btcWalletService); DisputeValidation.validateDisputeData(dispute, btcWalletService);
DisputeValidation.validateNodeAddresses(dispute, config); DisputeValidation.validateNodeAddresses(dispute, config);

View file

@ -42,6 +42,7 @@ import bisq.core.support.messages.ChatMessage;
import bisq.core.support.messages.SupportMessage; import bisq.core.support.messages.SupportMessage;
import bisq.core.trade.ClosedTradableManager; import bisq.core.trade.ClosedTradableManager;
import bisq.core.trade.TradeManager; import bisq.core.trade.TradeManager;
import bisq.core.trade.bisq_v1.FailedTradesManager;
import bisq.core.trade.model.Tradable; import bisq.core.trade.model.Tradable;
import bisq.core.trade.model.bisq_v1.Contract; import bisq.core.trade.model.bisq_v1.Contract;
import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.trade.model.bisq_v1.Trade;
@ -91,13 +92,14 @@ public final class ArbitrationManager extends DisputeManager<ArbitrationDisputeL
WalletsSetup walletsSetup, WalletsSetup walletsSetup,
TradeManager tradeManager, TradeManager tradeManager,
ClosedTradableManager closedTradableManager, ClosedTradableManager closedTradableManager,
FailedTradesManager failedTradesManager,
OpenOfferManager openOfferManager, OpenOfferManager openOfferManager,
DaoFacade daoFacade, DaoFacade daoFacade,
KeyRing keyRing, KeyRing keyRing,
ArbitrationDisputeListService arbitrationDisputeListService, ArbitrationDisputeListService arbitrationDisputeListService,
Config config, Config config,
PriceFeedService priceFeedService) { PriceFeedService priceFeedService) {
super(p2PService, tradeWalletService, walletService, walletsSetup, tradeManager, closedTradableManager, super(p2PService, tradeWalletService, walletService, walletsSetup, tradeManager, closedTradableManager, failedTradesManager,
openOfferManager, daoFacade, keyRing, arbitrationDisputeListService, config, priceFeedService); openOfferManager, daoFacade, keyRing, arbitrationDisputeListService, config, priceFeedService);
} }

View file

@ -37,6 +37,7 @@ import bisq.core.support.messages.ChatMessage;
import bisq.core.support.messages.SupportMessage; import bisq.core.support.messages.SupportMessage;
import bisq.core.trade.ClosedTradableManager; import bisq.core.trade.ClosedTradableManager;
import bisq.core.trade.TradeManager; import bisq.core.trade.TradeManager;
import bisq.core.trade.bisq_v1.FailedTradesManager;
import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.trade.model.bisq_v1.Trade;
import bisq.core.trade.protocol.bisq_v1.DisputeProtocol; import bisq.core.trade.protocol.bisq_v1.DisputeProtocol;
import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; import bisq.core.trade.protocol.bisq_v1.model.ProcessModel;
@ -88,13 +89,14 @@ public final class MediationManager extends DisputeManager<MediationDisputeList>
WalletsSetup walletsSetup, WalletsSetup walletsSetup,
TradeManager tradeManager, TradeManager tradeManager,
ClosedTradableManager closedTradableManager, ClosedTradableManager closedTradableManager,
FailedTradesManager failedTradesManager,
OpenOfferManager openOfferManager, OpenOfferManager openOfferManager,
DaoFacade daoFacade, DaoFacade daoFacade,
KeyRing keyRing, KeyRing keyRing,
MediationDisputeListService mediationDisputeListService, MediationDisputeListService mediationDisputeListService,
Config config, Config config,
PriceFeedService priceFeedService) { PriceFeedService priceFeedService) {
super(p2PService, tradeWalletService, walletService, walletsSetup, tradeManager, closedTradableManager, super(p2PService, tradeWalletService, walletService, walletsSetup, tradeManager, closedTradableManager, failedTradesManager,
openOfferManager, daoFacade, keyRing, mediationDisputeListService, config, priceFeedService); openOfferManager, daoFacade, keyRing, mediationDisputeListService, config, priceFeedService);
p2PService.getNetworkNode().addMessageListener(this); // listening for FileTransferPart message p2PService.getNetworkNode().addMessageListener(this); // listening for FileTransferPart message
} }

View file

@ -39,6 +39,7 @@ import bisq.core.support.messages.ChatMessage;
import bisq.core.support.messages.SupportMessage; import bisq.core.support.messages.SupportMessage;
import bisq.core.trade.ClosedTradableManager; import bisq.core.trade.ClosedTradableManager;
import bisq.core.trade.TradeManager; import bisq.core.trade.TradeManager;
import bisq.core.trade.bisq_v1.FailedTradesManager;
import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.trade.model.bisq_v1.Trade;
import bisq.network.p2p.AckMessageSourceType; import bisq.network.p2p.AckMessageSourceType;
@ -55,6 +56,7 @@ import bisq.common.util.Tuple2;
import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionConfidence;
import org.bitcoinj.core.TransactionInput; import org.bitcoinj.core.TransactionInput;
import org.bitcoinj.core.TransactionOutPoint; import org.bitcoinj.core.TransactionOutPoint;
import org.bitcoinj.core.TransactionOutput; import org.bitcoinj.core.TransactionOutput;
@ -92,6 +94,7 @@ public final class RefundManager extends DisputeManager<RefundDisputeList> {
WalletsSetup walletsSetup, WalletsSetup walletsSetup,
TradeManager tradeManager, TradeManager tradeManager,
ClosedTradableManager closedTradableManager, ClosedTradableManager closedTradableManager,
FailedTradesManager failedTradesManager,
OpenOfferManager openOfferManager, OpenOfferManager openOfferManager,
DaoFacade daoFacade, DaoFacade daoFacade,
DelayedPayoutTxReceiverService delayedPayoutTxReceiverService, DelayedPayoutTxReceiverService delayedPayoutTxReceiverService,
@ -100,7 +103,7 @@ public final class RefundManager extends DisputeManager<RefundDisputeList> {
Config config, Config config,
PriceFeedService priceFeedService, PriceFeedService priceFeedService,
MempoolService mempoolService) { MempoolService mempoolService) {
super(p2PService, tradeWalletService, walletService, walletsSetup, tradeManager, closedTradableManager, super(p2PService, tradeWalletService, walletService, walletsSetup, tradeManager, closedTradableManager, failedTradesManager,
openOfferManager, daoFacade, keyRing, refundDisputeListService, config, priceFeedService); openOfferManager, daoFacade, keyRing, refundDisputeListService, config, priceFeedService);
this.delayedPayoutTxReceiverService = delayedPayoutTxReceiverService; this.delayedPayoutTxReceiverService = delayedPayoutTxReceiverService;

View file

@ -801,7 +801,7 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
failedTradesManager.add(trade); failedTradesManager.add(trade);
} }
public void addFailedTradeToPendingTrades(Trade trade) { public void addTradeToPendingTrades(Trade trade) {
if (!trade.isInitialized()) { if (!trade.isInitialized()) {
initPersistedTrade(trade); initPersistedTrade(trade);
} }

View file

@ -102,7 +102,7 @@ class FailedTradesDataModel extends ActivatableDataModel {
} }
failedTradesManager.removeTrade(trade); failedTradesManager.removeTrade(trade);
tradeManager.addFailedTradeToPendingTrades(trade); tradeManager.addTradeToPendingTrades(trade);
return true; return true;
} }