Search in sources :

Example 1 with SendDirectMessageListener

use of bisq.network.p2p.SendDirectMessageListener in project bisq-core by bisq-network.

the class TakerSendPayDepositRequest method run.

@Override
protected void run() {
    try {
        runInterceptHook();
        checkNotNull(trade.getTradeAmount(), "TradeAmount must not be null");
        checkNotNull(trade.getTakerFeeTxId(), "TakeOfferFeeTxId must not be null");
        final User user = processModel.getUser();
        checkNotNull(user, "User must not be null");
        final List<NodeAddress> acceptedArbitratorAddresses = user.getAcceptedArbitratorAddresses();
        final List<NodeAddress> acceptedMediatorAddresses = user.getAcceptedMediatorAddresses();
        checkNotNull(acceptedArbitratorAddresses, "acceptedArbitratorAddresses must not be null");
        checkNotNull(acceptedMediatorAddresses, "acceptedMediatorAddresses must not be null");
        BtcWalletService walletService = processModel.getBtcWalletService();
        String id = processModel.getOffer().getId();
        checkArgument(!walletService.getAddressEntry(id, AddressEntry.Context.MULTI_SIG).isPresent(), "addressEntry must not be set here.");
        AddressEntry addressEntry = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG);
        byte[] takerMultiSigPubKey = addressEntry.getPubKey();
        processModel.setMyMultiSigPubKey(takerMultiSigPubKey);
        AddressEntry takerPayoutAddressEntry = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.TRADE_PAYOUT);
        String takerPayoutAddressString = takerPayoutAddressEntry.getAddressString();
        final String offerId = processModel.getOfferId();
        // Taker has to use offerId as nonce (he cannot manipulate that - so we avoid to have a challenge protocol for passing the nonce we want to get signed)
        // He cannot manipulate the offerId - so we avoid to have a challenge protocol for passing the nonce we want to get signed.
        final PaymentAccountPayload paymentAccountPayload = checkNotNull(processModel.getPaymentAccountPayload(trade), "processModel.getPaymentAccountPayload(trade) must not be null");
        byte[] sig = Sig.sign(processModel.getKeyRing().getSignatureKeyPair().getPrivate(), offerId.getBytes());
        PayDepositRequest message = new PayDepositRequest(offerId, processModel.getMyNodeAddress(), trade.getTradeAmount().value, trade.getTradePrice().getValue(), trade.getTxFee().getValue(), trade.getTakerFee().getValue(), trade.isCurrencyForTakerFeeBtc(), processModel.getRawTransactionInputs(), processModel.getChangeOutputValue(), processModel.getChangeOutputAddress(), takerMultiSigPubKey, takerPayoutAddressString, processModel.getPubKeyRing(), paymentAccountPayload, processModel.getAccountId(), trade.getTakerFeeTxId(), new ArrayList<>(acceptedArbitratorAddresses), new ArrayList<>(acceptedMediatorAddresses), trade.getArbitratorNodeAddress(), trade.getMediatorNodeAddress(), UUID.randomUUID().toString(), Version.getP2PMessageVersion(), sig, new Date().getTime());
        processModel.getP2PService().sendEncryptedDirectMessage(trade.getTradingPeerNodeAddress(), processModel.getTradingPeer().getPubKeyRing(), message, new SendDirectMessageListener() {

            @Override
            public void onArrived() {
                log.debug("Message arrived at peer. tradeId={}, message{}", id, message);
                complete();
            }

            @Override
            public void onFault() {
                appendToErrorMessage("Sending message failed: message=" + message + "\nerrorMessage=" + errorMessage);
                failed();
            }
        });
    } catch (Throwable t) {
        failed(t);
    }
}
Also used : User(bisq.core.user.User) AddressEntry(bisq.core.btc.AddressEntry) PaymentAccountPayload(bisq.core.payment.payload.PaymentAccountPayload) SendDirectMessageListener(bisq.network.p2p.SendDirectMessageListener) Date(java.util.Date) PayDepositRequest(bisq.core.trade.messages.PayDepositRequest) BtcWalletService(bisq.core.btc.wallet.BtcWalletService) NodeAddress(bisq.network.p2p.NodeAddress)

Example 2 with SendDirectMessageListener

use of bisq.network.p2p.SendDirectMessageListener in project bisq-core by bisq-network.

the class OpenOfferManager method handleOfferAvailabilityRequest.

