Skip to content

Commit bdd0c29

Browse files
committed
wallet: Move discard feerate fetching to CreateTransaction
Instead of fetching the discard feerate for each SelectCoinsMinConf iteration, fetch and cache it once during CreateTransaction so that it is shared for each SelectCoinsMinConf through coin_selection_params.m_discard_feerate. Does not change behavior.
1 parent 448d04b commit bdd0c29

File tree

4 files changed

+13
-10
lines changed

4 files changed

+13
-10
lines changed

src/bench/coin_selection.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ static void CoinSelection(benchmark::Bench& bench)
5151
const CoinEligibilityFilter filter_standard(1, 6, 0);
5252
const CoinSelectionParams coin_selection_params(/* use_bnb= */ true, /* change_output_size= */ 34,
5353
/* change_spend_size= */ 148, /* effective_fee= */ CFeeRate(0),
54-
/* long_term_feerate= */ CFeeRate(0),
54+
/* long_term_feerate= */ CFeeRate(0), /* discard_feerate= */ CFeeRate(0),
5555
/* tx_no_inputs_size= */ 0, /* avoid_partial= */ false);
5656
bench.run([&] {
5757
std::set<CInputCoin> setCoinsRet;

src/wallet/test/coinselector_tests.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ CoinEligibilityFilter filter_confirmed(1, 1, 0);
3737
CoinEligibilityFilter filter_standard_extra(6, 6, 0);
3838
CoinSelectionParams coin_selection_params(/* use_bnb= */ false, /* change_output_size= */ 0,
3939
/* change_spend_size= */ 0, /* effective_fee= */ CFeeRate(0),
40-
/* long_term_feerate= */ CFeeRate(0),
40+
/* long_term_feerate= */ CFeeRate(0), /* discard_feerate= */ CFeeRate(0),
4141
/* tx_no_inputs_size= */ 0, /* avoid_partial= */ false);
4242

4343
static void add_coin(const CAmount& nValue, int nInput, std::vector<CInputCoin>& set)
@@ -274,7 +274,7 @@ BOOST_AUTO_TEST_CASE(bnb_search_test)
274274
// Make sure that effective value is working in SelectCoinsMinConf when BnB is used
275275
CoinSelectionParams coin_selection_params_bnb(/* use_bnb= */ true, /* change_output_size= */ 0,
276276
/* change_spend_size= */ 0, /* effective_fee= */ CFeeRate(3000),
277-
/* long_term_feerate= */ CFeeRate(1000),
277+
/* long_term_feerate= */ CFeeRate(1000), /* discard_feerate= */ CFeeRate(1000),
278278
/* tx_no_inputs_size= */ 0, /* avoid_partial= */ false);
279279
CoinSet setCoinsRet;
280280
CAmount nValueRet;
@@ -647,11 +647,11 @@ BOOST_AUTO_TEST_CASE(SelectCoins_test)
647647
// Perform selection
648648
CoinSelectionParams coin_selection_params_knapsack(/* use_bnb= */ false, /* change_output_size= */ 34,
649649
/* change_spend_size= */ 148, /* effective_fee= */ CFeeRate(0),
650-
/* long_term_feerate= */ CFeeRate(0),
650+
/* long_term_feerate= */ CFeeRate(0), /* discard_feerate= */ CFeeRate(0),
651651
/* tx_no_inputs_size= */ 0, /* avoid_partial= */ false);
652652
CoinSelectionParams coin_selection_params_bnb(/* use_bnb= */ true, /* change_output_size= */ 34,
653653
/* change_spend_size= */ 148, /* effective_fee= */ CFeeRate(0),
654-
/* long_term_feerate= */ CFeeRate(0),
654+
/* long_term_feerate= */ CFeeRate(0), /* discard_feerate= */ CFeeRate(0),
655655
/* tx_no_inputs_size= */ 0, /* avoid_partial= */ false);
656656
CoinSet out_set;
657657
CAmount out_value = 0;

src/wallet/wallet.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2374,7 +2374,7 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const CoinEligibil
23742374
std::vector<OutputGroup> groups = GroupOutputs(coins, !coin_selection_params.m_avoid_partial_spends, effective_feerate, coin_selection_params.m_long_term_feerate, eligibility_filter, true /* positive_only */);
23752375

23762376
// Calculate cost of change
2377-
CAmount cost_of_change = GetDiscardRate(*this).GetFee(coin_selection_params.change_spend_size) + coin_selection_params.effective_fee.GetFee(coin_selection_params.change_output_size);
2377+
CAmount cost_of_change = coin_selection_params.m_discard_feerate.GetFee(coin_selection_params.change_spend_size) + coin_selection_params.effective_fee.GetFee(coin_selection_params.change_output_size);
23782378

23792379
// Calculate the fees for things that aren't inputs
23802380
CAmount not_input_fees = coin_selection_params.effective_fee.GetFee(coin_selection_params.tx_noinputs_size);
@@ -2798,7 +2798,8 @@ bool CWallet::CreateTransactionInternal(
27982798
CTxOut change_prototype_txout(0, scriptChange);
27992799
coin_selection_params.change_output_size = GetSerializeSize(change_prototype_txout);
28002800

2801-
CFeeRate discard_rate = GetDiscardRate(*this);
2801+
// Set discard feerate
2802+
coin_selection_params.m_discard_feerate = GetDiscardRate(*this);
28022803

28032804
// Get the fee rate to use effective values in coin selection
28042805
coin_selection_params.effective_fee = GetMinimumFeeRate(*this, coin_control, &feeCalc);
@@ -2917,7 +2918,7 @@ bool CWallet::CreateTransactionInternal(
29172918
// Never create dust outputs; if we would, just
29182919
// add the dust to the fee.
29192920
// The nChange when BnB is used is always going to go to fees.
2920-
if (IsDust(newTxOut, discard_rate) || bnb_used)
2921+
if (IsDust(newTxOut, coin_selection_params.m_discard_feerate) || bnb_used)
29212922
{
29222923
nChangePosInOut = -1;
29232924
nFeeRet += nChange;
@@ -2969,7 +2970,7 @@ bool CWallet::CreateTransactionInternal(
29692970
if (nChangePosInOut == -1 && nSubtractFeeFromAmount == 0 && pick_new_inputs) {
29702971
unsigned int tx_size_with_change = nBytes + coin_selection_params.change_output_size + 2; // Add 2 as a buffer in case increasing # of outputs changes compact size
29712972
CAmount fee_needed_with_change = coin_selection_params.effective_fee.GetFee(tx_size_with_change);
2972-
CAmount minimum_value_for_change = GetDustThreshold(change_prototype_txout, discard_rate);
2973+
CAmount minimum_value_for_change = GetDustThreshold(change_prototype_txout, coin_selection_params.m_discard_feerate);
29732974
if (nFeeRet >= fee_needed_with_change + minimum_value_for_change) {
29742975
pick_new_inputs = false;
29752976
nFeeRet = fee_needed_with_change;

src/wallet/wallet.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,18 +608,20 @@ struct CoinSelectionParams
608608
size_t change_spend_size = 0;
609609
CFeeRate effective_fee = CFeeRate(0);
610610
CFeeRate m_long_term_feerate;
611+
CFeeRate m_discard_feerate;
611612
size_t tx_noinputs_size = 0;
612613
//! Indicate that we are subtracting the fee from outputs
613614
bool m_subtract_fee_outputs = false;
614615
bool m_avoid_partial_spends = false;
615616

616617
CoinSelectionParams(bool use_bnb, size_t change_output_size, size_t change_spend_size, CFeeRate effective_fee,
617-
CFeeRate long_term_feerate, size_t tx_noinputs_size, bool avoid_partial) :
618+
CFeeRate long_term_feerate, CFeeRate discard_feerate, size_t tx_noinputs_size, bool avoid_partial) :
618619
use_bnb(use_bnb),
619620
change_output_size(change_output_size),
620621
change_spend_size(change_spend_size),
621622
effective_fee(effective_fee),
622623
m_long_term_feerate(long_term_feerate),
624+
m_discard_feerate(discard_feerate),
623625
tx_noinputs_size(tx_noinputs_size),
624626
m_avoid_partial_spends(avoid_partial)
625627
{}

0 commit comments

Comments
 (0)