98 std::set<Txid> empty_conflicts_set;
115 const auto expected_error_str{
strprintf(
"non-version=3 tx %s (wtxid=%s) cannot spend from version=3 tx %s (wtxid=%s)",
116 tx_v2_from_v3->GetHash().ToString(), tx_v2_from_v3->GetWitnessHash().ToString(),
117 mempool_tx_v3->GetHash().ToString(), mempool_tx_v3->GetWitnessHash().ToString())};
122 Package package_v3_v2{mempool_tx_v3, tx_v2_from_v3};
130 auto tx_v2_from_v2_and_v3 =
make_tx({
COutPoint{mempool_tx_v3->GetHash(), 0},
COutPoint{mempool_tx_v2->GetHash(), 0}}, 2);
132 const auto expected_error_str_2{
strprintf(
"non-version=3 tx %s (wtxid=%s) cannot spend from version=3 tx %s (wtxid=%s)",
133 tx_v2_from_v2_and_v3->GetHash().ToString(), tx_v2_from_v2_and_v3->GetWitnessHash().ToString(),
134 mempool_tx_v3->GetHash().ToString(), mempool_tx_v3->GetWitnessHash().ToString())};
139 Package package_v3_v2_v2{mempool_tx_v3, mempool_tx_v2, tx_v2_from_v2_and_v3};
150 const auto expected_error_str{
strprintf(
"version=3 tx %s (wtxid=%s) cannot spend from non-version=3 tx %s (wtxid=%s)",
151 tx_v3_from_v2->GetHash().ToString(), tx_v3_from_v2->GetWitnessHash().ToString(),
152 mempool_tx_v2->GetHash().ToString(), mempool_tx_v2->GetWitnessHash().ToString())};
157 Package package_v2_v3{mempool_tx_v2, tx_v3_from_v2};
165 auto tx_v3_from_v2_and_v3 =
make_tx({
COutPoint{mempool_tx_v3->GetHash(), 0},
COutPoint{mempool_tx_v2->GetHash(), 0}}, 3);
167 const auto expected_error_str_2{
strprintf(
"version=3 tx %s (wtxid=%s) cannot spend from non-version=3 tx %s (wtxid=%s)",
168 tx_v3_from_v2_and_v3->GetHash().ToString(), tx_v3_from_v2_and_v3->GetWitnessHash().ToString(),
169 mempool_tx_v2->GetHash().ToString(), mempool_tx_v2->GetWitnessHash().ToString())};
175 const auto expected_error_str_3{
strprintf(
"tx %s (wtxid=%s) would have too many ancestors",
176 tx_v3_from_v2_and_v3->GetHash().ToString(), tx_v3_from_v2_and_v3->GetWitnessHash().ToString())};
177 Package package_v3_v2_v3{mempool_tx_v3, mempool_tx_v2, tx_v3_from_v2_and_v3};
190 Package package_v3_v3{mempool_tx_v3, tx_v3_from_v3};
201 Package package_v2_v2{mempool_tx_v2, tx_v2_from_v2};
209 std::vector<COutPoint> mempool_outpoints;
210 mempool_outpoints.emplace_back(mempool_tx_v3->GetHash(), 0);
211 package_multi_parents.emplace_back(mempool_tx_v3);
212 for (
size_t i{0}; i < 2; ++i) {
215 mempool_outpoints.emplace_back(mempool_tx->GetHash(), 0);
216 package_multi_parents.emplace_back(mempool_tx);
218 auto tx_v3_multi_parent =
make_tx(mempool_outpoints, 3);
219 package_multi_parents.emplace_back(tx_v3_multi_parent);
222 const auto expected_error_str{
strprintf(
"tx %s (wtxid=%s) would have too many ancestors",
223 tx_v3_multi_parent->GetHash().ToString(), tx_v3_multi_parent->GetWitnessHash().ToString())};
237 for (
size_t i{0}; i < 2; ++i) {
238 auto mempool_tx =
make_tx({last_outpoint}, 3);
240 last_outpoint =
COutPoint{mempool_tx->GetHash(), 0};
241 package_multi_gen.emplace_back(mempool_tx);
242 if (i == 1) middle_tx = mempool_tx;
244 auto tx_v3_multi_gen =
make_tx({last_outpoint}, 3);
245 package_multi_gen.emplace_back(tx_v3_multi_gen);
247 const auto expected_error_str{
strprintf(
"tx %s (wtxid=%s) would have too many ancestors",
248 tx_v3_multi_gen->GetHash().ToString(), tx_v3_multi_gen->GetWitnessHash().ToString())};
260 many_inputs.emplace_back(mempool_tx_v3->GetHash(), 0);
262 auto tx_v3_child_big =
make_tx(many_inputs, 3);
265 const auto expected_error_str{
strprintf(
"version=3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
266 tx_v3_child_big->GetHash().ToString(), tx_v3_child_big->GetWitnessHash().ToString(), vsize,
TRUC_CHILD_MAX_VSIZE)};
271 Package package_child_big{mempool_tx_v3, tx_v3_child_big};
279 multisig_outpoints.emplace_back(mempool_tx_v3->GetHash(), 0);
282 script_multisig <<
OP_1;
283 for (
const auto& key : keys) {
290 for (
const auto& outpoint : multisig_outpoints) {
291 mtx_many_sigops.
vin.emplace_back(outpoint);
292 mtx_many_sigops.
vin.back().scriptWitness.stack.emplace_back(script_multisig.
begin(), script_multisig.
end());
294 mtx_many_sigops.
vout.resize(1);
296 mtx_many_sigops.
vout.back().nValue = 10000;
301 const int64_t total_sigops{
static_cast<int64_t
>(tx_many_sigops->vin.size()) *
static_cast<int64_t
>(script_multisig.
GetSigOpCount(
false))};
307 const auto expected_error_str{
strprintf(
"version=3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
308 tx_many_sigops->GetHash().ToString(), tx_many_sigops->GetWitnessHash().ToString(),
310 auto result{
SingleTRUCChecks(tx_many_sigops, *ancestors, empty_conflicts_set,
315 Package package_child_sigops{mempool_tx_v3, tx_many_sigops};
321 auto tx_mempool_v3_child =
make_tx({
COutPoint{mempool_tx_v3->GetHash(), 0}}, 3);
328 Package package_v3_1p1c{mempool_tx_v3, tx_mempool_v3_child};
338 const auto expected_error_str{
strprintf(
"tx %s (wtxid=%s) would exceed descendant count limit",
339 mempool_tx_v3->GetHash().ToString(), mempool_tx_v3->GetWitnessHash().ToString())};
349 Package package_v3_1p2c{mempool_tx_v3, tx_mempool_v3_child, tx_v3_child2};
356 auto entry_mempool_parent = pool.
GetIter(mempool_tx_v3->GetHash().ToUint256()).value();
369 auto tx_mempool_sibling =
make_tx({
COutPoint{tx_mempool_grandparent->GetHash(), 0}}, 3);
370 auto tx_mempool_nibling =
make_tx({
COutPoint{tx_mempool_sibling->GetHash(), 0}}, 3);
371 auto tx_to_submit =
make_tx({
COutPoint{tx_mempool_grandparent->GetHash(), 1}}, 3);
378 const auto expected_error_str{
strprintf(
"tx %s (wtxid=%s) would exceed descendant count limit",
379 tx_mempool_grandparent->GetHash().ToString(), tx_mempool_grandparent->GetWitnessHash().ToString())};