Bitcoin Core  31.0.0
P2P Digital Currency
spend.h
Go to the documentation of this file.
1 // Copyright (c) 2021-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_WALLET_SPEND_H
6 #define BITCOIN_WALLET_SPEND_H
7 
8 #include <consensus/amount.h>
10 #include <util/result.h>
11 #include <wallet/coinselection.h>
12 #include <wallet/transaction.h>
13 #include <wallet/types.h>
14 #include <wallet/wallet.h>
15 
16 #include <map>
17 #include <memory>
18 #include <optional>
19 #include <set>
20 #include <unordered_set>
21 #include <vector>
22 
23 namespace wallet {
26 int CalculateMaximumSignedInputSize(const CTxOut& txout, const CWallet* pwallet, const CCoinControl* coin_control);
27 int CalculateMaximumSignedInputSize(const CTxOut& txout, COutPoint outpoint, const SigningProvider* pwallet, bool can_grind_r, const CCoinControl* coin_control);
28 struct TxSize {
29  int64_t vsize{-1};
30  int64_t weight{-1};
31 };
32 
35 TxSize CalculateMaximumSignedTxSize(const CTransaction& tx, const CWallet* wallet, const std::vector<CTxOut>& txouts, const CCoinControl* coin_control = nullptr);
36 TxSize CalculateMaximumSignedTxSize(const CTransaction& tx, const CWallet* wallet, const CCoinControl* coin_control = nullptr) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet);
37 
46 struct CoinsResult {
47  std::map<OutputType, std::vector<COutput>> coins;
48 
50  std::vector<COutput> All() const;
51 
54  size_t Size() const;
56  size_t TypesCount() const { return coins.size(); }
57  void Clear();
58  void Erase(const std::unordered_set<COutPoint, SaltedOutpointHasher>& coins_to_remove);
59  void Shuffle(FastRandomContext& rng_fast);
60  void Add(OutputType type, const COutput& out);
61 
62  CAmount GetTotalAmount() const { return total_amount; }
63  std::optional<CAmount> GetEffectiveTotalAmount() const { return total_effective_amount; }
64  // Returns the appropriate total based on whether fees are being subtracted from outputs
65  std::optional<CAmount> GetAppropriateTotal(bool subtract_fee_outputs) const {
66  return subtract_fee_outputs ? total_amount : total_effective_amount;
67  }
68 
69 private:
71  CAmount total_amount{0};
73  std::optional<CAmount> total_effective_amount;
74 };
75 
77  // Outputs below the minimum amount will not get selected
79  // Outputs above the maximum amount will not get selected
81  // Return outputs until the minimum sum amount is covered
83  // Maximum number of outputs that can be returned
84  uint64_t max_count{0};
85  // By default, do not include immature coinbase outputs
87  // By default, skip locked UTXOs
88  bool skip_locked{true};
89  // When true, filter unconfirmed coins by whether their
90  // version's TRUCness matches what is set by CCoinControl.
92 };
93 
97 CoinsResult AvailableCoins(const CWallet& wallet,
98  const CCoinControl* coinControl = nullptr,
99  std::optional<CFeeRate> feerate = std::nullopt,
100  const CoinFilterParams& params = {}) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet);
101 
105 const CTxOut& FindNonChangeParentOutput(const CWallet& wallet, const COutPoint& outpoint) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet);
106 
110 std::map<CTxDestination, std::vector<COutput>> ListCoins(const CWallet& wallet) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet);
111 
115 };
116 
121  const CoinsResult& coins,
122  const CoinSelectionParams& coin_sel_params,
123  const std::vector<SelectionFilter>& filters);
124 
141 util::Result<SelectionResult> AttemptSelection(interfaces::Chain& chain, const CAmount& nTargetValue, OutputGroupTypeMap& groups,
142  const CoinSelectionParams& coin_selection_params, bool allow_mixed_output_types);
143 
158 util::Result<SelectionResult> ChooseSelectionResult(interfaces::Chain& chain, const CAmount& nTargetValue, Groups& groups, const CoinSelectionParams& coin_selection_params);
159 
164 util::Result<CoinsResult> FetchSelectedInputs(const CWallet& wallet, const CCoinControl& coin_control,
165  const CoinSelectionParams& coin_selection_params) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet);
166 
179 util::Result<SelectionResult> AutomaticCoinSelection(const CWallet& wallet, CoinsResult& available_coins, const CAmount& nTargetValue,
180  const CoinSelectionParams& coin_selection_params) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet);
181 
186 util::Result<SelectionResult> SelectCoins(const CWallet& wallet, CoinsResult& available_coins, const CoinsResult& pre_set_inputs,
187  const CAmount& nTargetValue, const CCoinControl& coin_control,
188  const CoinSelectionParams& coin_selection_params) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet);
189 
194 void DiscourageFeeSniping(CMutableTransaction& tx, FastRandomContext& rng_fast, interfaces::Chain& chain, const uint256& block_hash, int block_height);
195 
201 util::Result<CreatedTransactionResult> CreateTransaction(CWallet& wallet, const std::vector<CRecipient>& vecSend, std::optional<unsigned int> change_pos, const CCoinControl& coin_control, bool sign = true);
202 
207 util::Result<CreatedTransactionResult> FundTransaction(CWallet& wallet, const CMutableTransaction& tx, const std::vector<CRecipient>& recipients, std::optional<unsigned int> change_pos, bool lockUnspents, CCoinControl);
208 } // namespace wallet
209 
210 #endif // BITCOIN_WALLET_SPEND_H
util::Result< SelectionResult > SelectCoins(const CWallet &wallet, CoinsResult &available_coins, const CoinsResult &pre_set_inputs, const CAmount &nTargetValue, const CCoinControl &coin_control, const CoinSelectionParams &coin_selection_params)
Select all coins from coin_control, and if coin_control &#39;m_allow_other_inputs=true&#39;, call &#39;AutomaticCoinSelection&#39; to select a set of coins such that nTargetValue - pre_set_inputs.total_amount is met.
Definition: spend.cpp:814
util::Result< CoinsResult > FetchSelectedInputs(const CWallet &wallet, const CCoinControl &coin_control, const CoinSelectionParams &coin_selection_params)
Fetch and validate coin control selected inputs.
Definition: spend.cpp:269
CoinEligibilityFilter filter
Definition: spend.h:113
std::optional< CAmount > total_effective_amount
Sum of all available coins effective value (each output value minus fees required to spend it) ...
Definition: spend.h:73
bool check_version_trucness
Definition: spend.h:91
const CTxOut & FindNonChangeParentOutput(const CWallet &wallet, const COutPoint &outpoint)
Find non-change parent output.
Definition: spend.cpp:528
util::Result< SelectionResult > ChooseSelectionResult(interfaces::Chain &chain, const CAmount &nTargetValue, Groups &groups, const CoinSelectionParams &coin_selection_params)
Attempt to find a valid input set that meets the provided eligibility filter and target.
Definition: spend.cpp:729
int64_t vsize
Definition: spend.h:29
std::optional< CAmount > GetAppropriateTotal(bool subtract_fee_outputs) const
Definition: spend.h:65
OutputType
Definition: outputtype.h:18
bool allow_mixed_output_types
Definition: spend.h:114
std::map< OutputType, std::vector< COutput > > coins
Definition: spend.h:47
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
COutputs available for spending, stored by OutputType.
Definition: spend.h:46
bool include_immature_coinbase
Definition: spend.h:86
util::Result< CreatedTransactionResult > CreateTransaction(CWallet &wallet, const std::vector< CRecipient > &vecSend, std::optional< unsigned int > change_pos, const CCoinControl &coin_control, bool sign)
Create a new transaction paying the recipients with a set of coins selected by SelectCoins(); Also cr...
Definition: spend.cpp:1440
int CalculateMaximumSignedInputSize(const CTxOut &txout, const COutPoint outpoint, const SigningProvider *provider, bool can_grind_r, const CCoinControl *coin_control)
Definition: spend.cpp:92
Fast randomness source.
Definition: random.h:385
uint64_t max_count
Definition: spend.h:84
An output of a transaction.
Definition: transaction.h:139
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:28
is a home for public enum and struct type definitions that are used by internally by wallet code...
TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector< CTxOut > &txouts, const CCoinControl *coin_control)
Calculate the size of the transaction using CoinControl to determine whether to expect signature grin...
Definition: spend.cpp:144
util::Result< SelectionResult > AutomaticCoinSelection(const CWallet &wallet, CoinsResult &available_coins, const CAmount &value_to_select, const CoinSelectionParams &coin_selection_params)
Select a set of coins such that nTargetValue is met; never select unconfirmed coins if they are not o...
Definition: spend.cpp:872
int64_t weight
Definition: spend.h:30
util::Result< SelectionResult > AttemptSelection(interfaces::Chain &chain, const CAmount &nTargetValue, OutputGroupTypeMap &groups, const CoinSelectionParams &coin_selection_params, bool allow_mixed_output_types)
Attempt to find a valid input set that preserves privacy by not mixing OutputTypes.
Definition: spend.cpp:702
Parameters for filtering which OutputGroups we may use in coin selection.
static int sign(const secp256k1_context *ctx, struct signer_secrets *signer_secrets, struct signer *signer, const secp256k1_musig_keyagg_cache *cache, const unsigned char *msg32, unsigned char *sig64)
Definition: musig.c:106
std::optional< CAmount > GetEffectiveTotalAmount() const
Definition: spend.h:63
256-bit opaque blob.
Definition: uint256.h:195
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:51
An interface to be implemented by keystores that support signing.
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
Definition: chain.h:117
CreatedTransactionResult FundTransaction(CWallet &wallet, const CMutableTransaction &tx, const std::vector< CRecipient > &recipients, const UniValue &options, CCoinControl &coinControl, bool override_min_fee)
Definition: spend.cpp:470
CoinsResult AvailableCoins(const CWallet &wallet, const CCoinControl *coinControl, std::optional< CFeeRate > feerate, const CoinFilterParams &params)
Populate the CoinsResult struct with vectors of available COutputs, organized by OutputType.
Definition: spend.cpp:320
void DiscourageFeeSniping(CMutableTransaction &tx, FastRandomContext &rng_fast, interfaces::Chain &chain, const uint256 &block_hash, int block_height)
Set a height-based locktime for new transactions (uses the height of the current chain tip unless we ...
Definition: spend.cpp:997
static constexpr CAmount MAX_MONEY
No amount larger than this (in satoshi) is valid.
Definition: amount.h:26
size_t TypesCount() const
Return how many different output types this struct stores.
Definition: spend.h:56
A mutable version of CTransaction.
Definition: transaction.h:357
The basic transaction that is broadcasted on the network and contained in blocks. ...
Definition: transaction.h:280
CAmount GetTotalAmount() const
Definition: spend.h:62
A UTXO under consideration for use in funding a new transaction.
Definition: coinselection.h:28
CAmount min_sum_amount
Definition: spend.h:82
FilteredOutputGroups GroupOutputs(const CWallet &wallet, const CoinsResult &coins, const CoinSelectionParams &coin_sel_params, const std::vector< SelectionFilter > &filters, std::vector< OutputGroup > &ret_discarded_groups)
Definition: spend.cpp:572
std::map< CTxDestination, std::vector< COutput > > ListCoins(const CWallet &wallet)
Return list of available coins and locked coins grouped by non-change output address.
Definition: spend.cpp:548
std::map< CoinEligibilityFilter, OutputGroupTypeMap > FilteredOutputGroups