forked from bitcoin/bitcoin
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathcoincontrol.h
More file actions
153 lines (141 loc) · 5.43 KB
/
Copy pathcoincontrol.h
File metadata and controls
153 lines (141 loc) · 5.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// Copyright (c) 2011-2021 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_WALLET_COINCONTROL_H
#define BITCOIN_WALLET_COINCONTROL_H
#include <key.h>
#include <policy/feerate.h>
#include <policy/fees.h>
#include <primitives/transaction.h>
#include <script/keyorigin.h>
#include <script/signingprovider.h>
#include <script/standard.h>
#include <algorithm>
#include <map>
#include <optional>
#include <set>
namespace wallet {
enum class CoinType : uint8_t
{
ALL_COINS,
ONLY_FULLY_MIXED,
ONLY_READY_TO_MIX,
ONLY_NONDENOMINATED,
ONLY_MASTERNODE_COLLATERAL, // find masternode outputs including locked ones (use with caution)
ONLY_COINJOIN_COLLATERAL,
// Attributes
MIN_COIN_TYPE = ALL_COINS,
MAX_COIN_TYPE = ONLY_COINJOIN_COLLATERAL,
};
//! Default for -avoidpartialspends
static constexpr bool DEFAULT_AVOIDPARTIALSPENDS = false;
const int DEFAULT_MIN_DEPTH = 0;
const int DEFAULT_MAX_DEPTH = 9999999;
/** Coin Control Features. */
class CCoinControl
{
public:
//! Custom change destination, if not set an address is generated
CTxDestination destChange = CNoDestination();
//! If false, only safe inputs will be used
bool m_include_unsafe_inputs = false;
//! If true, the selection process can add extra unselected inputs from the wallet
//! while requires all selected inputs be used
bool m_allow_other_inputs = false;
//! If false, only include as many inputs as necessary to fulfill a coin selection request. Only usable together with m_allow_other_inputs
bool fRequireAllInputs = true;
//! Includes watch only addresses which are solvable
bool fAllowWatchOnly = false;
//! Override automatic min/max checks on fee, m_feerate must be set if true
bool fOverrideFeeRate = false;
//! Override the wallet's m_pay_tx_fee if set
std::optional<CFeeRate> m_feerate;
//! Override the discard feerate estimation with m_discard_feerate in CreateTransaction if set
std::optional<CFeeRate> m_discard_feerate;
//! Override the default confirmation target if set
std::optional<unsigned int> m_confirm_target;
//! Avoid partial use of funds sent to a given address
bool m_avoid_partial_spends = DEFAULT_AVOIDPARTIALSPENDS;
//! Forbids inclusion of dirty (previously used) addresses
bool m_avoid_address_reuse = false;
//! Fee estimation mode to control arguments to estimateSmartFee
FeeEstimateMode m_fee_mode = FeeEstimateMode::UNSET;
//! Minimum chain depth value for coin availability
int m_min_depth = DEFAULT_MIN_DEPTH;
//! Maximum chain depth value for coin availability
int m_max_depth = DEFAULT_MAX_DEPTH;
//! SigningProvider that has pubkeys and scripts to do spend size estimation for external inputs
FlatSigningProvider m_external_provider;
//! Controls which types of coins are allowed to be used (default: ALL_COINS)
CoinType nCoinType = CoinType::ALL_COINS;
CCoinControl(CoinType coin_type = CoinType::ALL_COINS);
/**
* Returns true if there are pre-selected inputs.
*/
bool HasSelected() const;
/**
* Returns true if the given output is pre-selected.
*/
bool IsSelected(const COutPoint& output) const;
/**
* Returns true if the given output is selected as an external input.
*/
bool IsExternalSelected(const COutPoint& output) const;
/**
* Returns the external output for the given outpoint if it exists.
*/
std::optional<CTxOut> GetExternalOutput(const COutPoint& outpoint) const;
/**
* Lock-in the given output for spending.
* The output will be included in the transaction even if it's not the most optimal choice.
*/
void Select(const COutPoint& output);
/**
* Lock-in the given output as an external input for spending because it is not in the wallet.
* The output will be included in the transaction even if it's not the most optimal choice.
*/
void SelectExternal(const COutPoint& outpoint, const CTxOut& txout);
/**
* Unselects the given output.
*/
void UnSelect(const COutPoint& output);
/**
* Unselects all outputs.
*/
void UnSelectAll();
/**
* List the selected inputs.
*/
std::vector<COutPoint> ListSelected() const;
/**
* Set an input's weight.
*/
void SetInputWeight(const COutPoint& outpoint, int64_t weight);
/**
* Returns true if the input weight is set.
*/
bool HasInputWeight(const COutPoint& outpoint) const;
/**
* Returns the input weight.
*/
int64_t GetInputWeight(const COutPoint& outpoint) const;
// Dash-specific helpers
void UseCoinJoin(bool fUseCoinJoin)
{
nCoinType = fUseCoinJoin ? CoinType::ONLY_FULLY_MIXED : CoinType::ALL_COINS;
}
bool IsUsingCoinJoin() const
{
return nCoinType == CoinType::ONLY_FULLY_MIXED;
}
private:
//! Selected inputs (inputs that will be used, regardless of whether they're optimal or not)
std::set<COutPoint> m_selected_inputs;
//! Map of external inputs to include in the transaction
//! These are not in the wallet, so we need to track them separately
std::map<COutPoint, CTxOut> m_external_txouts;
//! Map of COutPoints to the maximum weight (equals to size) for that input
std::map<COutPoint, int64_t> m_input_weights;
};
} // namespace wallet
#endif // BITCOIN_WALLET_COINCONTROL_H