From e0598ef0507d99c0a2c33d965e2df4c3534f89ed Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sun, 17 Apr 2016 15:59:22 +0200 Subject: [PATCH] move locked funds to available for failed trades --- .../main/java/io/bitsquare/trade/Trade.java | 14 +++++--- .../java/io/bitsquare/trade/TradeManager.java | 36 ++++++++++--------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/io/bitsquare/trade/Trade.java b/core/src/main/java/io/bitsquare/trade/Trade.java index b5dfc23233..fd301466b9 100644 --- a/core/src/main/java/io/bitsquare/trade/Trade.java +++ b/core/src/main/java/io/bitsquare/trade/Trade.java @@ -148,7 +148,10 @@ public abstract class Trade implements Tradable, Model { private DecryptedMsgWithPubKey decryptedMsgWithPubKey; private Date takeOfferDate; private Coin tradeAmount; + private long tradePrice; private NodeAddress tradingPeerNodeAddress; + @Nullable + private String takeOfferFeeTxId; protected State state; private DisputeState disputeState = DisputeState.NONE; private TradePeriodState tradePeriodState = TradePeriodState.NORMAL; @@ -166,9 +169,6 @@ public abstract class Trade implements Tradable, Model { transient private StringProperty errorMessageProperty; transient private ObjectProperty tradeAmountProperty; transient private ObjectProperty tradeVolumeProperty; - @Nullable - private String takeOfferFeeTxId; - private long tradePrice; /////////////////////////////////////////////////////////////////////////////////////////// @@ -271,9 +271,9 @@ public abstract class Trade implements Tradable, Model { /////////////////////////////////////////////////////////////////////////////////////////// // The deserialized tx has not actual confidence data, so we need to get the fresh one from the wallet. - public void updateDepositTxFromWallet(TradeWalletService tradeWalletService) { + public void updateDepositTxFromWallet() { if (depositTx != null) - setDepositTx(tradeWalletService.getWalletTx(depositTx.getHash())); + setDepositTx(processModel.getTradeWalletService().getWalletTx(depositTx.getHash())); } public void setDepositTx(Transaction tx) { @@ -338,6 +338,10 @@ public abstract class Trade implements Tradable, Model { return state.getPhase() != null && state.getPhase().ordinal() >= Phase.TAKER_FEE_PAID.ordinal(); } + public boolean isDepositFeePaid() { + return state.getPhase() != null && state.getPhase().ordinal() >= Phase.DEPOSIT_PAID.ordinal(); + } + public State getState() { return state; } diff --git a/core/src/main/java/io/bitsquare/trade/TradeManager.java b/core/src/main/java/io/bitsquare/trade/TradeManager.java index f98c4e7124..6b5c8d1bca 100644 --- a/core/src/main/java/io/bitsquare/trade/TradeManager.java +++ b/core/src/main/java/io/bitsquare/trade/TradeManager.java @@ -173,25 +173,18 @@ public class TradeManager { private void initPendingTrades() { Log.traceCall(); - //List failedTrades = new ArrayList<>(); for (Trade trade : trades) { - // We continue an interrupted trade. - - // TODO - /* if (trade.isFailedState()) { - failedTrades.add(trade); - } - else {*/ trade.setStorage(tradableListStorage); - trade.updateDepositTxFromWallet(tradeWalletService); - initTrade(trade, trade.getProcessModel().getUseSavingsWallet(), trade.getProcessModel().getFundsNeededForTrade()); - - - // } + if (trade.isDepositFeePaid()) { + trade.updateDepositTxFromWallet(); + initTrade(trade, trade.getProcessModel().getUseSavingsWallet(), trade.getProcessModel().getFundsNeededForTrade()); + } else if (trade.isTakerFeePaid()) { + addTradeToFailedTrades(trade); + } else { + removePreparedTrade(trade); + } } pendingTradesInitialized.set(true); - - //failedTrades.stream().filter(Trade::isTakerFeePaid).forEach(this::addTradeToFailedTrades); } private void handleInitialTakeOfferRequest(TradeMessage message, NodeAddress peerNodeAddress) { @@ -345,21 +338,30 @@ public class TradeManager { // If trade was completed (closed without fault but might be closed by a dispute) we move it to the closed trades public void addTradeToClosedTrades(Trade trade) { - trades.remove(trade); + removeTrade(trade); closedTradableManager.add(trade); } // If trade is in already in critical state (if taker role: taker fee; both roles: after deposit published) // we move the trade to failedTradesManager public void addTradeToFailedTrades(Trade trade) { - trades.remove(trade); + removeTrade(trade); failedTradesManager.add(trade); } // If trade is in preparation (if taker role: before taker fee is paid; both roles: before deposit published) // we just remove the trade from our list. We don't store those trades. public void removePreparedTrade(Trade trade) { + removeTrade(trade); + } + + public void removeTrade(Trade trade) { trades.remove(trade); + + walletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.OFFER_FUNDING); + walletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.RESERVED_FOR_TRADE); + walletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.MULTI_SIG); + walletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT); }