// Copyright (c) 2011-2016 The Cryptonote developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #pragma once #include "CryptoNoteCore/Account.h" #include "CryptoNoteCore/Currency.h" #include "INode.h" #include "WalletLegacy/WalletSendTransactionContext.h" #include "WalletLegacy/WalletUserTransactionsCache.h" #include "WalletLegacy/WalletUnconfirmedTransactions.h" #include "WalletLegacy/WalletRequest.h" #include "ITransfersContainer.h" namespace CryptoNote { class WalletTransactionSender { public: WalletTransactionSender(const Currency& currency, WalletUserTransactionsCache& transactionsCache, AccountKeys keys, ITransfersContainer& transfersContainer); void stop(); std::shared_ptr makeSendRequest(TransactionId& transactionId, std::deque>& events, const std::vector& transfers, uint64_t fee, const std::string& extra = "", uint64_t mixIn = 0, uint64_t unlockTimestamp = 0); private: std::shared_ptr makeGetRandomOutsRequest(std::shared_ptr context); std::shared_ptr doSendTransaction(std::shared_ptr context, std::deque>& events); void prepareInputs(const std::list& selectedTransfers, std::vector& outs, std::vector& sources, uint64_t mixIn); void splitDestinations(TransferId firstTransferId, size_t transfersCount, const TransactionDestinationEntry& changeDts, const TxDustPolicy& dustPolicy, std::vector& splittedDests); void digitSplitStrategy(TransferId firstTransferId, size_t transfersCount, const TransactionDestinationEntry& change_dst, uint64_t dust_threshold, std::vector& splitted_dsts, uint64_t& dust); void sendTransactionRandomOutsByAmount(std::shared_ptr context, std::deque>& events, boost::optional >& nextRequest, std::error_code ec); void relayTransactionCallback(std::shared_ptr context, std::deque>& events, boost::optional >& nextRequest, std::error_code ec); void notifyBalanceChanged(std::deque>& events); void validateTransfersAddresses(const std::vector& transfers); bool validateDestinationAddress(const std::string& address); uint64_t selectTransfersToSend(uint64_t neededMoney, bool addDust, uint64_t dust, std::list& selectedTransfers); const Currency& m_currency; AccountKeys m_keys; WalletUserTransactionsCache& m_transactionsCache; uint64_t m_upperTransactionSizeLimit; bool m_isStoping; ITransfersContainer& m_transferDetails; }; } /* namespace CryptoNote */