Search in sources :

Example 1 with TradePriceOutOfToleranceException

use of io.bitsquare.trade.exceptions.TradePriceOutOfToleranceException in project bitsquare by bitsquare.

the class Offer method checkTradePriceTolerance.

public void checkTradePriceTolerance(long takersTradePrice) throws TradePriceOutOfToleranceException, MarketPriceNotAvailableException, IllegalArgumentException {
    checkArgument(takersTradePrice > 0, "takersTradePrice must be positive");
    Fiat tradePriceAsFiat = Fiat.valueOf(getCurrencyCode(), takersTradePrice);
    Fiat offerPriceAsFiat = getPrice();
    if (offerPriceAsFiat == null)
        throw new MarketPriceNotAvailableException("Market price required for calculating trade price is not available.");
    double factor = (double) takersTradePrice / (double) offerPriceAsFiat.value;
    // from one provider.
    if (Math.abs(1 - factor) > 0.02) {
        String msg = "Taker's trade price is too far away from our calculated price based on the market price.\n" + "tradePriceAsFiat=" + tradePriceAsFiat.toFriendlyString() + "\n" + "offerPriceAsFiat=" + offerPriceAsFiat.toFriendlyString();
        log.warn(msg);
        throw new TradePriceOutOfToleranceException(msg);
    }
}
Also used : MarketPriceNotAvailableException(io.bitsquare.trade.exceptions.MarketPriceNotAvailableException) TradePriceOutOfToleranceException(io.bitsquare.trade.exceptions.TradePriceOutOfToleranceException) Fiat(org.bitcoinj.utils.Fiat)

Example 2 with TradePriceOutOfToleranceException

use of io.bitsquare.trade.exceptions.TradePriceOutOfToleranceException in project bitsquare by bitsquare.

the class OpenOfferManager method handleOfferAvailabilityRequest.

