@@ -575,11 +575,11 @@ std::optional<SelectionResult> SelectCoins(const CWallet& wallet, CoinsResult& a
575
575
// Deduct preset inputs amount from the search target
576
576
CAmount selection_target = nTargetValue - pre_set_inputs.total_amount ;
577
577
578
- // If automatic coin selection was disabled, we just want to return the preset inputs result
579
- if (!coin_control.m_allow_other_inputs ) {
580
- // 'selection_target' is computed on `PreSelectedInputs::Insert` which decides whether to use the effective value
581
- // or the raw output value based on the 'subtract_fee_outputs' flag.
582
- if (selection_target > 0 ) return std::nullopt;
578
+ // Return if automatic coin selection is disabled, and we don't cover the selection target
579
+ if (!coin_control.m_allow_other_inputs && selection_target > 0 ) return std::nullopt;
580
+
581
+ // Return if we can cover the target only with the preset inputs
582
+ if (selection_target <= 0 ) {
583
583
SelectionResult result (nTargetValue, SelectionAlgorithm::MANUAL);
584
584
result.AddInputs (pre_set_inputs.coins , coin_selection_params.m_subtract_fee_outputs );
585
585
result.ComputeAndSetWaste (coin_selection_params.min_viable_change , coin_selection_params.m_cost_of_change , coin_selection_params.m_change_fee );
@@ -590,12 +590,14 @@ std::optional<SelectionResult> SelectCoins(const CWallet& wallet, CoinsResult& a
590
590
auto op_selection_result = AutomaticCoinSelection (wallet, available_coins, selection_target, coin_control, coin_selection_params);
591
591
if (!op_selection_result) return op_selection_result;
592
592
593
- // Add preset inputs to the automatic coin selection result
594
- SelectionResult preselected (pre_set_inputs.total_amount , SelectionAlgorithm::MANUAL);
595
- preselected.AddInputs (pre_set_inputs.coins , coin_selection_params.m_subtract_fee_outputs );
596
- op_selection_result->Merge (preselected);
597
- if (op_selection_result->GetAlgo () == SelectionAlgorithm::MANUAL) {
598
- op_selection_result->ComputeAndSetWaste (coin_selection_params.min_viable_change , coin_selection_params.m_cost_of_change , coin_selection_params.m_change_fee );
593
+ // If needed, add preset inputs to the automatic coin selection result
594
+ if (!pre_set_inputs.coins .empty ()) {
595
+ SelectionResult preselected (pre_set_inputs.total_amount , SelectionAlgorithm::MANUAL);
596
+ preselected.AddInputs (pre_set_inputs.coins , coin_selection_params.m_subtract_fee_outputs );
597
+ op_selection_result->Merge (preselected);
598
+ op_selection_result->ComputeAndSetWaste (coin_selection_params.min_viable_change ,
599
+ coin_selection_params.m_cost_of_change ,
600
+ coin_selection_params.m_change_fee );
599
601
}
600
602
return op_selection_result;
601
603
}
@@ -622,9 +624,6 @@ std::optional<SelectionResult> AutomaticCoinSelection(const CWallet& wallet, Coi
622
624
// transaction at a target feerate. If an attempt fails, more attempts may be made using a more
623
625
// permissive CoinEligibilityFilter.
624
626
std::optional<SelectionResult> res = [&] {
625
- // Pre-selected inputs already cover the target amount.
626
- if (value_to_select <= 0 ) return std::make_optional (SelectionResult (value_to_select, SelectionAlgorithm::MANUAL));
627
-
628
627
// If possible, fund the transaction with confirmed UTXOs only. Prefer at least six
629
628
// confirmations on outputs received from other wallets and only spend confirmed change.
630
629
if (auto r1{AttemptSelection (wallet, value_to_select, CoinEligibilityFilter (1 , 6 , 0 ), available_coins, coin_selection_params, /* allow_mixed_output_types=*/ false )}) return r1;
0 commit comments