From cfee2f32ff8c791dbcda29065e4e022221f7314f Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Wed, 18 Mar 2015 13:01:21 +0100 Subject: [PATCH] Handle listener removal --- .../io/bitsquare/btc/TradeWalletService.java | 35 +++++--------- .../bitsquare/gui/main/debug/DebugView.java | 4 +- .../trade/createoffer/CreateOfferView.java | 6 +-- .../main/trade/takeoffer/TakeOfferView.java | 6 +-- .../main/java/io/bitsquare/trade/Trade.java | 9 ++++ .../java/io/bitsquare/trade/TradeManager.java | 8 ++-- .../RequestIsOfferAvailableMessage.java | 2 +- .../availability/tasks/GetPeerAddress.java | 2 +- .../protocol/placeoffer/PlaceOfferModel.java | 4 +- .../placeoffer/PlaceOfferProtocol.java | 4 +- .../tasks/AddOfferToRemoteOfferBook.java | 2 +- .../protocol/trade/SharedTradeModel.java | 19 -------- .../protocol/trade/messages/OfferMessage.java | 2 +- .../protocol/trade/messages/TradeMessage.java | 2 +- .../trade/offerer/BuyerAsOffererProtocol.java | 46 ++++++++++--------- .../offerer/models/BuyerAsOffererModel.java | 9 ++-- .../trade/offerer/models/OffererModel.java | 8 +--- .../trade/offerer/models/TakerModel.java | 9 ++-- ...java => CreateOffererDepositTxInputs.java} | 8 ++-- .../ProcessPayoutTxPublishedMessage.java | 6 +-- .../ProcessRequestDepositTxInputsMessage.java | 4 +- ...RequestOffererPublishDepositTxMessage.java | 4 +- .../offerer/tasks/RequestDepositPayment.java | 6 +-- .../tasks/SendBankTransferStartedMessage.java | 8 ++-- .../offerer/tasks/SendDepositTxIdToTaker.java | 6 +-- ...etupListenerForBlockChainConfirmation.java | 26 +++++++---- .../tasks/SignAndPublishDepositTx.java | 4 +- .../trade/offerer/tasks/SignPayoutTx.java | 6 +-- .../offerer/tasks/VerifyAndSignContract.java | 7 +-- .../tasks/VerifyTakeOfferFeePayment.java | 2 +- .../trade/taker/SellerAsTakerProtocol.java | 4 +- .../trade/taker/models/OffererModel.java | 4 ++ .../taker/models/SellerAsTakerModel.java | 11 +++-- .../trade/taker/models/TakerModel.java | 6 +-- .../taker/tasks/BroadcastTakeOfferFeeTx.java | 7 +-- .../taker/tasks/CreateAndSignContract.java | 4 -- .../taker/tasks/CreateTakeOfferFeeTx.java | 4 -- .../ProcessBankTransferStartedMessage.java | 4 -- .../ProcessDepositTxPublishedMessage.java | 8 +--- .../ProcessRequestDepositPaymentMessage.java | 4 -- .../taker/tasks/SendPayoutTxToOfferer.java | 10 ++-- .../SendRequestDepositTxInputsMessage.java | 23 +++++----- .../taker/tasks/SendSignedTakerDepositTx.java | 4 -- .../taker/tasks/SignAndPublishPayoutTx.java | 8 +--- .../taker/tasks/TakerCommitDepositTx.java | 8 +--- .../tasks/TakerCreatesAndSignsDepositTx.java | 11 ++--- .../taker/tasks/VerifyOfferFeePayment.java | 2 +- .../taker/tasks/VerifyOffererAccount.java | 4 -- .../tomp2p/TomP2PTradeMessageService.java | 3 +- 49 files changed, 171 insertions(+), 222 deletions(-) rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{GetOffererDepositTxInputs.java => CreateOffererDepositTxInputs.java} (83%) diff --git a/core/src/main/java/io/bitsquare/btc/TradeWalletService.java b/core/src/main/java/io/bitsquare/btc/TradeWalletService.java index 886ea19f09..f62a97d802 100644 --- a/core/src/main/java/io/bitsquare/btc/TradeWalletService.java +++ b/core/src/main/java/io/bitsquare/btc/TradeWalletService.java @@ -140,7 +140,7 @@ public class TradeWalletService { // Trade /////////////////////////////////////////////////////////////////////////////////////////// - public TransactionDataResult offererCreatesDepositTxInputs(Coin inputAmount, AddressEntry offererAddressEntry) throws + public TransactionDataResult createOffererDepositTxInputs(Coin inputAmount, AddressEntry offererAddressEntry) throws TransactionVerificationException, WalletException { // We pay the tx fee 2 times to the deposit tx: @@ -369,14 +369,14 @@ public class TradeWalletService { return depositTx; } - public TransactionDataResult offererCreatesAndSignsPayoutTx(Transaction depositTx, - Coin offererPayoutAmount, - Coin takerPayoutAmount, - String takerAddressString, - AddressEntry addressEntry, - byte[] offererPubKey, - byte[] takerPubKey, - byte[] arbitratorPubKey) + public byte[] offererCreatesAndSignsPayoutTx(Transaction depositTx, + Coin offererPayoutAmount, + Coin takerPayoutAmount, + String takerAddressString, + AddressEntry addressEntry, + byte[] offererPubKey, + byte[] takerPubKey, + byte[] arbitratorPubKey) throws AddressFormatException, TransactionVerificationException { Transaction payoutTx = createPayoutTx(depositTx, offererPayoutAmount, takerPayoutAmount, addressEntry.getAddressString(), takerAddressString); @@ -387,7 +387,7 @@ public class TradeWalletService { verifyTransaction(payoutTx); - return new TransactionDataResult(payoutTx, offererSignature.encodeToDER()); + return offererSignature.encodeToDER(); } public void takerSignsAndPublishPayoutTx(Transaction depositTx, @@ -415,8 +415,8 @@ public class TradeWalletService { verifyTransaction(payoutTx); checkWalletConsistency(); - checkScriptSig(payoutTx, input, 0); - input.verify(input.getConnectedOutput()); + // checkScriptSig(payoutTx, input, 0); + // input.verify(input.getConnectedOutput()); printTxWithInputs("payoutTx", payoutTx); @@ -557,7 +557,6 @@ public class TradeWalletService { private Transaction depositTx; - private Transaction payoutTx; private byte[] offererSignature; public TransactionDataResult(List connectedOutputsForAllInputs, List outputs) { @@ -571,12 +570,6 @@ public class TradeWalletService { this.outputs = outputs; } - public TransactionDataResult(Transaction payoutTx, byte[] offererSignature) { - - this.payoutTx = payoutTx; - this.offererSignature = offererSignature; - } - public List getOutputs() { return outputs; } @@ -589,10 +582,6 @@ public class TradeWalletService { return depositTx; } - public Transaction getPayoutTx() { - return payoutTx; - } - public byte[] getOffererSignature() { return offererSignature; } diff --git a/core/src/main/java/io/bitsquare/gui/main/debug/DebugView.java b/core/src/main/java/io/bitsquare/gui/main/debug/DebugView.java index da07fc8e9c..150fe4cd23 100644 --- a/core/src/main/java/io/bitsquare/gui/main/debug/DebugView.java +++ b/core/src/main/java/io/bitsquare/gui/main/debug/DebugView.java @@ -29,7 +29,7 @@ import io.bitsquare.trade.protocol.placeoffer.tasks.BroadcastCreateOfferFeeTx; import io.bitsquare.trade.protocol.placeoffer.tasks.CreateOfferFeeTx; import io.bitsquare.trade.protocol.placeoffer.tasks.ValidateOffer; import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererProtocol; -import io.bitsquare.trade.protocol.trade.offerer.tasks.GetOffererDepositTxInputs; +import io.bitsquare.trade.protocol.trade.offerer.tasks.CreateOffererDepositTxInputs; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessPayoutTxPublishedMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestDepositTxInputsMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestOffererPublishDepositTxMessage; @@ -103,7 +103,7 @@ public class DebugView extends InitializableView { /*---- Protocol ----*/ BuyerAsOffererProtocol.class, ProcessRequestDepositTxInputsMessage.class, - GetOffererDepositTxInputs.class, + CreateOffererDepositTxInputs.class, RequestDepositPayment.class, ProcessRequestOffererPublishDepositTxMessage.class, diff --git a/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.java b/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.java index fe95d325bf..52b443e950 100644 --- a/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.java +++ b/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.java @@ -314,10 +314,10 @@ public class CreateOfferView extends ActivatableViewAndModel { @Override public void onFailed() { model.offer.setState(Offer.State.OFFERER_OFFLINE); - + failed(); } }); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferModel.java b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferModel.java index 7b52715c69..bf0c70dc3b 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferModel.java @@ -18,9 +18,9 @@ package io.bitsquare.trade.protocol.placeoffer; import io.bitsquare.btc.WalletService; +import io.bitsquare.common.taskrunner.SharedTaskModel; import io.bitsquare.offer.Offer; import io.bitsquare.offer.OfferBookService; -import io.bitsquare.common.taskrunner.SharedTaskModel; import org.bitcoinj.core.Transaction; @@ -33,7 +33,7 @@ public class PlaceOfferModel extends SharedTaskModel { public final Offer offer; public final WalletService walletService; public final OfferBookService offerBookService; - + private Transaction transaction; public PlaceOfferModel(Offer offer, diff --git a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java index 7b20d3856d..7d57f3e8c3 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java @@ -17,13 +17,13 @@ package io.bitsquare.trade.protocol.placeoffer; +import io.bitsquare.common.handlers.ErrorMessageHandler; +import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.trade.handlers.TransactionResultHandler; import io.bitsquare.trade.protocol.placeoffer.tasks.AddOfferToRemoteOfferBook; import io.bitsquare.trade.protocol.placeoffer.tasks.BroadcastCreateOfferFeeTx; import io.bitsquare.trade.protocol.placeoffer.tasks.CreateOfferFeeTx; import io.bitsquare.trade.protocol.placeoffer.tasks.ValidateOffer; -import io.bitsquare.common.handlers.ErrorMessageHandler; -import io.bitsquare.common.taskrunner.TaskRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java index f10b5817ec..14204d550d 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java @@ -17,9 +17,9 @@ package io.bitsquare.trade.protocol.placeoffer.tasks; -import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/SharedTradeModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/SharedTradeModel.java index 651e4708c4..5f7c750fe3 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/SharedTradeModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/SharedTradeModel.java @@ -38,31 +38,20 @@ public class SharedTradeModel extends SharedTaskModel implements Serializable { // provided transient public final Offer offer; - transient public final TradeMessageService tradeMessageService; transient public final WalletService walletService; transient public final BlockChainService blockChainService; transient public final SignatureService signatureService; transient protected final Persistence persistence; - // derived transient public final String id; transient public final TradeWalletService tradeWalletService; transient public final byte[] arbitratorPubKey; - - /* transient public final FiatAccount fiatAccount; - transient public final String accountId; - transient public final PublicKey messagePubKey; - transient public final byte[] registrationPubKey; - transient public final DeterministicKey registrationKeyPair; - transient public final AddressEntry addressEntry;*/ - // data written/read by tasks transient private TradeMessage tradeMessage; - protected SharedTradeModel(Offer offer, TradeMessageService tradeMessageService, WalletService walletService, @@ -80,13 +69,6 @@ public class SharedTradeModel extends SharedTaskModel implements Serializable { tradeWalletService = walletService.getTradeWalletService(); //TODO use default arbitrator for now arbitratorPubKey = offer.getArbitrators().get(0).getPubKey(); - - /* registrationPubKey = walletService.getRegistrationAddressEntry().getPubKey(); - registrationKeyPair = walletService.getRegistrationAddressEntry().getKeyPair(); - addressEntry = walletService.getAddressEntry(id); - fiatAccount = user.getBankAccount(offer.getBankAccountId()); - accountId = user.getAccountId(); - messagePubKey = user.getNetworkPubKey();*/ } public void setTradeMessage(TradeMessage tradeMessage) { @@ -97,5 +79,4 @@ public class SharedTradeModel extends SharedTaskModel implements Serializable { return tradeMessage; } - } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/OfferMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/OfferMessage.java index b215e67af7..d7098b5048 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/OfferMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/OfferMessage.java @@ -23,6 +23,6 @@ import java.io.Serializable; public class OfferMessage implements Message, Serializable { private static final long serialVersionUID = -89035992124170905L; - + public String offerId; } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java index 6258fa8b3d..ee6bba8d27 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java @@ -23,6 +23,6 @@ import java.io.Serializable; public class TradeMessage implements Message, Serializable { private static final long serialVersionUID = 7572470983485004081L; - + public String tradeId; } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java index 86c3964e7d..1a24f42ccd 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java @@ -21,9 +21,12 @@ import io.bitsquare.network.Message; import io.bitsquare.network.Peer; import io.bitsquare.trade.Trade; import io.bitsquare.trade.handlers.MessageHandler; +import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.messages.RequestDepositTxInputsMessage; +import io.bitsquare.trade.protocol.trade.messages.RequestOffererPublishDepositTxMessage; import io.bitsquare.trade.protocol.trade.messages.TradeMessage; import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; -import io.bitsquare.trade.protocol.trade.offerer.tasks.GetOffererDepositTxInputs; +import io.bitsquare.trade.protocol.trade.offerer.tasks.CreateOffererDepositTxInputs; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessPayoutTxPublishedMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestDepositTxInputsMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestOffererPublishDepositTxMessage; @@ -36,13 +39,11 @@ import io.bitsquare.trade.protocol.trade.offerer.tasks.SignPayoutTx; import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyAndSignContract; import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyTakeOfferFeePayment; import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyTakerAccount; -import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage; -import io.bitsquare.trade.protocol.trade.messages.RequestDepositTxInputsMessage; -import io.bitsquare.trade.protocol.trade.messages.RequestOffererPublishDepositTxMessage; -import org.bitcoinj.core.Transaction; import org.bitcoinj.core.TransactionConfidence; +import javafx.application.Platform; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,11 +77,16 @@ public class BuyerAsOffererProtocol { public void cleanup() { log.debug("cleanup " + this); - model.tradeMessageService.removeMessageHandler(messageHandler); - if (transactionConfidence != null) { - if (!transactionConfidence.removeEventListener(transactionConfidenceListener)) - throw new RuntimeException("Remove transactionConfidenceListener failed."); - } + + // tradeMessageService and transactionConfidence use CopyOnWriteArrayList as listeners, but be safe and delay remove a bit. + Platform.runLater(() -> { + model.tradeMessageService.removeMessageHandler(messageHandler); + + if (transactionConfidence != null) { + if (!transactionConfidence.removeEventListener(transactionConfidenceListener)) + throw new RuntimeException("Remove transactionConfidenceListener failed at BuyerAsOffererProtocol."); + } + }); } /////////////////////////////////////////////////////////////////////////////////////////// @@ -102,7 +108,7 @@ public class BuyerAsOffererProtocol { ); taskRunner.addTasks( ProcessRequestDepositTxInputsMessage.class, - GetOffererDepositTxInputs.class, + CreateOffererDepositTxInputs.class, RequestDepositPayment.class ); taskRunner.run(); @@ -114,14 +120,12 @@ public class BuyerAsOffererProtocol { BuyerAsOffererTaskRunner taskRunner = new BuyerAsOffererTaskRunner<>(model, () -> { log.debug("taskRunner at handleRequestOffererPublishDepositTxMessage completed"); - transactionConfidenceListener = new TransactionConfidence.Listener() { - @Override - public void onConfidenceChanged(Transaction tx, ChangeReason reason) { - log.trace("onConfidenceChanged " + tx.getConfidence()); - if (reason == ChangeReason.TYPE && tx.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING) { + transactionConfidenceListener = (tx, reason) -> { + log.trace("onConfidenceChanged " + tx.getConfidence()); + if (reason == TransactionConfidence.Listener.ChangeReason.TYPE && tx.getConfidence().getConfidenceType() == TransactionConfidence + .ConfidenceType.BUILDING) { - model.trade.setState(Trade.State.DEPOSIT_CONFIRMED); - } + model.trade.setState(Trade.State.DEPOSIT_CONFIRMED); } }; transactionConfidence = model.trade.getDepositTx().getConfidence(); @@ -190,15 +194,15 @@ public class BuyerAsOffererProtocol { // Massage dispatcher /////////////////////////////////////////////////////////////////////////////////////////// - private void handleMessage(Message message, Peer peer) { - log.trace("handleNewMessage: message = " + message.getClass().getSimpleName()); + private void handleMessage(Message message, Peer sender) { + log.trace("handleNewMessage: message = " + message.getClass().getSimpleName() + " from " + sender); if (message instanceof TradeMessage) { TradeMessage tradeMessage = (TradeMessage) message; nonEmptyStringOf(tradeMessage.tradeId); if (tradeMessage.tradeId.equals(model.id)) { if (tradeMessage instanceof RequestDepositTxInputsMessage) { - handleRequestDepositTxInputsMessage((RequestDepositTxInputsMessage) tradeMessage, peer); + handleRequestDepositTxInputsMessage((RequestDepositTxInputsMessage) tradeMessage, sender); } else if (tradeMessage instanceof RequestOffererPublishDepositTxMessage) { diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/BuyerAsOffererModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/BuyerAsOffererModel.java index b791229d7a..487abf0b14 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/BuyerAsOffererModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/BuyerAsOffererModel.java @@ -41,9 +41,10 @@ public class BuyerAsOffererModel extends SharedTradeModel implements Serializabl public final TakerModel taker; public final OffererModel offerer; + // written by tasks private Transaction publishedDepositTx; private String takeOfferFeeTxId; - + public BuyerAsOffererModel(Trade trade, TradeMessageService tradeMessageService, WalletService walletService, @@ -60,9 +61,9 @@ public class BuyerAsOffererModel extends SharedTradeModel implements Serializabl this.trade = trade; - Object modelObject = persistence.read(this, "BuyerAsOffererModel_" + id); - if (modelObject instanceof BuyerAsOffererModel) { - BuyerAsOffererModel persistedModel = (BuyerAsOffererModel) modelObject; + Serializable serializable = persistence.read(this, "BuyerAsOffererModel_" + id); + if (serializable instanceof BuyerAsOffererModel) { + BuyerAsOffererModel persistedModel = (BuyerAsOffererModel) serializable; log.debug("Model reconstructed form persisted model."); setPublishedDepositTx(persistedModel.getPublishedDepositTx()); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/OffererModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/OffererModel.java index 833717b4db..31a1198223 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/OffererModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/OffererModel.java @@ -19,10 +19,8 @@ package io.bitsquare.trade.protocol.trade.offerer.models; import io.bitsquare.btc.AddressEntry; import io.bitsquare.fiat.FiatAccount; -import io.bitsquare.network.Peer; import org.bitcoinj.core.Coin; -import org.bitcoinj.core.Transaction; import org.bitcoinj.core.TransactionOutput; import org.bitcoinj.crypto.DeterministicKey; @@ -46,10 +44,8 @@ public class OffererModel implements Serializable { transient public byte[] pubKey; // written by tasks - public byte[] payoutSignature; + public byte[] payoutTxSignature; public Coin payoutAmount; public List connectedOutputsForAllInputs; - public List outputs; - public Peer peer; - public Transaction preparedPayoutTx; + public List outputs; // used to verify amounts with change outputs } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/TakerModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/TakerModel.java index de9feea293..dfca235d11 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/TakerModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/models/TakerModel.java @@ -30,18 +30,19 @@ import java.security.PublicKey; import java.util.List; -public class TakerModel implements Serializable{ +public class TakerModel implements Serializable { private static final long serialVersionUID = 2660909397210346486L; - + + // written by tasks public Peer peer; public String accountId; public FiatAccount fiatAccount; public PublicKey messagePublicKey; - public String contractAsJson; + public String contractAsJson;//TODO only write access now, missing impl. + public String contractSignature; public Coin payoutAmount; public Transaction depositTx; public List connectedOutputsForAllInputs; - public List outputs; public String payoutAddress; public byte[] pubKey; } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/GetOffererDepositTxInputs.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateOffererDepositTxInputs.java similarity index 83% rename from core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/GetOffererDepositTxInputs.java rename to core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateOffererDepositTxInputs.java index 07634fb170..9cea37fddf 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/GetOffererDepositTxInputs.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateOffererDepositTxInputs.java @@ -28,10 +28,10 @@ import org.bitcoinj.core.Coin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GetOffererDepositTxInputs extends Task { - private static final Logger log = LoggerFactory.getLogger(GetOffererDepositTxInputs.class); +public class CreateOffererDepositTxInputs extends Task { + private static final Logger log = LoggerFactory.getLogger(CreateOffererDepositTxInputs.class); - public GetOffererDepositTxInputs(TaskRunner taskHandler, BuyerAsOffererModel model) { + public CreateOffererDepositTxInputs(TaskRunner taskHandler, BuyerAsOffererModel model) { super(taskHandler, model); } @@ -39,7 +39,7 @@ public class GetOffererDepositTxInputs extends Task { protected void doRun() { try { Coin offererInputAmount = model.trade.getSecurityDeposit().add(FeePolicy.TX_FEE); - TradeWalletService.TransactionDataResult result = model.tradeWalletService.offererCreatesDepositTxInputs(offererInputAmount, + TradeWalletService.TransactionDataResult result = model.tradeWalletService.createOffererDepositTxInputs(offererInputAmount, model.offerer.addressEntry); model.offerer.connectedOutputsForAllInputs = result.getConnectedOutputsForAllInputs(); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessPayoutTxPublishedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessPayoutTxPublishedMessage.java index 60045e93df..d12051c444 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessPayoutTxPublishedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessPayoutTxPublishedMessage.java @@ -17,11 +17,11 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; -import io.bitsquare.trade.Trade; -import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; -import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.Trade; +import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestDepositTxInputsMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestDepositTxInputsMessage.java index 4aa468ed74..998a3fa6bb 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestDepositTxInputsMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestDepositTxInputsMessage.java @@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.trade.Trade; -import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import io.bitsquare.trade.protocol.trade.messages.RequestDepositTxInputsMessage; +import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +42,7 @@ public class ProcessRequestDepositTxInputsMessage extends Task 0); - model.taker.outputs = checkNotNull(message.takerOutputs); complete(); } catch (Throwable t) { diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RequestDepositPayment.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RequestDepositPayment.java index 5c265782bb..c617712bee 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RequestDepositPayment.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RequestDepositPayment.java @@ -17,11 +17,11 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; -import io.bitsquare.trade.listeners.SendMessageListener; -import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; -import io.bitsquare.trade.protocol.trade.messages.RequestDepositPaymentMessage; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.listeners.SendMessageListener; +import io.bitsquare.trade.protocol.trade.messages.RequestDepositPaymentMessage; +import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendBankTransferStartedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendBankTransferStartedMessage.java index d6d4fb9421..74b10a78fb 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendBankTransferStartedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendBankTransferStartedMessage.java @@ -17,11 +17,11 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; -import io.bitsquare.trade.listeners.SendMessageListener; -import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; -import io.bitsquare.trade.protocol.trade.messages.BankTransferStartedMessage; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.listeners.SendMessageListener; +import io.bitsquare.trade.protocol.trade.messages.BankTransferStartedMessage; +import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,7 +38,7 @@ public class SendBankTransferStartedMessage extends Task { BankTransferStartedMessage tradeMessage = new BankTransferStartedMessage( model.id, model.getPublishedDepositTx(), - model.offerer.payoutSignature, + model.offerer.payoutTxSignature, model.offerer.payoutAmount, model.taker.payoutAmount, model.offerer.addressEntry.getAddressString()); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendDepositTxIdToTaker.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendDepositTxIdToTaker.java index b06079fcd3..25b5a5330c 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendDepositTxIdToTaker.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendDepositTxIdToTaker.java @@ -17,11 +17,11 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; -import io.bitsquare.trade.listeners.SendMessageListener; -import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; -import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.listeners.SendMessageListener; +import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SetupListenerForBlockChainConfirmation.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SetupListenerForBlockChainConfirmation.java index 2525f53dbe..6e31bb3140 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SetupListenerForBlockChainConfirmation.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SetupListenerForBlockChainConfirmation.java @@ -17,44 +17,54 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; -import io.bitsquare.trade.Trade; -import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.Trade; +import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import org.bitcoinj.core.Transaction; import org.bitcoinj.core.TransactionConfidence; +import javafx.application.Platform; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SetupListenerForBlockChainConfirmation extends Task { private static final Logger log = LoggerFactory.getLogger(SetupListenerForBlockChainConfirmation.class); + private TransactionConfidence.Listener transactionConfidenceListener; + private TransactionConfidence transactionConfidence; + public SetupListenerForBlockChainConfirmation(TaskRunner taskHandler, BuyerAsOffererModel model) { super(taskHandler, model); } @Override protected void doRun() { - TransactionConfidence confidence = model.trade.getDepositTx().getConfidence(); - confidence.addEventListener(new TransactionConfidence.Listener() { + transactionConfidence = model.trade.getDepositTx().getConfidence(); + transactionConfidenceListener = new TransactionConfidence.Listener() { @Override public void onConfidenceChanged(Transaction tx, ChangeReason reason) { log.trace("onConfidenceChanged " + tx.getConfidence()); if (reason == ChangeReason.TYPE && tx.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING) { - model.trade.setState(Trade.State.DEPOSIT_CONFIRMED); - boolean removed = confidence.removeEventListener(this); - log.debug("listener removed? " + removed); + // transactionConfidence use CopyOnWriteArrayList as listeners, but be safe and delay remove a bit. + Platform.runLater(() -> removeEventListener()); } } - }); + }; + transactionConfidence.addEventListener(transactionConfidenceListener); complete(); } + private void removeEventListener() { + if (!transactionConfidence.removeEventListener(transactionConfidenceListener)) + throw new RuntimeException("Remove transactionConfidenceListener failed at SetupListenerForBlockChainConfirmation."); + } + @Override protected void updateStateOnFault() { } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java index 669bd3644b..00da382582 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java @@ -18,10 +18,10 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; import io.bitsquare.btc.FeePolicy; -import io.bitsquare.trade.Trade; -import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.Trade; +import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import org.bitcoinj.core.Coin; import org.bitcoinj.core.Transaction; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignPayoutTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignPayoutTx.java index 162bfaf8ab..06817e18aa 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignPayoutTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignPayoutTx.java @@ -17,7 +17,6 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; -import io.bitsquare.btc.TradeWalletService; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.trade.Trade; @@ -43,7 +42,7 @@ public class SignPayoutTx extends Task { Coin offererPayoutAmount = trade.getTradeAmount().add(securityDeposit); @SuppressWarnings("UnnecessaryLocalVariable") Coin takerPayoutAmount = securityDeposit; - TradeWalletService.TransactionDataResult result = model.tradeWalletService.offererCreatesAndSignsPayoutTx( + byte[] offererPayoutTxSignature = model.tradeWalletService.offererCreatesAndSignsPayoutTx( trade.getDepositTx(), offererPayoutAmount, takerPayoutAmount, @@ -53,8 +52,7 @@ public class SignPayoutTx extends Task { model.taker.pubKey, model.arbitratorPubKey); - model.offerer.preparedPayoutTx = result.getPayoutTx(); - model.offerer.payoutSignature = result.getOffererSignature(); + model.offerer.payoutTxSignature = offererPayoutTxSignature; model.offerer.payoutAmount = offererPayoutAmount; model.taker.payoutAmount = takerPayoutAmount; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyAndSignContract.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyAndSignContract.java index 623b63d638..ca14e9d92b 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyAndSignContract.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyAndSignContract.java @@ -17,12 +17,12 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; +import io.bitsquare.common.taskrunner.Task; +import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.trade.Contract; import io.bitsquare.trade.Trade; import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import io.bitsquare.util.Utilities; -import io.bitsquare.common.taskrunner.Task; -import io.bitsquare.common.taskrunner.TaskRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,7 +53,8 @@ public class VerifyAndSignContract extends Task { trade.setContract(contract); trade.setContractAsJson(contractAsJson); - trade.setTakerContractSignature(signature); + trade.setOffererContractSignature(signature); + trade.setTakerContractSignature(model.taker.contractSignature); complete(); } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakeOfferFeePayment.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakeOfferFeePayment.java index 52f2329b1f..8afb971e48 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakeOfferFeePayment.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakeOfferFeePayment.java @@ -17,9 +17,9 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; -import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java index 9ce433fc2a..067ecdf7e6 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java @@ -21,10 +21,10 @@ import io.bitsquare.network.Message; import io.bitsquare.network.Peer; import io.bitsquare.trade.Trade; import io.bitsquare.trade.handlers.MessageHandler; -import io.bitsquare.trade.protocol.trade.messages.TradeMessage; import io.bitsquare.trade.protocol.trade.messages.BankTransferStartedMessage; import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage; import io.bitsquare.trade.protocol.trade.messages.RequestDepositPaymentMessage; +import io.bitsquare.trade.protocol.trade.messages.TradeMessage; import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.tasks.BroadcastTakeOfferFeeTx; import io.bitsquare.trade.protocol.trade.taker.tasks.CreateAndSignContract; @@ -185,7 +185,7 @@ public class SellerAsTakerProtocol { /////////////////////////////////////////////////////////////////////////////////////////// private void handleMessage(Message message, Peer sender) { - log.trace("handleNewMessage: message = " + message.getClass().getSimpleName()); + log.trace("handleNewMessage: message = " + message.getClass().getSimpleName() + " from " + sender); if (message instanceof TradeMessage) { TradeMessage tradeMessage = (TradeMessage) message; nonEmptyStringOf(tradeMessage.tradeId); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/OffererModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/OffererModel.java index acd77a92a0..0a4e15da55 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/OffererModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/OffererModel.java @@ -30,7 +30,11 @@ import java.util.List; public class OffererModel implements Serializable { private static final long serialVersionUID = 1582902150121576205L; + // Those fields are set at constructor but not declared as final because constructor is not called in case model gets created from a persisted model + // Declared transient as they will be provided in any case at construction time public Peer peer; + + // written by tasks public byte[] pubKey; public Coin payoutAmount; public String payoutAddress; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/SellerAsTakerModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/SellerAsTakerModel.java index 13e4597f80..5ad2a34101 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/SellerAsTakerModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/SellerAsTakerModel.java @@ -42,10 +42,11 @@ public class SellerAsTakerModel extends SharedTradeModel implements Serializable public final TakerModel taker; public final OffererModel offerer; + // written by tasks private Transaction publishedDepositTx; private Transaction takeOfferFeeTx; private Transaction payoutTx; - + public SellerAsTakerModel(Trade trade, Peer offererPeer, TradeMessageService tradeMessageService, @@ -63,9 +64,9 @@ public class SellerAsTakerModel extends SharedTradeModel implements Serializable this.trade = trade; - Object modelObject = persistence.read(this, "SellerAsTakerModel_" + id); - if (modelObject instanceof SellerAsTakerModel) { - SellerAsTakerModel persistedModel = (SellerAsTakerModel) modelObject; + Serializable serializable = persistence.read(this, "SellerAsTakerModel_" + id); + if (serializable instanceof SellerAsTakerModel) { + SellerAsTakerModel persistedModel = (SellerAsTakerModel) serializable; log.debug("Model reconstructed form persisted model."); setPublishedDepositTx(persistedModel.getPublishedDepositTx()); @@ -79,7 +80,7 @@ public class SellerAsTakerModel extends SharedTradeModel implements Serializable taker = new TakerModel(); offerer = new OffererModel(); } - + offerer.peer = offererPeer; taker.registrationPubKey = walletService.getRegistrationAddressEntry().getPubKey(); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/TakerModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/TakerModel.java index a49455e1b0..d71e9998d1 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/TakerModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/models/TakerModel.java @@ -39,15 +39,15 @@ public class TakerModel implements Serializable { transient public FiatAccount fiatAccount; transient public String accountId; transient public PublicKey messagePubKey; - transient public byte[] registrationPubKey; + transient public byte[] registrationPubKey; // TODO not read yet, missing impl. transient public DeterministicKey registrationKeyPair; transient public AddressEntry addressEntry; transient public byte[] pubKey; - + // written by tasks public List connectedOutputsForAllInputs; public List outputs; public Coin payoutAmount; public Transaction preparedDepositTx; - + } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/BroadcastTakeOfferFeeTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/BroadcastTakeOfferFeeTx.java index cd99091d2d..a430002264 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/BroadcastTakeOfferFeeTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/BroadcastTakeOfferFeeTx.java @@ -46,7 +46,7 @@ public class BroadcastTakeOfferFeeTx extends Task { @Override public void onSuccess(Transaction transaction) { log.debug("Take offer fee published successfully. Transaction ID = " + transaction.getHashAsString()); - + model.trade.setState(Trade.State.TAKE_OFFER_FEE_PUBLISHED); complete(); @@ -55,6 +55,7 @@ public class BroadcastTakeOfferFeeTx extends Task { @Override public void onFailure(@NotNull Throwable t) { model.trade.setState(Trade.State.TAKE_OFFER_FEE_PUBLISH_FAILED); + failed(t); } }); @@ -67,8 +68,4 @@ public class BroadcastTakeOfferFeeTx extends Task { failed(e); } } - - @Override - protected void updateStateOnFault() { - } } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java index 935399bdd8..842ade3366 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java @@ -56,8 +56,4 @@ public class CreateAndSignContract extends Task { complete(); } - - @Override - protected void updateStateOnFault() { - } } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateTakeOfferFeeTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateTakeOfferFeeTx.java index ab00918fb9..9ebe6e6f8d 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateTakeOfferFeeTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateTakeOfferFeeTx.java @@ -51,8 +51,4 @@ public class CreateTakeOfferFeeTx extends Task { failed(e); } } - - @Override - protected void updateStateOnFault() { - } } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessBankTransferStartedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessBankTransferStartedMessage.java index 7fbf2471bb..2f8542a57c 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessBankTransferStartedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessBankTransferStartedMessage.java @@ -52,8 +52,4 @@ public class ProcessBankTransferStartedMessage extends Task failed(t); } } - - @Override - protected void updateStateOnFault() { - } } \ No newline at end of file diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessDepositTxPublishedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessDepositTxPublishedMessage.java index 53bd758644..fa0d67cc73 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessDepositTxPublishedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessDepositTxPublishedMessage.java @@ -17,10 +17,10 @@ package io.bitsquare.trade.protocol.trade.taker.tasks; -import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage; -import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,8 +48,4 @@ public class ProcessDepositTxPublishedMessage extends Task { failed(t); } } - - @Override - protected void updateStateOnFault() { - } } \ No newline at end of file diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRequestDepositPaymentMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRequestDepositPaymentMessage.java index 1424714078..607a92afb9 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRequestDepositPaymentMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRequestDepositPaymentMessage.java @@ -53,8 +53,4 @@ public class ProcessRequestDepositPaymentMessage extends Task { } }); } - - @Override - protected void updateStateOnFault() { - } } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendRequestDepositTxInputsMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendRequestDepositTxInputsMessage.java index 8848b016cb..313ce905b8 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendRequestDepositTxInputsMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendRequestDepositTxInputsMessage.java @@ -17,12 +17,14 @@ package io.bitsquare.trade.protocol.trade.taker.tasks; -import io.bitsquare.trade.Trade; -import io.bitsquare.trade.listeners.SendMessageListener; -import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.Trade; +import io.bitsquare.trade.listeners.SendMessageListener; import io.bitsquare.trade.protocol.trade.messages.RequestDepositTxInputsMessage; +import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; + +import javafx.application.Platform; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,19 +60,18 @@ public class SendRequestDepositTxInputsMessage extends Task // We try to repeat once and if that fails as well we persist the state for a later retry. if (retryCounter == 0) { retryCounter++; - // doRun(); + Platform.runLater(SendRequestDepositTxInputsMessage.this::doRun); } else { + appendToErrorMessage("Sending TakeOfferFeePayedMessage to offerer failed. Maybe the network connection was lost or the offerer lost his " + + "connection. " + + "We persisted the state of the trade, please try again later or cancel that trade."); + + model.trade.setState(Trade.State.MESSAGE_SENDING_FAILED); + failed(); } } }); } - - @Override - protected void updateStateOnFault() { - appendToErrorMessage("Sending TakeOfferFeePayedMessage to offerer failed. Maybe the network connection was lost or the offerer lost his connection. " + - "We persisted the state of the trade, please try again later or cancel that trade."); - model.trade.setState(Trade.State.MESSAGE_SENDING_FAILED); - } } \ No newline at end of file diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTx.java index 40414d4412..417824fbb3 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTx.java @@ -60,8 +60,4 @@ public class SendSignedTakerDepositTx extends Task { } }); } - - @Override - protected void updateStateOnFault() { - } } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SignAndPublishPayoutTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SignAndPublishPayoutTx.java index c0cc8740e8..966a4063dd 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SignAndPublishPayoutTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SignAndPublishPayoutTx.java @@ -17,10 +17,10 @@ package io.bitsquare.trade.protocol.trade.taker.tasks; -import io.bitsquare.trade.Trade; -import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.Trade; +import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import org.bitcoinj.core.Transaction; @@ -69,8 +69,4 @@ public class SignAndPublishPayoutTx extends Task { failed(e); } } - - @Override - protected void updateStateOnFault() { - } } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCommitDepositTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCommitDepositTx.java index 06183d64ef..2c5550c335 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCommitDepositTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCommitDepositTx.java @@ -17,10 +17,10 @@ package io.bitsquare.trade.protocol.trade.taker.tasks; -import io.bitsquare.trade.Trade; -import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.Trade; +import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import org.bitcoinj.core.Transaction; @@ -46,8 +46,4 @@ public class TakerCommitDepositTx extends Task { failed(t); } } - - @Override - protected void updateStateOnFault() { - } } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCreatesAndSignsDepositTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCreatesAndSignsDepositTx.java index 034b6e9ad8..8c24ae0368 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCreatesAndSignsDepositTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCreatesAndSignsDepositTx.java @@ -59,14 +59,11 @@ public class TakerCreatesAndSignsDepositTx extends Task { complete(); } catch (Exception e) { + Trade.State state = Trade.State.FAULT; + state.setErrorMessage(errorMessage); + model.trade.setState(state); + failed(e); } } - - @Override - protected void updateStateOnFault() { - Trade.State state = Trade.State.FAULT; - state.setErrorMessage(errorMessage); - model.trade.setState(state); - } } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOfferFeePayment.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOfferFeePayment.java index 2d1244d211..d289c02b1c 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOfferFeePayment.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOfferFeePayment.java @@ -17,9 +17,9 @@ package io.bitsquare.trade.protocol.trade.taker.tasks; -import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOffererAccount.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOffererAccount.java index 6277eeddf9..91c084a528 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOffererAccount.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOffererAccount.java @@ -45,8 +45,4 @@ public class VerifyOffererAccount extends Task { failed("Account registration validation for peer faultHandler.onFault."); } } - - @Override - protected void updateStateOnFault() { - } } diff --git a/core/src/main/java/io/bitsquare/trade/tomp2p/TomP2PTradeMessageService.java b/core/src/main/java/io/bitsquare/trade/tomp2p/TomP2PTradeMessageService.java index 53c9045163..cd27ff2278 100644 --- a/core/src/main/java/io/bitsquare/trade/tomp2p/TomP2PTradeMessageService.java +++ b/core/src/main/java/io/bitsquare/trade/tomp2p/TomP2PTradeMessageService.java @@ -28,7 +28,6 @@ import io.bitsquare.trade.listeners.SendMessageListener; import java.security.PublicKey; -import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executor; @@ -55,7 +54,7 @@ public class TomP2PTradeMessageService implements TradeMessageService { private static final Logger log = LoggerFactory.getLogger(TomP2PTradeMessageService.class); private final TomP2PNode tomP2PNode; - private final List messageHandlers = new CopyOnWriteArrayList<>(); + private final CopyOnWriteArrayList messageHandlers = new CopyOnWriteArrayList<>(); private Executor executor;