mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-01 16:53:52 +02:00
wallet: skip available coins fetch if "other inputs" are disallowed
no need to waste resources calculating the wallet available coins if they are not going to be used. The 'm_allow_other_inputs=true` default value change is to correct an ugly misleading behavior: The tx creation process was having a workaround patch to automatically fall back to select coins from the wallet if `m_allow_other_inputs=false` (previous default value) and no manual inputs were selected. This could be seen in master in flows like `sendtoaddress`, `sendmany` and even the GUI, where the `m_allow_other_inputs` value isn't customized and the wallet still selects and adds coins to the tx internally.
This commit is contained in:
@@ -289,7 +289,9 @@ bool SendCoinsDialog::PrepareSendText(QString& question_string, QString& informa
|
||||
|
||||
updateCoinControlState();
|
||||
|
||||
prepareStatus = model->prepareTransaction(*m_current_transaction, *m_coin_control);
|
||||
CCoinControl coin_control = *m_coin_control;
|
||||
coin_control.m_allow_other_inputs = !coin_control.HasSelected(); // future, could introduce a checkbox to customize this value.
|
||||
prepareStatus = model->prepareTransaction(*m_current_transaction, coin_control);
|
||||
|
||||
// process prepareStatus and on error generate message shown to user
|
||||
processSendCoinsReturn(prepareStatus,
|
||||
|
||||
@@ -37,7 +37,7 @@ public:
|
||||
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;
|
||||
bool m_allow_other_inputs = 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
|
||||
|
||||
@@ -579,7 +579,7 @@ std::optional<SelectionResult> SelectCoins(const CWallet& wallet, CoinsResult& a
|
||||
}
|
||||
|
||||
// coin control -> return all selected outputs (we want all selected to go into the transaction for sure)
|
||||
if (coin_control.HasSelected() && !coin_control.m_allow_other_inputs) {
|
||||
if (!coin_control.m_allow_other_inputs) {
|
||||
SelectionResult result(nTargetValue, SelectionAlgorithm::MANUAL);
|
||||
result.AddInput(preset_inputs);
|
||||
|
||||
@@ -893,14 +893,18 @@ static util::Result<CreatedTransactionResult> CreateTransactionInternal(
|
||||
const CAmount not_input_fees = coin_selection_params.m_effective_feerate.GetFee(coin_selection_params.tx_noinputs_size);
|
||||
CAmount selection_target = recipients_sum + not_input_fees;
|
||||
|
||||
// Get available coins
|
||||
auto available_coins = AvailableCoins(wallet,
|
||||
&coin_control,
|
||||
coin_selection_params.m_effective_feerate,
|
||||
1, /*nMinimumAmount*/
|
||||
MAX_MONEY, /*nMaximumAmount*/
|
||||
MAX_MONEY, /*nMinimumSumAmount*/
|
||||
0); /*nMaximumCount*/
|
||||
// Fetch wallet available coins if "other inputs" are
|
||||
// allowed (coins automatically selected by the wallet)
|
||||
CoinsResult available_coins;
|
||||
if (coin_control.m_allow_other_inputs) {
|
||||
available_coins = AvailableCoins(wallet,
|
||||
&coin_control,
|
||||
coin_selection_params.m_effective_feerate,
|
||||
1, /*nMinimumAmount*/
|
||||
MAX_MONEY, /*nMaximumAmount*/
|
||||
MAX_MONEY, /*nMinimumSumAmount*/
|
||||
0); /*nMaximumCount*/
|
||||
}
|
||||
|
||||
// Choose coins to use
|
||||
std::optional<SelectionResult> result = SelectCoins(wallet, available_coins, /*nTargetValue=*/selection_target, coin_control, coin_selection_params);
|
||||
|
||||
Reference in New Issue
Block a user