Skip to content

Commit 61c2265

Browse files
committed
wallet: group AvailableCoins filtering parameters in a single struct
Plus clean callers that use the params default values
1 parent f0f6a35 commit 61c2265

File tree

5 files changed

+44
-50
lines changed

5 files changed

+44
-50
lines changed

src/bench/wallet_create_tx.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,10 @@ static void WalletCreateTx(benchmark::Bench& bench, const OutputType output_type
111111
CAmount target = 0;
112112
if (preset_inputs) {
113113
// Select inputs, each has 49 BTC
114+
wallet::CoinFilterParams filter_coins;
115+
filter_coins.nMaximumCount = preset_inputs->num_of_internal_inputs;
114116
const auto& res = WITH_LOCK(wallet.cs_wallet,
115-
return wallet::AvailableCoins(wallet, nullptr, std::nullopt, 1, MAX_MONEY,
116-
MAX_MONEY, preset_inputs->num_of_internal_inputs));
117+
return wallet::AvailableCoins(wallet, /*coinControl=*/nullptr, /*feerate=*/std::nullopt, filter_coins));
117118
for (int i=0; i < preset_inputs->num_of_internal_inputs; i++) {
118119
const auto& coin{res.coins.at(output_type)[i]};
119120
target += coin.txout.nValue;

src/wallet/rpc/coins.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -591,11 +591,8 @@ RPCHelpMan listunspent()
591591
include_unsafe = request.params[3].get_bool();
592592
}
593593

594-
CAmount nMinimumAmount = 0;
595-
CAmount nMaximumAmount = MAX_MONEY;
596-
CAmount nMinimumSumAmount = MAX_MONEY;
597-
uint64_t nMaximumCount = 0;
598-
bool include_immature_coinbase{false};
594+
CoinFilterParams filter_coins;
595+
filter_coins.nMinimumAmount = 0;
599596

600597
if (!request.params[4].isNull()) {
601598
const UniValue& options = request.params[4].get_obj();
@@ -611,19 +608,19 @@ RPCHelpMan listunspent()
611608
true, true);
612609

613610
if (options.exists("minimumAmount"))
614-
nMinimumAmount = AmountFromValue(options["minimumAmount"]);
611+
filter_coins.nMinimumAmount = AmountFromValue(options["minimumAmount"]);
615612

616613
if (options.exists("maximumAmount"))
617-
nMaximumAmount = AmountFromValue(options["maximumAmount"]);
614+
filter_coins.nMaximumAmount = AmountFromValue(options["maximumAmount"]);
618615

619616
if (options.exists("minimumSumAmount"))
620-
nMinimumSumAmount = AmountFromValue(options["minimumSumAmount"]);
617+
filter_coins.nMinimumSumAmount = AmountFromValue(options["minimumSumAmount"]);
621618

622619
if (options.exists("maximumCount"))
623-
nMaximumCount = options["maximumCount"].getInt<int64_t>();
620+
filter_coins.nMaximumCount = options["maximumCount"].getInt<int64_t>();
624621

625622
if (options.exists("include_immature_coinbase")) {
626-
include_immature_coinbase = options["include_immature_coinbase"].get_bool();
623+
filter_coins.include_immature_coinbase = options["include_immature_coinbase"].get_bool();
627624
}
628625
}
629626

@@ -640,7 +637,7 @@ RPCHelpMan listunspent()
640637
cctl.m_max_depth = nMaxDepth;
641638
cctl.m_include_unsafe_inputs = include_unsafe;
642639
LOCK(pwallet->cs_wallet);
643-
vecOutputs = AvailableCoinsListUnspent(*pwallet, &cctl, nMinimumAmount, nMaximumAmount, nMinimumSumAmount, nMaximumCount, include_immature_coinbase).All();
640+
vecOutputs = AvailableCoinsListUnspent(*pwallet, &cctl, filter_coins).All();
644641
}
645642

646643
LOCK(pwallet->cs_wallet);

