git / moonbite-core / src/wallet/txassembler.h · raw
#pragma once#include <mweb/mweb_transact.h>#include <policy/fees.h>#include <script/standard.h>#include <wallet/coincontrol.h>#include <wallet/reserve.h>#include <wallet/wallet.h>#include <util/translation.h>struct InProcessTx { CMutableTransaction tx{}; std::vector<CRecipient> recipients; CAmount recipient_amount; std::unique_ptr<ReserveDestination> reserve_dest{nullptr}; DestinationAddr change_addr{}; int change_position{-1}; // MW: TODO - Change this to OutputIndex int bytes{0}; CCoinControl coin_control; CoinSelectionParams coin_selection_params{}; std::vector<COutputCoin> available_coins{}; std::set<CInputCoin> selected_coins{}; CAmount value_selected{0}; bool bnb_used{false}; FeeCalculation fee_calc{}; CAmount fee_needed{0}; CAmount total_fee{0}; unsigned int subtract_fee_from_amount{0}; // MWEB uint64_t mweb_weight{0}; MWEB::TxType mweb_type{MWEB::TxType::LTC_TO_LTC}; bool change_on_mweb{false}; CAmount mweb_fee{0}; // Portion of the fee that will be paid by an MWEB kernel};class CreateTxError : public std::runtime_error{public: CreateTxError(const bilingual_str& error) : std::runtime_error(error.original), m_error(error) {} ~CreateTxError() = default; const bilingual_str& GetError() const { return m_error; }private: bilingual_str m_error;};struct AssembledTx { CTransactionRef tx; CAmount fee; FeeCalculation fee_calc; // MW: TODO - Really just needs FeeReason int change_position;};class TxAssembler{ CWallet& m_wallet;public: explicit TxAssembler(CWallet& wallet) : m_wallet(wallet) {} Optional<AssembledTx> AssembleTx( const std::vector<CRecipient>& recipients, const CCoinControl& coin_control, const int nChangePosRequest, const bool sign, bilingual_str& errorOut );private: AssembledTx CreateTransaction( const std::vector<CRecipient>& recipients, const CCoinControl& coin_control, const int nChangePosRequest, const bool sign ); void CreateTransaction_Locked( InProcessTx& new_tx, const int nChangePosRequest, const bool sign ); void VerifyRecipients(const std::vector<CRecipient>& recipients); // Adds the output to 'txNew' for each non-MWEB recipient. // If the recipient is marked as 'fSubtractFeeFromAmount', 'nFeeRet' will be deducted from the amount. // // Returns false and populates the 'error' message if an error occurs. // Currently, this will only occur when a recipient amount is considered dust. void AddRecipientOutputs(InProcessTx& new_tx); void AddChangeOutput(InProcessTx& new_tx, const CAmount& nChange) const; void AddTxInputs(InProcessTx& new_tx) const; uint32_t GetLocktimeForNewTransaction() const; bool IsCurrentForAntiFeeSniping(interfaces::Chain& chain, const uint256& block_hash) const; // // Coin Selection // void InitCoinSelectionParams(InProcessTx& new_tx) const; bool AttemptCoinSelection( InProcessTx& new_tx, const CAmount& nTargetValue ) const; bool SelectCoins( InProcessTx& new_tx, const CAmount& nTargetValue, CoinSelectionParams& coin_selection_params ) const; // Reduce fee to only the needed amount if possible. This // prevents potential overpayment in fees if the coins // selected to meet nFeeNeeded result in a transaction that // requires less fee than the prior iteration. void ReduceFee(InProcessTx& new_tx) const; int64_t CalculateMaximumTxSize(const InProcessTx& new_tx) const; void UpdateChangeAddress(InProcessTx& new_tx) const; OutputType GetChangeType(const InProcessTx& new_tx) const;};