Skip to content
Bitcoin Roots

v29.4-roots.3 · Commit 25: [PATCH 25/30] feat(wallet): expose advanced coin control facts

src/wallet/test/spend_tests.cpp

Before: src/wallet/test/spend_tests.cpp · After: src/wallet/test/spend_tests.cpp

File metadata
index e28272a201d6881216dc990f082b5d191342ee38..b0ffdcc26c42bd1d3d09990b3c18f4c44b296d16 100644

Download original patch · Release notes

Diff rows 1–58 of 58. Line numbers refer to the original before/after files.

+ Added− RemovedUnmarked lines are context.

Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.

src/wallet/test/spend_tests.cpp CHANGED
@@ -8,6 +8,7 @@
8
  #include <policy/policy.h>
9
  #include <random.h>
10
  #include <script/solver.h>
 
11
  #include <validation.h>
12
  #include <wallet/coincontrol.h>
13
  #include <wallet/fees.h>
@@ -15,6 +16,8 @@
15
  #include <wallet/test/util.h>
16
  #include <wallet/test/wallet_test_fixture.h>
17
 
 
 
18
  #include <boost/test/unit_test.hpp>
19
 
20
  namespace wallet {
@@ -171,5 +174,43 @@ BOOST_FIXTURE_TEST_CASE(wallet_duplicated_preset_inputs_test, TestChain100Setup)
171
  BOOST_CHECK(!CreateTransaction(*wallet, recipients, /*change_pos=*/std::nullopt, coin_control));
172
  }
173
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  BOOST_AUTO_TEST_SUITE_END()
175
  } // namespace wallet
 
8
  #include <policy/policy.h>
9
  #include <random.h>
10
  #include <script/solver.h>
11
+ #include <util/rbf.h>
12
  #include <validation.h>
13
  #include <wallet/coincontrol.h>
14
  #include <wallet/fees.h>
 
16
  #include <wallet/test/util.h>
17
  #include <wallet/test/wallet_test_fixture.h>
18
 
19
+ #include <algorithm>
20
+
21
  #include <boost/test/unit_test.hpp>
22
 
23
  namespace wallet {
 
174
  BOOST_CHECK(!CreateTransaction(*wallet, recipients, /*change_pos=*/std::nullopt, coin_control));
175
  }
176
 
177
+ BOOST_FIXTURE_TEST_CASE(manual_coin_control_honors_selection_and_rbf, TestChain100Setup)
178
+ {
179
+ CreateAndProcessBlock({}, GetScriptForRawPubKey(coinbaseKey.GetPubKey()));
180
+ auto wallet{CreateSyncedWallet(*m_node.chain, WITH_LOCK(Assert(m_node.chainman)->GetMutex(), return m_node.chainman->ActiveChain()), coinbaseKey)};
181
+ const auto coins{WITH_LOCK(wallet->cs_wallet, return AvailableCoins(*wallet).All())};
182
+ BOOST_REQUIRE(!coins.empty());
183
+ const COutput selected_coin{coins.front()};
184
+ const CTxDestination destination{PKHash{GenerateRandomKey().GetPubKey()}};
185
+ const CRecipient recipient{destination, COIN, /*subtract_fee=*/false};
186
+
187
+ CCoinControl coin_control;
188
+ coin_control.m_allow_other_inputs = false;
189
+ coin_control.m_signal_bip125_rbf = false;
190
+ coin_control.Select(selected_coin.outpoint);
191
+
192
+ const auto no_rbf{CreateTransaction(*wallet, {recipient}, /*change_pos=*/std::nullopt, coin_control, /*sign=*/false)};
193
+ BOOST_REQUIRE(no_rbf);
194
+ BOOST_REQUIRE_EQUAL(no_rbf->tx->vin.size(), 1U);
195
+ BOOST_CHECK(no_rbf->tx->vin.front().prevout == selected_coin.outpoint);
196
+ BOOST_CHECK(no_rbf->tx->vin.front().nSequence == CTxIn::MAX_SEQUENCE_NONFINAL);
197
+ CAmount outputs{0};
198
+ for (const auto& output : no_rbf->tx->vout) outputs += output.nValue;
199
+ BOOST_CHECK_EQUAL(selected_coin.txout.nValue, outputs + no_rbf->fee);
200
+
201
+ coin_control.m_signal_bip125_rbf = true;
202
+ const auto rbf{CreateTransaction(*wallet, {recipient}, /*change_pos=*/std::nullopt, coin_control, /*sign=*/false)};
203
+ BOOST_REQUIRE(rbf);
204
+ BOOST_REQUIRE_EQUAL(rbf->tx->vin.size(), 1U);
205
+ BOOST_CHECK(rbf->tx->vin.front().prevout == selected_coin.outpoint);
206
+ BOOST_CHECK_EQUAL(rbf->tx->vin.front().nSequence, MAX_BIP125_RBF_SEQUENCE);
207
+
208
+ WITH_LOCK(wallet->cs_wallet, wallet->LockCoin(selected_coin.outpoint));
209
+ const auto available_after_lock{WITH_LOCK(wallet->cs_wallet, return AvailableCoins(*wallet).All())};
210
+ BOOST_CHECK(std::none_of(available_after_lock.cbegin(), available_after_lock.cend(),
211
+ [&selected_coin](const COutput& coin) { return coin.outpoint == selected_coin.outpoint; }));
212
+ BOOST_CHECK(WITH_LOCK(wallet->cs_wallet, return wallet->IsLockedCoin(selected_coin.outpoint)));
213
+ }
214
+
215
  BOOST_AUTO_TEST_SUITE_END()
216
  } // namespace wallet