From 1b78be689a31a4dffc82f5d2827928dc47b520db Mon Sep 17 00:00:00 2001 From: woodser Date: Wed, 5 Jan 2022 14:04:08 -0500 Subject: [PATCH] maker waits for ack on sign offer request --- .../tasks/MakerSendsSignOfferRequest.java | 30 +++++++++++++++++-- .../tasks/UpdateMultisigWithTradingPeer.java | 8 +---- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/bisq/core/offer/placeoffer/tasks/MakerSendsSignOfferRequest.java b/core/src/main/java/bisq/core/offer/placeoffer/tasks/MakerSendsSignOfferRequest.java index f403a544a8..89a97ea3ff 100644 --- a/core/src/main/java/bisq/core/offer/placeoffer/tasks/MakerSendsSignOfferRequest.java +++ b/core/src/main/java/bisq/core/offer/placeoffer/tasks/MakerSendsSignOfferRequest.java @@ -27,6 +27,10 @@ import bisq.core.offer.Offer; import bisq.core.offer.messages.SignOfferRequest; import bisq.core.offer.placeoffer.PlaceOfferModel; import bisq.core.support.dispute.mediation.mediator.Mediator; +import bisq.network.p2p.AckMessage; +import bisq.network.p2p.DecryptedDirectMessageListener; +import bisq.network.p2p.DecryptedMessageWithPubKey; +import bisq.network.p2p.NodeAddress; import bisq.network.p2p.P2PService; import bisq.network.p2p.SendDirectMessageListener; import java.util.Date; @@ -36,6 +40,8 @@ import org.slf4j.LoggerFactory; public class MakerSendsSignOfferRequest extends Task { private static final Logger log = LoggerFactory.getLogger(MakerSendsSignOfferRequest.class); + + private boolean failed = false; @SuppressWarnings({"unused"}) public MakerSendsSignOfferRequest(TaskRunner taskHandler, PlaceOfferModel model) { @@ -69,14 +75,34 @@ public class MakerSendsSignOfferRequest extends Task { // get signing arbitrator Mediator arbitrator = checkNotNull(model.getUser().getAcceptedMediatorByAddress(offer.getOfferPayload().getArbitratorSigner()), "user.getAcceptedMediatorByAddress(mediatorNodeAddress) must not be null"); + + // complete on successful ack message + DecryptedDirectMessageListener ackListener = new DecryptedDirectMessageListener() { + @Override + public void onDirectMessage(DecryptedMessageWithPubKey decryptedMessageWithPubKey, NodeAddress sender) { + if (!(decryptedMessageWithPubKey.getNetworkEnvelope() instanceof AckMessage)) return; + if (!sender.equals(arbitrator.getNodeAddress())) return; + AckMessage ackMessage = (AckMessage) decryptedMessageWithPubKey.getNetworkEnvelope(); + if (!ackMessage.getSourceMsgClassName().equals(SignOfferRequest.class.getSimpleName())) return; + if (ackMessage.isSuccess()) { + offer.setState(Offer.State.OFFER_FEE_RESERVED); + model.getP2PService().removeDecryptedDirectMessageListener(this); + complete(); + } else { + if (!failed) { + failed = true; + failed(ackMessage.getErrorMessage()); // TODO: (woodser): only fail once? build into task? + } + } + } + }; + model.getP2PService().addDecryptedDirectMessageListener(ackListener); // send request model.getP2PService().sendEncryptedDirectMessage(arbitrator.getNodeAddress(), arbitrator.getPubKeyRing(), request, new SendDirectMessageListener() { @Override public void onArrived() { - offer.setState(Offer.State.OFFER_FEE_RESERVED); log.info("{} arrived: arbitrator={}; offerId={}; uid={}", request.getClass().getSimpleName(), arbitrator.getNodeAddress(), offer.getId()); - complete(); } @Override public void onFault(String errorMessage) { diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/UpdateMultisigWithTradingPeer.java b/core/src/main/java/bisq/core/trade/protocol/tasks/UpdateMultisigWithTradingPeer.java index 61deace58c..007a21a6cb 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/UpdateMultisigWithTradingPeer.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/UpdateMultisigWithTradingPeer.java @@ -71,16 +71,10 @@ public class UpdateMultisigWithTradingPeer extends TradeTask { @Override public void onVerifiedTradeMessage(TradeMessage message, NodeAddress sender) { if (!(message instanceof UpdateMultisigResponse)) return; - - System.out.println("Received UpdateMultisigResponse!!!"); - System.out.println(message); - System.out.println(sender); - UpdateMultisigResponse response = (UpdateMultisigResponse) message; - int numOutputsSigned = multisigWallet.importMultisigHex(Arrays.asList(response.getUpdatedMultisigHex())); + multisigWallet.importMultisigHex(Arrays.asList(response.getUpdatedMultisigHex())); multisigWallet.sync(); multisigWallet.save(); - System.out.println("Num outputs signed with imported multisig hex: " + numOutputsSigned); trade.removeListener(updateMultisigResponseListener); complete(); }