This commit is contained in:
Manfred Karrer 2016-04-06 23:59:55 +02:00
parent 565c44d94c
commit cc46a81644
12 changed files with 77 additions and 194 deletions

View file

@ -1,35 +0,0 @@
package io.bitsquare.trade;
import io.bitsquare.btc.AddressEntry;
import io.bitsquare.btc.WalletService;
import org.bitcoinj.core.Coin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.stream.Stream;
public class TradableHelper {
private static final Logger log = LoggerFactory.getLogger(TradableHelper.class);
public static Stream<AddressEntry> getAddressEntriesForAvailableBalanceStream(WalletService walletService) {
Stream<AddressEntry> availableOrPayout = Stream.concat(walletService.getAddressEntries(AddressEntry.Context.TRADE_PAYOUT).stream(), walletService.getFundedAvailableAddressEntries().stream());
Stream<AddressEntry> available = Stream.concat(availableOrPayout, walletService.getAddressEntries(AddressEntry.Context.ARBITRATOR).stream());
available = Stream.concat(available, walletService.getAddressEntries(AddressEntry.Context.OFFER_FUNDING).stream());
return available
.filter(addressEntry -> walletService.getBalanceForAddress(addressEntry.getAddress()).isPositive());
}
public static Stream<Trade> getLockedTradeStream(TradeManager tradeManager) {
return tradeManager.getTrades().stream()
.filter(trade -> trade.getState().getPhase().ordinal() >= Trade.Phase.DEPOSIT_PAID.ordinal() &&
trade.getState().getPhase().ordinal() < Trade.Phase.PAYOUT_PAID.ordinal());
}
public static AddressEntry getLockedTradeAddressEntry(Trade trade, WalletService walletService) {
return walletService.getOrCreateAddressEntry(trade.getId(), AddressEntry.Context.MULTI_SIG);
}
public static Coin getReservedBalance(Tradable tradable, WalletService walletService) {
return walletService.getBalanceForAddress(walletService.getOrCreateAddressEntry(tradable.getId(), AddressEntry.Context.RESERVED_FOR_TRADE).getAddress());
}
}

View file

@ -61,6 +61,7 @@ import javax.inject.Inject;
import javax.inject.Named;
import java.io.File;
import java.util.Optional;
import java.util.stream.Stream;
import static io.bitsquare.util.Validator.nonEmptyStringOf;
@ -396,4 +397,18 @@ public class TradeManager {
public Optional<Trade> getTradeById(String tradeId) {
return trades.stream().filter(e -> e.getId().equals(tradeId)).findFirst();
}
public Stream<AddressEntry> getAddressEntriesForAvailableBalanceStream() {
Stream<AddressEntry> availableOrPayout = Stream.concat(walletService.getAddressEntries(AddressEntry.Context.TRADE_PAYOUT).stream(), walletService.getFundedAvailableAddressEntries().stream());
Stream<AddressEntry> available = Stream.concat(availableOrPayout, walletService.getAddressEntries(AddressEntry.Context.ARBITRATOR).stream());
available = Stream.concat(available, walletService.getAddressEntries(AddressEntry.Context.OFFER_FUNDING).stream());
return available
.filter(addressEntry -> walletService.getBalanceForAddress(addressEntry.getAddress()).isPositive());
}
public Stream<Trade> getLockedTradeStream() {
return getTrades().stream()
.filter(trade -> trade.getState().getPhase().ordinal() >= Trade.Phase.DEPOSIT_PAID.ordinal() &&
trade.getState().getPhase().ordinal() < Trade.Phase.PAYOUT_PAID.ordinal());
}
}

View file

