@@ -174,6 +174,16 @@ inline std::vector<OutputGroup>& KnapsackGroupOutputs(const CoinsResult& availab
174
174
return static_groups.all_groups .mixed_group ;
175
175
}
176
176
177
+ static std::unique_ptr<CWallet> NewWallet (const node::NodeContext& m_node, const std::string& wallet_name = " " )
178
+ {
179
+ std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain .get (), wallet_name, CreateMockWalletDatabase ());
180
+ BOOST_CHECK (wallet->LoadWallet () == DBErrors::LOAD_OK);
181
+ LOCK (wallet->cs_wallet );
182
+ wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
183
+ wallet->SetupDescriptorScriptPubKeyMans ();
184
+ return wallet;
185
+ }
186
+
177
187
// Branch and bound coin selection tests
178
188
BOOST_AUTO_TEST_CASE (bnb_search_test)
179
189
{
@@ -310,11 +320,7 @@ BOOST_AUTO_TEST_CASE(bnb_search_test)
310
320
coin_selection_params_bnb.m_subtract_fee_outputs = true ;
311
321
312
322
{
313
- std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain .get (), " " , CreateMockWalletDatabase ());
314
- wallet->LoadWallet ();
315
- LOCK (wallet->cs_wallet );
316
- wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
317
- wallet->SetupDescriptorScriptPubKeyMans ();
323
+ std::unique_ptr<CWallet> wallet = NewWallet (m_node);
318
324
319
325
CoinsResult available_coins;
320
326
@@ -332,11 +338,7 @@ BOOST_AUTO_TEST_CASE(bnb_search_test)
332
338
}
333
339
334
340
{
335
- std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain .get (), " " , CreateMockWalletDatabase ());
336
- wallet->LoadWallet ();
337
- LOCK (wallet->cs_wallet );
338
- wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
339
- wallet->SetupDescriptorScriptPubKeyMans ();
341
+ std::unique_ptr<CWallet> wallet = NewWallet (m_node);
340
342
341
343
CoinsResult available_coins;
342
344
@@ -351,15 +353,13 @@ BOOST_AUTO_TEST_CASE(bnb_search_test)
351
353
selected_input.Insert (select_coin, coin_selection_params_bnb.m_subtract_fee_outputs );
352
354
available_coins.Erase ({available_coins.coins [OutputType::BECH32].begin ()->outpoint });
353
355
coin_selection_params_bnb.m_effective_feerate = CFeeRate (0 );
356
+ LOCK (wallet->cs_wallet );
354
357
const auto result10 = SelectCoins (*wallet, available_coins, selected_input, 10 * CENT, coin_control, coin_selection_params_bnb);
355
358
BOOST_CHECK (result10);
356
359
}
357
360
{
358
- std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain .get (), " " , CreateMockWalletDatabase ());
359
- wallet->LoadWallet ();
360
- LOCK (wallet->cs_wallet );
361
- wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
362
- wallet->SetupDescriptorScriptPubKeyMans ();
361
+ std::unique_ptr<CWallet> wallet = NewWallet (m_node);
362
+ LOCK (wallet->cs_wallet ); // Every 'SelectCoins' call requires it
363
363
364
364
CoinsResult available_coins;
365
365
@@ -418,11 +418,7 @@ BOOST_AUTO_TEST_CASE(bnb_search_test)
418
418
// Test bnb max weight exceeded
419
419
// Inputs set [10, 9, 8, 5, 3, 1], Selection Target = 16 and coin 5 exceeding the max weight.
420
420
421
- std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain .get (), " " , m_args, CreateMockWalletDatabase ());
422
- wallet->LoadWallet ();
423
- LOCK (wallet->cs_wallet );
424
- wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
425
- wallet->SetupDescriptorScriptPubKeyMans ();
421
+ std::unique_ptr<CWallet> wallet = NewWallet (m_node);
426
422
427
423
CoinsResult available_coins;
428
424
add_coin (available_coins, *wallet, 10 * CENT, coin_selection_params_bnb.m_effective_feerate , 6 * 24 , false , 0 , true );
@@ -455,11 +451,7 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
455
451
FastRandomContext rand{};
456
452
const auto temp1{[&rand](std::vector<OutputGroup>& g, const CAmount& v, CAmount c) { return KnapsackSolver (g, v, c, rand); }};
457
453
const auto KnapsackSolver{temp1};
458
- std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain .get (), " " , CreateMockWalletDatabase ());
459
- wallet->LoadWallet ();
460
- LOCK (wallet->cs_wallet );
461
- wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
462
- wallet->SetupDescriptorScriptPubKeyMans ();
454
+ std::unique_ptr<CWallet> wallet = NewWallet (m_node);
463
455
464
456
CoinsResult available_coins;
465
457
@@ -765,11 +757,7 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
765
757
BOOST_AUTO_TEST_CASE (ApproximateBestSubset)
766
758
{
767
759
FastRandomContext rand{};
768
- std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain .get (), " " , CreateMockWalletDatabase ());
769
- wallet->LoadWallet ();
770
- LOCK (wallet->cs_wallet );
771
- wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
772
- wallet->SetupDescriptorScriptPubKeyMans ();
760
+ std::unique_ptr<CWallet> wallet = NewWallet (m_node);
773
761
774
762
CoinsResult available_coins;
775
763
@@ -787,11 +775,8 @@ BOOST_AUTO_TEST_CASE(ApproximateBestSubset)
787
775
// Tests that with the ideal conditions, the coin selector will always be able to find a solution that can pay the target value
788
776
BOOST_AUTO_TEST_CASE (SelectCoins_test)
789
777
{
790
- std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain .get (), " " , CreateMockWalletDatabase ());
791
- wallet->LoadWallet ();
792
- LOCK (wallet->cs_wallet );
793
- wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
794
- wallet->SetupDescriptorScriptPubKeyMans ();
778
+ std::unique_ptr<CWallet> wallet = NewWallet (m_node);
779
+ LOCK (wallet->cs_wallet ); // Every 'SelectCoins' call requires it
795
780
796
781
// Random generator stuff
797
782
std::default_random_engine generator;
@@ -979,12 +964,7 @@ static util::Result<SelectionResult> SelectCoinsSRD(const CAmount& target,
979
964
int max_weight,
980
965
std::function<CoinsResult(CWallet&)> coin_setup)
981
966
{
982
- std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain .get (), " " , CreateMockWalletDatabase ());
983
- wallet->LoadWallet ();
984
- LOCK (wallet->cs_wallet );
985
- wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
986
- wallet->SetupDescriptorScriptPubKeyMans ();
987
-
967
+ std::unique_ptr<CWallet> wallet = NewWallet (m_node);
988
968
CoinEligibilityFilter filter (0 , 0 , 0 ); // accept all coins without ancestors
989
969
Groups group = GroupOutputs (*wallet, coin_setup (*wallet), cs_params, {{filter}})[filter].all_groups ;
990
970
return SelectCoinsSRD (group.positive_group , target, cs_params.rng_fast , max_weight);
@@ -1066,16 +1046,12 @@ BOOST_AUTO_TEST_CASE(srd_tests)
1066
1046
}
1067
1047
}
1068
1048
1069
- static util::Result<SelectionResult> select_coins (const CAmount& target, const CoinSelectionParams& cs_params, const CCoinControl& cc, std::function<CoinsResult(CWallet&)> coin_setup, interfaces::Chain* chain )
1049
+ static util::Result<SelectionResult> select_coins (const CAmount& target, const CoinSelectionParams& cs_params, const CCoinControl& cc, std::function<CoinsResult(CWallet&)> coin_setup, const node::NodeContext& m_node )
1070
1050
{
1071
- std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(chain, " " , CreateMockWalletDatabase ());
1072
- wallet->LoadWallet ();
1073
- LOCK (wallet->cs_wallet );
1074
- wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
1075
- wallet->SetupDescriptorScriptPubKeyMans ();
1076
-
1051
+ std::unique_ptr<CWallet> wallet = NewWallet (m_node);
1077
1052
auto available_coins = coin_setup (*wallet);
1078
1053
1054
+ LOCK (wallet->cs_wallet );
1079
1055
auto result = SelectCoins (*wallet, available_coins, /* pre_set_inputs=*/ {}, target, cc, cs_params);
1080
1056
if (result) {
1081
1057
const auto signedTxSize = 10 + 34 + 68 * result->GetInputSet ().size (); // static header size + output size + inputs size (P2WPKH)
@@ -1109,8 +1085,6 @@ BOOST_AUTO_TEST_CASE(check_max_weight)
1109
1085
/* avoid_partial=*/ false ,
1110
1086
};
1111
1087
1112
- auto chain{m_node.chain .get ()};
1113
-
1114
1088
{
1115
1089
// Scenario 1:
1116
1090
// The actor starts with 1x 50.0 BTC and 1515x 0.033 BTC (~100.0 BTC total) unspent outputs
@@ -1129,7 +1103,7 @@ BOOST_AUTO_TEST_CASE(check_max_weight)
1129
1103
add_coin (available_coins, wallet, CAmount (50 * COIN), CFeeRate (0 ), 144 , false , 0 , true );
1130
1104
return available_coins;
1131
1105
},
1132
- chain );
1106
+ m_node );
1133
1107
1134
1108
BOOST_CHECK (result);
1135
1109
// Verify that only the 50 BTC UTXO was selected
@@ -1157,7 +1131,7 @@ BOOST_AUTO_TEST_CASE(check_max_weight)
1157
1131
}
1158
1132
return available_coins;
1159
1133
},
1160
- chain );
1134
+ m_node );
1161
1135
1162
1136
BOOST_CHECK (has_coin (result->GetInputSet (), CAmount (0.0625 * COIN)));
1163
1137
BOOST_CHECK (has_coin (result->GetInputSet (), CAmount (0.025 * COIN)));
@@ -1178,7 +1152,7 @@ BOOST_AUTO_TEST_CASE(check_max_weight)
1178
1152
}
1179
1153
return available_coins;
1180
1154
},
1181
- chain );
1155
+ m_node );
1182
1156
1183
1157
// No results
1184
1158
// 1515 inputs * 68 bytes = 103,020 bytes
@@ -1193,20 +1167,11 @@ BOOST_AUTO_TEST_CASE(SelectCoins_effective_value_test)
1193
1167
// This test creates a coin whose value is higher than the target but whose effective value is lower than the target.
1194
1168
// The coin is selected using coin control, with m_allow_other_inputs = false. SelectCoins should fail due to insufficient funds.
1195
1169
1196
- std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain .get (), " " , CreateMockWalletDatabase ());
1197
- wallet->LoadWallet ();
1198
- LOCK (wallet->cs_wallet );
1199
- wallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
1200
- wallet->SetupDescriptorScriptPubKeyMans ();
1170
+ std::unique_ptr<CWallet> wallet = NewWallet (m_node);
1201
1171
1202
1172
CoinsResult available_coins;
1203
1173
{
1204
- std::unique_ptr<CWallet> dummyWallet = std::make_unique<CWallet>(m_node.chain .get (), " dummy" , CreateMockWalletDatabase ());
1205
- dummyWallet->LoadWallet ();
1206
- LOCK (dummyWallet->cs_wallet );
1207
- dummyWallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
1208
- dummyWallet->SetupDescriptorScriptPubKeyMans ();
1209
-
1174
+ std::unique_ptr<CWallet> dummyWallet = NewWallet (m_node, /* wallet_name=*/ " dummy" );
1210
1175
add_coin (available_coins, *dummyWallet, 100000 ); // 0.001 BTC
1211
1176
}
1212
1177
@@ -1230,6 +1195,7 @@ BOOST_AUTO_TEST_CASE(SelectCoins_effective_value_test)
1230
1195
cc.SetInputWeight (output.outpoint , 148 );
1231
1196
cc.SelectExternal (output.outpoint , output.txout );
1232
1197
1198
+ LOCK (wallet->cs_wallet );
1233
1199
const auto preset_inputs = *Assert (FetchSelectedInputs (*wallet, cc, cs_params));
1234
1200
available_coins.Erase ({available_coins.coins [OutputType::BECH32].begin ()->outpoint });
1235
1201
@@ -1242,11 +1208,7 @@ BOOST_FIXTURE_TEST_CASE(wallet_coinsresult_test, BasicTestingSetup)
1242
1208
// Test case to verify CoinsResult object sanity.
1243
1209
CoinsResult available_coins;
1244
1210
{
1245
- std::unique_ptr<CWallet> dummyWallet = std::make_unique<CWallet>(m_node.chain .get (), " dummy" , CreateMockWalletDatabase ());
1246
- BOOST_CHECK_EQUAL (dummyWallet->LoadWallet (), DBErrors::LOAD_OK);
1247
- LOCK (dummyWallet->cs_wallet );
1248
- dummyWallet->SetWalletFlag (WALLET_FLAG_DESCRIPTORS);
1249
- dummyWallet->SetupDescriptorScriptPubKeyMans ();
1211
+ std::unique_ptr<CWallet> dummyWallet = NewWallet (m_node, /* wallet_name=*/ " dummy" );
1250
1212
1251
1213
// Add some coins to 'available_coins'
1252
1214
for (int i=0 ; i<10 ; i++) {
0 commit comments