Skip to content

Commit 448d04b

Browse files
committed
wallet: Move long term feerate setting to CreateTransaction
Instead of setting the long term feerate for each SelectCoinsMinConf iteration, set it once during CreateTransaction and let it be shared with each SelectCoinsMinConf through coin_selection_params.m_long_term_feerate. Does not change behavior.
1 parent e2f429e commit 448d04b

File tree

4 files changed

+30
-13
lines changed

4 files changed

+30
-13
lines changed

src/bench/coin_selection.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ static void CoinSelection(benchmark::Bench& bench)
4949
}
5050

5151
const CoinEligibilityFilter filter_standard(1, 6, 0);
52-
const CoinSelectionParams coin_selection_params(true, 34, 148, CFeeRate(0), 0, false);
52+
const CoinSelectionParams coin_selection_params(/* use_bnb= */ true, /* change_output_size= */ 34,
53+
/* change_spend_size= */ 148, /* effective_fee= */ CFeeRate(0),
54+
/* long_term_feerate= */ CFeeRate(0),
55+
/* tx_no_inputs_size= */ 0, /* avoid_partial= */ false);
5356
bench.run([&] {
5457
std::set<CInputCoin> setCoinsRet;
5558
CAmount nValueRet;

src/wallet/test/coinselector_tests.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ static CAmount balance = 0;
3535
CoinEligibilityFilter filter_standard(1, 6, 0);
3636
CoinEligibilityFilter filter_confirmed(1, 1, 0);
3737
CoinEligibilityFilter filter_standard_extra(6, 6, 0);
38-
CoinSelectionParams coin_selection_params(false, 0, 0, CFeeRate(0), 0, false);
38+
CoinSelectionParams coin_selection_params(/* use_bnb= */ false, /* change_output_size= */ 0,
39+
/* change_spend_size= */ 0, /* effective_fee= */ CFeeRate(0),
40+
/* long_term_feerate= */ CFeeRate(0),
41+
/* tx_no_inputs_size= */ 0, /* avoid_partial= */ false);
3942

4043
static void add_coin(const CAmount& nValue, int nInput, std::vector<CInputCoin>& set)
4144
{
@@ -269,7 +272,10 @@ BOOST_AUTO_TEST_CASE(bnb_search_test)
269272
}
270273

271274
// Make sure that effective value is working in SelectCoinsMinConf when BnB is used
272-
CoinSelectionParams coin_selection_params_bnb(true, 0, 0, CFeeRate(3000), 0, false);
275+
CoinSelectionParams coin_selection_params_bnb(/* use_bnb= */ true, /* change_output_size= */ 0,
276+
/* change_spend_size= */ 0, /* effective_fee= */ CFeeRate(3000),
277+
/* long_term_feerate= */ CFeeRate(1000),
278+
/* tx_no_inputs_size= */ 0, /* avoid_partial= */ false);
273279
CoinSet setCoinsRet;
274280
CAmount nValueRet;
275281
bool bnb_used;
@@ -639,8 +645,14 @@ BOOST_AUTO_TEST_CASE(SelectCoins_test)
639645
CAmount target = rand.randrange(balance - 1000) + 1000;
640646

641647
// Perform selection
642-
CoinSelectionParams coin_selection_params_knapsack(false, 34, 148, CFeeRate(0), 0, false);
643-
CoinSelectionParams coin_selection_params_bnb(true, 34, 148, CFeeRate(0), 0, false);
648+
CoinSelectionParams coin_selection_params_knapsack(/* use_bnb= */ false, /* change_output_size= */ 34,
649+
/* change_spend_size= */ 148, /* effective_fee= */ CFeeRate(0),
650+
/* long_term_feerate= */ CFeeRate(0),
651+
/* tx_no_inputs_size= */ 0, /* avoid_partial= */ false);
652+
CoinSelectionParams coin_selection_params_bnb(/* use_bnb= */ true, /* change_output_size= */ 34,
653+
/* change_spend_size= */ 148, /* effective_fee= */ CFeeRate(0),
654+
/* long_term_feerate= */ CFeeRate(0),
655+
/* tx_no_inputs_size= */ 0, /* avoid_partial= */ false);
644656
CoinSet out_set;
645657
CAmount out_value = 0;
646658
bool bnb_used = false;

src/wallet/wallet.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2364,20 +2364,14 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const CoinEligibil
23642364
nValueRet = 0;
23652365

23662366
if (coin_selection_params.use_bnb) {
2367-
// Get long term estimate
2368-
FeeCalculation feeCalc;
2369-
CCoinControl temp;
2370-
temp.m_confirm_target = 1008;
2371-
CFeeRate long_term_feerate = GetMinimumFeeRate(*this, temp, &feeCalc);
2372-
23732367
// Get the feerate for effective value.
23742368
// When subtracting the fee from the outputs, we want the effective feerate to be 0
23752369
CFeeRate effective_feerate{0};
23762370
if (!coin_selection_params.m_subtract_fee_outputs) {
23772371
effective_feerate = coin_selection_params.effective_fee;
23782372
}
23792373

2380-
std::vector<OutputGroup> groups = GroupOutputs(coins, !coin_selection_params.m_avoid_partial_spends, effective_feerate, long_term_feerate, eligibility_filter, true /* positive_only */);
2374+
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 */);
23812375

23822376
// Calculate cost of change
23832377
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);
@@ -2820,6 +2814,11 @@ bool CWallet::CreateTransactionInternal(
28202814
return false;
28212815
}
28222816

2817+
// Get long term estimate
2818+
CCoinControl cc_temp;
2819+
cc_temp.m_confirm_target = chain().estimateMaxBlocks();
2820+
coin_selection_params.m_long_term_feerate = GetMinimumFeeRate(*this, cc_temp, nullptr);
2821+
28232822
nFeeRet = 0;
28242823
bool pick_new_inputs = true;
28252824
CAmount nValueIn = 0;

src/wallet/wallet.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,16 +607,19 @@ struct CoinSelectionParams
607607
size_t change_output_size = 0;
608608
size_t change_spend_size = 0;
609609
CFeeRate effective_fee = CFeeRate(0);
610+
CFeeRate m_long_term_feerate;
610611
size_t tx_noinputs_size = 0;
611612
//! Indicate that we are subtracting the fee from outputs
612613
bool m_subtract_fee_outputs = false;
613614
bool m_avoid_partial_spends = false;
614615

615-
CoinSelectionParams(bool use_bnb, size_t change_output_size, size_t change_spend_size, CFeeRate effective_fee, size_t tx_noinputs_size, bool avoid_partial) :
616+
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) :
616618
use_bnb(use_bnb),
617619
change_output_size(change_output_size),
618620
change_spend_size(change_spend_size),
619621
effective_fee(effective_fee),
622+
m_long_term_feerate(long_term_feerate),
620623
tx_noinputs_size(tx_noinputs_size),
621624
m_avoid_partial_spends(avoid_partial)
622625
{}

0 commit comments

Comments
 (0)