// /////////////////////////////////////////////////////////////////////////////////////////
// OfferPayload Availability
// /////////////////////////////////////////////////////////////////////////////////////////
private void handleOfferAvailabilityRequest(OfferAvailabilityRequest message, NodeAddress sender) {
    log.trace("handleNewMessage: message = " + message.getClass().getSimpleName() + " from " + sender);
    if (p2PService.isBootstrapped()) {
        if (!stopped) {
            try {
                Validator.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.getMakerNodeAddress().getHostNameWithoutPostFix())).findAny().isPresent()) {
                        availabilityResult = AvailabilityResult.AVAILABLE;
                        // TODO mediators not impl yet
                        List<NodeAddress> acceptedArbitrators = user.getAcceptedArbitratorAddresses();
                        if (acceptedArbitrators != null && !acceptedArbitrators.isEmpty()) {
                            // losses and therefore an outdated market price.
                            try {
                                offer.checkTradePriceTolerance(message.getTakersTradePrice());
                            } 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.");
        }
    } else {
        log.info("We got a handleOfferAvailabilityRequest but we have not bootstrapped yet.");
    }
}
Also used : BtcWalletService(bisq.core.btc.wallet.BtcWalletService) PlaceOfferProtocol(bisq.core.offer.placeoffer.PlaceOfferProtocol) Coin(org.bitcoinj.core.Coin) LoggerFactory(org.slf4j.LoggerFactory) Timer(bisq.common.Timer) User(bisq.core.user.User) PersistenceProtoResolver(bisq.common.proto.persistable.PersistenceProtoResolver) ArrayList(java.util.ArrayList) Inject(javax.inject.Inject) TradePriceOutOfToleranceException(bisq.core.exceptions.TradePriceOutOfToleranceException) BootstrapListener(bisq.network.p2p.BootstrapListener) ErrorMessageHandler(bisq.common.handlers.ErrorMessageHandler) Named(javax.inject.Named) PlaceOfferModel(bisq.core.offer.placeoffer.PlaceOfferModel) Validator(bisq.core.util.Validator) Nullable(javax.annotation.Nullable) OfferAvailabilityResponse(bisq.core.offer.messages.OfferAvailabilityResponse) ClosedTradableManager(bisq.core.trade.closed.ClosedTradableManager) PeerManager(bisq.network.p2p.peers.PeerManager) NetworkEnvelope(bisq.common.proto.network.NetworkEnvelope) Logger(org.slf4j.Logger) OfferAvailabilityRequest(bisq.core.offer.messages.OfferAvailabilityRequest) P2PService(bisq.network.p2p.P2PService) TransactionResultHandler(bisq.core.trade.handlers.TransactionResultHandler) PersistedDataHost(bisq.common.proto.persistable.PersistedDataHost) ResultHandler(bisq.common.handlers.ResultHandler) Preconditions.checkNotNull(com.google.common.base.Preconditions.checkNotNull) Set(java.util.Set) Log(bisq.common.app.Log) Collectors(java.util.stream.Collectors) TradableList(bisq.core.trade.TradableList) File(java.io.File) BsqWalletService(bisq.core.btc.wallet.BsqWalletService) TimeUnit(java.util.concurrent.TimeUnit) List(java.util.List) PriceFeedService(bisq.core.provider.price.PriceFeedService) TradeWalletService(bisq.core.btc.wallet.TradeWalletService) NodeAddress(bisq.network.p2p.NodeAddress) SendDirectMessageListener(bisq.network.p2p.SendDirectMessageListener) Storage(bisq.common.storage.Storage) Preferences(bisq.core.user.Preferences) UserThread(bisq.common.UserThread) Optional(java.util.Optional) KeyRing(bisq.common.crypto.KeyRing) ObservableList(javafx.collections.ObservableList) DecryptedDirectMessageListener(bisq.network.p2p.DecryptedDirectMessageListener) DecryptedMessageWithPubKey(bisq.network.p2p.DecryptedMessageWithPubKey) NotNull(org.jetbrains.annotations.NotNull) TradePriceOutOfToleranceException(bisq.core.exceptions.TradePriceOutOfToleranceException) OfferAvailabilityResponse(bisq.core.offer.messages.OfferAvailabilityResponse) SendDirectMessageListener(bisq.network.p2p.SendDirectMessageListener) NodeAddress(bisq.network.p2p.NodeAddress)

Example 3 with SendDirectMessageListener

use of bisq.network.p2p.SendDirectMessageListener in project bisq-core by bisq-network.

the class SendOfferAvailabilityRequest method run.

@Override
protected void run() {
    try {
        runInterceptHook();
        model.p2PService.sendEncryptedDirectMessage(model.getPeerNodeAddress(), model.offer.getPubKeyRing(), new OfferAvailabilityRequest(model.offer.getId(), model.pubKeyRing, model.getTakersTradePrice()), new SendDirectMessageListener() {

            @Override
            public void onArrived() {
                complete();
            }

            @Override
            public void onFault() {
                model.offer.setState(Offer.State.MAKER_OFFLINE);
            }
        });
    } catch (Throwable t) {
        model.offer.setErrorMessage("An error occurred.\n" + "Error message:\n" + t.getMessage());
        failed(t);
    }
}
Also used : SendDirectMessageListener(bisq.network.p2p.SendDirectMessageListener) OfferAvailabilityRequest(bisq.core.offer.messages.OfferAvailabilityRequest)

Aggregations

SendDirectMessageListener (bisq.network.p2p.SendDirectMessageListener)3 BtcWalletService (bisq.core.btc.wallet.BtcWalletService)2 OfferAvailabilityRequest (bisq.core.offer.messages.OfferAvailabilityRequest)2 User (bisq.core.user.User)2 NodeAddress (bisq.network.p2p.NodeAddress)2 Timer (bisq.common.Timer)1 UserThread (bisq.common.UserThread)1 Log (bisq.common.app.Log)1 KeyRing (bisq.common.crypto.KeyRing)1 ErrorMessageHandler (bisq.common.handlers.ErrorMessageHandler)1 ResultHandler (bisq.common.handlers.ResultHandler)1 NetworkEnvelope (bisq.common.proto.network.NetworkEnvelope)1 PersistedDataHost (bisq.common.proto.persistable.PersistedDataHost)1 PersistenceProtoResolver (bisq.common.proto.persistable.PersistenceProtoResolver)1 Storage (bisq.common.storage.Storage)1 AddressEntry (bisq.core.btc.AddressEntry)1 BsqWalletService (bisq.core.btc.wallet.BsqWalletService)1 TradeWalletService (bisq.core.btc.wallet.TradeWalletService)1 TradePriceOutOfToleranceException (bisq.core.exceptions.TradePriceOutOfToleranceException)1 OfferAvailabilityResponse (bisq.core.offer.messages.OfferAvailabilityResponse)1