From f9a33a00ff915202250fd02ed0e545886e3a0d5d Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 31 Mar 2016 22:21:38 +0200 Subject: [PATCH] Remove mining fee check --- .../createoffer/CreateOfferDataModel.java | 33 +++--- .../offer/createoffer/CreateOfferView.java | 16 ++- .../createoffer/CreateOfferViewModel.java | 108 ++++++++++-------- .../offer/takeoffer/TakeOfferDataModel.java | 49 ++++---- .../main/offer/takeoffer/TakeOfferView.java | 37 +++--- .../offer/takeoffer/TakeOfferViewModel.java | 24 ++-- 6 files changed, 142 insertions(+), 125 deletions(-) diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferDataModel.java b/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferDataModel.java index 3acf88d15e..f38ec1dd5f 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferDataModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferDataModel.java @@ -17,21 +17,19 @@ package io.bitsquare.gui.main.offer.createoffer; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.SettableFuture; import com.google.inject.Inject; import io.bitsquare.arbitration.Arbitrator; -import io.bitsquare.btc.*; +import io.bitsquare.btc.AddressEntry; +import io.bitsquare.btc.FeePolicy; +import io.bitsquare.btc.TradeWalletService; +import io.bitsquare.btc.WalletService; import io.bitsquare.btc.blockchain.BlockchainService; import io.bitsquare.btc.listeners.BalanceListener; import io.bitsquare.btc.pricefeed.PriceFeed; -import io.bitsquare.common.UserThread; import io.bitsquare.common.crypto.KeyRing; import io.bitsquare.gui.Navigation; import io.bitsquare.gui.common.model.ActivatableDataModel; import io.bitsquare.gui.main.overlays.notifications.Notification; -import io.bitsquare.gui.main.overlays.popups.Popup; import io.bitsquare.gui.main.overlays.windows.WalletPasswordWindow; import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.locale.TradeCurrency; @@ -50,7 +48,6 @@ import org.bitcoinj.core.Coin; import org.bitcoinj.core.Transaction; import org.bitcoinj.utils.ExchangeRate; import org.bitcoinj.utils.Fiat; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -92,10 +89,10 @@ class CreateOfferDataModel extends ActivatableDataModel { final StringProperty btcCode = new SimpleStringProperty(); final BooleanProperty isWalletFunded = new SimpleBooleanProperty(); - final BooleanProperty isMainNet = new SimpleBooleanProperty(); + //final BooleanProperty isMainNet = new SimpleBooleanProperty(); final BooleanProperty isFeeFromFundingTxSufficient = new SimpleBooleanProperty(); - - final ObjectProperty feeFromFundingTxProperty = new SimpleObjectProperty(Coin.NEGATIVE_SATOSHI); + + // final ObjectProperty feeFromFundingTxProperty = new SimpleObjectProperty(Coin.NEGATIVE_SATOSHI); final ObjectProperty amountAsCoin = new SimpleObjectProperty<>(); final ObjectProperty minAmountAsCoin = new SimpleObjectProperty<>(); final ObjectProperty priceAsFiat = new SimpleObjectProperty<>(); @@ -135,7 +132,7 @@ class CreateOfferDataModel extends ActivatableDataModel { this.blockchainService = blockchainService; this.formatter = formatter; - isMainNet.set(preferences.getBitcoinNetwork() == BitcoinNetwork.MAINNET); + // isMainNet.set(preferences.getBitcoinNetwork() == BitcoinNetwork.MAINNET); offerId = UUID.randomUUID().toString(); addressEntry = walletService.getTradeAddressEntry(offerId); @@ -148,7 +145,7 @@ class CreateOfferDataModel extends ActivatableDataModel { public void onBalanceChanged(Coin balance, Transaction tx) { updateBalance(); - if (preferences.getBitcoinNetwork() == BitcoinNetwork.MAINNET) { + /* if (isMainNet.get()) { SettableFuture future = blockchainService.requestFee(tx.getHashAsString()); Futures.addCallback(future, new FutureCallback() { public void onSuccess(Coin fee) { @@ -168,9 +165,7 @@ class CreateOfferDataModel extends ActivatableDataModel { .show()); } }); - } else { - feeFromFundingTxProperty.set(FeePolicy.getMinRequiredFeeForFundingTx()); - } + }*/ } }; @@ -362,9 +357,9 @@ class CreateOfferDataModel extends ActivatableDataModel { return user.getAcceptedArbitrators().size() > 0; } - boolean isFeeFromFundingTxSufficient() { - return feeFromFundingTxProperty.get().compareTo(FeePolicy.getMinRequiredFeeForFundingTx()) >= 0; - } + /*boolean isFeeFromFundingTxSufficient() { + return !isMainNet.get() || feeFromFundingTxProperty.get().compareTo(FeePolicy.getMinRequiredFeeForFundingTx()) >= 0; + }*/ /////////////////////////////////////////////////////////////////////////////////////////// @@ -416,6 +411,8 @@ class CreateOfferDataModel extends ActivatableDataModel { } missingCoin.set(totalToPayAsCoin.get().subtract(balance.get())); + if (missingCoin.get().isNegative()) + missingCoin.set(Coin.ZERO); isWalletFunded.set(isBalanceSufficient(balance.get())); if (isWalletFunded.get()) { diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferView.java b/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferView.java index ae660ee8ff..ca4ba75985 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferView.java @@ -112,7 +112,7 @@ public class CreateOfferView extends ActivatableViewAndModel showWarningAdjustedVolumeListener; private ChangeListener errorMessageListener; private ChangeListener placeOfferCompletedListener; - private ChangeListener feeFromFundingTxListener; + // private ChangeListener feeFromFundingTxListener; private EventHandler paymentAccountsComboBoxSelectionHandler; private EventHandler currencyComboBoxSelectionHandler; @@ -123,6 +123,7 @@ public class CreateOfferView extends ActivatableViewAndModel balanceListener; private HBox fundingHBox; private Subscription isSpinnerVisibleSubscription; + private Subscription cancelButton2StyleSubscription; /////////////////////////////////////////////////////////////////////////////////////////// @@ -267,7 +268,7 @@ public class CreateOfferView extends ActivatableViewAndModel spinner.setProgress(isSpinnerVisible ? -1 : 0)); + cancelButton2StyleSubscription = EasyBind.subscribe(placeOfferButton.visibleProperty(), + isVisible -> cancelButton2.setId(isVisible ? "cancel-button" : null)); } private void removeSubscriptions() { isSpinnerVisibleSubscription.unsubscribe(); + cancelButton2StyleSubscription.unsubscribe(); } private void createListeners() { @@ -535,7 +539,7 @@ public class CreateOfferView extends ActivatableViewAndModel { + /* feeFromFundingTxListener = (observable, oldValue, newValue) -> { log.debug("feeFromFundingTxListener " + newValue); if (!model.dataModel.isFeeFromFundingTxSufficient()) { new Popup().warning("The mining fee from your funding transaction is not sufficiently high.\n\n" + @@ -556,7 +560,7 @@ public class CreateOfferView extends ActivatableViewAndModel onPaymentAccountsComboBoxSelected(); currencyComboBoxSelectionHandler = e -> onCurrencyComboBoxSelected(); @@ -609,7 +613,7 @@ public class CreateOfferView extends ActivatableViewAndModel priceAsFiatListener; private ChangeListener volumeAsFiatListener; private ChangeListener isWalletFundedListener; - private ChangeListener feeFromFundingTxListener; + //private ChangeListener feeFromFundingTxListener; private ChangeListener errorMessageListener; private Offer offer; private Timer timeoutTimer; @@ -254,9 +255,9 @@ class CreateOfferViewModel extends ActivatableWithDataModel { updateButtonDisableState(); }; - feeFromFundingTxListener = (ov, oldValue, newValue) -> { + /* feeFromFundingTxListener = (ov, oldValue, newValue) -> { updateButtonDisableState(); - }; + };*/ } private void addListeners() { @@ -273,7 +274,7 @@ class CreateOfferViewModel extends ActivatableWithDataModel { stopTimeoutTimer(); - isPlaceOfferButtonDisabled.set(false); - cancelButtonDisabled.set(false); + createOfferRequested = false; errorMessage.set("A timeout occurred at publishing the offer."); + + updateButtonDisableState(); + updateSpinnerInfo(); + resultHandler.run(); }, 30); } errorMessageListener = (observable, oldValue, newValue) -> { if (newValue != null) { stopTimeoutTimer(); - isPlaceOfferButtonDisabled.set(false); - cancelButtonDisabled.set(false); + createOfferRequested = false; if (offer.getState() == Offer.State.OFFER_FEE_PAID) errorMessage.set(newValue + "\n\nThe offer fee is already paid. In the worst case you have lost that fee. " + @@ -340,10 +341,15 @@ class CreateOfferViewModel extends ActivatableWithDataModel { stopTimeoutTimer(); resultHandler.run(); @@ -351,16 +357,10 @@ class CreateOfferViewModel extends ActivatableWithDataModel preferences.getMaxPriceDistanceInPercent()) { - Popup popup = new Popup(); - popup.warning("The price you have entered is outside the max. allowed deviation from the market price.\n" + - "The max. allowed deviation is " + - formatter.formatToPercent(preferences.getMaxPriceDistanceInPercent()) + - " and can be adjusted in the preferences.") - .actionButtonText("Change price") - .onAction(() -> popup.hide()) - .closeButtonText("Go to \"Preferences\"") - .onClose(() -> navigation.navigateTo(MainView.class, SettingsView.class, PreferencesView.class)) - .show(); - return false; - } else { - return true; - } - } else { - return true; - } - } - void onShowPayFundsScreen() { showPayFundsScreenDisplayed.set(true); updateSpinnerInfo(); @@ -514,6 +487,33 @@ class CreateOfferViewModel extends ActivatableWithDataModel preferences.getMaxPriceDistanceInPercent()) { + Popup popup = new Popup(); + popup.warning("The price you have entered is outside the max. allowed deviation from the market price.\n" + + "The max. allowed deviation is " + + formatter.formatToPercent(preferences.getMaxPriceDistanceInPercent()) + + " and can be adjusted in the preferences.") + .actionButtonText("Change price") + .onAction(() -> popup.hide()) + .closeButtonText("Go to \"Preferences\"") + .onClose(() -> navigation.navigateTo(MainView.class, SettingsView.class, PreferencesView.class)) + .show(); + return false; + } else { + return true; + } + } else { + return true; + } + } + BSFormatter getFormatter() { return formatter; } @@ -579,6 +579,7 @@ class CreateOfferViewModel extends ActivatableWithDataModel amountAsCoin = new SimpleObjectProperty<>(); final ObjectProperty volumeAsFiat = new SimpleObjectProperty<>(); final ObjectProperty totalToPayAsCoin = new SimpleObjectProperty<>(); @@ -124,7 +120,7 @@ class TakeOfferDataModel extends ActivatableDataModel { networkFeeAsCoin = FeePolicy.getFixedTxFeeForTrades(); securityDepositAsCoin = FeePolicy.getSecurityDeposit(); - isMainNet.set(preferences.getBitcoinNetwork() == BitcoinNetwork.MAINNET); + // isMainNet.set(preferences.getBitcoinNetwork() == BitcoinNetwork.MAINNET); } @Override @@ -179,20 +175,16 @@ class TakeOfferDataModel extends ActivatableDataModel { if (BitsquareApp.DEV_MODE) amountAsCoin.set(offer.getAmount()); - calculateTotalToPay(); calculateVolume(); calculateTotalToPay(); + updateBalance(); balanceListener = new BalanceListener(addressEntry.getAddress()) { @Override public void onBalanceChanged(Coin balance, Transaction tx) { updateBalance(); - if (tx.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING) { - - } - - if (isMainNet.get()) { + /*if (isMainNet.get()) { SettableFuture future = blockchainService.requestFee(tx.getHashAsString()); Futures.addCallback(future, new FutureCallback() { public void onSuccess(Coin fee) { @@ -215,7 +207,7 @@ class TakeOfferDataModel extends ActivatableDataModel { } else { setFeeFromFundingTx(FeePolicy.getMinRequiredFeeForFundingTx()); isFeeFromFundingTxSufficient.set(feeFromFundingTx.compareTo(FeePolicy.getMinRequiredFeeForFundingTx()) >= 0); - } + }*/ } }; @@ -347,20 +339,23 @@ class TakeOfferDataModel extends ActivatableDataModel { Coin savingWalletBalance = walletService.getSavingWalletBalance(); totalAvailableBalance = savingWalletBalance.add(tradeWalletBalance); - if (totalAvailableBalance.compareTo(totalToPayAsCoin.get()) > 0) + if (totalToPayAsCoin.get() != null && totalAvailableBalance.compareTo(totalToPayAsCoin.get()) > 0) balance.set(totalToPayAsCoin.get()); else balance.set(totalAvailableBalance); } else { balance.set(tradeWalletBalance); } - - missingCoin.set(totalToPayAsCoin.get().subtract(balance.get())); + if (totalToPayAsCoin.get() != null) { + missingCoin.set(totalToPayAsCoin.get().subtract(balance.get())); + if (missingCoin.get().isNegative()) + missingCoin.set(Coin.ZERO); + } isWalletFunded.set(isBalanceSufficient(balance.get())); if (isWalletFunded.get()) { // walletService.removeBalanceListener(balanceListener); - if (walletFundedNotification == null) { + if (totalToPayAsCoin.get() != null && walletFundedNotification == null) { walletFundedNotification = new Notification() .headLine("Trading wallet update") .notification("Your trading wallet is sufficiently funded.\n" + @@ -378,13 +373,13 @@ class TakeOfferDataModel extends ActivatableDataModel { public void swapTradeToSavings() { walletService.swapTradeToSavings(offer.getId()); - setFeeFromFundingTx(Coin.NEGATIVE_SATOSHI); + //setFeeFromFundingTx(Coin.NEGATIVE_SATOSHI); } - private void setFeeFromFundingTx(Coin fee) { + /* private void setFeeFromFundingTx(Coin fee) { feeFromFundingTx = fee; isFeeFromFundingTxSufficient.set(feeFromFundingTx.compareTo(FeePolicy.getMinRequiredFeeForFundingTx()) >= 0); - } + }*/ boolean isMinAmountLessOrEqualAmount() { //noinspection SimplifiableIfStatement diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferView.java b/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferView.java index de0d2fabc6..a9ccf8450e 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferView.java @@ -64,7 +64,6 @@ import org.bitcoinj.uri.BitcoinURI; import org.controlsfx.control.PopOver; import org.fxmisc.easybind.EasyBind; import org.fxmisc.easybind.Subscription; -import org.fxmisc.easybind.monadic.MonadicBinding; import org.jetbrains.annotations.NotNull; import javax.inject.Inject; @@ -115,9 +114,10 @@ public class TakeOfferView extends ActivatableViewAndModel noSufficientFeeBinding; + // private Subscription noSufficientFeeSubscription; + // private MonadicBinding noSufficientFeeBinding; private Subscription totalToPaySubscription; + private Subscription cancelButton2StyleSubscription; /////////////////////////////////////////////////////////////////////////////////////////// @@ -507,7 +507,7 @@ public class TakeOfferView extends ActivatableViewAndModel isWalletFunded && isMainNet && !isFeeSufficient); noSufficientFeeSubscription = noSufficientFeeBinding.subscribe((observable, oldValue, newValue) -> { if (newValue) @@ -527,10 +527,12 @@ public class TakeOfferView extends ActivatableViewAndModel balanceTextField.setBalance(newValue)); totalToPaySubscription = EasyBind.subscribe(model.dataModel.totalToPayAsCoin, newValue -> balanceTextField.setTargetAmount(newValue)); + cancelButton2StyleSubscription = EasyBind.subscribe(takeOfferButton.visibleProperty(), + isVisible -> cancelButton2.setId(isVisible ? "cancel-button" : null)); } private void removeSubscriptions() { @@ -540,12 +542,13 @@ public class TakeOfferView extends ActivatableViewAndModel close()); + cancelButton1.setOnAction(e -> { + model.dataModel.swapTradeToSavings(); + close(); + }); offerAvailabilitySpinner = new ProgressIndicator(0); offerAvailabilitySpinner.setPrefSize(18, 18); @@ -758,15 +764,20 @@ public class TakeOfferView extends ActivatableViewAndModel { - if (model.dataModel.isWalletFunded.get()) + if (model.dataModel.isWalletFunded.get()) { new Popup().warning("You have already paid in the funds.\n" + "Are you sure you want to cancel.") - .actionButtonText("Yes, cancel") - .onAction(() -> close()) - .closeButtonText("No") + .actionButtonText("No") + .onClose(() -> { + model.dataModel.swapTradeToSavings(); + close(); + }) + .closeButtonText("Yes, cancel") .show(); - else + } else { close(); + model.dataModel.swapTradeToSavings(); + } }); cancelButton2.setDefaultButton(false); cancelButton2.setVisible(false); diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferViewModel.java index 13037c6b92..53fd675a40 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferViewModel.java @@ -42,8 +42,6 @@ import javafx.beans.value.ChangeListener; import javafx.collections.ObservableList; import org.bitcoinj.core.Address; import org.bitcoinj.core.Coin; -import org.fxmisc.easybind.EasyBind; -import org.fxmisc.easybind.Subscription; import javax.inject.Inject; import java.util.List; @@ -99,7 +97,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel im private ChangeListener offerStateListener; private ChangeListener offerErrorListener; private ConnectionListener connectionListener; - private Subscription isFeeSufficientSubscription; + // private Subscription isFeeSufficientSubscription; private Runnable takeOfferSucceededHandler; @@ -199,9 +197,11 @@ class TakeOfferViewModel extends ActivatableWithDataModel im applyTradeState(trade.getState()); trade.errorMessageProperty().addListener(tradeErrorListener); applyTradeErrorMessage(trade.errorMessageProperty().get()); - updateButtonDisableState(); takeOfferCompleted.set(true); }); + + updateButtonDisableState(); + updateSpinnerInfo(); } public void onPaymentAccountSelected(PaymentAccount paymentAccount) { @@ -390,8 +390,9 @@ class TakeOfferViewModel extends ActivatableWithDataModel im && !dataModel.isAmountLargerThanOfferAmount() && isOfferAvailable.get(); isNextButtonDisabled.set(!inputDataValid); - boolean notSufficientFees = dataModel.isWalletFunded.get() && dataModel.isMainNet.get() && !dataModel.isFeeFromFundingTxSufficient.get(); - isTakeOfferButtonDisabled.set(takeOfferRequested || !inputDataValid || notSufficientFees); + // boolean notSufficientFees = dataModel.isWalletFunded.get() && dataModel.isMainNet.get() && !dataModel.isFeeFromFundingTxSufficient.get(); + // isTakeOfferButtonDisabled.set(takeOfferRequested || !inputDataValid || notSufficientFees); + isTakeOfferButtonDisabled.set(takeOfferRequested || !inputDataValid || !dataModel.isWalletFunded.get()); } @@ -467,11 +468,12 @@ class TakeOfferViewModel extends ActivatableWithDataModel im showTransactionPublishedScreen.get()) { spinnerInfoText.set(""); } else if (dataModel.isWalletFunded.get()) { - if (dataModel.isFeeFromFundingTxSufficient.get()) { + spinnerInfoText.set(""); + /* if (dataModel.isFeeFromFundingTxSufficient.get()) { spinnerInfoText.set(""); } else { spinnerInfoText.set("Check if funding tx miner fee is sufficient..."); - } + }*/ } else { spinnerInfoText.set("Waiting for funds..."); } @@ -489,10 +491,10 @@ class TakeOfferViewModel extends ActivatableWithDataModel im dataModel.isWalletFunded.addListener(isWalletFundedListener); p2PService.getNetworkNode().addConnectionListener(connectionListener); - isFeeSufficientSubscription = EasyBind.subscribe(dataModel.isFeeFromFundingTxSufficient, newValue -> { + /* isFeeSufficientSubscription = EasyBind.subscribe(dataModel.isFeeFromFundingTxSufficient, newValue -> { updateButtonDisableState(); updateSpinnerInfo(); - }); + });*/ } private void removeListeners() { @@ -512,7 +514,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel im trade.errorMessageProperty().removeListener(tradeErrorListener); } p2PService.getNetworkNode().removeConnectionListener(connectionListener); - isFeeSufficientSubscription.unsubscribe(); + //isFeeSufficientSubscription.unsubscribe(); }