///////////////////////////////////////////////////////////////////////////////////////////
// Offer Availability
///////////////////////////////////////////////////////////////////////////////////////////
private void handleOfferAvailabilityRequest(OfferAvailabilityRequest message, NodeAddress sender) {
    log.trace("handleNewMessage: message = " + message.getClass().getSimpleName() + " from " + sender);
    if (!stopped) {
        try {
            nonEmptyStringOf(message.offerId);
            checkNotNull(message.getPubKeyRing());
        } catch (Throwable t) {
            log.warn("Invalid message " + message.toString());
            return;
        }
        Optional<OpenOffer> openOfferOptional = findOpenOffer(message.offerId);
        AvailabilityResult availabilityResult;
        if (openOfferOptional.isPresent()) {
            if (openOfferOptional.get().getState() == OpenOffer.State.AVAILABLE) {
                final Offer offer = openOfferOptional.get().getOffer();
                if (!preferences.getIgnoreTradersList().stream().filter(i -> i.equals(offer.getOffererNodeAddress().getHostNameWithoutPostFix())).findAny().isPresent()) {
                    availabilityResult = AvailabilityResult.AVAILABLE;
                    List<NodeAddress> acceptedArbitrators = user.getAcceptedArbitratorAddresses();
                    if (acceptedArbitrators != null && !acceptedArbitrators.isEmpty()) {
                        // We need to be backward compatible. takersTradePrice was not used before 0.4.9.
                        if (message.takersTradePrice > 0) {
                            // losses and therefore an outdated market price.
                            try {
                                offer.checkTradePriceTolerance(message.takersTradePrice);
                            } catch (TradePriceOutOfToleranceException e) {
                                log.warn("Trade price check failed because takers price is outside out tolerance.");
                                availabilityResult = AvailabilityResult.PRICE_OUT_OF_TOLERANCE;
                            } catch (MarketPriceNotAvailableException e) {
                                log.warn(e.getMessage());
                                availabilityResult = AvailabilityResult.MARKET_PRICE_NOT_AVAILABLE;
                            } catch (Throwable e) {
                                log.warn("Trade price check failed. " + e.getMessage());
                                availabilityResult = AvailabilityResult.UNKNOWN_FAILURE;
                            }
                        }
                    } else {
                        log.warn("acceptedArbitrators is null or empty: acceptedArbitrators=" + acceptedArbitrators);
                        availabilityResult = AvailabilityResult.NO_ARBITRATORS;
                    }
                } else {
                    availabilityResult = AvailabilityResult.USER_IGNORED;
                }
            } else {
                availabilityResult = AvailabilityResult.OFFER_TAKEN;
            }
        } else {
            log.warn("handleOfferAvailabilityRequest: openOffer not found. That should never happen.");
            availabilityResult = AvailabilityResult.OFFER_TAKEN;
        }
        try {
            p2PService.sendEncryptedDirectMessage(sender, message.getPubKeyRing(), new OfferAvailabilityResponse(message.offerId, availabilityResult), new SendDirectMessageListener() {

                @Override
                public void onArrived() {
                    log.trace("OfferAvailabilityResponse successfully arrived at peer");
                }

                @Override
                public void onFault() {
                    log.debug("Sending OfferAvailabilityResponse failed.");
                }
            });
        } catch (Throwable t) {
            t.printStackTrace();
            log.debug("Exception at handleRequestIsOfferAvailableMessage " + t.getMessage());
        }
    } else {
        log.debug("We have stopped already. We ignore that handleOfferAvailabilityRequest call.");
    }
}
Also used : OfferAvailabilityResponse(io.bitsquare.trade.protocol.availability.messages.OfferAvailabilityResponse) PriceFeedService(io.bitsquare.btc.pricefeed.PriceFeedService) P2PService(io.bitsquare.p2p.P2PService) TradableList(io.bitsquare.trade.TradableList) ErrorMessageHandler(io.bitsquare.common.handlers.ErrorMessageHandler) Coin(org.bitcoinj.core.Coin) Inject(com.google.inject.Inject) LoggerFactory(org.slf4j.LoggerFactory) Timer(io.bitsquare.common.Timer) AvailabilityResult(io.bitsquare.trade.protocol.availability.AvailabilityResult) TransactionResultHandler(io.bitsquare.trade.handlers.TransactionResultHandler) PlaceOfferModel(io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel) ArrayList(java.util.ArrayList) DevFlags(io.bitsquare.app.DevFlags) User(io.bitsquare.user.User) WalletService(io.bitsquare.btc.WalletService) PeerManager(io.bitsquare.p2p.peers.PeerManager) KeyRing(io.bitsquare.common.crypto.KeyRing) TradeWalletService(io.bitsquare.btc.TradeWalletService) ResultHandler(io.bitsquare.common.handlers.ResultHandler) Named(javax.inject.Named) AddressEntry(io.bitsquare.btc.AddressEntry) Nullable(javax.annotation.Nullable) Log(io.bitsquare.app.Log) Logger(org.slf4j.Logger) Validator.nonEmptyStringOf(io.bitsquare.util.Validator.nonEmptyStringOf) UserThread(io.bitsquare.common.UserThread) OfferAvailabilityRequest(io.bitsquare.trade.protocol.availability.messages.OfferAvailabilityRequest) Message(io.bitsquare.p2p.Message) NodeAddress(io.bitsquare.p2p.NodeAddress) BootstrapListener(io.bitsquare.p2p.BootstrapListener) ClosedTradableManager(io.bitsquare.trade.closed.ClosedTradableManager) SendDirectMessageListener(io.bitsquare.p2p.messaging.SendDirectMessageListener) File(java.io.File) TimeUnit(java.util.concurrent.TimeUnit) MarketPriceNotAvailableException(io.bitsquare.trade.exceptions.MarketPriceNotAvailableException) Preferences(io.bitsquare.user.Preferences) DecryptedDirectMessageListener(io.bitsquare.p2p.messaging.DecryptedDirectMessageListener) List(java.util.List) com.google.inject.internal.util.$Preconditions.checkNotNull(com.google.inject.internal.util.$Preconditions.checkNotNull) TradePriceOutOfToleranceException(io.bitsquare.trade.exceptions.TradePriceOutOfToleranceException) PlaceOfferProtocol(io.bitsquare.trade.protocol.placeoffer.PlaceOfferProtocol) Optional(java.util.Optional) Storage(io.bitsquare.storage.Storage) DecryptedMsgWithPubKey(io.bitsquare.crypto.DecryptedMsgWithPubKey) ObservableList(javafx.collections.ObservableList) AvailabilityResult(io.bitsquare.trade.protocol.availability.AvailabilityResult) TradePriceOutOfToleranceException(io.bitsquare.trade.exceptions.TradePriceOutOfToleranceException) OfferAvailabilityResponse(io.bitsquare.trade.protocol.availability.messages.OfferAvailabilityResponse) SendDirectMessageListener(io.bitsquare.p2p.messaging.SendDirectMessageListener) MarketPriceNotAvailableException(io.bitsquare.trade.exceptions.MarketPriceNotAvailableException) NodeAddress(io.bitsquare.p2p.NodeAddress)

Example 3 with TradePriceOutOfToleranceException

use of io.bitsquare.trade.exceptions.TradePriceOutOfToleranceException in project bitsquare by bitsquare.

the class ProcessPayDepositRequest method run.