@ -21,16 +21,11 @@ public class AddressWithIconAndDirection extends AnchorPane {
private final Label directionIcon;
private final Label label;
public AddressWithIconAndDirection(String text, String address, AwesomeIcon awesomeIcon, boolean received, boolean isInternal) {
public AddressWithIconAndDirection(String text, String address, AwesomeIcon awesomeIcon, boolean received) {
directionIcon = new Label();
directionIcon.setLayoutY(3);
if (isInternal) {
directionIcon.getStyleClass().add("internal-funds-icon");
AwesomeDude.setIcon(directionIcon, AwesomeIcon.REPEAT);
} else {
directionIcon.getStyleClass().add(received ? "received-funds-icon" : "sent-funds-icon");
AwesomeDude.setIcon(directionIcon, received ? AwesomeIcon.SIGNIN : AwesomeIcon.SIGNOUT);
}
directionIcon.setMouseTransparent(true);
HBox hBox = new HBox();

View file

@ -26,6 +26,7 @@ import io.bitsquare.app.Version;
import io.bitsquare.arbitration.ArbitratorManager;
import io.bitsquare.arbitration.Dispute;
import io.bitsquare.arbitration.DisputeManager;
import io.bitsquare.btc.AddressEntry;
import io.bitsquare.btc.TradeWalletService;
import io.bitsquare.btc.WalletService;
import io.bitsquare.btc.listeners.BalanceListener;
@ -54,7 +55,6 @@ import io.bitsquare.p2p.network.Connection;
import io.bitsquare.p2p.network.ConnectionListener;
import io.bitsquare.p2p.peers.keepalive.messages.Ping;
import io.bitsquare.payment.OKPayAccount;
import io.bitsquare.trade.TradableHelper;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.TradeManager;
import io.bitsquare.trade.closed.ClosedTradableManager;
@ -65,6 +65,7 @@ import io.bitsquare.user.Preferences;
import io.bitsquare.user.User;
import javafx.beans.property.*;
import javafx.collections.ListChangeListener;
import org.bitcoinj.core.Address;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.store.BlockStoreException;
@ -683,7 +684,7 @@ public class MainViewModel implements ViewModel {
}
private void updateAvailableBalance() {
Coin totalAvailableBalance = Coin.valueOf(TradableHelper.getAddressEntriesForAvailableBalanceStream(walletService)
Coin totalAvailableBalance = Coin.valueOf(tradeManager.getAddressEntriesForAvailableBalanceStream()
.mapToLong(addressEntry -> walletService.getBalanceForAddress(addressEntry.getAddress()).getValue())
.sum());
availableBalance.set(formatter.formatCoinWithCode(totalAvailableBalance));
@ -691,7 +692,10 @@ public class MainViewModel implements ViewModel {
private void updateReservedBalance() {
Coin sum = Coin.valueOf(openOfferManager.getOpenOffers().stream()
.map(openOffer -> TradableHelper.getReservedBalance(openOffer, walletService))
.map(openOffer -> {
Address address = walletService.getOrCreateAddressEntry(openOffer.getId(), AddressEntry.Context.RESERVED_FOR_TRADE).getAddress();
return walletService.getBalanceForAddress(address);
})
.mapToLong(Coin::getValue)
.sum());
@ -699,8 +703,8 @@ public class MainViewModel implements ViewModel {
}
private void updateLockedBalance() {
Coin sum = Coin.valueOf(TradableHelper.getLockedTradeStream(tradeManager)
.mapToLong(trade -> TradableHelper.getLockedTradeAddressEntry(trade, walletService).getLockedTradeAmount().getValue())
Coin sum = Coin.valueOf(tradeManager.getLockedTradeStream()
.mapToLong(trade -> walletService.getOrCreateAddressEntry(trade.getId(), AddressEntry.Context.MULTI_SIG).getLockedTradeAmount().getValue())
.sum());
lockedBalance.set(formatter.formatCoinWithCode(sum));
}

View file

@ -35,25 +35,19 @@ import org.slf4j.LoggerFactory;
public class DepositListItem {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private final StringProperty balance = new SimpleStringProperty();
private final WalletService walletService;
private Coin balanceAsCoin;
private BSFormatter formatter;
private final ConfidenceProgressIndicator progressIndicator;
private final Tooltip tooltip;
private String balanceString;
private String addressString;
private String usage = "-";
private TxConfidenceListener txConfidenceListener;
private int numTxOutputs = 0;
// public DepositListItem(AddressEntry addressEntry, Transaction transaction, WalletService walletService, Optional<Tradable> tradableOptional, BSFormatter formatter) {
public DepositListItem(AddressEntry addressEntry, WalletService walletService, BSFormatter formatter) {
this.walletService = walletService;
this.formatter = formatter;
addressString = addressEntry.getAddressString();

View file

@ -69,31 +69,28 @@ public class DepositView extends ActivatableView<VBox, Void> {
@FXML
GridPane gridPane;
@FXML
TableView<DepositListItem> tableView;
@FXML
TableColumn<DepositListItem, DepositListItem> selectColumn, addressColumn, balanceColumn, confidenceColumn, usageColumn;
private ImageView qrCodeImageView;
private int gridRow = 0;
private AddressTextField addressTextField;
Button generateNewAddressButton;
private final WalletService walletService;
private final BSFormatter formatter;
private final Preferences preferences;
private final ObservableList<DepositListItem> observableList = FXCollections.observableArrayList();
private final SortedList<DepositListItem> sortedList = new SortedList<>(observableList);
private BalanceListener balanceListener;
private Button generateNewAddressButton;
private TitledGroupBg titledGroupBg;
private Label addressLabel, amountLabel;
private Label qrCodeLabel;
private InputTextField amountTextField;
private Subscription amountTextFieldSubscription;
private String paymentLabel;
private ChangeListener<DepositListItem> tableViewSelectionListener;
private final WalletService walletService;
private final BSFormatter formatter;
private final Preferences preferences;
private final String paymentLabelString;
private final ObservableList<DepositListItem> observableList = FXCollections.observableArrayList();
private final SortedList<DepositListItem> sortedList = new SortedList<>(observableList);
private BalanceListener balanceListener;
private Subscription amountTextFieldSubscription;
private ChangeListener<DepositListItem> tableViewSelectionListener;
private int gridRow = 0;
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor, lifecycle
@ -106,6 +103,8 @@ public class DepositView extends ActivatableView<VBox, Void> {
this.walletService = walletService;
this.formatter = formatter;
this.preferences = preferences;
paymentLabelString = "Fund Bitsquare wallet";
}
@Override
@ -153,8 +152,7 @@ public class DepositView extends ActivatableView<VBox, Void> {
//GridPane.setValignment(addressLabel, VPos.TOP);
//GridPane.setMargin(addressLabel, new Insets(3, 0, 0, 0));
addressTextField = addressTuple.second;
paymentLabel = "Fund Bitsquare wallet";
addressTextField.setPaymentLabel(paymentLabel);
addressTextField.setPaymentLabel(paymentLabelString);
Tuple2<Label, InputTextField> amountTuple = addLabelInputTextField(gridPane, ++gridRow, "Amount in BTC (optional):");
@ -307,7 +305,7 @@ public class DepositView extends ActivatableView<VBox, Void> {
private String getBitcoinURI() {
return BitcoinURI.convertToBitcoinURI(addressTextField.getAddress(),
getAmountAsCoin(),
paymentLabel,
paymentLabelString,
null);
}

View file

@ -30,7 +30,6 @@ import io.bitsquare.gui.main.overlays.windows.OfferDetailsWindow;
import io.bitsquare.gui.main.overlays.windows.TradeDetailsWindow;
import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.trade.Tradable;
import io.bitsquare.trade.TradableHelper;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.TradeManager;
import io.bitsquare.trade.offer.OpenOffer;
@ -148,9 +147,9 @@ public class LockedView extends ActivatableView<VBox, Void> {
private void updateList() {
observableList.forEach(LockedListItem::cleanup);
observableList.setAll(TradableHelper.getLockedTradeStream(tradeManager)
observableList.setAll(tradeManager.getLockedTradeStream()
.map(trade -> new LockedListItem(trade,
TradableHelper.getLockedTradeAddressEntry(trade, walletService),
walletService.getOrCreateAddressEntry(trade.getId(), AddressEntry.Context.MULTI_SIG),
walletService,
formatter))
.collect(Collectors.toList()));

View file

@ -22,7 +22,6 @@ import io.bitsquare.btc.WalletService;
import io.bitsquare.btc.listeners.BalanceListener;
import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.trade.Tradable;
import io.bitsquare.trade.TradableHelper;
import io.bitsquare.trade.offer.OpenOffer;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
@ -72,7 +71,8 @@ public class ReservedListItem {
}
private void updateBalance() {
balance = TradableHelper.getReservedBalance(openOffer, walletService);
Address address = walletService.getOrCreateAddressEntry(openOffer.getId(), AddressEntry.Context.RESERVED_FOR_TRADE).getAddress();
balance = walletService.getBalanceForAddress(address);
if (balance != null)
balanceLabel.setText(formatter.formatCoin(this.balance));
}

View file

@ -40,7 +40,6 @@ public class TransactionsListItem {
private final WalletService walletService;
private final ConfidenceProgressIndicator progressIndicator;
private final Tooltip tooltip;
private boolean isInternal;
@Nullable
private Tradable tradable;
private String details;
@ -89,7 +88,7 @@ public class TransactionsListItem {
}
}
}
} else/* if (tradableOptional.isPresent())*/ {
} else {
amountAsCoin = valueSentToMe.subtract(valueSentFromMe);
boolean outgoing = false;
for (TransactionOutput transactionOutput : transaction.getOutputs()) {
@ -107,25 +106,27 @@ public class TransactionsListItem {
direction = "Sent to:";
received = false;
}
} /*else {
// savings wallet tx
for (TransactionOutput transactionOutput : transaction.getOutputs()) {
if (transactionOutput.isMine(walletService.getWallet())) {
if (transactionOutput.getScriptPubKey().isSentToAddress() ||
transactionOutput.getScriptPubKey().isPayToScriptHash()) {
address = transactionOutput.getScriptPubKey().getToAddress(walletService.getWallet().getParams());
addressString = address.toString();
amountAsCoin = transactionOutput.getValue().multiply(-1);
}
}
}
direction = "Transferred to:";
received = false;
isInternal = true;
details = "Change output";
}*/
// confidence
progressIndicator = new ConfidenceProgressIndicator();
progressIndicator.setId("funds-confidence");
tooltip = new Tooltip("Not used yet");
progressIndicator.setProgress(0);
progressIndicator.setPrefHeight(30);
progressIndicator.setPrefWidth(30);
Tooltip.install(progressIndicator, tooltip);
if (address != null) {
txConfidenceListener = new TxConfidenceListener(txId) {
@Override
public void onTransactionConfidenceChanged(TransactionConfidence confidence) {
updateConfidence(confidence);
}
};
walletService.addTxConfidenceListener(txConfidenceListener);
updateConfidence(transaction.getConfidence());
}
if (tradableOptional.isPresent()) {
@ -148,10 +149,12 @@ public class TransactionsListItem {
trade.getPayoutTx().getHashAsString().equals(txId)) {
details = "MultiSig payout: " + tradable.getShortId();
} else if (trade.getDisputeState() == Trade.DisputeState.DISPUTE_CLOSED) {
if (valueSentToMe.isPositive())
if (valueSentToMe.isPositive()) {
details = "Dispute payout: " + tradable.getShortId();
else
} else {
details = "Lost dispute case: " + tradable.getShortId();
progressIndicator.setVisible(false);
}
} else {
details = "Unknown reason: " + tradable.getShortId();
}
@ -159,31 +162,11 @@ public class TransactionsListItem {
} else {
if (amountAsCoin.isZero())
details = "No refund from dispute";
else if (!isInternal)
else
details = received ? "Received funds" : "Withdrawn from wallet";
}
date = formatter.formatDateTime(transaction.getUpdateTime());
// confidence
progressIndicator = new ConfidenceProgressIndicator();
progressIndicator.setId("funds-confidence");
tooltip = new Tooltip("Not used yet");
progressIndicator.setProgress(0);
progressIndicator.setPrefHeight(30);
progressIndicator.setPrefWidth(30);
Tooltip.install(progressIndicator, tooltip);
if (address != null) {
txConfidenceListener = new TxConfidenceListener(txId) {
@Override
public void onTransactionConfidenceChanged(TransactionConfidence confidence) {
updateConfidence(confidence);
}
};
walletService.addTxConfidenceListener(txConfidenceListener);
updateConfidence(transaction.getConfidence());
}
}
@ -242,10 +225,6 @@ public class TransactionsListItem {
return direction;
}
public boolean isInternal() {
return isInternal;
}
public String getTxId() {
return txId;
}

View file

@ -194,38 +194,6 @@ public class TransactionsView extends ActivatableView<VBox, Void> {
Set<Tradable> all = concat3.collect(Collectors.toSet());
Set<Transaction> transactions = walletService.getWallet().getTransactions(true);
/* List<TransactionsListItem> transactionsListItems = new ArrayList<>();
for (Transaction transaction : transactions) {
Optional<Tradable> tradableOptional = all.stream()
.filter(tradable -> {
String txId = transaction.getHashAsString();
if (tradable instanceof OpenOffer)
return tradable.getOffer().getOfferFeePaymentTxID().equals(txId);
else if (tradable instanceof Trade) {
Trade trade = (Trade) tradable;
boolean isTakeOfferFeeTx = txId.equals(trade.getTakeOfferFeeTxId());
boolean isOfferFeeTx = trade.getOffer() != null &&
txId.equals(trade.getOffer().getOfferFeePaymentTxID());
boolean isDepositTx = trade.getDepositTx() != null &&
trade.getDepositTx().getHashAsString().equals(txId);
boolean isPayoutTx = trade.getPayoutTx() != null &&
trade.getPayoutTx().getHashAsString().equals(txId);
boolean isDisputedPayoutTx = disputeManager.getDisputesAsObservableList().stream()
.filter(dispute -> txId.equals(dispute.getDisputePayoutTxId()) &&
tradable.getId().equals(dispute.getTradeId()))
.findAny()
.isPresent();
return isTakeOfferFeeTx || isOfferFeeTx || isDepositTx || isPayoutTx || isDisputedPayoutTx;
} else
return false;
})
.findAny();
// if (tradableOptional.isPresent())
transactionsListItems.add(new TransactionsListItem(transaction, walletService, tradableOptional, formatter));
}*/
List<TransactionsListItem> transactionsListItems = transactions.stream()
.map(transaction -> {
Optional<Tradable> tradableOptional = all.stream()
@ -258,12 +226,6 @@ public class TransactionsView extends ActivatableView<VBox, Void> {
})
.collect(Collectors.toList());
/* List<TransactionsListItem> usedSavingWalletEntries = walletService.getUsedSavingWalletTransactions()
.stream()
.map(transaction -> new TransactionsListItem(transaction, walletService, Optional.<Tradable>empty(), formatter))
.collect(Collectors.toList());
transactionsListItems.addAll(usedSavingWalletEntries);*/
// are sorted by getRecentTransactions
observableList.forEach(TransactionsListItem::cleanup);
observableList.setAll(transactionsListItems);
@ -377,7 +339,7 @@ public class TransactionsView extends ActivatableView<VBox, Void> {
if (item != null && !empty) {
String addressString = item.getAddressString();
field = new AddressWithIconAndDirection(item.getDirection(), addressString,
AwesomeIcon.EXTERNAL_LINK, item.getReceived(), item.isInternal());
AwesomeIcon.EXTERNAL_LINK, item.getReceived());
field.setOnAction(event -> openBlockExplorer(item));
field.setTooltip(new Tooltip("Open external blockchain explorer for " +
"address: " + addressString));

View file

@ -21,10 +21,6 @@ import io.bitsquare.btc.AddressEntry;
import io.bitsquare.btc.WalletService;
import io.bitsquare.btc.listeners.BalanceListener;
import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.trade.TradeManager;
import io.bitsquare.trade.closed.ClosedTradableManager;
import io.bitsquare.trade.failed.FailedTradesManager;
import io.bitsquare.trade.offer.OpenOfferManager;
import javafx.scene.control.Label;
import org.bitcoinj.core.Address;
import org.bitcoinj.core.Coin;
@ -35,25 +31,14 @@ public class WithdrawalListItem {
private final Label balanceLabel;
private final AddressEntry addressEntry;
private final WalletService walletService;
private final OpenOfferManager openOfferManager;
private final TradeManager tradeManager;
private final ClosedTradableManager closedTradableManager;
private final FailedTradesManager failedTradesManager;
private final BSFormatter formatter;
private Coin balance;
private final String addressString;
public WithdrawalListItem(AddressEntry addressEntry, WalletService walletService,
OpenOfferManager openOfferManager, TradeManager tradeManager,
ClosedTradableManager closedTradableManager,
FailedTradesManager failedTradesManager,
BSFormatter formatter) {
this.addressEntry = addressEntry;
this.walletService = walletService;
this.openOfferManager = openOfferManager;
this.tradeManager = tradeManager;
this.closedTradableManager = closedTradableManager;
this.failedTradesManager = failedTradesManager;
this.formatter = formatter;
addressString = addressEntry.getAddressString();
@ -99,7 +84,6 @@ public class WithdrawalListItem {
WithdrawalListItem that = (WithdrawalListItem) o;
return !(addressEntry != null ? !addressEntry.equals(that.addressEntry) : that.addressEntry != null);
}
@Override

View file

@ -30,18 +30,14 @@ import io.bitsquare.gui.common.view.ActivatableView;
import io.bitsquare.gui.common.view.FxmlView;
import io.bitsquare.gui.components.HyperlinkWithIcon;
import io.bitsquare.gui.main.overlays.popups.Popup;
import io.bitsquare.gui.main.overlays.windows.OfferDetailsWindow;
import io.bitsquare.gui.main.overlays.windows.TradeDetailsWindow;
import io.bitsquare.gui.main.overlays.windows.WalletPasswordWindow;
import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.gui.util.validation.BtcAddressValidator;
import io.bitsquare.trade.Tradable;
import io.bitsquare.trade.TradableHelper;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.TradeManager;
import io.bitsquare.trade.closed.ClosedTradableManager;
import io.bitsquare.trade.failed.FailedTradesManager;
import io.bitsquare.trade.offer.OpenOfferManager;
import io.bitsquare.user.Preferences;
import javafx.beans.binding.Bindings;
import javafx.beans.property.ReadOnlyObjectWrapper;
@ -80,13 +76,10 @@ public class WithdrawalView extends ActivatableView<VBox, Void> {
private final TradeManager tradeManager;
private final ClosedTradableManager closedTradableManager;
private final FailedTradesManager failedTradesManager;
private final OpenOfferManager openOfferManager;
private final BSFormatter formatter;
private final Preferences preferences;
private final BtcAddressValidator btcAddressValidator;
private final WalletPasswordWindow walletPasswordWindow;
private final OfferDetailsWindow offerDetailsWindow;
private final TradeDetailsWindow tradeDetailsWindow;
private final ObservableList<WithdrawalListItem> observableList = FXCollections.observableArrayList();
private final SortedList<WithdrawalListItem> sortedList = new SortedList<>(observableList);
private Set<WithdrawalListItem> selectedItems = new HashSet<>();
@ -101,21 +94,17 @@ public class WithdrawalView extends ActivatableView<VBox, Void> {
@Inject
private WithdrawalView(WalletService walletService, TradeManager tradeManager,
ClosedTradableManager closedTradableManager,
FailedTradesManager failedTradesManager, OpenOfferManager openOfferManager,
FailedTradesManager failedTradesManager,
BSFormatter formatter, Preferences preferences,
BtcAddressValidator btcAddressValidator, WalletPasswordWindow walletPasswordWindow,
OfferDetailsWindow offerDetailsWindow, TradeDetailsWindow tradeDetailsWindow) {
BtcAddressValidator btcAddressValidator, WalletPasswordWindow walletPasswordWindow) {
this.walletService = walletService;
this.tradeManager = tradeManager;
this.closedTradableManager = closedTradableManager;
this.failedTradesManager = failedTradesManager;
this.openOfferManager = openOfferManager;
this.formatter = formatter;
this.preferences = preferences;
this.btcAddressValidator = btcAddressValidator;
this.walletPasswordWindow = walletPasswordWindow;
this.offerDetailsWindow = offerDetailsWindow;
this.tradeDetailsWindow = tradeDetailsWindow;
}
@Override
@ -285,9 +274,8 @@ public class WithdrawalView extends ActivatableView<VBox, Void> {
private void updateList() {
observableList.forEach(WithdrawalListItem::cleanup);
observableList.setAll(TradableHelper.getAddressEntriesForAvailableBalanceStream(walletService)
.map(addressEntry -> new WithdrawalListItem(addressEntry, walletService, openOfferManager, tradeManager,
closedTradableManager, failedTradesManager, formatter))
observableList.setAll(tradeManager.getAddressEntriesForAvailableBalanceStream()
.map(addressEntry -> new WithdrawalListItem(addressEntry, walletService, formatter))
.collect(Collectors.toList()));
}