diff --git a/core/src/main/java/io/bitsquare/trade/Trade.java b/core/src/main/java/io/bitsquare/trade/Trade.java index cbfe9304aa..4ae4ffb737 100644 --- a/core/src/main/java/io/bitsquare/trade/Trade.java +++ b/core/src/main/java/io/bitsquare/trade/Trade.java @@ -233,8 +233,6 @@ abstract public class Trade implements Tradable, Model, Serializable { createProtocol(); - tradeProtocol.checkPayoutTxTimeLock(this); - if (decryptedMsgWithPubKey != null) { tradeProtocol.applyMailboxMessage(decryptedMsgWithPubKey, this); } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsOffererProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsOffererProtocol.java index b34bed7578..22a0e5670d 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsOffererProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsOffererProtocol.java @@ -30,9 +30,9 @@ import io.bitsquare.trade.protocol.trade.messages.PayDepositRequest; import io.bitsquare.trade.protocol.trade.messages.TradeMessage; import io.bitsquare.trade.protocol.trade.tasks.buyer.*; import io.bitsquare.trade.protocol.trade.tasks.offerer.*; +import io.bitsquare.trade.protocol.trade.tasks.shared.BroadcastAfterLockTime; import io.bitsquare.trade.protocol.trade.tasks.shared.CommitPayoutTx; import io.bitsquare.trade.protocol.trade.tasks.shared.InitWaitPeriodForOpenDispute; -import io.bitsquare.trade.protocol.trade.tasks.shared.SetupPayoutTxLockTimeReachedListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,7 +56,7 @@ public class BuyerAsOffererProtocol extends TradeProtocol implements BuyerProtoc // If we are after the time lock state we need to setup the listener again Trade.State tradeState = trade.getState(); - if (tradeState.getPhase() == Trade.Phase.PAYOUT_PAID) { + if (tradeState.getPhase() == Trade.Phase.PAYOUT_PAID && tradeState != Trade.State.PAYOUT_BROAD_CASTED) { TradeTaskRunner taskRunner = new TradeTaskRunner(trade, () -> { @@ -65,7 +65,7 @@ public class BuyerAsOffererProtocol extends TradeProtocol implements BuyerProtoc }, this::handleTaskRunnerFault); - taskRunner.addTasks(SetupPayoutTxLockTimeReachedListener.class); + taskRunner.addTasks(BroadcastAfterLockTime.class); taskRunner.run(); } } @@ -185,7 +185,7 @@ public class BuyerAsOffererProtocol extends TradeProtocol implements BuyerProtoc SignAndFinalizePayoutTx.class, CommitPayoutTx.class, SendPayoutTxFinalizedMessage.class, - SetupPayoutTxLockTimeReachedListener.class + BroadcastAfterLockTime.class ); taskRunner.run(); } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsTakerProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsTakerProtocol.java index 132e1928d8..4f655b0bbf 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsTakerProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsTakerProtocol.java @@ -29,8 +29,8 @@ import io.bitsquare.trade.protocol.trade.messages.FinalizePayoutTxRequest; import io.bitsquare.trade.protocol.trade.messages.PublishDepositTxRequest; import io.bitsquare.trade.protocol.trade.messages.TradeMessage; import io.bitsquare.trade.protocol.trade.tasks.buyer.*; +import io.bitsquare.trade.protocol.trade.tasks.shared.BroadcastAfterLockTime; import io.bitsquare.trade.protocol.trade.tasks.shared.CommitPayoutTx; -import io.bitsquare.trade.protocol.trade.tasks.shared.SetupPayoutTxLockTimeReachedListener; import io.bitsquare.trade.protocol.trade.tasks.taker.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,7 +54,7 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol // If we are after the timeLock state we need to setup the listener again Trade.State tradeState = trade.getState(); - if (tradeState.getPhase() == Trade.Phase.PAYOUT_PAID) { + if (tradeState.getPhase() == Trade.Phase.PAYOUT_PAID && tradeState != Trade.State.PAYOUT_BROAD_CASTED) { TradeTaskRunner taskRunner = new TradeTaskRunner(trade, () -> { handleTaskRunnerSuccess("SetupPayoutTxLockTimeReachedListener"); @@ -62,7 +62,7 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol }, this::handleTaskRunnerFault); - taskRunner.addTasks(SetupPayoutTxLockTimeReachedListener.class); + taskRunner.addTasks(BroadcastAfterLockTime.class); taskRunner.run(); } } @@ -173,7 +173,7 @@ public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol SignAndFinalizePayoutTx.class, CommitPayoutTx.class, SendPayoutTxFinalizedMessage.class, - SetupPayoutTxLockTimeReachedListener.class + BroadcastAfterLockTime.class ); taskRunner.run(); } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsOffererProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsOffererProtocol.java index 912ef3e689..b4932d6bf7 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsOffererProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsOffererProtocol.java @@ -26,9 +26,9 @@ import io.bitsquare.trade.Trade; import io.bitsquare.trade.protocol.trade.messages.*; import io.bitsquare.trade.protocol.trade.tasks.offerer.*; import io.bitsquare.trade.protocol.trade.tasks.seller.*; +import io.bitsquare.trade.protocol.trade.tasks.shared.BroadcastAfterLockTime; import io.bitsquare.trade.protocol.trade.tasks.shared.CommitPayoutTx; import io.bitsquare.trade.protocol.trade.tasks.shared.InitWaitPeriodForOpenDispute; -import io.bitsquare.trade.protocol.trade.tasks.shared.SetupPayoutTxLockTimeReachedListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,7 +53,7 @@ public class SellerAsOffererProtocol extends TradeProtocol implements SellerProt // If we are after the time lock state we need to setup the listener again //TODO not sure if that is not called already from the checkPayoutTxTimeLock at tradeProtocol Trade.State tradeState = trade.getState(); - if (tradeState.getPhase() == Trade.Phase.PAYOUT_PAID) { + if (tradeState.getPhase() == Trade.Phase.PAYOUT_PAID && tradeState != Trade.State.PAYOUT_BROAD_CASTED) { TradeTaskRunner taskRunner = new TradeTaskRunner(trade, () -> { handleTaskRunnerSuccess("SetupPayoutTxLockTimeReachedListener"); @@ -61,7 +61,7 @@ public class SellerAsOffererProtocol extends TradeProtocol implements SellerProt }, this::handleTaskRunnerFault); - taskRunner.addTasks(SetupPayoutTxLockTimeReachedListener.class); + taskRunner.addTasks(BroadcastAfterLockTime.class); taskRunner.run(); } } @@ -189,7 +189,7 @@ public class SellerAsOffererProtocol extends TradeProtocol implements SellerProt taskRunner.addTasks( ProcessPayoutTxFinalizedMessage.class, CommitPayoutTx.class, - SetupPayoutTxLockTimeReachedListener.class + BroadcastAfterLockTime.class ); taskRunner.run(); } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsTakerProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsTakerProtocol.java index be7b7f3460..f7ad5d1b2d 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsTakerProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsTakerProtocol.java @@ -28,8 +28,8 @@ import io.bitsquare.trade.protocol.trade.messages.PayoutTxFinalizedMessage; import io.bitsquare.trade.protocol.trade.messages.PublishDepositTxRequest; import io.bitsquare.trade.protocol.trade.messages.TradeMessage; import io.bitsquare.trade.protocol.trade.tasks.seller.*; +import io.bitsquare.trade.protocol.trade.tasks.shared.BroadcastAfterLockTime; import io.bitsquare.trade.protocol.trade.tasks.shared.CommitPayoutTx; -import io.bitsquare.trade.protocol.trade.tasks.shared.SetupPayoutTxLockTimeReachedListener; import io.bitsquare.trade.protocol.trade.tasks.taker.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,7 +54,7 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc // If we are after the timeLock state we need to setup the listener again //TODO not sure if that is not called already from the checkPayoutTxTimeLock at tradeProtocol Trade.State tradeState = trade.getState(); - if (tradeState.getPhase() == Trade.Phase.PAYOUT_PAID) { + if (tradeState.getPhase() == Trade.Phase.PAYOUT_PAID && tradeState != Trade.State.PAYOUT_BROAD_CASTED) { TradeTaskRunner taskRunner = new TradeTaskRunner(trade, () -> { handleTaskRunnerSuccess("SetupPayoutTxLockTimeReachedListener"); @@ -62,7 +62,7 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc }, this::handleTaskRunnerFault); - taskRunner.addTasks(SetupPayoutTxLockTimeReachedListener.class); + taskRunner.addTasks(BroadcastAfterLockTime.class); taskRunner.run(); } } @@ -188,7 +188,7 @@ public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtoc taskRunner.addTasks( ProcessPayoutTxFinalizedMessage.class, CommitPayoutTx.class, - SetupPayoutTxLockTimeReachedListener.class + BroadcastAfterLockTime.class ); taskRunner.run(); } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/TradeProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/TradeProtocol.java index 6c1a69af2f..5ffd097676 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/TradeProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/TradeProtocol.java @@ -28,7 +28,6 @@ import io.bitsquare.trade.TakerTrade; import io.bitsquare.trade.Trade; import io.bitsquare.trade.TradeManager; import io.bitsquare.trade.protocol.trade.messages.TradeMessage; -import io.bitsquare.trade.protocol.trade.tasks.shared.SetupPayoutTxLockTimeReachedListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -104,22 +103,6 @@ public abstract class TradeProtocol { protected abstract void doHandleDecryptedMessage(TradeMessage tradeMessage, NodeAddress peerNodeAddress); - public void checkPayoutTxTimeLock(Trade trade) { - this.trade = trade; - - if (trade.getState() == Trade.State.PAYOUT_TX_COMMITTED) { - TradeTaskRunner taskRunner = new TradeTaskRunner(trade, - () -> { - log.debug("taskRunner needPayoutTxBroadcast completed"); - processModel.onComplete(); - }, - this::handleTaskRunnerFault); - - taskRunner.addTasks(SetupPayoutTxLockTimeReachedListener.class); - taskRunner.run(); - } - } - protected void startTimeout() { stopTimeout(); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/shared/SetupPayoutTxLockTimeReachedListener.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/shared/BroadcastAfterLockTime.java similarity index 66% rename from core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/shared/SetupPayoutTxLockTimeReachedListener.java rename to core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/shared/BroadcastAfterLockTime.java index c89562675a..2bb04cd39e 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/shared/SetupPayoutTxLockTimeReachedListener.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/shared/BroadcastAfterLockTime.java @@ -25,16 +25,17 @@ import io.bitsquare.trade.Trade; import io.bitsquare.trade.protocol.trade.tasks.TradeTask; import org.bitcoinj.core.StoredBlock; import org.bitcoinj.core.Transaction; +import org.bitcoinj.core.TransactionConfidence; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.ExecutionException; -public class SetupPayoutTxLockTimeReachedListener extends TradeTask { - private static final Logger log = LoggerFactory.getLogger(SetupPayoutTxLockTimeReachedListener.class); +public class BroadcastAfterLockTime extends TradeTask { + private static final Logger log = LoggerFactory.getLogger(BroadcastAfterLockTime.class); - public SetupPayoutTxLockTimeReachedListener(TaskRunner taskHandler, Trade trade) { + public BroadcastAfterLockTime(TaskRunner taskHandler, Trade trade) { super(taskHandler, trade); } @@ -66,18 +67,31 @@ public class SetupPayoutTxLockTimeReachedListener extends TradeTask { } private void broadcastTx() { - processModel.getTradeWalletService().broadcastTx(trade.getPayoutTx(), new FutureCallback() { - @Override - public void onSuccess(Transaction transaction) { - log.debug("BroadcastTx succeeded. Transaction:" + transaction); + boolean needsBroadCast = true; + Transaction walletTx = processModel.getTradeWalletService().getWalletTx(trade.getPayoutTx().getHash()); + if (walletTx != null) { + TransactionConfidence.ConfidenceType confidenceType = walletTx.getConfidence().getConfidenceType(); + if (confidenceType.equals(TransactionConfidence.ConfidenceType.PENDING) || + confidenceType.equals(TransactionConfidence.ConfidenceType.BUILDING)) { + needsBroadCast = false; trade.setState(Trade.State.PAYOUT_BROAD_CASTED); complete(); } + } + if (needsBroadCast) { + processModel.getTradeWalletService().broadcastTx(trade.getPayoutTx(), new FutureCallback() { + @Override + public void onSuccess(Transaction transaction) { + log.debug("BroadcastTx succeeded. Transaction:" + transaction); + trade.setState(Trade.State.PAYOUT_BROAD_CASTED); + complete(); + } - @Override - public void onFailure(@NotNull Throwable t) { - failed(t); - } - }); + @Override + public void onFailure(@NotNull Throwable t) { + failed(t); + } + }); + } } } diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/BuyerSubView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/BuyerSubView.java index 02c36d9f88..c25ce3d3c4 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/BuyerSubView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/BuyerSubView.java @@ -110,13 +110,11 @@ public class BuyerSubView extends TradeSubView { step2.setCompleted(); showItem(step3); break; - case WAIT_FOR_UNLOCK_PAYOUT: - if (model.getLockTime() > 0) { - step1.setCompleted(); - step2.setCompleted(); - step3.setCompleted(); - showItem(step4); - } + case WAIT_FOR_BROADCAST_AFTER_UNLOCK: + step1.setCompleted(); + step2.setCompleted(); + step3.setCompleted(); + showItem(step4); break; case REQUEST_WITHDRAWAL: step1.setCompleted(); diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesViewModel.java index 163992acdf..a8e9364b62 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesViewModel.java @@ -53,7 +53,7 @@ public class PendingTradesViewModel extends ActivatableWithDataModel 0) { @@ -74,7 +73,6 @@ public class SellerSubView extends TradeSubView { addWizardsToGridPane(step2); addWizardsToGridPane(step3); addWizardsToGridPane(step5); - GridPane.setRowSpan(tradeProcessTitledGroupBg, 4); } } @@ -115,14 +113,13 @@ public class SellerSubView extends TradeSubView { case WAIT_FOR_PAYOUT_TX: step1.setCompleted(); step2.setCompleted(); - step3.setCompleted(); - showItem(step4); + showItem(step3); // We don't use a wizard for that step as it only gets displayed in case the other peer is offline - tradeStepView = new SellerStep4bView(model); + tradeStepView = new SellerStep3bView(model); contentPane.getChildren().setAll(tradeStepView); break; - case WAIT_FOR_UNLOCK_PAYOUT: + case WAIT_FOR_BROADCAST_AFTER_UNLOCK: step1.setCompleted(); step2.setCompleted(); step3.setCompleted(); diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep4bView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep3bView.java similarity index 96% rename from gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep4bView.java rename to gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep3bView.java index 8b8b58ae12..475bd3eb22 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep4bView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep3bView.java @@ -20,13 +20,13 @@ package io.bitsquare.gui.main.portfolio.pendingtrades.steps.seller; import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView; -public class SellerStep4bView extends TradeStepView { +public class SellerStep3bView extends TradeStepView { /////////////////////////////////////////////////////////////////////////////////////////// // Constructor, Initialisation /////////////////////////////////////////////////////////////////////////////////////////// - public SellerStep4bView(PendingTradesViewModel model) { + public SellerStep3bView(PendingTradesViewModel model) { super(model); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep4aView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep4View.java similarity index 91% rename from gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep4aView.java rename to gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep4View.java index 91c96d1f6a..89bfeef098 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep4aView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep4View.java @@ -20,13 +20,13 @@ package io.bitsquare.gui.main.portfolio.pendingtrades.steps.seller; import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer.BuyerStep4View; -public class SellerStep4aView extends BuyerStep4View { +public class SellerStep4View extends BuyerStep4View { /////////////////////////////////////////////////////////////////////////////////////////// // Constructor, Initialisation /////////////////////////////////////////////////////////////////////////////////////////// - public SellerStep4aView(PendingTradesViewModel model) { + public SellerStep4View(PendingTradesViewModel model) { super(model); } }