@Override
protected void run() {
    try {
        runInterceptHook();
        log.debug("current trade state " + trade.getState());
        PayDepositRequest payDepositRequest = (PayDepositRequest) processModel.getTradeMessage();
        checkNotNull(payDepositRequest);
        checkTradeId(processModel.getId(), payDepositRequest);
        PaymentAccountContractData paymentAccountContractData = checkNotNull(payDepositRequest.takerPaymentAccountContractData);
        final PaymentAccountFilter[] appliedPaymentAccountFilter = new PaymentAccountFilter[1];
        if (processModel.isPeersPaymentAccountDataAreBanned(paymentAccountContractData, appliedPaymentAccountFilter)) {
            failed("Other trader is banned by his trading account data.\n" + "paymentAccountContractData=" + paymentAccountContractData.getPaymentDetails() + "\n" + "banFilter=" + appliedPaymentAccountFilter[0].toString());
            return;
        }
        processModel.tradingPeer.setPaymentAccountContractData(paymentAccountContractData);
        processModel.tradingPeer.setRawTransactionInputs(checkNotNull(payDepositRequest.rawTransactionInputs));
        checkArgument(payDepositRequest.rawTransactionInputs.size() > 0);
        processModel.tradingPeer.setChangeOutputValue(payDepositRequest.changeOutputValue);
        if (payDepositRequest.changeOutputAddress != null)
            processModel.tradingPeer.setChangeOutputAddress(payDepositRequest.changeOutputAddress);
        processModel.tradingPeer.setMultiSigPubKey(checkNotNull(payDepositRequest.takerMultiSigPubKey));
        processModel.tradingPeer.setPayoutAddressString(nonEmptyStringOf(payDepositRequest.takerPayoutAddressString));
        processModel.tradingPeer.setPubKeyRing(checkNotNull(payDepositRequest.takerPubKeyRing));
        processModel.tradingPeer.setAccountId(nonEmptyStringOf(payDepositRequest.takerAccountId));
        trade.setTakeOfferFeeTxId(nonEmptyStringOf(payDepositRequest.takeOfferFeeTxId));
        processModel.setTakerAcceptedArbitratorNodeAddresses(checkNotNull(payDepositRequest.acceptedArbitratorNodeAddresses));
        if (payDepositRequest.acceptedArbitratorNodeAddresses.isEmpty())
            failed("acceptedArbitratorNames must not be empty");
        trade.applyArbitratorNodeAddress(checkNotNull(payDepositRequest.arbitratorNodeAddress));
        try {
            long takersTradePrice = payDepositRequest.tradePrice;
            trade.getOffer().checkTradePriceTolerance(takersTradePrice);
            trade.setTradePrice(takersTradePrice);
        } catch (TradePriceOutOfToleranceException e) {
            failed(e.getMessage());
        } catch (Throwable e2) {
            failed(e2);
        }
        checkArgument(payDepositRequest.tradeAmount > 0);
        trade.setTradeAmount(Coin.valueOf(payDepositRequest.tradeAmount));
        // check and update to the latest peer address of our peer if the payDepositRequest is correct
        checkArgument(payDepositRequest.getSenderNodeAddress().equals(processModel.getTempTradingPeerNodeAddress()));
        trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
        removeMailboxMessageAfterProcessing();
        complete();
    } catch (Throwable t) {
        failed(t);
    }
}
Also used : PayDepositRequest(io.bitsquare.trade.protocol.trade.messages.PayDepositRequest) PaymentAccountContractData(io.bitsquare.payment.PaymentAccountContractData) TradePriceOutOfToleranceException(io.bitsquare.trade.exceptions.TradePriceOutOfToleranceException) PaymentAccountFilter(io.bitsquare.filter.PaymentAccountFilter)

Aggregations

TradePriceOutOfToleranceException (io.bitsquare.trade.exceptions.TradePriceOutOfToleranceException)3 MarketPriceNotAvailableException (io.bitsquare.trade.exceptions.MarketPriceNotAvailableException)2 Inject (com.google.inject.Inject)1 com.google.inject.internal.util.$Preconditions.checkNotNull (com.google.inject.internal.util.$Preconditions.checkNotNull)1 DevFlags (io.bitsquare.app.DevFlags)1 Log (io.bitsquare.app.Log)1 AddressEntry (io.bitsquare.btc.AddressEntry)1 TradeWalletService (io.bitsquare.btc.TradeWalletService)1 WalletService (io.bitsquare.btc.WalletService)1 PriceFeedService (io.bitsquare.btc.pricefeed.PriceFeedService)1 Timer (io.bitsquare.common.Timer)1 UserThread (io.bitsquare.common.UserThread)1 KeyRing (io.bitsquare.common.crypto.KeyRing)1 ErrorMessageHandler (io.bitsquare.common.handlers.ErrorMessageHandler)1 ResultHandler (io.bitsquare.common.handlers.ResultHandler)1 DecryptedMsgWithPubKey (io.bitsquare.crypto.DecryptedMsgWithPubKey)1 PaymentAccountFilter (io.bitsquare.filter.PaymentAccountFilter)1 BootstrapListener (io.bitsquare.p2p.BootstrapListener)1 Message (io.bitsquare.p2p.Message)1 NodeAddress (io.bitsquare.p2p.NodeAddress)1