) tradesObject;
+ }
else
+ {
trades = new HashMap<>();
+ }
messageFacade.addIncomingTradeMessageListener(this::onIncomingTradeMessage);
}
@@ -127,7 +125,9 @@ public class Trading
public void addOffer(Offer offer) throws IOException
{
if (offers.containsKey(offer.getId()))
+ {
throw new IllegalStateException("offers contains already an offer with the ID " + offer.getId());
+ }
offers.put(offer.getId(), offer);
saveOffers();
@@ -138,7 +138,9 @@ public class Trading
public void removeOffer(Offer offer)
{
if (!offers.containsKey(offer.getId()))
+ {
throw new IllegalStateException("offers does not contain the offer with the ID " + offer.getId());
+ }
offers.remove(offer.getId());
saveOffers();
@@ -146,14 +148,14 @@ public class Trading
messageFacade.removeOffer(offer);
}
- public Trade takeOffer(BigInteger amount, Offer offer, TakerAsSellerProtocolListener listener)
+ public Trade takeOffer(BigInteger amount, Offer offer, ProtocolForTakerAsSellerListener listener)
{
Trade trade = createTrade(offer);
trade.setTradeAmount(amount);
- TakerAsSellerProtocol takerAsSellerProtocol = new TakerAsSellerProtocol(trade, listener, messageFacade, walletFacade, blockChainFacade, cryptoFacade, user);
- takerAsSellerProtocolMap.put(trade.getId(), takerAsSellerProtocol);
- takerAsSellerProtocol.start();
+ ProtocolForTakerAsSeller protocolForTakerAsSeller = new ProtocolForTakerAsSeller(trade, listener, messageFacade, walletFacade, blockChainFacade, cryptoFacade, user);
+ takerAsSellerProtocolMap.put(trade.getId(), protocolForTakerAsSeller);
+ protocolForTakerAsSeller.start();
return trade;
}
@@ -166,7 +168,9 @@ public class Trading
public Trade createTrade(Offer offer)
{
if (trades.containsKey(offer.getId()))
+ {
throw new IllegalStateException("trades contains already an trade with the ID " + offer.getId());
+ }
Trade trade = new Trade(offer);
trades.put(offer.getId(), trade);
@@ -181,7 +185,9 @@ public class Trading
public void removeTrade(Trade trade)
{
if (!trades.containsKey(trade.getId()))
+ {
throw new IllegalStateException("trades does not contain the trade with the ID " + trade.getId());
+ }
trades.remove(trade.getId());
saveTrades();
@@ -205,70 +211,90 @@ public class Trading
Trade trade = createTrade(offer);
pendingTrade = trade;
- OffererAsBuyerProtocol offererAsBuyerProtocol = new OffererAsBuyerProtocol(trade, sender, messageFacade, walletFacade, blockChainFacade, cryptoFacade, user, new OffererAsBuyerProtocolListener()
+ ProtocolForOffererAsBuyer protocolForOffererAsBuyer = new ProtocolForOffererAsBuyer(trade,
+ sender,
+ messageFacade,
+ walletFacade,
+ blockChainFacade,
+ cryptoFacade,
+ user,
+ new ProtocolForOffererAsBuyerListener()
+ {
+ @Override
+ public void onOfferAccepted(Offer offer)
+ {
+ removeOffer(offer);
+ }
+
+ @Override
+ public void onDepositTxPublished(String depositTxID)
+ {
+ log.trace("trading onDepositTxPublishedMessage " + depositTxID);
+ }
+
+ @Override
+ public void onDepositTxConfirmedUpdate(TransactionConfidence confidence)
+ {
+ log.trace("trading onDepositTxConfirmedUpdate");
+ }
+
+ @Override
+ public void onPayoutTxPublished(String payoutTxAsHex)
+ {
+ Transaction payoutTx = new Transaction(walletFacade.getWallet().getParams(),
+ Utils.parseAsHexOrBase58(payoutTxAsHex));
+ trade.setPayoutTransaction(payoutTx);
+ trade.setState(Trade.State.COMPLETED);
+ log.debug("trading onPayoutTxPublishedMessage");
+ }
+
+ @Override
+ public void onFault(Throwable throwable, ProtocolForOffererAsBuyer.State state)
+ {
+ log.error("Error while executing trade process at state: " + state + " / " + throwable);
+ Popups.openErrorPopup("Error while executing trade process",
+ "Error while executing trade process at state: " + state + " / " +
+ throwable);
+ }
+
+ @Override
+ public void onWaitingForPeerResponse(ProtocolForOffererAsBuyer.State state)
+ {
+ log.debug("Waiting for peers response at state " + state);
+ }
+
+ @Override
+ public void onCompleted(ProtocolForOffererAsBuyer.State state)
+ {
+ log.debug("Trade protocol completed at state " + state);
+ }
+
+ @Override
+ public void onWaitingForUserInteraction(ProtocolForOffererAsBuyer.State state)
+ {
+ log.debug("Waiting for UI activity at state " + state);
+ }
+
+
+ @Override
+ public void onDepositTxConfirmedInBlockchain()
+ {
+ log.trace("trading onDepositTxConfirmedInBlockchain");
+ }
+
+ });
+
+ if (!offererAsBuyerProtocolMap.containsKey(trade.getId()))
{
- @Override
- public void onOfferAccepted(Offer offer)
- {
- removeOffer(offer);
- }
+ offererAsBuyerProtocolMap.put(trade.getId(), protocolForOffererAsBuyer);
+ }
+ else
+ {
+ // We don't store the protocol in case we have already a pending offer. The protocol is only temporary used to reply with a reject message.
+ log.trace("offererAsBuyerProtocol not stored as offer is already pending.");
+ }
- @Override
- public void onDepositTxPublished(String depositTxID)
- {
- log.trace("trading onDepositTxPublishedMessage " + depositTxID);
- }
-
- @Override
- public void onDepositTxConfirmedUpdate(TransactionConfidence confidence)
- {
- log.trace("trading onDepositTxConfirmedUpdate");
- }
-
- @Override
- public void onPayoutTxPublished(String payoutTxAsHex)
- {
- Transaction payoutTx = new Transaction(walletFacade.getWallet().getParams(), Utils.parseAsHexOrBase58(payoutTxAsHex));
- trade.setPayoutTransaction(payoutTx);
- trade.setState(Trade.State.COMPLETED);
- log.debug("trading onPayoutTxPublishedMessage");
- }
-
- @Override
- public void onFault(Throwable throwable, OffererAsBuyerProtocol.State state)
- {
- log.error("Error while executing trade process at state: " + state + " / " + throwable);
- Popups.openErrorPopup("Error while executing trade process", "Error while executing trade process at state: " + state + " / " + throwable);
- }
-
- @Override
- public void onWaitingForPeerResponse(OffererAsBuyerProtocol.State state)
- {
- log.debug("Waiting for peers response at state " + state);
- }
-
- @Override
- public void onCompleted(OffererAsBuyerProtocol.State state)
- {
- log.debug("Trade protocol completed at state " + state);
- }
-
- @Override
- public void onWaitingForUserInteraction(OffererAsBuyerProtocol.State state)
- {
- log.debug("Waiting for UI activity at state " + state);
- }
-
-
- @Override
- public void onDepositTxConfirmedInBlockchain()
- {
- log.trace("trading onDepositTxConfirmedInBlockchain");
- }
-
- });
- this.offererAsBuyerProtocolMap.put(trade.getId(), offererAsBuyerProtocol);
- offererAsBuyerProtocol.start();
+ protocolForOffererAsBuyer.start();
}
else
{
@@ -305,13 +331,9 @@ public class Trading
createOffererAsBuyerProtocol(tradeId, sender);
takeOfferRequestListeners.stream().forEach(e -> e.onTakeOfferRequested(tradeId, sender));
}
- else if (tradeMessage instanceof AcceptTakeOfferRequestMessage)
+ else if (tradeMessage instanceof RespondToTakeOfferRequestMessage)
{
- takerAsSellerProtocolMap.get(tradeId).onAcceptTakeOfferRequestMessage();
- }
- else if (tradeMessage instanceof RejectTakeOfferRequestMessage)
- {
- takerAsSellerProtocolMap.get(tradeId).onRejectTakeOfferRequestMessage();
+ takerAsSellerProtocolMap.get(tradeId).onRespondToTakeOfferRequestMessage((RespondToTakeOfferRequestMessage) tradeMessage);
}
else if (tradeMessage instanceof TakeOfferFeePayedMessage)
{
@@ -398,8 +420,12 @@ public class Trading
public Trade getTrade(String tradeId)
{
if (trades.containsKey(tradeId))
+ {
return trades.get(trades);
+ }
else
+ {
return null;
+ }
}
}
diff --git a/src/main/java/io/bitsquare/trade/orderbook/OrderBook.java b/src/main/java/io/bitsquare/trade/orderbook/OrderBook.java
index 998d9dca13..07dcacaf09 100644
--- a/src/main/java/io/bitsquare/trade/orderbook/OrderBook.java
+++ b/src/main/java/io/bitsquare/trade/orderbook/OrderBook.java
@@ -70,9 +70,13 @@ public class OrderBook implements OrderBookListener
public void loadOffers()
{
if (user.getCurrentBankAccount() != null)
+ {
messageFacade.getOffers(user.getCurrentBankAccount().getCurrency().getCurrencyCode());
+ }
else
+ {
messageFacade.getOffers(CurrencyUtil.getDefaultCurrency().getCurrencyCode());
+ }
}
public void removeOffer(Offer offer)
@@ -86,10 +90,10 @@ public class OrderBook implements OrderBookListener
Offer offer = orderBookListItem.getOffer();
BankAccount currentBankAccount = user.getCurrentBankAccount();
- if (orderBookFilter == null
- || currentBankAccount == null
- || orderBookFilter.getDirection() == null)
+ if (orderBookFilter == null || currentBankAccount == null || orderBookFilter.getDirection() == null)
+ {
return false;
+ }
// The users current bank account currency must match the offer currency (1 to 1)
boolean currencyResult = currentBankAccount.getCurrency().equals(offer.getCurrency());
@@ -104,7 +108,9 @@ public class OrderBook implements OrderBookListener
// The requested amount must be lower or equal then the offer amount
boolean amountResult = true;
if (orderBookFilter.getAmount() > 0)
+ {
amountResult = orderBookFilter.getAmount() <= offer.getAmount().doubleValue();
+ }
// The requested trade direction must be opposite of the offerList trade direction
boolean directionResult = !orderBookFilter.getDirection().equals(offer.getDirection());
@@ -114,9 +120,13 @@ public class OrderBook implements OrderBookListener
if (orderBookFilter.getPrice() > 0)
{
if (offer.getDirection() == Direction.SELL)
+ {
priceResult = orderBookFilter.getPrice() >= offer.getPrice();
+ }
else
+ {
priceResult = orderBookFilter.getPrice() <= offer.getPrice();
+ }
}
// The arbitrator defined in the offer must match one of the accepted arbitrators defined in the settings (1 to n)
@@ -124,13 +134,7 @@ public class OrderBook implements OrderBookListener
//noinspection UnnecessaryLocalVariable
- boolean result = currencyResult
- && countryResult
- && languageResult
- && amountResult
- && directionResult
- && priceResult
- && arbitratorResult;
+ boolean result = currencyResult && countryResult && languageResult && amountResult && directionResult && priceResult && arbitratorResult;
/*
log.debug("result = " + result +
@@ -260,7 +264,9 @@ public class OrderBook implements OrderBookListener
for (Country country : list)
{
if (country.getCode().equals(countryToMatch.getCode()))
+ {
return true;
+ }
}
return false;
}
@@ -272,7 +278,9 @@ public class OrderBook implements OrderBookListener
for (Locale locale2 : list1)
{
if (locale1.getLanguage().equals(locale2.getLanguage()))
+ {
return true;
+ }
}
}
return false;
@@ -287,7 +295,9 @@ public class OrderBook implements OrderBookListener
try
{
if (arbitrator.getId().equals(arbitratorToMatch.getId()))
+ {
return true;
+ }
} catch (Exception e)
{
log.error(e.toString());
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/FaultHandler.java b/src/main/java/io/bitsquare/trade/protocol/FaultHandler.java
similarity index 63%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/FaultHandler.java
rename to src/main/java/io/bitsquare/trade/protocol/FaultHandler.java
index f2d4a6ce2d..e2ff5b0da4 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/FaultHandler.java
+++ b/src/main/java/io/bitsquare/trade/protocol/FaultHandler.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.tasks;
+package io.bitsquare.trade.protocol;
public interface FaultHandler
{
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/ResultHandler.java b/src/main/java/io/bitsquare/trade/protocol/ResultHandler.java
similarity index 57%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/ResultHandler.java
rename to src/main/java/io/bitsquare/trade/protocol/ResultHandler.java
index 9d9670e880..e4d774f4dc 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/ResultHandler.java
+++ b/src/main/java/io/bitsquare/trade/protocol/ResultHandler.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.tasks;
+package io.bitsquare.trade.protocol;
public interface ResultHandler
{
diff --git a/src/main/java/io/bitsquare/trade/protocol/messages/offerer/AcceptTakeOfferRequestMessage.java b/src/main/java/io/bitsquare/trade/protocol/messages/offerer/AcceptTakeOfferRequestMessage.java
deleted file mode 100644
index f4876bf212..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/messages/offerer/AcceptTakeOfferRequestMessage.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package io.bitsquare.trade.protocol.messages.offerer;
-
-import io.bitsquare.msg.TradeMessage;
-import java.io.Serializable;
-
-public class AcceptTakeOfferRequestMessage implements Serializable, TradeMessage
-{
- private static final long serialVersionUID = 6177387534087739018L;
- private final String tradeId;
-
- public AcceptTakeOfferRequestMessage(String tradeId)
- {
- this.tradeId = tradeId;
- }
-
-
- @Override
- public String getTradeId()
- {
- return tradeId;
- }
-}
diff --git a/src/main/java/io/bitsquare/trade/protocol/messages/offerer/RejectTakeOfferRequestMessage.java b/src/main/java/io/bitsquare/trade/protocol/messages/offerer/RejectTakeOfferRequestMessage.java
deleted file mode 100644
index 78ee7255d5..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/messages/offerer/RejectTakeOfferRequestMessage.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package io.bitsquare.trade.protocol.messages.offerer;
-
-import io.bitsquare.msg.TradeMessage;
-import java.io.Serializable;
-
-public class RejectTakeOfferRequestMessage implements Serializable, TradeMessage
-{
- private static final long serialVersionUID = -8088557759642128139L;
- private final String tradeId;
-
- public RejectTakeOfferRequestMessage(String tradeId)
- {
- this.tradeId = tradeId;
- }
-
- @Override
- public String getTradeId()
- {
- return tradeId;
- }
-}
diff --git a/src/main/java/io/bitsquare/trade/protocol/messages/offerer/BankTransferInitedMessage.java b/src/main/java/io/bitsquare/trade/protocol/offerer/BankTransferInitedMessage.java
similarity index 92%
rename from src/main/java/io/bitsquare/trade/protocol/messages/offerer/BankTransferInitedMessage.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/BankTransferInitedMessage.java
index c658da20bf..346dc45bc6 100644
--- a/src/main/java/io/bitsquare/trade/protocol/messages/offerer/BankTransferInitedMessage.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/BankTransferInitedMessage.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.messages.offerer;
+package io.bitsquare.trade.protocol.offerer;
import io.bitsquare.msg.TradeMessage;
import java.io.Serializable;
@@ -16,7 +16,8 @@ public class BankTransferInitedMessage implements Serializable, TradeMessage
private BigInteger takerPaybackAmount;
private String offererPayoutAddress;
- public BankTransferInitedMessage(String tradeId, String depositTxAsHex,
+ public BankTransferInitedMessage(String tradeId,
+ String depositTxAsHex,
String offererSignatureR,
String offererSignatureS,
BigInteger offererPaybackAmount,
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/CreateDepositTx.java b/src/main/java/io/bitsquare/trade/protocol/offerer/CreateDepositTx.java
similarity index 85%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/offerer/CreateDepositTx.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/CreateDepositTx.java
index 19711509e1..15e755fc0f 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/CreateDepositTx.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/CreateDepositTx.java
@@ -1,10 +1,10 @@
-package io.bitsquare.trade.protocol.tasks.offerer;
+package io.bitsquare.trade.protocol.offerer;
import com.google.bitcoin.core.InsufficientMoneyException;
import com.google.bitcoin.core.Transaction;
import com.google.bitcoin.core.Utils;
import io.bitsquare.btc.WalletFacade;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
import java.math.BigInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -24,11 +24,7 @@ public class CreateDepositTx
try
{
String offererPubKey = walletFacade.getAddressInfoByTradeID(tradeId).getPubKeyAsHexString();
- Transaction transaction = walletFacade.offererCreatesMSTxAndAddPayment(collateralAmount,
- offererPubKey,
- takerMultiSigPubKey,
- arbitratorPubKeyAsHex,
- tradeId);
+ Transaction transaction = walletFacade.offererCreatesMSTxAndAddPayment(collateralAmount, offererPubKey, takerMultiSigPubKey, arbitratorPubKeyAsHex, tradeId);
String preparedOffererDepositTxAsHex = Utils.bytesToHexString(transaction.bitcoinSerialize());
long offererTxOutIndex = transaction.getInput(0).getOutpoint().getIndex();
diff --git a/src/main/java/io/bitsquare/trade/protocol/messages/offerer/DepositTxPublishedMessage.java b/src/main/java/io/bitsquare/trade/protocol/offerer/DepositTxPublishedMessage.java
similarity index 92%
rename from src/main/java/io/bitsquare/trade/protocol/messages/offerer/DepositTxPublishedMessage.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/DepositTxPublishedMessage.java
index fbbc92d7d0..198cf26182 100644
--- a/src/main/java/io/bitsquare/trade/protocol/messages/offerer/DepositTxPublishedMessage.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/DepositTxPublishedMessage.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.messages.offerer;
+package io.bitsquare.trade.protocol.offerer;
import io.bitsquare.msg.TradeMessage;
import java.io.Serializable;
diff --git a/src/main/java/io/bitsquare/trade/protocol/offerer/HandleTakeOfferRequest.java b/src/main/java/io/bitsquare/trade/protocol/offerer/HandleTakeOfferRequest.java
new file mode 100644
index 0000000000..7a5996e4da
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/HandleTakeOfferRequest.java
@@ -0,0 +1,44 @@
+package io.bitsquare.trade.protocol.offerer;
+
+import io.bitsquare.msg.MessageFacade;
+import io.bitsquare.msg.listeners.OutgoingTradeMessageListener;
+import io.bitsquare.trade.Trade;
+import io.bitsquare.trade.protocol.FaultHandler;
+import net.tomp2p.peers.PeerAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HandleTakeOfferRequest
+{
+ private static final Logger log = LoggerFactory.getLogger(HandleTakeOfferRequest.class);
+
+ public static void run(ResultHandler resultHandler, FaultHandler faultHandler, PeerAddress peerAddress, MessageFacade messageFacade, Trade.State tradeState, String tradeId)
+ {
+ boolean takeOfferRequestAccepted = tradeState == Trade.State.OPEN;
+ if (!takeOfferRequestAccepted)
+ {
+ log.info("Received take offer request but the offer not marked as open anymore.");
+ }
+ messageFacade.sendTradeMessage(peerAddress, new RespondToTakeOfferRequestMessage(tradeId, takeOfferRequestAccepted), new OutgoingTradeMessageListener()
+ {
+ @Override
+ public void onResult()
+ {
+ log.trace("RespondToTakeOfferRequestMessage successfully arrived at peer");
+ resultHandler.onResult(takeOfferRequestAccepted);
+ }
+
+ @Override
+ public void onFailed()
+ {
+ log.error("AcceptTakeOfferRequestMessage faultHandler.onFault to arrive at peer");
+ faultHandler.onFault(new Exception("AcceptTakeOfferRequestMessage faultHandler.onFault to arrive at peer"));
+ }
+ });
+ }
+
+ public interface ResultHandler
+ {
+ void onResult(boolean takeOfferRequestAccepted);
+ }
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/offerer/OffererAsBuyerProtocol.java b/src/main/java/io/bitsquare/trade/protocol/offerer/ProtocolForOffererAsBuyer.java
similarity index 57%
rename from src/main/java/io/bitsquare/trade/protocol/offerer/OffererAsBuyerProtocol.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/ProtocolForOffererAsBuyer.java
index 60761aff2c..a31a220141 100644
--- a/src/main/java/io/bitsquare/trade/protocol/offerer/OffererAsBuyerProtocol.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/ProtocolForOffererAsBuyer.java
@@ -10,368 +10,39 @@ import io.bitsquare.msg.MessageFacade;
import io.bitsquare.trade.Contract;
import io.bitsquare.trade.Offer;
import io.bitsquare.trade.Trade;
-import io.bitsquare.trade.protocol.messages.taker.PayoutTxPublishedMessage;
-import io.bitsquare.trade.protocol.messages.taker.RequestOffererPublishDepositTxMessage;
-import io.bitsquare.trade.protocol.messages.taker.TakeOfferFeePayedMessage;
-import io.bitsquare.trade.protocol.tasks.offerer.*;
+import io.bitsquare.trade.protocol.taker.PayoutTxPublishedMessage;
+import io.bitsquare.trade.protocol.taker.RequestOffererPublishDepositTxMessage;
+import io.bitsquare.trade.protocol.taker.TakeOfferFeePayedMessage;
import io.bitsquare.user.User;
import java.math.BigInteger;
import net.tomp2p.peers.PeerAddress;
+import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Preconditions.*;
import static io.bitsquare.util.Validator.*;
/**
* Responsible for the correct execution of the sequence of tasks, message passing to the peer and message processing from the peer.
- * That class handles the role of the offerer as the Bitcoin buyer.
+ *
+ * This class handles the role of the offerer as the Bitcoin buyer.
+ *
* It uses sub tasks to not pollute the main class too much with all the async result/fault handling.
- * Any data from incoming messages as well data used to send to the peer need to be validated before further processing.
+ * Any data from incoming messages need to be validated before further processing.
*/
-public class OffererAsBuyerProtocol
+public class ProtocolForOffererAsBuyer
{
- private static final Logger log = LoggerFactory.getLogger(OffererAsBuyerProtocol.class);
- public final PeerAddress peerAddress;
- // provided data
- private final String id;
- private final Trade trade;
- private final OffererAsBuyerProtocolListener listener;
- private final MessageFacade messageFacade;
- private final WalletFacade walletFacade;
- private final BlockChainFacade blockChainFacade;
- private final CryptoFacade cryptoFacade;
- private final User user;
- private final String tradeId;
- private final Offer offer;
-
- // data written/read by tasks
- private String preparedOffererDepositTxAsHex;
- private long offererTxOutIndex;
- // data written by messages, read by tasks
- private String takeOfferFeeTxId;
- private String takerMultiSigPubKey;
- private String takerPayoutAddress;
- private String peersAccountId;
- private BankAccount peersBankAccount;
- private String takerMessagePubKey;
- private String peersContractAsJson;
- private String signedTakerDepositTxAsHex;
- private String txConnOutAsHex;
- private String txScriptSigAsHex;
- private long takerTxOutIndex;
- // private
- private State state;
-
- public OffererAsBuyerProtocol(Trade trade,
- PeerAddress peerAddress,
- MessageFacade messageFacade,
- WalletFacade walletFacade,
- BlockChainFacade blockChainFacade,
- CryptoFacade cryptoFacade,
- User user,
- OffererAsBuyerProtocolListener listener)
- {
- this.trade = trade;
- this.peerAddress = peerAddress;
- this.listener = listener;
- this.messageFacade = messageFacade;
- this.walletFacade = walletFacade;
- this.blockChainFacade = blockChainFacade;
- this.cryptoFacade = cryptoFacade;
- this.user = user;
-
- id = trade.getId();
-
- tradeId = trade.getId();
- offer = trade.getOffer();
-
- state = State.Init;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Constructor
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public void start()
- {
- log.debug("start");
- HandleTakeOfferRequest.run(this::onResultHandleTakeOfferRequest, this::onFault, peerAddress, messageFacade, trade.getState(), tradeId);
- state = State.HandleTakeOfferRequest;
- }
-
- public void onResultHandleTakeOfferRequest(Trade.State tradeState)
- {
- log.debug("onResultHandleTakeOfferRequest");
- trade.setState(tradeState);
- messageFacade.removeOffer(offer);
- listener.onOfferAccepted(offer);
- listener.onWaitingForPeerResponse(state);
- }
-
- public void onTakeOfferFeePayedMessage(TakeOfferFeePayedMessage message)
- {
- log.debug("onTakeOfferFeePayedMessage");
-
- // validation
- checkState(state == State.HandleTakeOfferRequest);
- checkNotNull(message);
- String takeOfferFeeTxId = nonEmptyStringOf(message.getTakeOfferFeeTxId());
- BigInteger tradeAmount = nonNegativeBigIntegerOf(nonZeroBigIntegerOf(message.getTradeAmount()));
- String takerMultiSigPubKey = nonEmptyStringOf(message.getTakerMultiSigPubKey());
-
- // apply new state
- state = State.onTakeOfferFeePayedMessage;
- this.takeOfferFeeTxId = takeOfferFeeTxId;
- this.takerMultiSigPubKey = takerMultiSigPubKey;
- trade.setTakeOfferFeeTxID(takeOfferFeeTxId);
- trade.setTradeAmount(tradeAmount);
-
- // next task
- VerifyTakeOfferFeePayment.run(this::onResultVerifyTakeOfferFeePayment, this::onFault, walletFacade, takeOfferFeeTxId);
- state = State.VerifyTakeOfferFeePayment;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Incoming message from peer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public void onResultVerifyTakeOfferFeePayment()
- {
- log.debug("onResultVerifyTakeOfferFeePayment");
- BigInteger collateralAmount = trade.getCollateralAmount();
- String arbitratorPubKeyAsHex = offer.getArbitrator().getPubKeyAsHex();
-
- CreateDepositTx.run(this::onResultCreateDepositTx,
- this::onFault,
- walletFacade,
- tradeId,
- collateralAmount,
- takerMultiSigPubKey,
- arbitratorPubKeyAsHex);
-
- state = State.CreateDepositTx;
- }
-
- public void onResultCreateDepositTx(String offererPubKey, String preparedOffererDepositTxAsHex, long offererTxOutIndex)
- {
- log.debug("onResultCreateDepositTx");
- this.preparedOffererDepositTxAsHex = preparedOffererDepositTxAsHex;
- this.offererTxOutIndex = offererTxOutIndex;
-
- BankAccount bankAccount = user.getBankAccount(trade.getOffer().getBankAccountId());
- String accountId = user.getAccountId();
-
- RequestTakerDepositPayment.run(this::onResultRequestTakerDepositPayment,
- this::onFault,
- peerAddress,
- messageFacade,
- tradeId,
- bankAccount,
- accountId,
- offererPubKey,
- preparedOffererDepositTxAsHex,
- offererTxOutIndex);
-
- state = State.RequestTakerDepositPayment;
- }
-
- public void onResultRequestTakerDepositPayment()
- {
- log.debug("onResultRequestTakerDepositPayment");
- listener.onWaitingForPeerResponse(state);
- }
-
- public void onRequestOffererPublishDepositTxMessage(RequestOffererPublishDepositTxMessage message)
- {
- log.debug("onRequestOffererPublishDepositTxMessage");
-
- // validation
- checkState(state == State.RequestTakerDepositPayment);
- checkNotNull(message);
- String takerPayoutAddress = nonEmptyStringOf(message.getTakerPayoutAddress());
- String peersAccountId = nonEmptyStringOf(message.getAccountId());
- BankAccount peersBankAccount = checkNotNull(message.getBankAccount());
- String takerMessagePubKey = nonEmptyStringOf(message.getTakerMessagePubKey());
- String peersContractAsJson = nonEmptyStringOf(message.getContractAsJson());
- String signedTakerDepositTxAsHex = nonEmptyStringOf(message.getSignedTakerDepositTxAsHex());
- String txConnOutAsHex = nonEmptyStringOf(message.getTxConnOutAsHex());
- String txScriptSigAsHex = nonEmptyStringOf(message.getTxScriptSigAsHex());
- long takerTxOutIndex = nonNegativeLongOf(message.getTakerTxOutIndex());
-
- // apply new state
- state = State.onRequestOffererPublishDepositTxMessage;
- this.takerPayoutAddress = takerPayoutAddress;
- this.peersAccountId = peersAccountId;
- this.peersBankAccount = peersBankAccount;
- this.takerMessagePubKey = takerMessagePubKey;
- this.peersContractAsJson = peersContractAsJson;
- this.signedTakerDepositTxAsHex = signedTakerDepositTxAsHex;
- this.txConnOutAsHex = txConnOutAsHex;
- this.txScriptSigAsHex = txScriptSigAsHex;
- this.takerTxOutIndex = takerTxOutIndex;
-
- // next task
- VerifyTakerAccount.run(this::onResultVerifyTakerAccount, this::onFault, blockChainFacade, peersAccountId, peersBankAccount);
- state = State.VerifyTakerAccount;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Incoming message from peer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public void onResultVerifyTakerAccount()
- {
- log.debug("onResultVerifyTakerAccount");
-
- String accountId = user.getAccountId();
- BigInteger tradeAmount = trade.getTradeAmount();
- String messagePubKeyAsHex = user.getMessagePubKeyAsHex();
- BankAccount bankAccount = user.getBankAccount(offer.getBankAccountId());
- ECKey registrationKey = walletFacade.getRegistrationAddressInfo().getKey();
-
- VerifyAndSignContract.run(this::onResultVerifyAndSignContract,
- this::onFault,
- cryptoFacade,
- accountId,
- tradeAmount,
- takeOfferFeeTxId,
- messagePubKeyAsHex,
- offer,
- peersAccountId,
- bankAccount,
- peersBankAccount,
- takerMessagePubKey,
- peersContractAsJson,
- registrationKey);
-
- state = State.VerifyAndSignContract;
- }
-
- public void onResultVerifyAndSignContract(Contract contract, String contractAsJson, String signature)
- {
- log.debug("onResultVerifyAndSignContract");
-
- trade.setContract(contract);
- trade.setContractAsJson(contractAsJson);
- trade.setContractTakerSignature(signature);
-
- SignAndPublishDepositTx.run(this::onResultSignAndPublishDepositTx,
- this::onFault,
- walletFacade,
- preparedOffererDepositTxAsHex,
- signedTakerDepositTxAsHex,
- txConnOutAsHex,
- txScriptSigAsHex,
- offererTxOutIndex,
- takerTxOutIndex);
- state = State.SignAndPublishDepositTx;
- }
-
- public void onResultSignAndPublishDepositTx(Transaction transaction)
- {
- log.debug("onResultSignAndPublishDepositTx");
-
- trade.setDepositTransaction(transaction);
- listener.onDepositTxPublished(transaction.getHashAsString());
-
- Transaction depositTransaction = trade.getDepositTransaction();
- SendDepositTxIdToTaker.run(this::onResultSendDepositTxIdToTaker, this::onFault, peerAddress, messageFacade, tradeId, depositTransaction);
- state = State.SendDepositTxIdToTaker;
- }
-
- public void onResultSendDepositTxIdToTaker()
- {
- log.debug("onResultSendDepositTxIdToTaker");
-
- SetupListenerForBlockChainConfirmation.run(this::onResultSetupListenerForBlockChainConfirmation, this::onFault, trade.getDepositTransaction(), listener);
- state = State.SetupListenerForBlockChainConfirmation;
- }
-
- public void onResultSetupListenerForBlockChainConfirmation()
- {
- log.debug("onResultSetupListenerForBlockChainConfirmation");
-
- state = State.onResultSetupListenerForBlockChainConfirmation;
- listener.onWaitingForUserInteraction(state);
- }
-
- // Triggered from UI event: Button click "Bank transfer inited"
- public void onUIEventBankTransferInited()
- {
- log.debug("onUIEventBankTransferInited");
-
- // validation
- checkState(state == State.onResultSetupListenerForBlockChainConfirmation);
-
- state = State.onUIEventBankTransferInited;
-
- // next task
- String depositTransactionId = trade.getDepositTransaction().getHashAsString();
- String offererPayoutAddress = walletFacade.getAddressInfoByTradeID(tradeId).getAddressString();
- BigInteger collateral = trade.getCollateralAmount();
- BigInteger tradeAmount = trade.getTradeAmount();
- SendSignedPayoutTx.run(this::onResultSendSignedPayoutTx, this::onFault, peerAddress, messageFacade, walletFacade, tradeId, takerPayoutAddress, offererPayoutAddress, depositTransactionId, collateral, tradeAmount);
- state = State.SendSignedPayoutTx;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Triggered UI event
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public void onResultSendSignedPayoutTx()
- {
- log.debug("onResultSendSignedPayoutTx");
-
- listener.onWaitingForPeerResponse(state);
- }
-
- public void onPayoutTxPublishedMessage(PayoutTxPublishedMessage tradeMessage)
- {
- log.debug("onPayoutTxPublishedMessage");
-
- // validation
- checkState(state == State.SendSignedPayoutTx);
- String payoutTxAsHex = nonEmptyStringOf(tradeMessage.getPayoutTxAsHex());
-
- state = State.onPayoutTxPublishedMessage;
-
- // next task
- listener.onPayoutTxPublished(payoutTxAsHex);
- listener.onCompleted(state);
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Incoming message from peer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public String getId()
- {
- return id;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Getters, Setters
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- // generic fault handler
- private void onFault(Throwable throwable)
- {
- listener.onFault(throwable, state);
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Private
- ///////////////////////////////////////////////////////////////////////////////////////////
+ private static final Logger log = LoggerFactory.getLogger(ProtocolForOffererAsBuyer.class);
+ private final String arbitratorPubKey;
+ private final BigInteger collateral;
+ private final BankAccount bankAccount;
+ private final String accountId;
+ private final BigInteger tradeAmount;
+ private final String messagePubKey;
+ private final ECKey accountKey;
+ private final String payoutAddress;
public enum State
{
@@ -397,4 +68,351 @@ public class OffererAsBuyerProtocol
onPayoutTxPublishedMessage
}
+ private final Trade trade;
+ private final PeerAddress peerAddress;
+ private final MessageFacade messageFacade;
+ private final WalletFacade walletFacade;
+ private final BlockChainFacade blockChainFacade;
+ private final CryptoFacade cryptoFacade;
+ private final ProtocolForOffererAsBuyerListener listener;
+
+ private final String id;
+ private final String tradeId;
+ private final Offer offer;
+
+ private State state;
+
+ // data written/read by tasks
+ private String preparedOffererDepositTxAsHex;
+ private long offererTxOutIndex;
+
+ // data written by messages, read by tasks
+ private String takeOfferFeeTxId;
+ private String takerPubKey;
+ private String peersPayoutAddress;
+ private String peersAccountId;
+ private BankAccount peersBankAccount;
+ private String peersMessagePubKey;
+ private String peersContractAsJson;
+ private String signedTakerDepositTxAsHex;
+ private String txConnOutAsHex;
+ private String txScriptSigAsHex;
+ private long takerTxOutIndex;
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Constructor
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public ProtocolForOffererAsBuyer(Trade trade,
+ PeerAddress peerAddress,
+ MessageFacade messageFacade,
+ WalletFacade walletFacade,
+ BlockChainFacade blockChainFacade,
+ CryptoFacade cryptoFacade,
+ User user,
+ ProtocolForOffererAsBuyerListener listener)
+ {
+ this.trade = trade;
+ this.peerAddress = peerAddress;
+ this.listener = listener;
+ this.messageFacade = messageFacade;
+ this.walletFacade = walletFacade;
+ this.blockChainFacade = blockChainFacade;
+ this.cryptoFacade = cryptoFacade;
+
+ id = trade.getId();
+
+ tradeId = trade.getId();
+ offer = trade.getOffer();
+ arbitratorPubKey = offer.getArbitrator().getPubKeyAsHex();
+ collateral = trade.getCollateralAmount();
+ bankAccount = user.getBankAccount(trade.getOffer().getBankAccountId());
+ accountId = user.getAccountId();
+ tradeAmount = trade.getTradeAmount();
+ messagePubKey = user.getMessagePubKeyAsHex();
+ accountKey = walletFacade.getRegistrationAddressInfo().getKey();
+ payoutAddress = walletFacade.getAddressInfoByTradeID(tradeId).getAddressString();
+ state = State.Init;
+ }
+
+
+ public void start()
+ {
+ log.debug("start called ");
+ HandleTakeOfferRequest.run(this::onResultHandleTakeOfferRequest, this::onFault, peerAddress, messageFacade, trade.getState(), tradeId);
+ state = State.HandleTakeOfferRequest;
+ }
+
+ public void onResultHandleTakeOfferRequest(boolean takeOfferRequestAccepted)
+ {
+ log.debug("onResultHandleTakeOfferRequest called ");
+ if (takeOfferRequestAccepted)
+ {
+ trade.setState(Trade.State.ACCEPTED);
+ messageFacade.removeOffer(offer);
+ listener.onOfferAccepted(offer);
+ listener.onWaitingForPeerResponse(state);
+ }
+ else
+ {
+ log.info("Finish here as we have already the offer accepted.");
+ }
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Incoming message from peer
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public void onTakeOfferFeePayedMessage(@NotNull TakeOfferFeePayedMessage message)
+ {
+ log.debug("onTakeOfferFeePayedMessage called ");
+
+ // validation
+ checkState(state == State.HandleTakeOfferRequest);
+ checkArgument(tradeId.equals(message.getTradeId()));
+ String takeOfferFeeTxId = nonEmptyStringOf(message.getTakeOfferFeeTxId());
+ BigInteger tradeAmount = nonNegativeBigIntegerOf(nonZeroBigIntegerOf(message.getTradeAmount()));
+ String takerPubKey = nonEmptyStringOf(message.getTakerPubKey());
+
+ // apply new state
+ state = State.onTakeOfferFeePayedMessage;
+ this.takeOfferFeeTxId = takeOfferFeeTxId;
+ this.takerPubKey = takerPubKey;
+ trade.setTakeOfferFeeTxID(takeOfferFeeTxId);
+ trade.setTradeAmount(tradeAmount);
+
+ // next task
+ VerifyTakeOfferFeePayment.run(this::onResultVerifyTakeOfferFeePayment, this::onFault, walletFacade, this.takeOfferFeeTxId);
+ state = State.VerifyTakeOfferFeePayment;
+ }
+
+ public void onResultVerifyTakeOfferFeePayment()
+ {
+ log.debug("onResultVerifyTakeOfferFeePayment called ");
+
+ CreateDepositTx.run(this::onResultCreateDepositTx, this::onFault, walletFacade, tradeId, collateral, takerPubKey, arbitratorPubKey);
+
+ state = State.CreateDepositTx;
+ }
+
+ public void onResultCreateDepositTx(String offererPubKey, String preparedOffererDepositTxAsHex, long offererTxOutIndex)
+ {
+ log.debug("onResultCreateDepositTx called ");
+ this.preparedOffererDepositTxAsHex = preparedOffererDepositTxAsHex;
+ this.offererTxOutIndex = offererTxOutIndex;
+
+
+ RequestTakerDepositPayment.run(this::onResultRequestTakerDepositPayment,
+ this::onFault,
+ peerAddress,
+ messageFacade,
+ tradeId,
+ bankAccount,
+ accountId,
+ offererPubKey,
+ preparedOffererDepositTxAsHex,
+ offererTxOutIndex);
+
+ state = State.RequestTakerDepositPayment;
+ }
+
+ public void onResultRequestTakerDepositPayment()
+ {
+ log.debug("onResultRequestTakerDepositPayment called ");
+ listener.onWaitingForPeerResponse(state);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Incoming message from peer
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public void onRequestOffererPublishDepositTxMessage(RequestOffererPublishDepositTxMessage message)
+ {
+ log.debug("onRequestOffererPublishDepositTxMessage called ");
+
+ // validation
+ checkState(state == State.RequestTakerDepositPayment);
+ checkArgument(tradeId.equals(message.getTradeId()));
+ String peersPayoutAddress = nonEmptyStringOf(message.getTakerPayoutAddress());
+ String peersAccountId = nonEmptyStringOf(message.getTakerAccountId());
+ BankAccount peersBankAccount = checkNotNull(message.getTakerBankAccount());
+ String peersMessagePubKey = nonEmptyStringOf(message.getTakerMessagePubKey());
+ String peersContractAsJson = nonEmptyStringOf(message.getTakerContractAsJson());
+ String signedTakerDepositTxAsHex = nonEmptyStringOf(message.getSignedTakerDepositTxAsHex());
+ String txConnOutAsHex = nonEmptyStringOf(message.getTxConnOutAsHex());
+ String txScriptSigAsHex = nonEmptyStringOf(message.getTxScriptSigAsHex());
+ long takerTxOutIndex = nonNegativeLongOf(message.getTakerTxOutIndex());
+
+ // apply new state
+ state = State.onRequestOffererPublishDepositTxMessage;
+ this.peersPayoutAddress = peersPayoutAddress;
+ this.peersAccountId = peersAccountId;
+ this.peersBankAccount = peersBankAccount;
+ this.peersMessagePubKey = peersMessagePubKey;
+ this.peersContractAsJson = peersContractAsJson;
+ this.signedTakerDepositTxAsHex = signedTakerDepositTxAsHex;
+ this.txConnOutAsHex = txConnOutAsHex;
+ this.txScriptSigAsHex = txScriptSigAsHex;
+ this.takerTxOutIndex = takerTxOutIndex;
+
+ // next task
+ VerifyTakerAccount.run(this::onResultVerifyTakerAccount, this::onFault, blockChainFacade, this.peersAccountId, this.peersBankAccount);
+ state = State.VerifyTakerAccount;
+ }
+
+ public void onResultVerifyTakerAccount()
+ {
+ log.debug("onResultVerifyTakerAccount called ");
+
+ VerifyAndSignContract.run(this::onResultVerifyAndSignContract,
+ this::onFault,
+ cryptoFacade,
+ accountId,
+ tradeAmount,
+ takeOfferFeeTxId,
+ messagePubKey,
+ offer,
+ peersAccountId,
+ bankAccount,
+ peersBankAccount,
+ peersMessagePubKey,
+ peersContractAsJson,
+ accountKey);
+
+ state = State.VerifyAndSignContract;
+ }
+
+ public void onResultVerifyAndSignContract(Contract contract, String contractAsJson, String signature)
+ {
+ log.debug("onResultVerifyAndSignContract called ");
+
+ trade.setContract(contract);
+ trade.setContractAsJson(contractAsJson);
+ trade.setContractTakerSignature(signature);
+
+ SignAndPublishDepositTx.run(this::onResultSignAndPublishDepositTx,
+ this::onFault,
+ walletFacade,
+ preparedOffererDepositTxAsHex,
+ signedTakerDepositTxAsHex,
+ txConnOutAsHex,
+ txScriptSigAsHex,
+ offererTxOutIndex,
+ takerTxOutIndex);
+ state = State.SignAndPublishDepositTx;
+ }
+
+ public void onResultSignAndPublishDepositTx(Transaction depositTransaction)
+ {
+ log.debug("onResultSignAndPublishDepositTx called ");
+
+ trade.setDepositTransaction(depositTransaction);
+ listener.onDepositTxPublished(depositTransaction.getHashAsString());
+
+ SendDepositTxIdToTaker.run(this::onResultSendDepositTxIdToTaker, this::onFault, peerAddress, messageFacade, tradeId, depositTransaction);
+ state = State.SendDepositTxIdToTaker;
+ }
+
+ public void onResultSendDepositTxIdToTaker()
+ {
+ log.debug("onResultSendDepositTxIdToTaker called ");
+
+ SetupListenerForBlockChainConfirmation.run(this::onResultSetupListenerForBlockChainConfirmation, this::onFault, trade.getDepositTransaction(), listener);
+ state = State.SetupListenerForBlockChainConfirmation;
+ }
+
+ public void onResultSetupListenerForBlockChainConfirmation()
+ {
+ log.debug("onResultSetupListenerForBlockChainConfirmation called ");
+
+ state = State.onResultSetupListenerForBlockChainConfirmation;
+ listener.onWaitingForUserInteraction(state);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Triggered UI event
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ // Triggered from UI event: Button click "Bank transfer inited"
+ public void onUIEventBankTransferInited()
+ {
+ log.debug("onUIEventBankTransferInited called ");
+
+ // validation
+ checkState(state == State.onResultSetupListenerForBlockChainConfirmation);
+
+
+ state = State.onUIEventBankTransferInited;
+
+ // next task
+ String depositTransactionId = trade.getDepositTransaction().getHashAsString();
+
+ SendSignedPayoutTx.run(this::onResultSendSignedPayoutTx,
+ this::onFault,
+ peerAddress,
+ messageFacade,
+ walletFacade,
+ tradeId,
+ peersPayoutAddress,
+ payoutAddress,
+ depositTransactionId,
+ collateral,
+ tradeAmount);
+ state = State.SendSignedPayoutTx;
+ }
+
+ public void onResultSendSignedPayoutTx()
+ {
+ log.debug("onResultSendSignedPayoutTx called ");
+
+ listener.onWaitingForPeerResponse(state);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Incoming message from peer
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public void onPayoutTxPublishedMessage(PayoutTxPublishedMessage message)
+ {
+ log.debug("onPayoutTxPublishedMessage called ");
+
+ // validation
+ checkState(state == State.SendSignedPayoutTx);
+ checkArgument(tradeId.equals(message.getTradeId()));
+ String payoutTxAsHex = nonEmptyStringOf(message.getPayoutTxAsHex());
+
+ state = State.onPayoutTxPublishedMessage;
+
+ // next task
+ listener.onPayoutTxPublished(payoutTxAsHex);
+ listener.onCompleted(state);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Getters, Setters
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public String getId()
+ {
+ return id;
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Private
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ // generic fault handler
+ private void onFault(Throwable throwable)
+ {
+ listener.onFault(throwable, state);
+ }
+
+
}
diff --git a/src/main/java/io/bitsquare/trade/protocol/offerer/OffererAsBuyerProtocolListener.java b/src/main/java/io/bitsquare/trade/protocol/offerer/ProtocolForOffererAsBuyerListener.java
similarity index 55%
rename from src/main/java/io/bitsquare/trade/protocol/offerer/OffererAsBuyerProtocolListener.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/ProtocolForOffererAsBuyerListener.java
index 1d062d28db..ac851d7434 100644
--- a/src/main/java/io/bitsquare/trade/protocol/offerer/OffererAsBuyerProtocolListener.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/ProtocolForOffererAsBuyerListener.java
@@ -3,7 +3,7 @@ package io.bitsquare.trade.protocol.offerer;
import com.google.bitcoin.core.TransactionConfidence;
import io.bitsquare.trade.Offer;
-public interface OffererAsBuyerProtocolListener
+public interface ProtocolForOffererAsBuyerListener
{
void onOfferAccepted(Offer offer);
@@ -15,11 +15,11 @@ public interface OffererAsBuyerProtocolListener
void onPayoutTxPublished(String payoutTxID);
- void onFault(Throwable throwable, OffererAsBuyerProtocol.State state);
+ void onFault(Throwable throwable, ProtocolForOffererAsBuyer.State state);
- void onWaitingForPeerResponse(OffererAsBuyerProtocol.State state);
+ void onWaitingForPeerResponse(ProtocolForOffererAsBuyer.State state);
- void onCompleted(OffererAsBuyerProtocol.State state);
+ void onCompleted(ProtocolForOffererAsBuyer.State state);
- void onWaitingForUserInteraction(OffererAsBuyerProtocol.State state);
+ void onWaitingForUserInteraction(ProtocolForOffererAsBuyer.State state);
}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/RequestTakerDepositPayment.java b/src/main/java/io/bitsquare/trade/protocol/offerer/RequestTakerDepositPayment.java
similarity index 78%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/offerer/RequestTakerDepositPayment.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/RequestTakerDepositPayment.java
index 888b2e846f..858d0ec58f 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/RequestTakerDepositPayment.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/RequestTakerDepositPayment.java
@@ -1,11 +1,10 @@
-package io.bitsquare.trade.protocol.tasks.offerer;
+package io.bitsquare.trade.protocol.offerer;
import io.bitsquare.bank.BankAccount;
import io.bitsquare.msg.MessageFacade;
import io.bitsquare.msg.listeners.OutgoingTradeMessageListener;
-import io.bitsquare.trade.protocol.messages.offerer.RequestTakerDepositPaymentMessage;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
import net.tomp2p.peers.PeerAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -25,12 +24,7 @@ public class RequestTakerDepositPayment
String preparedOffererDepositTxAsHex,
long offererTxOutIndex)
{
- RequestTakerDepositPaymentMessage tradeMessage = new RequestTakerDepositPaymentMessage(tradeId,
- bankAccount,
- accountId,
- offererPubKey,
- preparedOffererDepositTxAsHex,
- offererTxOutIndex);
+ RequestTakerDepositPaymentMessage tradeMessage = new RequestTakerDepositPaymentMessage(tradeId, bankAccount, accountId, offererPubKey, preparedOffererDepositTxAsHex, offererTxOutIndex);
messageFacade.sendTradeMessage(peerAddress, tradeMessage, new OutgoingTradeMessageListener()
{
@Override
diff --git a/src/main/java/io/bitsquare/trade/protocol/messages/offerer/RequestTakerDepositPaymentMessage.java b/src/main/java/io/bitsquare/trade/protocol/offerer/RequestTakerDepositPaymentMessage.java
similarity index 94%
rename from src/main/java/io/bitsquare/trade/protocol/messages/offerer/RequestTakerDepositPaymentMessage.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/RequestTakerDepositPaymentMessage.java
index 8fc0366e30..69579b1ae8 100644
--- a/src/main/java/io/bitsquare/trade/protocol/messages/offerer/RequestTakerDepositPaymentMessage.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/RequestTakerDepositPaymentMessage.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.messages.offerer;
+package io.bitsquare.trade.protocol.offerer;
import io.bitsquare.bank.BankAccount;
import io.bitsquare.msg.TradeMessage;
@@ -9,7 +9,6 @@ public class RequestTakerDepositPaymentMessage implements Serializable, TradeMes
private static final long serialVersionUID = -3988720410493712913L;
private final String tradeId;
-
private BankAccount bankAccount;
private String accountID;
private String offererPubKey;
@@ -37,7 +36,7 @@ public class RequestTakerDepositPaymentMessage implements Serializable, TradeMes
return bankAccount;
}
- public String getAccountID()
+ public String getAccountId()
{
return accountID;
}
diff --git a/src/main/java/io/bitsquare/trade/protocol/offerer/RespondToTakeOfferRequestMessage.java b/src/main/java/io/bitsquare/trade/protocol/offerer/RespondToTakeOfferRequestMessage.java
new file mode 100644
index 0000000000..3636b7c7e2
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/RespondToTakeOfferRequestMessage.java
@@ -0,0 +1,28 @@
+package io.bitsquare.trade.protocol.offerer;
+
+import io.bitsquare.msg.TradeMessage;
+import java.io.Serializable;
+
+public class RespondToTakeOfferRequestMessage implements Serializable, TradeMessage
+{
+ private static final long serialVersionUID = 6177387534087739018L;
+ private final String tradeId;
+ private boolean takeOfferRequestAccepted;
+
+ public RespondToTakeOfferRequestMessage(String tradeId, boolean takeOfferRequestAccepted)
+ {
+ this.tradeId = tradeId;
+ this.takeOfferRequestAccepted = takeOfferRequestAccepted;
+ }
+
+ @Override
+ public String getTradeId()
+ {
+ return tradeId;
+ }
+
+ public boolean isTakeOfferRequestAccepted()
+ {
+ return takeOfferRequestAccepted;
+ }
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SendDepositTxIdToTaker.java b/src/main/java/io/bitsquare/trade/protocol/offerer/SendDepositTxIdToTaker.java
similarity index 85%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SendDepositTxIdToTaker.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/SendDepositTxIdToTaker.java
index d9349cb716..4945723c76 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SendDepositTxIdToTaker.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/SendDepositTxIdToTaker.java
@@ -1,12 +1,11 @@
-package io.bitsquare.trade.protocol.tasks.offerer;
+package io.bitsquare.trade.protocol.offerer;
import com.google.bitcoin.core.Transaction;
import com.google.bitcoin.core.Utils;
import io.bitsquare.msg.MessageFacade;
import io.bitsquare.msg.listeners.OutgoingTradeMessageListener;
-import io.bitsquare.trade.protocol.messages.offerer.DepositTxPublishedMessage;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
import net.tomp2p.peers.PeerAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SendSignedPayoutTx.java b/src/main/java/io/bitsquare/trade/protocol/offerer/SendSignedPayoutTx.java
similarity index 73%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SendSignedPayoutTx.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/SendSignedPayoutTx.java
index 2374451ab9..a6b3f90f74 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SendSignedPayoutTx.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/SendSignedPayoutTx.java
@@ -1,12 +1,11 @@
-package io.bitsquare.trade.protocol.tasks.offerer;
+package io.bitsquare.trade.protocol.offerer;
import com.google.bitcoin.core.ECKey;
import io.bitsquare.btc.WalletFacade;
import io.bitsquare.msg.MessageFacade;
import io.bitsquare.msg.listeners.OutgoingTradeMessageListener;
-import io.bitsquare.trade.protocol.messages.offerer.BankTransferInitedMessage;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
import java.math.BigInteger;
import javafx.util.Pair;
import net.tomp2p.peers.PeerAddress;
@@ -34,11 +33,7 @@ public class SendSignedPayoutTx
BigInteger offererPaybackAmount = tradeAmount.add(collateral);
BigInteger takerPaybackAmount = collateral;
- Pair result = walletFacade.offererCreatesAndSignsPayoutTx(depositTransactionId,
- offererPaybackAmount,
- takerPaybackAmount,
- takerPayoutAddress,
- tradeId);
+ Pair result = walletFacade.offererCreatesAndSignsPayoutTx(depositTransactionId, offererPaybackAmount, takerPaybackAmount, takerPayoutAddress, tradeId);
ECKey.ECDSASignature offererSignature = result.getKey();
String offererSignatureR = offererSignature.r.toString();
@@ -46,12 +41,12 @@ public class SendSignedPayoutTx
String depositTxAsHex = result.getValue();
BankTransferInitedMessage tradeMessage = new BankTransferInitedMessage(tradeId,
- depositTxAsHex,
- offererSignatureR,
- offererSignatureS,
- offererPaybackAmount,
- takerPaybackAmount,
- offererPayoutAddress);
+ depositTxAsHex,
+ offererSignatureR,
+ offererSignatureS,
+ offererPaybackAmount,
+ takerPaybackAmount,
+ offererPayoutAddress);
messageFacade.sendTradeMessage(peerAddress, tradeMessage, new OutgoingTradeMessageListener()
{
diff --git a/src/main/java/io/bitsquare/trade/protocol/offerer/SetupListenerForBlockChainConfirmation.java b/src/main/java/io/bitsquare/trade/protocol/offerer/SetupListenerForBlockChainConfirmation.java
new file mode 100644
index 0000000000..c9276834be
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/SetupListenerForBlockChainConfirmation.java
@@ -0,0 +1,38 @@
+package io.bitsquare.trade.protocol.offerer;
+
+import com.google.bitcoin.core.Transaction;
+import com.google.bitcoin.core.TransactionConfidence;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SetupListenerForBlockChainConfirmation
+{
+ private static final Logger log = LoggerFactory.getLogger(SetupListenerForBlockChainConfirmation.class);
+
+ public static void run(ResultHandler resultHandler, FaultHandler faultHandler, Transaction depositTransaction, ProtocolForOffererAsBuyerListener listener)
+ { //TODO
+ // sharedModel.offererPaymentProtocolListener.onDepositTxConfirmedInBlockchain();
+
+ depositTransaction.getConfidence().addEventListener(new TransactionConfidence.Listener()
+ {
+ @Override
+ public void onConfidenceChanged(Transaction tx, ChangeReason reason)
+ {
+ log.trace("onConfidenceChanged " + tx.getConfidence());
+ if (reason == ChangeReason.SEEN_PEERS)
+ {
+ listener.onDepositTxConfirmedUpdate(tx.getConfidence());
+ }
+ if (reason == ChangeReason.TYPE && tx.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING)
+ {
+ listener.onDepositTxConfirmedInBlockchain();
+ depositTransaction.getConfidence().removeEventListener(this);
+ log.trace("Tx is in blockchain");
+ resultHandler.onResult();
+ }
+ }
+ });
+ }
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/offerer/SignAndPublishDepositTx.java b/src/main/java/io/bitsquare/trade/protocol/offerer/SignAndPublishDepositTx.java
new file mode 100644
index 0000000000..cdb0dc8b6f
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/SignAndPublishDepositTx.java
@@ -0,0 +1,60 @@
+package io.bitsquare.trade.protocol.offerer;
+
+import com.google.bitcoin.core.Transaction;
+import com.google.common.util.concurrent.FutureCallback;
+import io.bitsquare.btc.WalletFacade;
+import io.bitsquare.trade.protocol.FaultHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SignAndPublishDepositTx
+{
+ private static final Logger log = LoggerFactory.getLogger(SignAndPublishDepositTx.class);
+
+ public static void run(ResultHandler resultHandler,
+ FaultHandler faultHandler,
+ WalletFacade walletFacade,
+ String preparedOffererDepositTxAsHex,
+ String signedTakerDepositTxAsHex,
+ String txConnOutAsHex,
+ String txScriptSigAsHex,
+ long offererTxOutIndex,
+ long takerTxOutIndex)
+ {
+ try
+ {
+ walletFacade.offererSignAndPublishTx(preparedOffererDepositTxAsHex,
+ signedTakerDepositTxAsHex,
+ txConnOutAsHex,
+ txScriptSigAsHex,
+ offererTxOutIndex,
+ takerTxOutIndex,
+ new FutureCallback()
+ {
+ @Override
+ public void onSuccess(Transaction transaction)
+ {
+ log.trace("offererSignAndPublishTx succeeded " + transaction);
+ resultHandler.onResult(transaction);
+ }
+
+ @Override
+ public void onFailure(Throwable t)
+ {
+ log.error("offererSignAndPublishTx faultHandler.onFault:" + t);
+ faultHandler.onFault(t);
+ }
+ });
+ } catch (Exception e)
+ {
+ log.error("offererSignAndPublishTx faultHandler.onFault:" + e);
+ faultHandler.onFault(e);
+ }
+ }
+
+ public interface ResultHandler
+ {
+ void onResult(Transaction depositTransaction);
+ }
+
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/VerifyAndSignContract.java b/src/main/java/io/bitsquare/trade/protocol/offerer/VerifyAndSignContract.java
similarity index 84%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/offerer/VerifyAndSignContract.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/VerifyAndSignContract.java
index 284f4d2ba0..cf659f9d46 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/VerifyAndSignContract.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/VerifyAndSignContract.java
@@ -1,11 +1,11 @@
-package io.bitsquare.trade.protocol.tasks.offerer;
+package io.bitsquare.trade.protocol.offerer;
import com.google.bitcoin.core.ECKey;
import io.bitsquare.bank.BankAccount;
import io.bitsquare.crypto.CryptoFacade;
import io.bitsquare.trade.Contract;
import io.bitsquare.trade.Offer;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
import io.bitsquare.util.Utilities;
import java.math.BigInteger;
import org.slf4j.Logger;
@@ -30,15 +30,7 @@ public class VerifyAndSignContract
String peersContractAsJson,
ECKey registrationKey)
{
- Contract contract = new Contract(offer,
- tradeAmount,
- takeOfferFeeTxId,
- accountId,
- peersAccountId,
- bankAccount,
- peersBankAccount,
- messagePubKeyAsHex,
- takerMessagePubKey);
+ Contract contract = new Contract(offer, tradeAmount, takeOfferFeeTxId, accountId, peersAccountId, bankAccount, peersBankAccount, messagePubKeyAsHex, takerMessagePubKey);
String contractAsJson = Utilities.objectToJson(contract);
// log.trace("Offerer contract created: " + contract);
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/VerifyTakeOfferFeePayment.java b/src/main/java/io/bitsquare/trade/protocol/offerer/VerifyTakeOfferFeePayment.java
similarity index 79%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/offerer/VerifyTakeOfferFeePayment.java
rename to src/main/java/io/bitsquare/trade/protocol/offerer/VerifyTakeOfferFeePayment.java
index d6923290cb..fc14c28635 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/VerifyTakeOfferFeePayment.java
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/VerifyTakeOfferFeePayment.java
@@ -1,8 +1,8 @@
-package io.bitsquare.trade.protocol.tasks.offerer;
+package io.bitsquare.trade.protocol.offerer;
import io.bitsquare.btc.WalletFacade;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/io/bitsquare/trade/protocol/offerer/VerifyTakerAccount.java b/src/main/java/io/bitsquare/trade/protocol/offerer/VerifyTakerAccount.java
new file mode 100644
index 0000000000..ff5f598a79
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/offerer/VerifyTakerAccount.java
@@ -0,0 +1,20 @@
+package io.bitsquare.trade.protocol.offerer;
+
+import io.bitsquare.bank.BankAccount;
+import io.bitsquare.btc.BlockChainFacade;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
+import io.bitsquare.trade.protocol.shared.VerifyPeerAccount;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VerifyTakerAccount
+{
+ private static final Logger log = LoggerFactory.getLogger(VerifyTakerAccount.class);
+
+ public static void run(ResultHandler resultHandler, FaultHandler faultHandler, BlockChainFacade blockChainFacade, String peersAccountId, BankAccount peersBankAccount)
+ {
+ VerifyPeerAccount.run(resultHandler, faultHandler, blockChainFacade, peersAccountId, peersBankAccount);
+ }
+
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/mock/BuyOffererPaymentProcess.java b/src/main/java/io/bitsquare/trade/protocol/old/BuyOffererPaymentProcess.java
similarity index 95%
rename from src/main/java/io/bitsquare/trade/protocol/mock/BuyOffererPaymentProcess.java
rename to src/main/java/io/bitsquare/trade/protocol/old/BuyOffererPaymentProcess.java
index 9acc86d0de..c2bb983dd2 100644
--- a/src/main/java/io/bitsquare/trade/protocol/mock/BuyOffererPaymentProcess.java
+++ b/src/main/java/io/bitsquare/trade/protocol/old/BuyOffererPaymentProcess.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.mock;
+package io.bitsquare.trade.protocol.old;
//TODO not used but let it for reference until all use cases are impl.
class BuyOffererPaymentProcess extends PaymentProcess
diff --git a/src/main/java/io/bitsquare/trade/protocol/mock/BuyTakerPaymentProcess.java b/src/main/java/io/bitsquare/trade/protocol/old/BuyTakerPaymentProcess.java
similarity index 95%
rename from src/main/java/io/bitsquare/trade/protocol/mock/BuyTakerPaymentProcess.java
rename to src/main/java/io/bitsquare/trade/protocol/old/BuyTakerPaymentProcess.java
index 28c44db0f9..0c4e20efcc 100644
--- a/src/main/java/io/bitsquare/trade/protocol/mock/BuyTakerPaymentProcess.java
+++ b/src/main/java/io/bitsquare/trade/protocol/old/BuyTakerPaymentProcess.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.mock;
+package io.bitsquare.trade.protocol.old;
//TODO not used but let it for reference until all use cases are impl.
public class BuyTakerPaymentProcess extends PaymentProcess
diff --git a/src/main/java/io/bitsquare/trade/protocol/mock/PaymentProcess.java b/src/main/java/io/bitsquare/trade/protocol/old/PaymentProcess.java
similarity index 99%
rename from src/main/java/io/bitsquare/trade/protocol/mock/PaymentProcess.java
rename to src/main/java/io/bitsquare/trade/protocol/old/PaymentProcess.java
index 078c838505..b3726ab795 100644
--- a/src/main/java/io/bitsquare/trade/protocol/mock/PaymentProcess.java
+++ b/src/main/java/io/bitsquare/trade/protocol/old/PaymentProcess.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.mock;
+package io.bitsquare.trade.protocol.old;
import com.google.inject.Inject;
import io.bitsquare.btc.BlockChainFacade;
diff --git a/src/main/java/io/bitsquare/trade/protocol/mock/SellOffererPaymentProcess.java b/src/main/java/io/bitsquare/trade/protocol/old/SellOffererPaymentProcess.java
similarity index 95%
rename from src/main/java/io/bitsquare/trade/protocol/mock/SellOffererPaymentProcess.java
rename to src/main/java/io/bitsquare/trade/protocol/old/SellOffererPaymentProcess.java
index e643a4f85f..8a4a9f7553 100644
--- a/src/main/java/io/bitsquare/trade/protocol/mock/SellOffererPaymentProcess.java
+++ b/src/main/java/io/bitsquare/trade/protocol/old/SellOffererPaymentProcess.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.mock;
+package io.bitsquare.trade.protocol.old;
//TODO not used but let it for reference until all use cases are impl.
class SellOffererPaymentProcess extends PaymentProcess
diff --git a/src/main/java/io/bitsquare/trade/protocol/mock/SellTakerPaymentProcess.java b/src/main/java/io/bitsquare/trade/protocol/old/SellTakerPaymentProcess.java
similarity index 95%
rename from src/main/java/io/bitsquare/trade/protocol/mock/SellTakerPaymentProcess.java
rename to src/main/java/io/bitsquare/trade/protocol/old/SellTakerPaymentProcess.java
index e265638f5d..7e78d70c43 100644
--- a/src/main/java/io/bitsquare/trade/protocol/mock/SellTakerPaymentProcess.java
+++ b/src/main/java/io/bitsquare/trade/protocol/old/SellTakerPaymentProcess.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.mock;
+package io.bitsquare.trade.protocol.old;
//TODO not used but let it for reference until all use cases are impl.
class SellTakerPaymentProcess extends PaymentProcess
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/VerifyTakerAccount.java b/src/main/java/io/bitsquare/trade/protocol/shared/VerifyPeerAccount.java
similarity index 82%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/offerer/VerifyTakerAccount.java
rename to src/main/java/io/bitsquare/trade/protocol/shared/VerifyPeerAccount.java
index 44f19ff4de..3842bce48a 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/VerifyTakerAccount.java
+++ b/src/main/java/io/bitsquare/trade/protocol/shared/VerifyPeerAccount.java
@@ -1,15 +1,15 @@
-package io.bitsquare.trade.protocol.tasks.offerer;
+package io.bitsquare.trade.protocol.shared;
import io.bitsquare.bank.BankAccount;
import io.bitsquare.btc.BlockChainFacade;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class VerifyTakerAccount
+public class VerifyPeerAccount
{
- private static final Logger log = LoggerFactory.getLogger(VerifyTakerAccount.class);
+ private static final Logger log = LoggerFactory.getLogger(VerifyPeerAccount.class);
public static void run(ResultHandler resultHandler, FaultHandler faultHandler, BlockChainFacade blockChainFacade, String peersAccountId, BankAccount peersBankAccount)
{
diff --git a/src/main/java/io/bitsquare/trade/protocol/taker/CreateAndSignContract.java b/src/main/java/io/bitsquare/trade/protocol/taker/CreateAndSignContract.java
new file mode 100644
index 0000000000..26cebbf816
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/CreateAndSignContract.java
@@ -0,0 +1,51 @@
+package io.bitsquare.trade.protocol.taker;
+
+import com.google.bitcoin.core.ECKey;
+import io.bitsquare.bank.BankAccount;
+import io.bitsquare.crypto.CryptoFacade;
+import io.bitsquare.trade.Contract;
+import io.bitsquare.trade.Offer;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.util.Utilities;
+import java.math.BigInteger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CreateAndSignContract
+{
+ private static final Logger log = LoggerFactory.getLogger(CreateAndSignContract.class);
+
+ public static void run(ResultHandler resultHandler,
+ FaultHandler faultHandler,
+ CryptoFacade cryptoFacade,
+ Offer offer,
+ BigInteger tradeAmount,
+ String takeOfferFeeTxId,
+ String accountId,
+ BankAccount bankAccount,
+ String peersMessagePubKeyAsHex,
+ String messagePubKeyAsHex,
+ String peersAccountId,
+ BankAccount peersBankAccount,
+ ECKey registrationKey)
+ {
+ try
+ {
+ Contract contract = new Contract(offer, tradeAmount, takeOfferFeeTxId, peersAccountId, accountId, peersBankAccount, bankAccount, peersMessagePubKeyAsHex, messagePubKeyAsHex);
+
+ String contractAsJson = Utilities.objectToJson(contract);
+ String signature = cryptoFacade.signContract(registrationKey, contractAsJson);
+ resultHandler.onResult(contract, contractAsJson, signature);
+ } catch (Throwable t)
+ {
+ log.error("Exception at sign contract " + t);
+ faultHandler.onFault(t);
+ }
+ }
+
+ public interface ResultHandler
+ {
+ void onResult(Contract contract, String contractAsJson, String signature);
+ }
+
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/GetPeerAddress.java b/src/main/java/io/bitsquare/trade/protocol/taker/GetPeerAddress.java
similarity index 91%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/taker/GetPeerAddress.java
rename to src/main/java/io/bitsquare/trade/protocol/taker/GetPeerAddress.java
index 7738ad5cee..c2c2ffe9ca 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/GetPeerAddress.java
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/GetPeerAddress.java
@@ -1,8 +1,8 @@
-package io.bitsquare.trade.protocol.tasks.taker;
+package io.bitsquare.trade.protocol.taker;
import io.bitsquare.msg.MessageFacade;
import io.bitsquare.msg.listeners.GetPeerAddressListener;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
import net.tomp2p.peers.PeerAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/io/bitsquare/trade/protocol/taker/PayDeposit.java b/src/main/java/io/bitsquare/trade/protocol/taker/PayDeposit.java
new file mode 100644
index 0000000000..bcda8a516d
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/PayDeposit.java
@@ -0,0 +1,54 @@
+package io.bitsquare.trade.protocol.taker;
+
+import com.google.bitcoin.core.InsufficientMoneyException;
+import com.google.bitcoin.core.Transaction;
+import io.bitsquare.btc.WalletFacade;
+import io.bitsquare.trade.protocol.FaultHandler;
+import java.math.BigInteger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PayDeposit
+{
+ private static final Logger log = LoggerFactory.getLogger(PayDeposit.class);
+
+ public static void run(ResultHandler resultHandler,
+ FaultHandler faultHandler,
+ WalletFacade walletFacade,
+ BigInteger collateral,
+ BigInteger tradeAmount,
+ String tradeId,
+ String pubKeyForThatTrade,
+ String arbitratorPubKey,
+ String offererPubKey,
+ String preparedOffererDepositTxAsHex)
+ {
+ try
+ {
+ BigInteger amountToPay = tradeAmount.add(collateral);
+ BigInteger msOutputAmount = amountToPay.add(collateral);
+
+ Transaction signedTakerDepositTx = walletFacade.takerAddPaymentAndSignTx(amountToPay,
+ msOutputAmount,
+ offererPubKey,
+ pubKeyForThatTrade,
+ arbitratorPubKey,
+ preparedOffererDepositTxAsHex,
+ tradeId);
+
+ log.trace("sharedModel.signedTakerDepositTx: " + signedTakerDepositTx);
+ resultHandler.onResult(signedTakerDepositTx);
+ } catch (InsufficientMoneyException e)
+ {
+ log.error("Pay deposit faultHandler.onFault due InsufficientMoneyException " + e);
+ faultHandler.onFault(new Exception("Pay deposit faultHandler.onFault due InsufficientMoneyException " + e));
+ }
+ }
+
+ public interface ResultHandler
+ {
+ void onResult(Transaction signedTakerDepositTx);
+ }
+
+
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/PayTakeOfferFee.java b/src/main/java/io/bitsquare/trade/protocol/taker/PayTakeOfferFee.java
similarity index 88%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/taker/PayTakeOfferFee.java
rename to src/main/java/io/bitsquare/trade/protocol/taker/PayTakeOfferFee.java
index 7078d1fd72..4d6d366c37 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/PayTakeOfferFee.java
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/PayTakeOfferFee.java
@@ -1,10 +1,10 @@
-package io.bitsquare.trade.protocol.tasks.taker;
+package io.bitsquare.trade.protocol.taker;
import com.google.bitcoin.core.InsufficientMoneyException;
import com.google.bitcoin.core.Transaction;
import com.google.common.util.concurrent.FutureCallback;
import io.bitsquare.btc.WalletFacade;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,7 +23,7 @@ public class PayTakeOfferFee
public void onSuccess(Transaction transaction)
{
log.debug("Take offer fee paid successfully. Transaction ID = " + transaction.getHashAsString());
- resultHandler.onResult(transaction);
+ resultHandler.onResult(transaction.getHashAsString());
}
@Override
@@ -42,7 +42,7 @@ public class PayTakeOfferFee
public interface ResultHandler
{
- void onResult(Transaction transaction);
+ void onResult(String takeOfferFeeTxId);
}
}
diff --git a/src/main/java/io/bitsquare/trade/protocol/messages/taker/PayoutTxPublishedMessage.java b/src/main/java/io/bitsquare/trade/protocol/taker/PayoutTxPublishedMessage.java
similarity index 92%
rename from src/main/java/io/bitsquare/trade/protocol/messages/taker/PayoutTxPublishedMessage.java
rename to src/main/java/io/bitsquare/trade/protocol/taker/PayoutTxPublishedMessage.java
index f758bf0c1a..b4c0bb39a3 100644
--- a/src/main/java/io/bitsquare/trade/protocol/messages/taker/PayoutTxPublishedMessage.java
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/PayoutTxPublishedMessage.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.messages.taker;
+package io.bitsquare.trade.protocol.taker;
import io.bitsquare.msg.TradeMessage;
import java.io.Serializable;
diff --git a/src/main/java/io/bitsquare/trade/protocol/taker/ProtocolForTakerAsSeller.java b/src/main/java/io/bitsquare/trade/protocol/taker/ProtocolForTakerAsSeller.java
new file mode 100644
index 0000000000..7d0461a629
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/ProtocolForTakerAsSeller.java
@@ -0,0 +1,400 @@
+package io.bitsquare.trade.protocol.taker;
+
+import com.google.bitcoin.core.ECKey;
+import com.google.bitcoin.core.Transaction;
+import io.bitsquare.bank.BankAccount;
+import io.bitsquare.btc.BlockChainFacade;
+import io.bitsquare.btc.WalletFacade;
+import io.bitsquare.crypto.CryptoFacade;
+import io.bitsquare.msg.MessageFacade;
+import io.bitsquare.trade.Contract;
+import io.bitsquare.trade.Offer;
+import io.bitsquare.trade.Trade;
+import io.bitsquare.trade.protocol.offerer.BankTransferInitedMessage;
+import io.bitsquare.trade.protocol.offerer.DepositTxPublishedMessage;
+import io.bitsquare.trade.protocol.offerer.RequestTakerDepositPaymentMessage;
+import io.bitsquare.trade.protocol.offerer.RespondToTakeOfferRequestMessage;
+import io.bitsquare.user.User;
+import java.math.BigInteger;
+import net.tomp2p.peers.PeerAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static com.google.common.base.Preconditions.*;
+import static io.bitsquare.util.Validator.*;
+
+/**
+ * Responsible for the correct execution of the sequence of tasks, message passing to the peer and message processing from the peer.
+ * That class handles the role of the taker as the Bitcoin seller.
+ * It uses sub tasks to not pollute the main class too much with all the async result/fault handling.
+ * Any data from incoming messages as well data used to send to the peer need to be validated before further processing.
+ */
+public class ProtocolForTakerAsSeller
+{
+ private static final Logger log = LoggerFactory.getLogger(ProtocolForTakerAsSeller.class);
+
+
+ public enum State
+ {
+ Init,
+ GetPeerAddress,
+ RequestTakeOffer,
+ PayTakeOfferFee,
+
+ onRequestTakerDepositPaymentMessage,
+
+ SendTakeOfferFeePayedTxId,
+ VerifyOffererAccount,
+ CreateAndSignContract,
+ PayDeposit,
+ SendSignedTakerDepositTxAsHex,
+ onDepositTxPublishedMessage,
+ onBankTransferInitedMessage,
+ onUIEventFiatReceived,
+ SignAndPublishPayoutTx,
+ SendPayoutTxToOfferer
+ }
+
+ // provided data
+ private final Trade trade;
+ private final ProtocolForTakerAsSellerListener listener;
+ private final MessageFacade messageFacade;
+ private final WalletFacade walletFacade;
+ private final BlockChainFacade blockChainFacade;
+ private final CryptoFacade cryptoFacade;
+
+ // derived
+ private final String id;
+ private final Offer offer;
+ private final String tradeId;
+ private final BankAccount bankAccount;
+ private final String accountId;
+ private final String messagePubKey;
+ private final BigInteger tradeAmount;
+ private final String pubKeyForThatTrade;
+ private final ECKey accountKey;
+ private final String peersMessagePubKey;
+ private final BigInteger collateral;
+ private final String arbitratorPubKey;
+
+ // written/read by task
+ private PeerAddress peerAddress;
+
+ // written by messages, read by tasks
+ private String peersAccountId;
+ private BankAccount peersBankAccount;
+ private String peersPubKey;
+ private String preparedPeersDepositTxAsHex;
+ private long peersTxOutIndex;
+
+ private String depositTxAsHex;
+ private String offererSignatureR;
+ private String offererSignatureS;
+ private BigInteger offererPaybackAmount;
+ private BigInteger takerPaybackAmount;
+ private String offererPayoutAddress;
+
+
+ // state
+ private State state;
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Constructor
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public ProtocolForTakerAsSeller(Trade trade,
+ ProtocolForTakerAsSellerListener listener,
+ MessageFacade messageFacade,
+ WalletFacade walletFacade,
+ BlockChainFacade blockChainFacade,
+ CryptoFacade cryptoFacade,
+ User user)
+ {
+ this.trade = trade;
+ this.listener = listener;
+ this.messageFacade = messageFacade;
+ this.walletFacade = walletFacade;
+ this.blockChainFacade = blockChainFacade;
+ this.cryptoFacade = cryptoFacade;
+
+ offer = trade.getOffer();
+ tradeId = trade.getId();
+ tradeAmount = trade.getTradeAmount();
+ collateral = trade.getCollateralAmount();
+ arbitratorPubKey = trade.getOffer().getArbitrator().getPubKeyAsHex();
+
+ pubKeyForThatTrade = walletFacade.getAddressInfoByTradeID(tradeId).getPubKeyAsHexString();
+
+ bankAccount = user.getBankAccount(offer.getBankAccountId());
+ accountId = user.getAccountId();
+ messagePubKey = user.getMessagePubKeyAsHex();
+
+ peersMessagePubKey = offer.getMessagePubKeyAsHex();
+ accountKey = walletFacade.getRegistrationAddressInfo().getKey();
+
+ id = trade.getId();
+
+ state = State.Init;
+ }
+
+ public void start()
+ {
+ log.debug("start called");
+ GetPeerAddress.run(this::onResultGetPeerAddress, this::onFault, messageFacade, peersMessagePubKey);
+ state = State.GetPeerAddress;
+ }
+
+ public void onResultGetPeerAddress(PeerAddress peerAddress)
+ {
+ log.debug(" called");
+ this.peerAddress = peerAddress;
+
+ RequestTakeOffer.run(this::onResultRequestTakeOffer, this::onFault, peerAddress, messageFacade, tradeId);
+ state = State.RequestTakeOffer;
+ }
+
+ public void onResultRequestTakeOffer()
+ {
+ log.debug(" called");
+ listener.onWaitingForPeerResponse(state);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Incoming message from peer
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public void onRespondToTakeOfferRequestMessage(RespondToTakeOfferRequestMessage message)
+ {
+ log.debug("onRespondToTakeOfferRequestMessage called");
+ checkState(state == State.RequestTakeOffer);
+ checkArgument(tradeId.equals(message.getTradeId()));
+
+ if (message.isTakeOfferRequestAccepted())
+ {
+ PayTakeOfferFee.run(this::onResultPayTakeOfferFee, this::onFault, walletFacade, tradeId);
+ state = State.PayTakeOfferFee;
+ }
+ else
+ {
+ listener.onTakeOfferRequestRejected(trade);
+ }
+ }
+
+ public void onResultPayTakeOfferFee(String takeOfferFeeTxId)
+ {
+ log.debug("onResultPayTakeOfferFee called");
+ trade.setTakeOfferFeeTxID(takeOfferFeeTxId);
+
+ SendTakeOfferFeePayedTxId.run(this::onResultSendTakeOfferFeePayedTxId, this::onFault, peerAddress, messageFacade, tradeId, takeOfferFeeTxId, tradeAmount, pubKeyForThatTrade);
+ state = State.SendTakeOfferFeePayedTxId;
+ }
+
+ public void onResultSendTakeOfferFeePayedTxId()
+ {
+ log.debug("onResultSendTakeOfferFeePayedTxId called");
+ listener.onWaitingForPeerResponse(state);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Incoming message from peer
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public void onRequestTakerDepositPaymentMessage(RequestTakerDepositPaymentMessage message)
+ {
+ log.debug("onRequestTakerDepositPaymentMessage called");
+
+ // validation
+ checkState(state == State.SendTakeOfferFeePayedTxId);
+ checkArgument(tradeId.equals(message.getTradeId()));
+ String peersAccountId = nonEmptyStringOf(message.getAccountId());
+ BankAccount peersBankAccount = checkNotNull(message.getBankAccount());
+ String offererPubKey = nonEmptyStringOf(message.getOffererPubKey());
+ String preparedOffererDepositTxAsHex = nonEmptyStringOf(message.getPreparedOffererDepositTxAsHex());
+ long offererTxOutIndex = nonNegativeLongOf(message.getOffererTxOutIndex());
+
+ // apply new state
+ state = State.onRequestTakerDepositPaymentMessage;
+ this.peersAccountId = peersAccountId;
+ this.peersBankAccount = peersBankAccount;
+ this.peersPubKey = offererPubKey;
+ this.preparedPeersDepositTxAsHex = preparedOffererDepositTxAsHex;
+ this.peersTxOutIndex = offererTxOutIndex;
+
+ // next task
+ VerifyOffererAccount.run(this::onResultVerifyOffererAccount, this::onFault, blockChainFacade, peersAccountId, peersBankAccount);
+ state = State.VerifyOffererAccount;
+ }
+
+ public void onResultVerifyOffererAccount()
+ {
+ log.debug("onResultVerifyOffererAccount called");
+ String takeOfferFeeTxId = trade.getTakeOfferFeeTxId();
+ CreateAndSignContract.run(this::onResultCreateAndSignContract,
+ this::onFault,
+ cryptoFacade,
+ offer,
+ tradeAmount,
+ takeOfferFeeTxId,
+ accountId,
+ bankAccount,
+ peersMessagePubKey,
+ messagePubKey,
+ peersAccountId,
+ peersBankAccount,
+ accountKey);
+ state = State.CreateAndSignContract;
+ }
+
+ public void onResultCreateAndSignContract(Contract contract, String contractAsJson, String signature)
+ {
+ log.debug("onResultCreateAndSignContract called");
+
+ trade.setContract(contract);
+ trade.setContractAsJson(contractAsJson);
+ trade.setContractTakerSignature(signature);
+
+ PayDeposit.run(this::onResultPayDeposit, this::onFault, walletFacade, collateral, tradeAmount, tradeId, pubKeyForThatTrade, arbitratorPubKey, peersPubKey, preparedPeersDepositTxAsHex);
+ state = State.PayDeposit;
+ }
+
+ public void onResultPayDeposit(Transaction signedTakerDepositTx)
+ {
+ log.debug("onResultPayDeposit called");
+ String contractAsJson = trade.getContractAsJson();
+ String takerSignature = trade.getTakerSignature();
+
+ SendSignedTakerDepositTxAsHex.run(this::onResultSendSignedTakerDepositTxAsHex,
+ this::onFault,
+ peerAddress,
+ messageFacade,
+ walletFacade,
+ bankAccount,
+ accountId,
+ messagePubKey,
+ tradeId,
+ contractAsJson,
+ takerSignature,
+ signedTakerDepositTx,
+ peersTxOutIndex);
+ state = State.SendSignedTakerDepositTxAsHex;
+ }
+
+ public void onResultSendSignedTakerDepositTxAsHex()
+ {
+ log.debug(" called");
+ listener.onWaitingForPeerResponse(state);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Incoming message from peer
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ // informational, does only trigger UI feedback/update
+ public void onDepositTxPublishedMessage(DepositTxPublishedMessage message)
+ {
+ log.debug("onDepositTxPublishedMessage called");
+ checkState(state.ordinal() > State.SendSignedTakerDepositTxAsHex.ordinal() && state.ordinal() < State.SignAndPublishPayoutTx.ordinal());
+ checkArgument(tradeId.equals(message.getTradeId()));
+ state = State.onDepositTxPublishedMessage;
+ listener.onDepositTxPublished(walletFacade.takerCommitDepositTx(message.getDepositTxAsHex()));
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Incoming message from peer
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ // informational, store data for later, does only trigger UI feedback/update
+ public void onBankTransferInitedMessage(BankTransferInitedMessage message)
+ {
+ log.debug("onBankTransferInitedMessage called");
+
+ // validate
+ checkState(state.ordinal() > State.SendSignedTakerDepositTxAsHex.ordinal() && state.ordinal() < State.SignAndPublishPayoutTx.ordinal());
+ checkArgument(tradeId.equals(message.getTradeId()));
+ String depositTxAsHex = nonEmptyStringOf(message.getDepositTxAsHex());
+ String offererSignatureR = nonEmptyStringOf(message.getOffererSignatureR());
+ String offererSignatureS = nonEmptyStringOf(message.getOffererSignatureS());
+ BigInteger offererPaybackAmount = nonNegativeBigIntegerOf(nonZeroBigIntegerOf(message.getOffererPaybackAmount()));
+ BigInteger takerPaybackAmount = nonNegativeBigIntegerOf(nonZeroBigIntegerOf(message.getTakerPaybackAmount()));
+ String offererPayoutAddress = nonEmptyStringOf(message.getOffererPayoutAddress());
+
+ // apply state
+ state = State.onBankTransferInitedMessage;
+ this.depositTxAsHex = depositTxAsHex;
+ this.offererSignatureR = offererSignatureR;
+ this.offererSignatureS = offererSignatureS;
+ this.offererPaybackAmount = offererPaybackAmount;
+ this.takerPaybackAmount = takerPaybackAmount;
+ this.offererPayoutAddress = offererPayoutAddress;
+
+ listener.onBankTransferInited(message.getTradeId());
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Triggered UI event
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ // User clicked the "bank transfer received" button, so we release the funds for pay out
+ public void onUIEventFiatReceived()
+ {
+ log.debug("onUIEventFiatReceived called");
+
+ checkState(state.ordinal() > State.SendSignedTakerDepositTxAsHex.ordinal() && state.ordinal() < State.SignAndPublishPayoutTx.ordinal());
+ state = State.onUIEventFiatReceived;
+
+ SignAndPublishPayoutTx.run(this::onResultSignAndPublishPayoutTx,
+ this::onFault,
+ walletFacade,
+ tradeId,
+ depositTxAsHex,
+ offererSignatureR,
+ offererSignatureS,
+ offererPaybackAmount,
+ takerPaybackAmount,
+ offererPayoutAddress);
+ state = State.SignAndPublishPayoutTx;
+ }
+
+ public void onResultSignAndPublishPayoutTx(String transactionId, String payoutTxAsHex)
+ {
+ log.debug("onResultSignAndPublishPayoutTx called");
+ listener.onPayoutTxPublished(trade, transactionId);
+
+ SendPayoutTxToOfferer.run(this::onResultSendPayoutTxToOfferer, this::onFault, peerAddress, messageFacade, tradeId, payoutTxAsHex);
+ state = State.SendPayoutTxToOfferer;
+ }
+
+ public void onResultSendPayoutTxToOfferer()
+ {
+ log.debug("onResultSendPayoutTxToOfferer called");
+ listener.onCompleted(state);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Getters, Setters
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ public String getId()
+ {
+ return id;
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////
+ // Private
+ ///////////////////////////////////////////////////////////////////////////////////////////
+
+ // generic fault handler
+ private void onFault(Throwable throwable)
+ {
+ listener.onFault(throwable, state);
+ }
+
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/taker/TakerAsSellerProtocolListener.java b/src/main/java/io/bitsquare/trade/protocol/taker/ProtocolForTakerAsSellerListener.java
similarity index 53%
rename from src/main/java/io/bitsquare/trade/protocol/taker/TakerAsSellerProtocolListener.java
rename to src/main/java/io/bitsquare/trade/protocol/taker/ProtocolForTakerAsSellerListener.java
index 20f75789e6..20bfe7f723 100644
--- a/src/main/java/io/bitsquare/trade/protocol/taker/TakerAsSellerProtocolListener.java
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/ProtocolForTakerAsSellerListener.java
@@ -2,7 +2,7 @@ package io.bitsquare.trade.protocol.taker;
import io.bitsquare.trade.Trade;
-public interface TakerAsSellerProtocolListener
+public interface ProtocolForTakerAsSellerListener
{
void onDepositTxPublished(String depositTxId);
@@ -10,11 +10,11 @@ public interface TakerAsSellerProtocolListener
void onPayoutTxPublished(Trade trade, String hashAsString);
- void onFault(Throwable throwable, TakerAsSellerProtocol.State state);
+ void onFault(Throwable throwable, ProtocolForTakerAsSeller.State state);
- void onWaitingForPeerResponse(TakerAsSellerProtocol.State state);
+ void onWaitingForPeerResponse(ProtocolForTakerAsSeller.State state);
- void onCompleted(TakerAsSellerProtocol.State state);
+ void onCompleted(ProtocolForTakerAsSeller.State state);
void onTakeOfferRequestRejected(Trade trade);
}
diff --git a/src/main/java/io/bitsquare/trade/protocol/messages/taker/RequestOffererPublishDepositTxMessage.java b/src/main/java/io/bitsquare/trade/protocol/taker/RequestOffererPublishDepositTxMessage.java
similarity index 94%
rename from src/main/java/io/bitsquare/trade/protocol/messages/taker/RequestOffererPublishDepositTxMessage.java
rename to src/main/java/io/bitsquare/trade/protocol/taker/RequestOffererPublishDepositTxMessage.java
index 40405e2e8c..c06dc90cae 100644
--- a/src/main/java/io/bitsquare/trade/protocol/messages/taker/RequestOffererPublishDepositTxMessage.java
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/RequestOffererPublishDepositTxMessage.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.messages.taker;
+package io.bitsquare.trade.protocol.taker;
import io.bitsquare.bank.BankAccount;
import io.bitsquare.msg.TradeMessage;
@@ -62,12 +62,12 @@ public class RequestOffererPublishDepositTxMessage implements Serializable, Trad
return offererTxOutIndex;
}
- public BankAccount getBankAccount()
+ public BankAccount getTakerBankAccount()
{
return bankAccount;
}
- public String getAccountId()
+ public String getTakerAccountId()
{
return accountID;
}
@@ -92,7 +92,7 @@ public class RequestOffererPublishDepositTxMessage implements Serializable, Trad
return txConnOutAsHex;
}
- public String getContractAsJson()
+ public String getTakerContractAsJson()
{
return contractAsJson;
}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/RequestTakeOffer.java b/src/main/java/io/bitsquare/trade/protocol/taker/RequestTakeOffer.java
similarity index 82%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/taker/RequestTakeOffer.java
rename to src/main/java/io/bitsquare/trade/protocol/taker/RequestTakeOffer.java
index 6814d09d24..e97633ab4b 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/RequestTakeOffer.java
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/RequestTakeOffer.java
@@ -1,10 +1,9 @@
-package io.bitsquare.trade.protocol.tasks.taker;
+package io.bitsquare.trade.protocol.taker;
import io.bitsquare.msg.MessageFacade;
import io.bitsquare.msg.listeners.OutgoingTradeMessageListener;
-import io.bitsquare.trade.protocol.messages.taker.RequestTakeOfferMessage;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
import net.tomp2p.peers.PeerAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/io/bitsquare/trade/protocol/messages/taker/RequestTakeOfferMessage.java b/src/main/java/io/bitsquare/trade/protocol/taker/RequestTakeOfferMessage.java
similarity index 89%
rename from src/main/java/io/bitsquare/trade/protocol/messages/taker/RequestTakeOfferMessage.java
rename to src/main/java/io/bitsquare/trade/protocol/taker/RequestTakeOfferMessage.java
index df30ef586d..6e7884468d 100644
--- a/src/main/java/io/bitsquare/trade/protocol/messages/taker/RequestTakeOfferMessage.java
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/RequestTakeOfferMessage.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.messages.taker;
+package io.bitsquare.trade.protocol.taker;
import io.bitsquare.msg.TradeMessage;
import java.io.Serializable;
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/SendPayoutTxToOfferer.java b/src/main/java/io/bitsquare/trade/protocol/taker/SendPayoutTxToOfferer.java
similarity index 76%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/taker/SendPayoutTxToOfferer.java
rename to src/main/java/io/bitsquare/trade/protocol/taker/SendPayoutTxToOfferer.java
index 987a29bee4..c85aeffa33 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/SendPayoutTxToOfferer.java
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/SendPayoutTxToOfferer.java
@@ -1,11 +1,9 @@
-package io.bitsquare.trade.protocol.tasks.taker;
+package io.bitsquare.trade.protocol.taker;
import io.bitsquare.msg.MessageFacade;
import io.bitsquare.msg.listeners.OutgoingTradeMessageListener;
-import io.bitsquare.trade.Trade;
-import io.bitsquare.trade.protocol.messages.taker.PayoutTxPublishedMessage;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
import net.tomp2p.peers.PeerAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -14,9 +12,9 @@ public class SendPayoutTxToOfferer
{
private static final Logger log = LoggerFactory.getLogger(SendPayoutTxToOfferer.class);
- public static void run(ResultHandler resultHandler, FaultHandler faultHandler, PeerAddress peerAddress, MessageFacade messageFacade, Trade trade, String payoutTxAsHex)
+ public static void run(ResultHandler resultHandler, FaultHandler faultHandler, PeerAddress peerAddress, MessageFacade messageFacade, String tradeId, String payoutTxAsHex)
{
- PayoutTxPublishedMessage tradeMessage = new PayoutTxPublishedMessage(trade.getId(), payoutTxAsHex);
+ PayoutTxPublishedMessage tradeMessage = new PayoutTxPublishedMessage(tradeId, payoutTxAsHex);
messageFacade.sendTradeMessage(peerAddress, tradeMessage, new OutgoingTradeMessageListener()
{
@Override
diff --git a/src/main/java/io/bitsquare/trade/protocol/taker/SendSignedTakerDepositTxAsHex.java b/src/main/java/io/bitsquare/trade/protocol/taker/SendSignedTakerDepositTxAsHex.java
new file mode 100644
index 0000000000..2336e0d52f
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/SendSignedTakerDepositTxAsHex.java
@@ -0,0 +1,67 @@
+package io.bitsquare.trade.protocol.taker;
+
+import com.google.bitcoin.core.Transaction;
+import com.google.bitcoin.core.Utils;
+import io.bitsquare.bank.BankAccount;
+import io.bitsquare.btc.WalletFacade;
+import io.bitsquare.msg.MessageFacade;
+import io.bitsquare.msg.listeners.OutgoingTradeMessageListener;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
+import net.tomp2p.peers.PeerAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SendSignedTakerDepositTxAsHex
+{
+ private static final Logger log = LoggerFactory.getLogger(SendSignedTakerDepositTxAsHex.class);
+
+ public static void run(ResultHandler resultHandler,
+ FaultHandler faultHandler,
+ PeerAddress peerAddress,
+ MessageFacade messageFacade,
+ WalletFacade walletFacade,
+ BankAccount bankAccount,
+ String accountId,
+ String messagePubKeyAsHex,
+ String tradeId,
+ String contractAsJson,
+ String takerSignature,
+ Transaction signedTakerDepositTx,
+ long offererTxOutIndex)
+ {
+ long takerTxOutIndex = signedTakerDepositTx.getInput(1).getOutpoint().getIndex();
+
+ RequestOffererPublishDepositTxMessage tradeMessage = new RequestOffererPublishDepositTxMessage(tradeId,
+ bankAccount,
+ accountId,
+ messagePubKeyAsHex,
+ Utils.bytesToHexString(signedTakerDepositTx.bitcoinSerialize()),
+ Utils.bytesToHexString(signedTakerDepositTx.getInput(1).getScriptBytes()),
+ Utils.bytesToHexString(signedTakerDepositTx.getInput(1)
+ .getConnectedOutput()
+ .getParentTransaction()
+ .bitcoinSerialize()),
+ contractAsJson,
+ takerSignature,
+ walletFacade.getAddressInfoByTradeID(tradeId).getAddressString(),
+ takerTxOutIndex,
+ offererTxOutIndex);
+ messageFacade.sendTradeMessage(peerAddress, tradeMessage, new OutgoingTradeMessageListener()
+ {
+ @Override
+ public void onResult()
+ {
+ log.trace("RequestOffererDepositPublicationMessage successfully arrived at peer");
+ resultHandler.onResult();
+ }
+
+ @Override
+ public void onFailed()
+ {
+ log.error("RequestOffererDepositPublicationMessage faultHandler.onFault to arrive at peer");
+ faultHandler.onFault(new Exception("RequestOffererDepositPublicationMessage faultHandler.onFault to arrive at peer"));
+ }
+ });
+ }
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/SendTakeOfferFeePayedTxId.java b/src/main/java/io/bitsquare/trade/protocol/taker/SendTakeOfferFeePayedTxId.java
similarity index 78%
rename from src/main/java/io/bitsquare/trade/protocol/tasks/taker/SendTakeOfferFeePayedTxId.java
rename to src/main/java/io/bitsquare/trade/protocol/taker/SendTakeOfferFeePayedTxId.java
index 02aef821ca..454b040796 100644
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/SendTakeOfferFeePayedTxId.java
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/SendTakeOfferFeePayedTxId.java
@@ -1,10 +1,9 @@
-package io.bitsquare.trade.protocol.tasks.taker;
+package io.bitsquare.trade.protocol.taker;
import io.bitsquare.msg.MessageFacade;
import io.bitsquare.msg.listeners.OutgoingTradeMessageListener;
-import io.bitsquare.trade.protocol.messages.taker.TakeOfferFeePayedMessage;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
import java.math.BigInteger;
import net.tomp2p.peers.PeerAddress;
import org.slf4j.Logger;
@@ -21,12 +20,9 @@ public class SendTakeOfferFeePayedTxId
String tradeId,
String takeOfferFeeTxId,
BigInteger tradeAmount,
- String pubKeyAsHexString)
+ String pubKeyForThatTradeAsHex)
{
- TakeOfferFeePayedMessage msg = new TakeOfferFeePayedMessage(tradeId,
- takeOfferFeeTxId,
- tradeAmount,
- pubKeyAsHexString);
+ TakeOfferFeePayedMessage msg = new TakeOfferFeePayedMessage(tradeId, takeOfferFeeTxId, tradeAmount, pubKeyForThatTradeAsHex);
messageFacade.sendTradeMessage(peerAddress, msg, new OutgoingTradeMessageListener()
{
diff --git a/src/main/java/io/bitsquare/trade/protocol/taker/SignAndPublishPayoutTx.java b/src/main/java/io/bitsquare/trade/protocol/taker/SignAndPublishPayoutTx.java
new file mode 100644
index 0000000000..a09f27868f
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/SignAndPublishPayoutTx.java
@@ -0,0 +1,66 @@
+package io.bitsquare.trade.protocol.taker;
+
+import com.google.bitcoin.core.Transaction;
+import com.google.bitcoin.core.Utils;
+import com.google.common.util.concurrent.FutureCallback;
+import io.bitsquare.btc.WalletFacade;
+import io.bitsquare.trade.protocol.FaultHandler;
+import java.math.BigInteger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SignAndPublishPayoutTx
+{
+ private static final Logger log = LoggerFactory.getLogger(SignAndPublishPayoutTx.class);
+
+ public static void run(ResultHandler resultHandler,
+ FaultHandler faultHandler,
+ WalletFacade walletFacade,
+ String tradeId,
+ String depositTxAsHex,
+ String offererSignatureR,
+ String offererSignatureS,
+ BigInteger offererPaybackAmount,
+ BigInteger takerPaybackAmount,
+ String offererPayoutAddress)
+ {
+ try
+ {
+
+ walletFacade.takerSignsAndSendsTx(depositTxAsHex,
+ offererSignatureR,
+ offererSignatureS,
+ offererPaybackAmount,
+ takerPaybackAmount,
+ offererPayoutAddress,
+ tradeId,
+ new FutureCallback()
+ {
+ @Override
+ public void onSuccess(Transaction transaction)
+ {
+ log.debug("takerSignsAndSendsTx " + transaction);
+ String payoutTxAsHex = Utils.bytesToHexString(transaction.bitcoinSerialize());
+ resultHandler.onResult(transaction.getHashAsString(), payoutTxAsHex);
+ }
+
+ @Override
+ public void onFailure(Throwable t)
+ {
+ log.error("Exception at takerSignsAndSendsTx " + t);
+ faultHandler.onFault(t);
+ }
+ });
+ } catch (Exception e)
+ {
+ log.error("Exception at takerSignsAndSendsTx " + e);
+ faultHandler.onFault(e);
+ }
+ }
+
+ public interface ResultHandler
+ {
+ void onResult(String transactionId, String payoutTxAsHex);
+ }
+
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/messages/taker/TakeOfferFeePayedMessage.java b/src/main/java/io/bitsquare/trade/protocol/taker/TakeOfferFeePayedMessage.java
similarity index 73%
rename from src/main/java/io/bitsquare/trade/protocol/messages/taker/TakeOfferFeePayedMessage.java
rename to src/main/java/io/bitsquare/trade/protocol/taker/TakeOfferFeePayedMessage.java
index 1974bb542c..44a218d3c3 100644
--- a/src/main/java/io/bitsquare/trade/protocol/messages/taker/TakeOfferFeePayedMessage.java
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/TakeOfferFeePayedMessage.java
@@ -1,4 +1,4 @@
-package io.bitsquare.trade.protocol.messages.taker;
+package io.bitsquare.trade.protocol.taker;
import io.bitsquare.msg.TradeMessage;
import java.io.Serializable;
@@ -11,14 +11,14 @@ public class TakeOfferFeePayedMessage implements Serializable, TradeMessage
private BigInteger tradeAmount;
private String takeOfferFeeTxID;
- private String takerMultiSigPubKey;
+ private String takerPubKey;
- public TakeOfferFeePayedMessage(String tradeId, String takeOfferFeeTxID, BigInteger tradeAmount, String takerMultiSigPubKey)
+ public TakeOfferFeePayedMessage(String tradeId, String takeOfferFeeTxID, BigInteger tradeAmount, String takerPubKey)
{
this.tradeId = tradeId;
this.takeOfferFeeTxID = takeOfferFeeTxID;
this.tradeAmount = tradeAmount;
- this.takerMultiSigPubKey = takerMultiSigPubKey;
+ this.takerPubKey = takerPubKey;
}
@Override
@@ -37,9 +37,9 @@ public class TakeOfferFeePayedMessage implements Serializable, TradeMessage
return takeOfferFeeTxID;
}
- public String getTakerMultiSigPubKey()
+ public String getTakerPubKey()
{
- return takerMultiSigPubKey;
+ return takerPubKey;
}
}
diff --git a/src/main/java/io/bitsquare/trade/protocol/taker/TakerAsSellerProtocol.java b/src/main/java/io/bitsquare/trade/protocol/taker/TakerAsSellerProtocol.java
deleted file mode 100644
index 709a328aa3..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/taker/TakerAsSellerProtocol.java
+++ /dev/null
@@ -1,882 +0,0 @@
-package io.bitsquare.trade.protocol.taker;
-
-import com.google.bitcoin.core.Transaction;
-import io.bitsquare.bank.BankAccount;
-import io.bitsquare.btc.BlockChainFacade;
-import io.bitsquare.btc.WalletFacade;
-import io.bitsquare.crypto.CryptoFacade;
-import io.bitsquare.msg.MessageFacade;
-import io.bitsquare.trade.Offer;
-import io.bitsquare.trade.Trade;
-import io.bitsquare.trade.protocol.messages.offerer.BankTransferInitedMessage;
-import io.bitsquare.trade.protocol.messages.offerer.DepositTxPublishedMessage;
-import io.bitsquare.trade.protocol.messages.offerer.RequestTakerDepositPaymentMessage;
-import io.bitsquare.trade.protocol.tasks.taker.*;
-import io.bitsquare.user.User;
-import java.math.BigInteger;
-import net.tomp2p.peers.PeerAddress;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static io.bitsquare.util.Validator.nonEmptyStringOf;
-import static io.bitsquare.util.Validator.nonNegativeLongOf;
-
-/**
- * Responsible for the correct execution of the sequence of tasks, message passing to the peer and message processing from the peer.
- * That class handles the role of the taker as the Bitcoin seller.
- * It uses sub tasks to not pollute the main class too much with all the async result/fault handling.
- * Any data from incoming messages as well data used to send to the peer need to be validated before further processing.
- */
-public class TakerAsSellerProtocol
-{
- private static final Logger log = LoggerFactory.getLogger(TakerAsSellerProtocol.class);
- // provided data
- private final Trade trade;
- private final TakerAsSellerProtocolListener listener;
- private final MessageFacade messageFacade;
- private final WalletFacade walletFacade;
- private final BlockChainFacade blockChainFacade;
- private final CryptoFacade cryptoFacade;
- private final User user;
- private final String id;
- private final Offer offer;
- private final String tradeId;
- // written/read by task
- private String payoutTxAsHex;
- private PeerAddress peerAddress;
- private Transaction signedTakerDepositTx;
- private long takerTxOutIndex;
- // written by message, read by tasks
- private String peersAccountId;
- private BankAccount peersBankAccount;
- private String offererPubKey;
- private String preparedOffererDepositTxAsHex;
- private long offererTxOutIndex;
- private String depositTxAsHex;
- private String offererSignatureR;
- private String offererSignatureS;
- private BigInteger offererPaybackAmount;
- private BigInteger takerPaybackAmount;
- private String offererPayoutAddress;
- //private
- private State state;
-
- public TakerAsSellerProtocol(Trade trade,
- TakerAsSellerProtocolListener listener,
- MessageFacade messageFacade,
- WalletFacade walletFacade,
- BlockChainFacade blockChainFacade,
- CryptoFacade cryptoFacade,
- User user)
- {
- this.trade = trade;
- this.listener = listener;
- this.messageFacade = messageFacade;
- this.walletFacade = walletFacade;
- this.blockChainFacade = blockChainFacade;
- this.cryptoFacade = cryptoFacade;
- this.user = user;
-
- offer = trade.getOffer();
- tradeId = trade.getId();
-
- id = trade.getId();
- state = State.Init;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Constructor
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- // generic fault handler
- public void onFault(Throwable throwable)
- {
- listener.onFault(throwable, state);
- }
-
- public void start()
- {
- String messagePubKeyAsHex = nonEmptyStringOf(offer.getMessagePubKeyAsHex());
-
- GetPeerAddress.run(this::onResultGetPeerAddress, this::onFault, messageFacade, messagePubKeyAsHex);
- state = State.GetPeerAddress;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Tasks
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public void onResultGetPeerAddress(PeerAddress peerAddress)
- {
- this.peerAddress = checkNotNull(peerAddress);
-
- RequestTakeOffer.run(this::onResultRequestTakeOffer, this::onFault, this.peerAddress, messageFacade, tradeId);
- state = State.RequestTakeOffer;
- }
-
- public void onResultRequestTakeOffer()
- {
- listener.onWaitingForPeerResponse(state);
- }
-
- public void onAcceptTakeOfferRequestMessage()
- {
- log.debug("onAcceptTakeOfferRequestMessage");
- checkState(state == State.RequestTakeOffer);
-
- PayTakeOfferFee.run(this::onResultPayTakeOfferFee, this::onFault, walletFacade, tradeId);
- state = State.PayTakeOfferFee;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Incoming message from peer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- // OR
- public void onRejectTakeOfferRequestMessage()
- {
- log.debug("onRejectTakeOfferRequestMessage");
- checkState(state == State.RequestTakeOffer);
-
- state = State.onRejectTakeOfferRequestMessage;
- listener.onTakeOfferRequestRejected(trade);
- }
-
- public void onResultPayTakeOfferFee(Transaction transaction)
- {
- checkNotNull(transaction);
- String transactionId = nonEmptyStringOf(transaction.getHashAsString());
-
- trade.setTakeOfferFeeTxID(transactionId);
-
- String takeOfferFeeTxId = trade.getTakeOfferFeeTxId();
- BigInteger tradeAmount = trade.getTradeAmount();
- String pubKeyAsHexString = walletFacade.getAddressInfoByTradeID(tradeId).getPubKeyAsHexString();
-
- SendTakeOfferFeePayedTxId.run(this::onResultSendTakeOfferFeePayedTxId,
- this::onFault,
- peerAddress,
- messageFacade,
- tradeId,
- takeOfferFeeTxId,
- tradeAmount,
- pubKeyAsHexString);
- state = State.SendTakeOfferFeePayedTxId;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Tasks
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public void onResultSendTakeOfferFeePayedTxId()
- {
- listener.onWaitingForPeerResponse(state);
- }
-
- public void onRequestTakerDepositPaymentMessage(RequestTakerDepositPaymentMessage message)
- {
- log.debug("onRequestTakerDepositPaymentMessage");
-
- checkState(state == State.SendTakeOfferFeePayedTxId);
-
- peersAccountId = nonEmptyStringOf(message.getAccountID());
- peersBankAccount = checkNotNull(message.getBankAccount());
- offererPubKey = nonEmptyStringOf(message.getOffererPubKey());
- preparedOffererDepositTxAsHex = nonEmptyStringOf(message.getPreparedOffererDepositTxAsHex());
- offererTxOutIndex = nonNegativeLongOf(message.getOffererTxOutIndex());
-
- VerifyOffererAccount.run(this::onResultVerifyOffererAccount,
- this::onFault,
- blockChainFacade,
- peersAccountId,
- peersBankAccount);
- state = State.VerifyOffererAccount;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Incoming message from peer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public void onResultVerifyOffererAccount()
- {
- CreateAndSignContract.run(this::onResultCreateAndSignContract,
- this::onFault,
- cryptoFacade,
- trade,
- user,
- peersAccountId,
- peersBankAccount,
- walletFacade.getRegistrationAddressInfo().getKey());
- state = State.CreateAndSignContract;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Tasks
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public void onResultCreateAndSignContract()
- {
- PayDeposit.run(this::onResultPayDeposit, this::onFault, walletFacade, trade, offererPubKey, preparedOffererDepositTxAsHex);
- state = State.PayDeposit;
- }
-
- public void onResultPayDeposit(Transaction signedTakerDepositTx, long takerTxOutIndex)
- {
- SendSignedTakerDepositTxAsHex.run(this::onResultSendSignedTakerDepositTxAsHex,
- this::onFault,
- peerAddress,
- messageFacade,
- walletFacade,
- trade,
- user,
- signedTakerDepositTx,
- takerTxOutIndex,
- offererTxOutIndex);
- state = State.SendSignedTakerDepositTxAsHex;
- }
-
- public void onResultSendSignedTakerDepositTxAsHex()
- {
- listener.onWaitingForPeerResponse(state);
- }
-
- // informational, does only trigger UI feedback/update
- public void onDepositTxPublishedMessage(DepositTxPublishedMessage message)
- {
- log.debug("onDepositTxPublishedMessage");
- if (state.ordinal() > State.SendSignedTakerDepositTxAsHex.ordinal() && state.ordinal() < State.SignAndPublishPayoutTx.ordinal())
- {
- state = State.onDepositTxPublishedMessage;
-
- listener.onDepositTxPublished(walletFacade.takerCommitDepositTx(message.getDepositTxAsHex()));
- }
- else
- {
- log.error("Invalid state. Actual state is: " + state);
- }
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Incoming message from peer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- // informational, store data for later, does only trigger UI feedback/update
- public void onBankTransferInitedMessage(BankTransferInitedMessage tradeMessage)
- {
- log.debug("onBankTransferInitedMessage");
-
- if (state.ordinal() > State.SendSignedTakerDepositTxAsHex.ordinal() && state.ordinal() < State.SignAndPublishPayoutTx.ordinal())
- {
- state = State.onBankTransferInitedMessage;
-
- depositTxAsHex = tradeMessage.getDepositTxAsHex();
- offererSignatureR = tradeMessage.getOffererSignatureR();
- offererSignatureS = tradeMessage.getOffererSignatureS();
- offererPaybackAmount = tradeMessage.getOffererPaybackAmount();
- takerPaybackAmount = tradeMessage.getTakerPaybackAmount();
- offererPayoutAddress = tradeMessage.getOffererPayoutAddress();
-
- listener.onBankTransferInited(tradeMessage.getTradeId());
- }
- else
- {
- log.error("Invalid state. Actual state is: " + state);
- }
- }
-
- // User clicked the "bank transfer received" button, so we release the funds for pay out
- public void onUIEventFiatReceived()
- {
- log.debug("onUIEventFiatReceived");
-
- if (state.ordinal() > State.SendSignedTakerDepositTxAsHex.ordinal() && state.ordinal() < State.SignAndPublishPayoutTx.ordinal())
- {
- state = State.onUIEventFiatReceived;
-
- SignAndPublishPayoutTx.run(this::onResultSignAndPublishPayoutTx,
- this::onFault,
- walletFacade,
- trade,
- depositTxAsHex,
- offererSignatureR,
- offererSignatureS,
- offererPaybackAmount,
- takerPaybackAmount,
- offererPayoutAddress);
- state = State.SignAndPublishPayoutTx;
- }
- else
- {
- log.error("Invalid state. Actual state is: " + state);
- }
- }
-
- public void onResultSignAndPublishPayoutTx(Transaction transaction, String payoutTxAsHex)
- {
- listener.onPayoutTxPublished(trade, transaction.getHashAsString());
-
- SendPayoutTxToOfferer.run(this::onResultSendPayoutTxToOfferer, this::onFault, peerAddress, messageFacade, trade, payoutTxAsHex);
- state = State.SendPayoutTxToOfferer;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Tasks
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public void onResultSendPayoutTxToOfferer()
- {
- checkState(state == State.SendPayoutTxToOfferer);
- listener.onCompleted(state);
- }
-
- public String getId()
- {
- return id;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Getters, Setters
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- public enum State
- {
- Init,
- GetPeerAddress,
- RequestTakeOffer,
- PayTakeOfferFee,
- onRejectTakeOfferRequestMessage,
- SendTakeOfferFeePayedTxId,
- VerifyOffererAccount,
- CreateAndSignContract,
- PayDeposit,
- SendSignedTakerDepositTxAsHex,
- onDepositTxPublishedMessage,
- onBankTransferInitedMessage,
- onUIEventFiatReceived,
- SignAndPublishPayoutTx,
- SendPayoutTxToOfferer
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 1.1
- ///////////////////////////////////////////////////////////////////////////////////////////
-
-
- /* private void findPeerAddress()
- {
- log.debug("1.1 findPeerAddress");
- AddressLookupListener addressLookupListener = new AddressLookupListener()
- {
- @Override
- public void onResult(PeerAddress address)
- {
- log.debug("1.1 findPeerAddress onResult");
- // We got the peer address
- peerAddress = address;
-
- takerPaymentProtocolListener.onProgress(getProgress());
-
- // next
- requestTakeOffer();
- }
-
- @Override
- public void onFailed()
- {
- log.debug("1.1 findPeerAddress onFailed");
- takerPaymentProtocolListener.onFailure("onGetPeerAddressFailed");
- }
- };
-
- takerPaymentProtocolListener.onProgress(getProgress());
-
- // Request the peers address from the DHT
- messageFacade.getPeerAddress(offer.getMessagePubKeyAsHex(), addressLookupListener);
- } */
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 1.2
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /* private void requestTakeOffer()
- {
- log.debug("1.2 requestTakeOffer");
- TradeMessageListener listener = new TradeMessageListener()
- {
- @Override
- public void onResult()
- {
- log.debug("1.2 requestTakeOffer onResult");
- // Our message has arrived
- // We don't know yet if the offerer has accepted
- // the take request (if offer is not already reserved for another user)
- // We await for an incoming message from the offerer with the accept msg
- takerPaymentProtocolListener.onProgress(getProgress());
-
- // Wait for message from offerer...
- }
-
- @Override
- public void onFailed()
- {
- log.debug("1.2 requestTakeOffer onFailed");
- takerPaymentProtocolListener.onFailure("sendTakeOfferRequest onSendTradingMessageFailed");
- }
- };
-
- takerPaymentProtocolListener.onProgress(getProgress());
-
- // Send the take offer request
- TradeMessage tradeMessage = new TradeMessage(TradeMessageType.REQUEST_TAKE_OFFER, trade.getId());
- messageFacade.sendTradeMessage(peerAddress, tradeMessage, listener);
- } */
-
-
- //************************************************************************************************
- // 1.3. Offerers tasks, we are in waiting mode
- //************************************************************************************************
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 1.4
- ///////////////////////////////////////////////////////////////////////////////////////////
-
-
- // 1.4a offerer has accepted the take offer request. Move on to step 2.
- /* public void onAcceptTakeOfferRequestMessage()
- {
- log.debug("1.4a onAcceptTakeOfferRequestMessage");
- // listener.onProgress(getProgress());
-
- payOfferFee(trade);
- }
-
- // 1.4b Offerer has rejected the take offer request. The UI controller will onResult the case.
- public void onRejectTakeOfferRequestMessage()
- {
- log.debug("1.4b onRejectTakeOfferRequestMessage");
- // listener.onProgress(getProgress());
- } */
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 2.1
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /* private void payOfferFee(Trade trade)
- {
- log.debug("2.1 payTakeOfferFee");
- FutureCallback callback = new FutureCallback()
- {
- @Override
- public void onSuccess(@javax.annotation.Nullable Transaction transaction)
- {
- log.debug("2.1 payTakeOfferFee onSuccess");
- log.info("sendResult onSuccess txid:" + transaction.getHashAsString());
-
- // Offer fee payed successfully.
- trade.setTakeOfferFeeTxID(transaction.getHashAsString());
-
- // listener.onProgress(getProgress());
-
- // move on
- sendTakerOfferFeeTxID(transaction.getHashAsString());
- }
-
- @Override
- public void onFailure(Throwable t)
- {
- log.debug("2.1 payTakeOfferFee onFailure");
- // listener.onFailure("payTakeOfferFee onFailure " + t.getMessage());
- }
- };
- try
- {
- // Pay the offer fee
- // listener.onProgress(getProgress());
- walletFacade.payTakeOfferFee(trade.getId(), callback);
- } catch (InsufficientMoneyException e)
- {
- // listener.onProgress(getProgress());
- }
- } */
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 2.2
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- // Request peers account details. At that moment private data (bank account nr.) of the offerer get visible to the taker.
- // We send also the tx id of the fee payment, so the offerer can confirm that the payment is seen in the network
- // 0 block confirmation is acceptable for the fee to not block the process
- // The offerer will wait until a minimum of peers seen the tx before sending his data.
- // We also get the multisig tx delivered
- /* private void sendTakerOfferFeeTxID(String takeOfferFeeTxID)
- {
- log.debug("2.2 sendTakerOfferFeeTxID");
- TradeMessageListener listener = new TradeMessageListener()
- {
- @Override
- public void onResult()
- {
- log.debug("2.2 sendTakerOfferFeeTxID onResult");
- // Message has arrived
- //listener.onProgress(getProgress());
-
- // We wait until the offerer send us the data
- }
-
- @Override
- public void onFailed()
- {
- log.debug("2.2 sendTakerOfferFeeTxID onFailed");
- // //TakerAsSellerProtocol.this. listener.onFailure("requestAccountDetails onSendTradingMessageFailed");
- }
- };
-
- // this.listener.onProgress(getProgress());
-
- // 2.3. send request for the account details and send fee tx id so offerer can verify that the fee has been paid.
- TradeMessageOld tradeMessage = new TradeMessageOld(TradeMessageType.TAKE_OFFER_FEE_PAYED,
- trade.getId(),
- trade.getTradeAmount(),
- takeOfferFeeTxID,
- walletFacade.getAddressInfoByTradeID(trade.getId()).getPubKeyAsHexString());
- messageFacade.sendTradeMessage(peerAddress, tradeMessage, listener);
- }
- */
-
- //************************************************************************************************
- // 2.3 - 2.6 Offerers tasks, we are in waiting mode
- //************************************************************************************************
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 2.7 Incoming msg from offerer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /*public void onRequestTakerDepositPaymentMessage(TradeMessageOld requestTradeMessage)
- {
- log.debug("2.7 onRequestTakerDepositPaymentMessage");
- verifyOfferer(requestTradeMessage);
- } */
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 2.8 Verify offerers account registration and against the blacklist
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /*private void verifyOfferer(TradeMessageOld requestTradeMessage)
- {
- log.debug("2.8 verifyOfferer");
- log.debug("2.8.1 verifyAccountRegistration");
- if (blockChainFacade.verifyAccountRegistration())
- {
- log.debug("2.8.2 isAccountBlackListed");
- if (blockChainFacade.isAccountBlackListed(requestTradeMessage.getAccountId(), requestTradeMessage.getBankAccount()))
- {
- // listener.onFailure("Offerer is blacklisted.");
- }
- else
- {
- createAndSignContract(requestTradeMessage);
- }
- }
- else
- {
- // listener.onFailure("Offerers account registration is invalid.");
- }
- } */
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 2.9 Create and sign the contract
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /* private void createAndSignContract(TradeMessageOld requestTradeMessage)
- {
- log.debug("2.9 createAndSignContract");
- checkNotNull(trade.getOffer());
- checkNotNull(trade.getTradeAmount());
- checkNotNull(trade.getTakeOfferFeeTxId());
- checkNotNull(requestTradeMessage.getAccountId());
- checkNotNull(user.getAccountId());
- checkNotNull(requestTradeMessage.getBankAccount());
- checkNotNull(user.getCurrentBankAccount());
- checkNotNull(user.getMessagePubKeyAsHex());
-
- Contract contract = new Contract(trade.getOffer(),
- trade.getTradeAmount(),
- trade.getTakeOfferFeeTxId(),
- requestTradeMessage.getAccountId(),
- user.getAccountId(),
- requestTradeMessage.getBankAccount(),
- user.getCurrentBankAccount(),
- trade.getOffer().getMessagePubKeyAsHex(),
- user.getMessagePubKeyAsHex()
- );
-
- log.debug("2.9 contract created: " + contract);
- String contractAsJson = Utilities.objectToJson(contract);
- String signature = cryptoFacade.signContract(walletFacade.getRegistrationAddressInfo().getKey(), contractAsJson);
-
- //log.debug("2.9 contractAsJson: " + contractAsJson);
- log.debug("2.9 contract signature: " + signature);
-
- trade.setContract(contract);
- trade.setContractAsJson(contractAsJson);
- trade.setContractTakerSignature(signature);
-
- payDeposit(requestTradeMessage);
- } */
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 2.10 Pay in the funds to the deposit tx and sign it
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /*private void payDeposit(TradeMessageOld requestTradeMessage)
- {
- log.debug("2.10 payDeposit");
-
- BigInteger collateralAmount = trade.getCollateralAmount();
- BigInteger takerInputAmount = trade.getTradeAmount().add(collateralAmount);
- BigInteger msOutputAmount = trade.getTradeAmount().add(collateralAmount).add(collateralAmount);
-
- String offererPubKey = requestTradeMessage.getOffererPubKey();
- String takerPubKey = walletFacade.getAddressInfoByTradeID(trade.getId()).getPubKeyAsHexString();
- String arbitratorPubKey = trade.getOffer().getArbitrator().getPubKeyAsHex();
- String preparedOffererDepositTxAsHex = requestTradeMessage.getPreparedOffererDepositTxAsHex();
-
- checkNotNull(takerInputAmount);
- checkNotNull(msOutputAmount);
- checkNotNull(offererPubKey);
- checkNotNull(takerPubKey);
- checkNotNull(arbitratorPubKey);
- checkNotNull(preparedOffererDepositTxAsHex);
-
- log.debug("2.10 offererCreatesMSTxAndAddPayment");
- log.debug("takerAmount " + BtcFormatter.formatSatoshis(takerInputAmount));
- log.debug("msOutputAmount " + BtcFormatter.formatSatoshis(msOutputAmount));
- log.debug("offerer pubkey " + offererPubKey);
- log.debug("taker pubkey " + takerPubKey);
- log.debug("arbitrator pubkey " + arbitratorPubKey);
- log.debug("preparedOffererDepositTxAsHex " + preparedOffererDepositTxAsHex);
- try
- {
- Transaction signedTakerDepositTx = walletFacade.takerAddPaymentAndSignTx(takerInputAmount, msOutputAmount, offererPubKey, takerPubKey, arbitratorPubKey, preparedOffererDepositTxAsHex, trade.getId());
- log.debug("2.10 deposit tx created: " + signedTakerDepositTx);
- long takerTxOutIndex = signedTakerDepositTx.getInput(1).getOutpoint().getIndex();
- sendSignedTakerDepositTxAsHex(signedTakerDepositTx, takerTxOutIndex, requestTradeMessage.getOffererTxOutIndex());
- } catch (InsufficientMoneyException e)
- {
- log.error("2.10 error at walletFacade.takerAddPaymentAndSign: " + e.getMessage());
- }
- } */
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 2.11 Send the tx to the offerer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /* private void sendSignedTakerDepositTxAsHex(Transaction signedTakerDepositTx, long takerTxOutIndex, long offererTxOutIndex)
- {
- log.debug("2.11 sendSignedTakerDepositTxAsHex");
-
- TradeMessageListener listener = new TradeMessageListener()
- {
- @Override
- public void onResult()
- {
- log.debug("2.11 sendSignedTakerDepositTxAsHex REQUEST_TAKER_DEPOSIT_PAYMENT onResult");
- // Message arrived at taker
- // //TakerAsSellerProtocol.this. listener.onFailure(getProgress());
- }
-
- @Override
- public void onFailed()
- {
- log.debug("2.11 sendSignedTakerDepositTxAsHex REQUEST_TAKER_DEPOSIT_PAYMENT onFailed");
- ////TakerAsSellerProtocol.this. listener.onFailure("sendSignedTakerDepositTxAsHex REQUEST_TAKER_DEPOSIT_PAYMENT onFailed");
- }
- };
-
- // this.listener.onProgress(getProgress());
-
- BankAccount bankAccount = user.getCurrentBankAccount();
- String accountID = user.getAccountId();
- String messagePubKey = user.getMessagePubKeyAsHex();
- String contractAsJson = trade.getContractAsJson();
- String signature = trade.getTakerSignature();
-
- String signedTakerDepositTxAsHex = com.google.bitcoin.core.Utils.bytesToHexString(signedTakerDepositTx.bitcoinSerialize());
- String txScriptSigAsHex = com.google.bitcoin.core.Utils.bytesToHexString(signedTakerDepositTx.getInput(1).getScriptBytes());
- String txConnOutAsHex = com.google.bitcoin.core.Utils.bytesToHexString(signedTakerDepositTx.getInput(1).getConnectedOutput().getParentTransaction().bitcoinSerialize());
- //TODO just 1 address supported yet
- String payoutAddress = walletFacade.getAddressInfoByTradeID(trade.getId()).getAddressString();
- log.debug("2.10 deposit txAsHex: " + signedTakerDepositTxAsHex);
- log.debug("2.10 txScriptSigAsHex: " + txScriptSigAsHex);
- log.debug("2.10 txConnOutAsHex: " + txConnOutAsHex);
- log.debug("2.10 payoutAddress: " + payoutAddress);
-
- TradeMessageOld tradeMessage = new TradeMessageOld(TradeMessageType.REQUEST_OFFERER_DEPOSIT_PUBLICATION,
- trade.getId(),
- bankAccount,
- accountID,
- messagePubKey,
- signedTakerDepositTxAsHex,
- txScriptSigAsHex,
- txConnOutAsHex,
- contractAsJson,
- signature,
- payoutAddress,
- takerTxOutIndex,
- offererTxOutIndex
- );
-
- log.debug("2.11 sendTradingMessage");
- messageFacade.sendTradeMessage(peerAddress, tradeMessage, listener);
- } */
-
-
- //************************************************************************************************
- // 3.1 - 3.5 Offerers tasks, we are in waiting mode
- //************************************************************************************************
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 3.6 Incoming msg from offerer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /* public void onDepositTxPublishedMessage(TradeMessageOld tradeMessage)
- {
- log.debug("3.6 DepositTxID received: " + tradeMessage.getDepositTxAsHex());
-
- String txID = walletFacade.takerCommitDepositTx(tradeMessage.getDepositTxAsHex());
- // listener.onProgress(getProgress());
- listener.onDepositTxPublishedMessage(txID);
- } */
-
-
- //************************************************************************************************
- // 3.7-3.10 Offerers tasks, we are in waiting mode
- //************************************************************************************************
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 3.11 Incoming msg from offerer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /* public void onBankTransferInitedMessage(BankTransferInitedMessage tradeMessage)
- {
- log.debug("3.11 Bank transfer inited msg received");
- listener.onBankTransferInitedMessage(tradeMessage);
- } */
-
- //************************************************************************************************
- // Taker will check periodically his bank account until he received the money. That might take a while...
- //************************************************************************************************
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 3.12 User clicked the "bank transfer received" button, so we release the funds for pay out
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /* public void onUIEventFiatReceived(TradeMessageOld tradeMessage)
- {
- log.debug("3.12 onUIEventFiatReceived");
- FutureCallback callback = new FutureCallback()
- {
- @Override
- public void onSuccess(@javax.annotation.Nullable Transaction transaction)
- {
- System.out.println("######### 3.12 onSuccess walletFacade.takerSignsAndSendsTx " + transaction);
- log.debug("3.12 onSuccess walletFacade.takerSignsAndSendsTx " + transaction);
- listener.onPayoutTxPublished(transaction.getHashAsString());
-
- sendPayoutTxToOfferer(Utils.bytesToHexString(transaction.bitcoinSerialize()));
- }
-
- @Override
- public void onFailure(Throwable t)
- {
- log.error("######### 3.12 onFailure walletFacade.takerSignsAndSendsTx");
- System.err.println("3.12 onFailure walletFacade.takerSignsAndSendsTx");
- // listener.onFailure("takerSignsAndSendsTx failed " + t.getMessage());
- }
- };
- try
- {
- String depositTxAsHex = tradeMessage.getDepositTxAsHex();
- String offererSignatureR = tradeMessage.getOffererSignatureR();
- String offererSignatureS = tradeMessage.getOffererSignatureS();
- BigInteger offererPaybackAmount = tradeMessage.getOffererPaybackAmount();
- BigInteger takerPaybackAmount = tradeMessage.getTakerPaybackAmount();
- String offererPayoutAddress = tradeMessage.getOffererPayoutAddress();
-
- log.debug("3.12 walletFacade.takerSignsAndSendsTx");
- walletFacade.takerSignsAndSendsTx(depositTxAsHex,
- offererSignatureR,
- offererSignatureS,
- offererPaybackAmount,
- takerPaybackAmount,
- offererPayoutAddress,
- trade.getId(),
- callback);
- } catch (AddressFormatException e)
- {
- log.error("3.12 offererCreatesAndSignsPayoutTx onFailed AddressFormatException " + e.getMessage());
- }
- } */
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Step 3.13 Send payout txID to offerer
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- /*void sendPayoutTxToOfferer(String payoutTxAsHex)
- {
- log.debug("3.13 sendPayoutTxToOfferer ");
- TradeMessageListener listener = new TradeMessageListener()
- {
- @Override
- public void onResult()
- {
- log.debug("3.13 sendPayoutTxToOfferer PAYOUT_TX_PUBLISHED onResult");
- log.debug("3.13 TRADE COMPLETE!!!!!!!!!!!");
- //TakerAsSellerProtocol.this. listener.onFailure(getProgress());
- }
-
- @Override
- public void onFailed()
- {
- log.debug("3.13 sendPayoutTxToOfferer PAYOUT_TX_PUBLISHED onFailed");
- //TakerAsSellerProtocol.this. listener.onFailure("sendPayoutTxToOfferer PAYOUT_TX_PUBLISHED onFailed");
- }
- };
-
- TradeMessageOld tradeMessage = new TradeMessageOld(TradeMessageType.PAYOUT_TX_PUBLISHED, trade.getId());
- tradeMessage.setPayoutTxAsHex(payoutTxAsHex);
- log.debug("3.13 sendTradeMessage PAYOUT_TX_PUBLISHED");
- messageFacade.sendTradeMessage(peerAddress, tradeMessage, listener);
- } */
-
- /* private double getProgress()
- {
- currentStep++;
- int numberOfSteps = 10;
- return (double) currentStep / (double) numberOfSteps;
- } */
-
-}
diff --git a/src/main/java/io/bitsquare/trade/protocol/taker/VerifyOffererAccount.java b/src/main/java/io/bitsquare/trade/protocol/taker/VerifyOffererAccount.java
new file mode 100644
index 0000000000..32c88d056f
--- /dev/null
+++ b/src/main/java/io/bitsquare/trade/protocol/taker/VerifyOffererAccount.java
@@ -0,0 +1,19 @@
+package io.bitsquare.trade.protocol.taker;
+
+import io.bitsquare.bank.BankAccount;
+import io.bitsquare.btc.BlockChainFacade;
+import io.bitsquare.trade.protocol.FaultHandler;
+import io.bitsquare.trade.protocol.ResultHandler;
+import io.bitsquare.trade.protocol.shared.VerifyPeerAccount;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VerifyOffererAccount
+{
+ private static final Logger log = LoggerFactory.getLogger(VerifyOffererAccount.class);
+
+ public static void run(ResultHandler resultHandler, FaultHandler faultHandler, BlockChainFacade blockChainFacade, String peersAccountId, BankAccount peersBankAccount)
+ {
+ VerifyPeerAccount.run(resultHandler, faultHandler, blockChainFacade, peersAccountId, peersBankAccount);
+ }
+}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/HandleTakeOfferRequest.java b/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/HandleTakeOfferRequest.java
deleted file mode 100644
index 08fff63d62..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/HandleTakeOfferRequest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package io.bitsquare.trade.protocol.tasks.offerer;
-
-import io.bitsquare.msg.MessageFacade;
-import io.bitsquare.msg.listeners.OutgoingTradeMessageListener;
-import io.bitsquare.trade.Trade;
-import io.bitsquare.trade.protocol.messages.offerer.AcceptTakeOfferRequestMessage;
-import io.bitsquare.trade.protocol.messages.offerer.RejectTakeOfferRequestMessage;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import net.tomp2p.peers.PeerAddress;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class HandleTakeOfferRequest
-{
- private static final Logger log = LoggerFactory.getLogger(HandleTakeOfferRequest.class);
-
- public static void run(ResultHandler resultHandler, FaultHandler faultHandler, PeerAddress peerAddress, MessageFacade messageFacade, Trade.State tradeState, String tradeId)
- {
- if (tradeState == Trade.State.OPEN)
- {
- messageFacade.sendTradeMessage(peerAddress, new AcceptTakeOfferRequestMessage(tradeId), new OutgoingTradeMessageListener()
- {
- @Override
- public void onResult()
- {
- log.trace("AcceptTakeOfferRequestMessage successfully arrived at peer");
- resultHandler.onResult(Trade.State.ACCEPTED);
- }
-
- @Override
- public void onFailed()
- {
- log.error("AcceptTakeOfferRequestMessage faultHandler.onFault to arrive at peer");
- faultHandler.onFault(new Exception("AcceptTakeOfferRequestMessage faultHandler.onFault to arrive at peer"));
- }
- });
- }
- else
- {
- RejectTakeOfferRequestMessage msg = new RejectTakeOfferRequestMessage(tradeId);
- messageFacade.sendTradeMessage(peerAddress, msg, new OutgoingTradeMessageListener()
- {
- @Override
- public void onResult()
- {
- log.trace("RejectTakeOfferRequestMessage successfully arrived at peer");
- }
-
- @Override
- public void onFailed()
- {
- log.error("RejectTakeOfferRequestMessage faultHandler.onFault to arrive at peer");
- }
- });
-
- log.error("Offer not marked as open.");
- faultHandler.onFault(new Exception("Offer not marked as open."));
- }
- }
-
- public interface ResultHandler
- {
- void onResult(Trade.State tradeState);
- }
-}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SetupListenerForBlockChainConfirmation.java b/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SetupListenerForBlockChainConfirmation.java
deleted file mode 100644
index 0ba260a5fe..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SetupListenerForBlockChainConfirmation.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package io.bitsquare.trade.protocol.tasks.offerer;
-
-import com.google.bitcoin.core.Transaction;
-import com.google.bitcoin.core.TransactionConfidence;
-import io.bitsquare.trade.protocol.offerer.OffererAsBuyerProtocolListener;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SetupListenerForBlockChainConfirmation
-{
- private static final Logger log = LoggerFactory.getLogger(SetupListenerForBlockChainConfirmation.class);
-
- public static void run(ResultHandler resultHandler, FaultHandler faultHandler, Transaction depositTransaction, OffererAsBuyerProtocolListener listener)
- { //TODO
- // sharedModel.offererPaymentProtocolListener.onDepositTxConfirmedInBlockchain();
-
- depositTransaction.getConfidence().addEventListener(new TransactionConfidence.Listener()
- {
- @Override
- public void onConfidenceChanged(Transaction tx, ChangeReason reason)
- {
- log.trace("onConfidenceChanged " + tx.getConfidence());
- if (reason == ChangeReason.SEEN_PEERS)
- {
- listener.onDepositTxConfirmedUpdate(tx.getConfidence());
- }
- if (reason == ChangeReason.TYPE && tx.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING)
- {
- listener.onDepositTxConfirmedInBlockchain();
- depositTransaction.getConfidence().removeEventListener(this);
- log.trace("Tx is in blockchain");
- resultHandler.onResult();
- }
- }
- }
- );
- }
-}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SignAndPublishDepositTx.java b/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SignAndPublishDepositTx.java
deleted file mode 100644
index 02cb1478b4..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/offerer/SignAndPublishDepositTx.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package io.bitsquare.trade.protocol.tasks.offerer;
-
-import com.google.bitcoin.core.Transaction;
-import com.google.common.util.concurrent.FutureCallback;
-import io.bitsquare.btc.WalletFacade;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SignAndPublishDepositTx
-{
- private static final Logger log = LoggerFactory.getLogger(SignAndPublishDepositTx.class);
-
- public static void run(ResultHandler resultHandler,
- FaultHandler faultHandler,
- WalletFacade walletFacade,
- String preparedOffererDepositTxAsHex,
- String signedTakerDepositTxAsHex,
- String txConnOutAsHex,
- String txScriptSigAsHex,
- long offererTxOutIndex,
- long takerTxOutIndex)
- {
- try
- {
- walletFacade.offererSignAndPublishTx(preparedOffererDepositTxAsHex,
- signedTakerDepositTxAsHex,
- txConnOutAsHex,
- txScriptSigAsHex,
- offererTxOutIndex,
- takerTxOutIndex,
- new FutureCallback()
- {
- @Override
- public void onSuccess(Transaction transaction)
- {
- log.trace("offererSignAndPublishTx succeeded " + transaction);
- resultHandler.onResult(transaction);
- }
-
- @Override
- public void onFailure(Throwable t)
- {
- log.error("offererSignAndPublishTx faultHandler.onFault:" + t);
- faultHandler.onFault(t);
- }
- });
- } catch (Exception e)
- {
- log.error("offererSignAndPublishTx faultHandler.onFault:" + e);
- faultHandler.onFault(e);
- }
- }
-
- public interface ResultHandler
- {
- void onResult(Transaction transaction);
- }
-
-}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/CreateAndSignContract.java b/src/main/java/io/bitsquare/trade/protocol/tasks/taker/CreateAndSignContract.java
deleted file mode 100644
index ce4c71d89f..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/CreateAndSignContract.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package io.bitsquare.trade.protocol.tasks.taker;
-
-import com.google.bitcoin.core.ECKey;
-import io.bitsquare.bank.BankAccount;
-import io.bitsquare.crypto.CryptoFacade;
-import io.bitsquare.trade.Contract;
-import io.bitsquare.trade.Trade;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
-import io.bitsquare.user.User;
-import io.bitsquare.util.Utilities;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CreateAndSignContract
-{
- private static final Logger log = LoggerFactory.getLogger(CreateAndSignContract.class);
-
- public static void run(ResultHandler resultHandler,
- FaultHandler faultHandler,
- CryptoFacade cryptoFacade,
- Trade trade,
- User user,
- String peersAccountId,
- BankAccount peersBankAccount,
- ECKey registrationKey)
- {
- try
- {
- Contract contract = new Contract(trade.getOffer(),
- trade.getTradeAmount(),
- trade.getTakeOfferFeeTxId(),
- peersAccountId,
- user.getAccountId(),
- peersBankAccount,
- user.getCurrentBankAccount(),
- trade.getOffer().getMessagePubKeyAsHex(),
- user.getMessagePubKeyAsHex()
- );
-
- String contractAsJson = Utilities.objectToJson(contract);
- String signature = cryptoFacade.signContract(registrationKey, contractAsJson);
- //log.trace("contract: " + contract);
- //log.debug("contractAsJson: " + contractAsJson);
- //log.trace("contract signature: " + signature);
-
- trade.setContract(contract);
- trade.setContractAsJson(contractAsJson);
- trade.setContractTakerSignature(signature);
-
- resultHandler.onResult();
- } catch (Throwable t)
- {
- log.error("Exception at sign contract " + t);
- faultHandler.onFault(t);
- }
- }
-
-
-}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/PayDeposit.java b/src/main/java/io/bitsquare/trade/protocol/tasks/taker/PayDeposit.java
deleted file mode 100644
index 5e67be8f73..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/PayDeposit.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package io.bitsquare.trade.protocol.tasks.taker;
-
-import com.google.bitcoin.core.InsufficientMoneyException;
-import com.google.bitcoin.core.Transaction;
-import io.bitsquare.btc.WalletFacade;
-import io.bitsquare.trade.Trade;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import java.math.BigInteger;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PayDeposit
-{
- private static final Logger log = LoggerFactory.getLogger(PayDeposit.class);
-
- public static void run(ResultHandler resultHandler, FaultHandler faultHandler, WalletFacade walletFacade, Trade trade, String offererPubKey, String preparedOffererDepositTxAsHex)
- {
- try
- {
- BigInteger collateralAmount = trade.getCollateralAmount();
- Transaction signedTakerDepositTx = walletFacade.takerAddPaymentAndSignTx(trade.getTradeAmount().add(collateralAmount),
- trade.getTradeAmount().add(collateralAmount).add(collateralAmount),
- offererPubKey,
- walletFacade.getAddressInfoByTradeID(trade.getId()).getPubKeyAsHexString(),
- trade.getOffer().getArbitrator().getPubKeyAsHex(),
- preparedOffererDepositTxAsHex,
- trade.getId());
-
- log.trace("sharedModel.signedTakerDepositTx: " + signedTakerDepositTx);
- long takerTxOutIndex = signedTakerDepositTx.getInput(1).getOutpoint().getIndex();
-
- resultHandler.onResult(signedTakerDepositTx, takerTxOutIndex);
- } catch (InsufficientMoneyException e)
- {
- log.error("Pay deposit faultHandler.onFault due InsufficientMoneyException " + e);
- faultHandler.onFault(new Exception("Pay deposit faultHandler.onFault due InsufficientMoneyException " + e));
- }
- }
-
- public interface ResultHandler
- {
- void onResult(Transaction signedTakerDepositTx, long takerTxOutIndex);
- }
-
-
-}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/SendSignedTakerDepositTxAsHex.java b/src/main/java/io/bitsquare/trade/protocol/tasks/taker/SendSignedTakerDepositTxAsHex.java
deleted file mode 100644
index 38e4bc30a0..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/SendSignedTakerDepositTxAsHex.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package io.bitsquare.trade.protocol.tasks.taker;
-
-import com.google.bitcoin.core.Transaction;
-import com.google.bitcoin.core.Utils;
-import io.bitsquare.btc.WalletFacade;
-import io.bitsquare.msg.MessageFacade;
-import io.bitsquare.msg.listeners.OutgoingTradeMessageListener;
-import io.bitsquare.trade.Trade;
-import io.bitsquare.trade.protocol.messages.taker.RequestOffererPublishDepositTxMessage;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
-import io.bitsquare.user.User;
-import net.tomp2p.peers.PeerAddress;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SendSignedTakerDepositTxAsHex
-{
- private static final Logger log = LoggerFactory.getLogger(SendSignedTakerDepositTxAsHex.class);
-
- public static void run(ResultHandler resultHandler,
- FaultHandler faultHandler,
- PeerAddress peerAddress,
- MessageFacade messageFacade,
- WalletFacade walletFacade,
- Trade trade,
- User user,
- Transaction signedTakerDepositTx,
- long takerTxOutIndex,
- long offererTxOutIndex)
- {
- RequestOffererPublishDepositTxMessage tradeMessage = new RequestOffererPublishDepositTxMessage(trade.getId(),
- user.getCurrentBankAccount(),
- user.getAccountId(),
- user.getMessagePubKeyAsHex(),
- Utils.bytesToHexString(signedTakerDepositTx.bitcoinSerialize()),
- Utils.bytesToHexString(signedTakerDepositTx.getInput(1).getScriptBytes()),
- Utils.bytesToHexString(signedTakerDepositTx.getInput(1).getConnectedOutput().getParentTransaction().bitcoinSerialize()),
- trade.getContractAsJson(),
- trade.getTakerSignature(),
- walletFacade.getAddressInfoByTradeID(trade.getId()).getAddressString(),
- takerTxOutIndex,
- offererTxOutIndex);
- messageFacade.sendTradeMessage(peerAddress, tradeMessage, new OutgoingTradeMessageListener()
- {
- @Override
- public void onResult()
- {
- log.trace("RequestOffererDepositPublicationMessage successfully arrived at peer");
- resultHandler.onResult();
- }
-
- @Override
- public void onFailed()
- {
- log.error("RequestOffererDepositPublicationMessage faultHandler.onFault to arrive at peer");
- faultHandler.onFault(new Exception("RequestOffererDepositPublicationMessage faultHandler.onFault to arrive at peer"));
- }
- });
- }
-}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/SignAndPublishPayoutTx.java b/src/main/java/io/bitsquare/trade/protocol/tasks/taker/SignAndPublishPayoutTx.java
deleted file mode 100644
index ef342a303f..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/SignAndPublishPayoutTx.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package io.bitsquare.trade.protocol.tasks.taker;
-
-import com.google.bitcoin.core.Transaction;
-import com.google.bitcoin.core.Utils;
-import com.google.common.util.concurrent.FutureCallback;
-import io.bitsquare.btc.WalletFacade;
-import io.bitsquare.trade.Trade;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import java.math.BigInteger;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SignAndPublishPayoutTx
-{
- private static final Logger log = LoggerFactory.getLogger(SignAndPublishPayoutTx.class);
-
- public static void run(ResultHandler resultHandler,
- FaultHandler faultHandler,
- WalletFacade walletFacade,
- Trade trade,
- String depositTxAsHex,
- String offererSignatureR,
- String offererSignatureS,
- BigInteger offererPaybackAmount,
- BigInteger takerPaybackAmount,
- String offererPayoutAddress
- )
- {
- try
- {
-
- walletFacade.takerSignsAndSendsTx(depositTxAsHex,
- offererSignatureR,
- offererSignatureS,
- offererPaybackAmount,
- takerPaybackAmount,
- offererPayoutAddress,
- trade.getId(),
- new FutureCallback()
- {
- @Override
- public void onSuccess(Transaction transaction)
- {
- log.debug("takerSignsAndSendsTx " + transaction);
- String payoutTxAsHex = Utils.bytesToHexString(transaction.bitcoinSerialize());
- resultHandler.onResult(transaction, payoutTxAsHex);
- }
-
- @Override
- public void onFailure(Throwable t)
- {
- log.error("Exception at takerSignsAndSendsTx " + t);
- faultHandler.onFault(t);
- }
- });
- } catch (Exception e)
- {
- log.error("Exception at takerSignsAndSendsTx " + e);
- faultHandler.onFault(e);
- }
- }
-
- public interface ResultHandler
- {
- void onResult(Transaction transaction, String payoutTxAsHex);
- }
-
-}
diff --git a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/VerifyOffererAccount.java b/src/main/java/io/bitsquare/trade/protocol/tasks/taker/VerifyOffererAccount.java
deleted file mode 100644
index f4ce650d6f..0000000000
--- a/src/main/java/io/bitsquare/trade/protocol/tasks/taker/VerifyOffererAccount.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package io.bitsquare.trade.protocol.tasks.taker;
-
-import io.bitsquare.bank.BankAccount;
-import io.bitsquare.btc.BlockChainFacade;
-import io.bitsquare.trade.protocol.tasks.FaultHandler;
-import io.bitsquare.trade.protocol.tasks.ResultHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class VerifyOffererAccount
-{
- private static final Logger log = LoggerFactory.getLogger(VerifyOffererAccount.class);
-
- public static void run(ResultHandler resultHandler, FaultHandler faultHandler, BlockChainFacade blockChainFacade, String peersAccountId, BankAccount peersBankAccount)
- {
- //TODO mocked yet
- if (blockChainFacade.verifyAccountRegistration())
- {
- if (blockChainFacade.isAccountBlackListed(peersAccountId, peersBankAccount))
- {
- log.error("Offerer is blacklisted");
- faultHandler.onFault(new Exception("Offerer is blacklisted"));
- }
- else
- {
- resultHandler.onResult();
- }
- }
- else
- {
- log.error("Account Registration for peer faultHandler.onFault.");
- faultHandler.onFault(new Exception("Account Registration for peer faultHandler.onFault."));
- }
- }
-}
diff --git a/src/main/java/io/bitsquare/user/Arbitrator.java b/src/main/java/io/bitsquare/user/Arbitrator.java
index ee8d821ba7..56effa061f 100644
--- a/src/main/java/io/bitsquare/user/Arbitrator.java
+++ b/src/main/java/io/bitsquare/user/Arbitrator.java
@@ -94,18 +94,26 @@ public class Arbitrator implements Serializable
public int hashCode()
{
if (id != null)
+ {
return Objects.hashCode(id);
+ }
else
+ {
return 0;
+ }
}
@SuppressWarnings("NonFinalFieldReferenceInEquals")
public boolean equals(Object obj)
{
if (!(obj instanceof Arbitrator))
+ {
return false;
+ }
if (obj == this)
+ {
return true;
+ }
Arbitrator other = (Arbitrator) obj;
return id != null && id.equals(other.getId());
diff --git a/src/main/java/io/bitsquare/user/User.java b/src/main/java/io/bitsquare/user/User.java
index a2ca1d9195..4c98bbf262 100644
--- a/src/main/java/io/bitsquare/user/User.java
+++ b/src/main/java/io/bitsquare/user/User.java
@@ -46,17 +46,28 @@ public class User implements Serializable
public void addBankAccount(BankAccount bankAccount)
{
if (!bankAccounts.contains(bankAccount))
+ {
bankAccounts.add(bankAccount);
+ }
currentBankAccount = bankAccount;
}
public void removeCurrentBankAccount()
{
- if (currentBankAccount != null) bankAccounts.remove(currentBankAccount);
+ if (currentBankAccount != null)
+ {
+ bankAccounts.remove(currentBankAccount);
+ }
- if (bankAccounts.isEmpty()) currentBankAccount = null;
- else currentBankAccount = bankAccounts.get(0);
+ if (bankAccounts.isEmpty())
+ {
+ currentBankAccount = null;
+ }
+ else
+ {
+ currentBankAccount = bankAccounts.get(0);
+ }
}
@@ -74,7 +85,9 @@ public class User implements Serializable
bankAccountUIDs += bankAccount.toString();
if (i < bankAccounts.size() - 1)
+ {
bankAccountUIDs += ", ";
+ }
}
return bankAccountUIDs;
@@ -136,7 +149,9 @@ public class User implements Serializable
for (final BankAccount bankAccount : bankAccounts)
{
if (bankAccount.getUid().equals(bankAccountId))
+ {
return bankAccount;
+ }
}
return null;
}
diff --git a/src/main/java/io/bitsquare/util/DSAKeyUtil.java b/src/main/java/io/bitsquare/util/DSAKeyUtil.java
index 72c2362c2a..a246be4293 100755
--- a/src/main/java/io/bitsquare/util/DSAKeyUtil.java
+++ b/src/main/java/io/bitsquare/util/DSAKeyUtil.java
@@ -60,9 +60,13 @@ public class DSAKeyUtil
} catch (Throwable throwable)
{
if (throwable instanceof FileNotFoundException)
+ {
log.debug("Files not found. That is ok for the first execute.");
+ }
else
+ {
log.error("Could not read key files. " + throwable);
+ }
try
{
@@ -114,15 +118,23 @@ public class DSAKeyUtil
// Work around an issue on Windows whereby you can't rename over existing files.
final File pubKeyCanonicalFile = pubKeyFile.getCanonicalFile();
if (pubKeyCanonicalFile.exists() && !pubKeyCanonicalFile.delete())
+ {
throw new IOException("Failed to delete pubKeyCanonicalFile for replacement with save");
+ }
if (!pubKeyTempFile.renameTo(pubKeyCanonicalFile))
+ {
throw new IOException("Failed to rename " + pubKeyTempFile + " to " + pubKeyCanonicalFile);
+ }
final File privKeyCanonicalFile = privKeyFile.getCanonicalFile();
if (privKeyCanonicalFile.exists() && !privKeyCanonicalFile.delete())
+ {
throw new IOException("Failed to delete privKeyCanonicalFile for replacement with save");
+ }
if (!privKeyTempFile.renameTo(privKeyCanonicalFile))
+ {
throw new IOException("Failed to rename " + privKeyTempFile + " to " + privKeyCanonicalFile);
+ }
}
else
{
@@ -141,13 +153,17 @@ public class DSAKeyUtil
{
log.warn("PubKeyTempFile still exists after failed save.");
if (!pubKeyTempFile.delete())
+ {
log.warn("Cannot delete pubKeyTempFile.");
+ }
}
if (privKeyTempFile.exists())
{
log.warn("PrivKeyTempFile still exists after failed save.");
if (!privKeyTempFile.delete())
+ {
log.warn("Cannot delete privKeyTempFile.");
+ }
}
lock.unlock();
diff --git a/src/main/java/io/bitsquare/util/FileUtil.java b/src/main/java/io/bitsquare/util/FileUtil.java
index 5851d22121..0e600c588a 100644
--- a/src/main/java/io/bitsquare/util/FileUtil.java
+++ b/src/main/java/io/bitsquare/util/FileUtil.java
@@ -33,7 +33,9 @@ public class FileUtil
if (!dir.exists())
{
if (!dir.mkdir())
+ {
log.error("Could not create directory. " + dir.getAbsolutePath());
+ }
}
return dir;
diff --git a/src/main/java/io/bitsquare/util/Utilities.java b/src/main/java/io/bitsquare/util/Utilities.java
index c5acd39c14..6bd9822b92 100644
--- a/src/main/java/io/bitsquare/util/Utilities.java
+++ b/src/main/java/io/bitsquare/util/Utilities.java
@@ -82,7 +82,9 @@ public class Utilities
private static void printElapsedTime(String msg)
{
if (!msg.isEmpty())
+ {
msg += " / ";
+ }
long timeStamp = System.currentTimeMillis();
log.debug(msg + "Elapsed: " + String.valueOf(timeStamp - lastTimeStamp));
lastTimeStamp = timeStamp;