Fix bug with tx broadcast state

This commit is contained in:
Manfred Karrer 2016-02-12 18:23:15 +01:00
parent e5cfc2892b
commit 43d811d9fe
12 changed files with 59 additions and 69 deletions

View file

@ -233,8 +233,6 @@ abstract public class Trade implements Tradable, Model, Serializable {
createProtocol();
tradeProtocol.checkPayoutTxTimeLock(this);
if (decryptedMsgWithPubKey != null) {
tradeProtocol.applyMailboxMessage(decryptedMsgWithPubKey, this);
}

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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();

View file

@ -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<Transaction>() {
@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<Transaction>() {
@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);
}
});
}
}
}