From 461aa9bd7fa6594478d9a30b759b39ec11ddda5f Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 15 Apr 2016 12:03:30 +0200 Subject: [PATCH] Add check at offerer for trade price --- .../trade/protocol/trade/ProcessModel.java | 1 - .../offerer/ProcessPayDepositRequest.java | 22 ++++++++++++++++++- .../java/io/bitsquare/user/Preferences.java | 12 ++++++++++ .../java/io/bitsquare/app/BitsquareApp.java | 2 +- .../io/bitsquare/gui/main/MainViewModel.java | 20 +++++++++-------- .../createoffer/CreateOfferDataModel.java | 6 ++--- .../offer/createoffer/CreateOfferView.java | 2 +- .../main/offer/takeoffer/TakeOfferView.java | 2 +- 8 files changed, 50 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/ProcessModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/ProcessModel.java index 1f4c8b804e..42f4f1a1e2 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/ProcessModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/ProcessModel.java @@ -68,7 +68,6 @@ public class ProcessModel implements Model, Serializable { transient private KeyRing keyRing; transient private P2PService p2PService; - // Mutable public final TradingPeer tradingPeer; transient private TradeMessage tradeMessage; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/offerer/ProcessPayDepositRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/offerer/ProcessPayDepositRequest.java index bddb6451d7..15b42ef113 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/offerer/ProcessPayDepositRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/offerer/ProcessPayDepositRequest.java @@ -26,6 +26,7 @@ import io.bitsquare.trade.Trade; import io.bitsquare.trade.protocol.trade.messages.PayDepositRequest; import io.bitsquare.trade.protocol.trade.tasks.TradeTask; import org.bitcoinj.core.Coin; +import org.bitcoinj.utils.Fiat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,8 +77,27 @@ public class ProcessPayDepositRequest extends TradeTask { if (payDepositRequest.acceptedArbitratorNodeAddresses.size() < 1) failed("acceptedArbitratorNames size must be at least 1"); trade.setArbitratorNodeAddress(checkNotNull(payDepositRequest.arbitratorNodeAddress)); + + long takersTradePrice = payDepositRequest.tradePrice; + checkArgument(takersTradePrice > 0); + Fiat tradePriceAsFiat = Fiat.valueOf(trade.getOffer().getCurrencyCode(), takersTradePrice); + Fiat offerPriceAsFiat = trade.getOffer().getPrice(); + double factor = (double) takersTradePrice / (double) offerPriceAsFiat.value; + // We allow max. 2 % difference between own offer price calculation and takers calculation. + // Market price might be different at offerers and takers side so we need a bit of tolerance. + // The tolerance will get smaller once we have multiple price feeds avoiding fast price fluctuations + // from one provider. + if (Math.abs(1 - factor) > 0.02) { + String msg = "Takers tradePrice is outside our market price tolerance.\n" + + "tradePriceAsFiat=" + tradePriceAsFiat.toFriendlyString() + "\n" + + "offerPriceAsFiat=" + offerPriceAsFiat.toFriendlyString(); + log.warn(msg); + failed(msg); + } + trade.setTradePrice(takersTradePrice); + + checkArgument(payDepositRequest.tradeAmount > 0); - trade.setTradePrice(payDepositRequest.tradePrice); trade.setTradeAmount(Coin.valueOf(payDepositRequest.tradeAmount)); // update to the latest peer address of our peer if the payDepositRequest is correct diff --git a/core/src/main/java/io/bitsquare/user/Preferences.java b/core/src/main/java/io/bitsquare/user/Preferences.java index 9bdd2ac2cc..991a6d363f 100644 --- a/core/src/main/java/io/bitsquare/user/Preferences.java +++ b/core/src/main/java/io/bitsquare/user/Preferences.java @@ -110,6 +110,7 @@ public final class Preferences implements Persistable { private double maxPriceDistanceInPercent; private boolean useInvertedMarketPrice; private boolean useStickyMarketPrice = false; + private boolean usePercentageBasedPrice = false; // Observable wrappers transient private final StringProperty btcDenominationProperty = new SimpleStringProperty(btcDenomination); @@ -162,6 +163,7 @@ public final class Preferences implements Persistable { // useTorForBitcoinJ = persisted.getUseTorForBitcoinJ(); useTorForBitcoinJ = false; useStickyMarketPrice = persisted.getUseStickyMarketPrice(); + usePercentageBasedPrice = persisted.getUsePercentageBasedPrice(); showOwnOffersInOfferBook = persisted.getShowOwnOffersInOfferBook(); maxPriceDistanceInPercent = persisted.getMaxPriceDistanceInPercent(); // Backward compatible to version 0.3.6. Can be removed after a while @@ -368,6 +370,12 @@ public final class Preferences implements Persistable { storage.queueUpForSave(); } + public void setUsePercentageBasedPrice(boolean usePercentageBasedPrice) { + this.usePercentageBasedPrice = usePercentageBasedPrice; + storage.queueUpForSave(); + } + + /////////////////////////////////////////////////////////////////////////////////////////// // Getter /////////////////////////////////////////////////////////////////////////////////////////// @@ -488,6 +496,10 @@ public final class Preferences implements Persistable { return useStickyMarketPrice; } + public boolean getUsePercentageBasedPrice() { + return usePercentageBasedPrice; + } + /////////////////////////////////////////////////////////////////////////////////////////// // Private diff --git a/gui/src/main/java/io/bitsquare/app/BitsquareApp.java b/gui/src/main/java/io/bitsquare/app/BitsquareApp.java index 2a4348d9a5..cf61f7da3f 100644 --- a/gui/src/main/java/io/bitsquare/app/BitsquareApp.java +++ b/gui/src/main/java/io/bitsquare/app/BitsquareApp.java @@ -76,7 +76,7 @@ import static io.bitsquare.app.BitsquareEnvironment.APP_NAME_KEY; public class BitsquareApp extends Application { private static final Logger log = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(BitsquareApp.class); - public static final boolean DEV_MODE = false; + public static final boolean DEV_MODE = true; public static final boolean IS_RELEASE_VERSION = !DEV_MODE && true; private static Environment env; diff --git a/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java index efb4140b77..ce19f066e8 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java @@ -497,7 +497,11 @@ public class MainViewModel implements ViewModel { setupBtcNumPeersWatcher(); setupP2PNumPeersWatcher(); updateBalance(); - setupDevDummyPaymentAccount(); + if (BitsquareApp.DEV_MODE) { + preferences.setShowOwnOffersInOfferBook(true); + if (user.getPaymentAccounts().isEmpty()) + setupDevDummyPaymentAccount(); + } setupMarketPriceFeed(); swapPendingOfferFundingEntries(); fillPriceFeedComboBoxItems(); @@ -713,7 +717,7 @@ public class MainViewModel implements ViewModel { marketPriceBinding.subscribe((observable, oldValue, newValue) -> { if (newValue != null && !newValue.equals(oldValue)) { setMarketPriceInItems(); - + String code = preferences.getUseStickyMarketPrice() ? preferences.getPreferredTradeCurrency().getCode() : priceFeed.currencyCodeProperty().get(); @@ -896,12 +900,10 @@ public class MainViewModel implements ViewModel { } private void setupDevDummyPaymentAccount() { - if (BitsquareApp.DEV_MODE && user.getPaymentAccounts().isEmpty()) { - OKPayAccount okPayAccount = new OKPayAccount(); - okPayAccount.setAccountNr("dummy"); - okPayAccount.setAccountName("OKPay dummy"); - okPayAccount.setSelectedTradeCurrency(CurrencyUtil.getDefaultTradeCurrency()); - user.addPaymentAccount(okPayAccount); - } + OKPayAccount okPayAccount = new OKPayAccount(); + okPayAccount.setAccountNr("dummy"); + okPayAccount.setAccountName("OKPay dummy"); + okPayAccount.setSelectedTradeCurrency(CurrencyUtil.getDefaultTradeCurrency()); + user.addPaymentAccount(okPayAccount); } } 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 23c73acf0b..e56e1f68ae 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 @@ -140,6 +140,8 @@ class CreateOfferDataModel extends ActivatableDataModel { networkFeeAsCoin = FeePolicy.getFixedTxFeeForTrades(); securityDepositAsCoin = FeePolicy.getSecurityDeposit(); + usePercentageBasedPrice.set(preferences.getUsePercentageBasedPrice()); + balanceListener = new BalanceListener(getAddressEntry().getAddress()) { @Override public void onBalanceChanged(Coin balance, Transaction tx) { @@ -282,9 +284,6 @@ class CreateOfferDataModel extends ActivatableDataModel { String countryCode = paymentAccount instanceof CountryBasedPaymentAccount ? ((CountryBasedPaymentAccount) paymentAccount).getCountry().code : null; checkNotNull(p2PService.getAddress(), "Address must not be null"); - log.error("fiatPrice " + fiatPrice); - log.error("percentageBasedPrice " + percentageBasedPrice); - log.error("usePercentageBasedPrice " + usePercentageBasedPrice.get()); return new Offer(offerId, p2PService.getAddress(), keyRing.getPubKeyRing(), @@ -389,6 +388,7 @@ class CreateOfferDataModel extends ActivatableDataModel { public void setUsePercentageBasedPrice(boolean usePercentageBasedPrice) { this.usePercentageBasedPrice.set(usePercentageBasedPrice); + preferences.setUsePercentageBasedPrice(usePercentageBasedPrice); } /*boolean isFeeFromFundingTxSufficient() { 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 20706721bf..0e15b05c5c 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 @@ -989,7 +989,7 @@ public class CreateOfferView extends ActivatableViewAndModel amountValueCurrencyBoxTuple = getValueCurrencyBox(BSResources.get("createOffer.amount.prompt")); 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 f149b9d0f6..742c947ca7 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 @@ -855,7 +855,7 @@ public class TakeOfferView extends ActivatableViewAndModel