src/wallet/rpc/spend.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1385,7 +1385,9 @@ RPCHelpMan sendall()
13851385
total_input_value += tx->tx->vout[input.prevout.n].nValue;
13861386
}
13871387
} else {
1388-
for (const COutput& output : AvailableCoins(*pwallet, &coin_control, fee_rate, /*nMinimumAmount=*/0).All()) {
1388+
CoinFilterParams coins_params;
1389+
coins_params.nMinimumAmount = 0;
1390+
for (const COutput& output : AvailableCoins(*pwallet, &coin_control, fee_rate, coins_params).All()) {
13891391
CHECK_NONFATAL(output.input_bytes > 0);
13901392
if (send_max && fee_rate.GetFee(output.input_bytes) > output.txout.nValue) {
13911393
continue;

src/wallet/spend.cpp

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -191,12 +191,7 @@ util::Result<PreSelectedInputs> FetchSelectedInputs(const CWallet& wallet, const
191191
CoinsResult AvailableCoins(const CWallet& wallet,
192192
const CCoinControl* coinControl,
193193
std::optional<CFeeRate> feerate,
194-
const CAmount& nMinimumAmount,
195-
const CAmount& nMaximumAmount,
196-
const CAmount& nMinimumSumAmount,
197-
const uint64_t nMaximumCount,
198-
bool only_spendable,
199-
bool include_immature_coinbase)
194+
const CoinFilterParams& params)
200195
{
201196
AssertLockHeld(wallet.cs_wallet);
202197

@@ -214,7 +209,7 @@ CoinsResult AvailableCoins(const CWallet& wallet,
214209
const uint256& wtxid = entry.first;
215210
const CWalletTx& wtx = entry.second;
216211

217-
if (wallet.IsTxImmatureCoinBase(wtx) && !include_immature_coinbase)
212+
if (wallet.IsTxImmatureCoinBase(wtx) && !params.include_immature_coinbase)
218213
continue;
219214

220215
int nDepth = wallet.GetTxDepthInMainChain(wtx);
@@ -273,7 +268,7 @@ CoinsResult AvailableCoins(const CWallet& wallet,
273268
const CTxOut& output = wtx.tx->vout[i];
274269
const COutPoint outpoint(wtxid, i);
275270

276-
if (output.nValue < nMinimumAmount || output.nValue > nMaximumAmount)
271+
if (output.nValue < params.nMinimumAmount || output.nValue > params.nMaximumAmount)
277272
continue;
278273

279274
// Skip manually selected coins (the caller can fetch them directly)
@@ -305,7 +300,7 @@ CoinsResult AvailableCoins(const CWallet& wallet,
305300
bool spendable = ((mine & ISMINE_SPENDABLE) != ISMINE_NO) || (((mine & ISMINE_WATCH_ONLY) != ISMINE_NO) && (coinControl && coinControl->fAllowWatchOnly && solvable));
306301

307302
// Filter by spendable outputs only
308-
if (!spendable && only_spendable) continue;
303+
if (!spendable && params.only_spendable) continue;
309304

310305
// Obtain script type
311306
std::vector<std::vector<uint8_t>> script_solutions;
@@ -329,14 +324,14 @@ CoinsResult AvailableCoins(const CWallet& wallet,
329324
// Cache total amount as we go
330325
result.total_amount += output.nValue;
331326
// Checks the sum amount of all UTXO's.
332-
if (nMinimumSumAmount != MAX_MONEY) {
333-
if (result.total_amount >= nMinimumSumAmount) {
327+
if (params.nMinimumSumAmount != MAX_MONEY) {
328+
if (result.total_amount >= params.nMinimumSumAmount) {
334329
return result;
335330
}
336331
}
337332

338333
// Checks the maximum number of UTXO's.
339-
if (nMaximumCount > 0 && result.Size() >= nMaximumCount) {
334+
if (params.nMaximumCount > 0 && result.Size() >= params.nMaximumCount) {
340335
return result;
341336
}
342337
}
@@ -345,21 +340,16 @@ CoinsResult AvailableCoins(const CWallet& wallet,
345340
return result;
346341
}
347342

348-
CoinsResult AvailableCoinsListUnspent(const CWallet& wallet, const CCoinControl* coinControl, const CAmount& nMinimumAmount, const CAmount& nMaximumAmount, const CAmount& nMinimumSumAmount, const uint64_t nMaximumCount, bool include_immature_coinbase)
343+
CoinsResult AvailableCoinsListUnspent(const CWallet& wallet, const CCoinControl* coinControl, CoinFilterParams params)
349344
{
350-
return AvailableCoins(wallet, coinControl, /*feerate=*/ std::nullopt, nMinimumAmount, nMaximumAmount, nMinimumSumAmount, nMaximumCount, /*only_spendable=*/false, include_immature_coinbase);
345+
params.only_spendable = false;
346+
return AvailableCoins(wallet, coinControl, /*feerate=*/ std::nullopt, params);
351347
}
352348

353349
CAmount GetAvailableBalance(const CWallet& wallet, const CCoinControl* coinControl)
354350
{
355351
LOCK(wallet.cs_wallet);
356-
return AvailableCoins(wallet, coinControl,
357-
/*feerate=*/ std::nullopt,
358-
/*nMinimumAmount=*/ 1,
359-
/*nMaximumAmount=*/ MAX_MONEY,
360-
/*nMinimumSumAmount=*/ MAX_MONEY,
361-
/*nMaximumCount=*/ 0
362-
).total_amount;
352+
return AvailableCoins(wallet, coinControl).total_amount;
363353
}
364354

365355
const CTxOut& FindNonChangeParentOutput(const CWallet& wallet, const CTransaction& tx, int output)
@@ -898,13 +888,7 @@ static util::Result<CreatedTransactionResult> CreateTransactionInternal(
898888
// allowed (coins automatically selected by the wallet)
899889
CoinsResult available_coins;
900890
if (coin_control.m_allow_other_inputs) {
901-
available_coins = AvailableCoins(wallet,
902-
&coin_control,
903-
coin_selection_params.m_effective_feerate,
904-
1, /*nMinimumAmount*/
905-
MAX_MONEY, /*nMaximumAmount*/
906-
MAX_MONEY, /*nMinimumSumAmount*/
907-
0); /*nMaximumCount*/
891+
available_coins = AvailableCoins(wallet, &coin_control, coin_selection_params.m_effective_feerate);
908892
}
909893

910894
// Choose coins to use

src/wallet/spend.h

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,24 +55,34 @@ struct CoinsResult {
5555
CAmount total_amount{0};
5656
};
5757

58+
struct CoinFilterParams {
59+
// Outputs below the minimum amount will not get selected
60+
CAmount nMinimumAmount{1};
61+
// Outputs above the maximum amount will not get selected
62+
CAmount nMaximumAmount{MAX_MONEY};
63+
// Return outputs until the minimum sum amount is covered
64+
CAmount nMinimumSumAmount{MAX_MONEY};
65+
// Maximum number of outputs that can be returned
66+
uint64_t nMaximumCount{0};
67+
// By default, return only spendable outputs
68+
bool only_spendable{true};
69+
// By default, do not include immature coinbase outputs
70+
bool include_immature_coinbase{false};
71+
};
72+
5873
/**
5974
* Populate the CoinsResult struct with vectors of available COutputs, organized by OutputType.
6075
*/
6176
CoinsResult AvailableCoins(const CWallet& wallet,
6277
const CCoinControl* coinControl = nullptr,
6378
std::optional<CFeeRate> feerate = std::nullopt,
64-
const CAmount& nMinimumAmount = 1,
65-
const CAmount& nMaximumAmount = MAX_MONEY,
66-
const CAmount& nMinimumSumAmount = MAX_MONEY,
67-
const uint64_t nMaximumCount = 0,
68-
bool only_spendable = true,
69-
bool include_immature_coinbase = false) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet);
79+
const CoinFilterParams& params = {}) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet);
7080

7181
/**
72-
* Wrapper function for AvailableCoins which skips the `feerate` parameter. Use this function
82+
* Wrapper function for AvailableCoins which skips the `feerate` and `CoinFilterParams::only_spendable` parameters. Use this function
7383
* to list all available coins (e.g. listunspent RPC) while not intending to fund a transaction.
7484
*/
75-
CoinsResult AvailableCoinsListUnspent(const CWallet& wallet, const CCoinControl* coinControl = nullptr, const CAmount& nMinimumAmount = 1, const CAmount& nMaximumAmount = MAX_MONEY, const CAmount& nMinimumSumAmount = MAX_MONEY, const uint64_t nMaximumCount = 0, bool include_immature_coinbase = false) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet);
85+
CoinsResult AvailableCoinsListUnspent(const CWallet& wallet, const CCoinControl* coinControl = nullptr, CoinFilterParams params = {}) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet);
7686

7787
CAmount GetAvailableBalance(const CWallet& wallet, const CCoinControl* coinControl = nullptr);
7888

0 commit comments

Comments
 (0)