@@ -139,7 +139,7 @@ inline std::vector<OutputGroup>& GroupCoins(const std::vector<COutput>& availabl
139
139
return static_groups;
140
140
}
141
141
142
- inline std::vector<OutputGroup>& KnapsackGroupOutputs (const std::vector<COutput> & available_coins, CWallet& wallet, const CoinEligibilityFilter& filter)
142
+ inline std::vector<OutputGroup>& KnapsackGroupOutputs (const CoinsResult & available_coins, CWallet& wallet, const CoinEligibilityFilter& filter)
143
143
{
144
144
FastRandomContext rand{};
145
145
CoinSelectionParams coin_selection_params{
@@ -154,7 +154,7 @@ inline std::vector<OutputGroup>& KnapsackGroupOutputs(const std::vector<COutput>
154
154
/* avoid_partial=*/ false ,
155
155
};
156
156
static std::vector<OutputGroup> static_groups;
157
- static_groups = GroupOutputs (wallet, available_coins, coin_selection_params, filter, /* positive_only=*/ false );
157
+ static_groups = GroupOutputs (wallet, available_coins. All () , coin_selection_params, filter, /* positive_only=*/ false );
158
158
return static_groups;
159
159
}
160
160
@@ -418,25 +418,25 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
418
418
available_coins.Clear ();
419
419
420
420
// with an empty wallet we can't even pay one cent
421
- BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_standard), 1 * CENT, CENT));
421
+ BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_standard), 1 * CENT, CENT));
422
422
423
423
add_coin (available_coins, *wallet, 1 *CENT, CFeeRate (0 ), 4 ); // add a new 1 cent coin
424
424
425
425
// with a new 1 cent coin, we still can't find a mature 1 cent
426
- BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_standard), 1 * CENT, CENT));
426
+ BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_standard), 1 * CENT, CENT));
427
427
428
428
// but we can find a new 1 cent
429
- const auto result1 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 1 * CENT, CENT);
429
+ const auto result1 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 1 * CENT, CENT);
430
430
BOOST_CHECK (result1);
431
431
BOOST_CHECK_EQUAL (result1->GetSelectedValue (), 1 * CENT);
432
432
433
433
add_coin (available_coins, *wallet, 2 *CENT); // add a mature 2 cent coin
434
434
435
435
// we can't make 3 cents of mature coins
436
- BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_standard), 3 * CENT, CENT));
436
+ BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_standard), 3 * CENT, CENT));
437
437
438
438
// we can make 3 cents of new coins
439
- const auto result2 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 3 * CENT, CENT);
439
+ const auto result2 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 3 * CENT, CENT);
440
440
BOOST_CHECK (result2);
441
441
BOOST_CHECK_EQUAL (result2->GetSelectedValue (), 3 * CENT);
442
442
@@ -447,38 +447,38 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
447
447
// now we have new: 1+10=11 (of which 10 was self-sent), and mature: 2+5+20=27. total = 38
448
448
449
449
// we can't make 38 cents only if we disallow new coins:
450
- BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_standard), 38 * CENT, CENT));
450
+ BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_standard), 38 * CENT, CENT));
451
451
// we can't even make 37 cents if we don't allow new coins even if they're from us
452
- BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_standard_extra), 38 * CENT, CENT));
452
+ BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_standard_extra), 38 * CENT, CENT));
453
453
// but we can make 37 cents if we accept new coins from ourself
454
- const auto result3 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_standard), 37 * CENT, CENT);
454
+ const auto result3 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_standard), 37 * CENT, CENT);
455
455
BOOST_CHECK (result3);
456
456
BOOST_CHECK_EQUAL (result3->GetSelectedValue (), 37 * CENT);
457
457
// and we can make 38 cents if we accept all new coins
458
- const auto result4 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 38 * CENT, CENT);
458
+ const auto result4 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 38 * CENT, CENT);
459
459
BOOST_CHECK (result4);
460
460
BOOST_CHECK_EQUAL (result4->GetSelectedValue (), 38 * CENT);
461
461
462
462
// try making 34 cents from 1,2,5,10,20 - we can't do it exactly
463
- const auto result5 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 34 * CENT, CENT);
463
+ const auto result5 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 34 * CENT, CENT);
464
464
BOOST_CHECK (result5);
465
465
BOOST_CHECK_EQUAL (result5->GetSelectedValue (), 35 * CENT); // but 35 cents is closest
466
466
BOOST_CHECK_EQUAL (result5->GetInputSet ().size (), 3U ); // the best should be 20+10+5. it's incredibly unlikely the 1 or 2 got included (but possible)
467
467
468
468
// when we try making 7 cents, the smaller coins (1,2,5) are enough. We should see just 2+5
469
- const auto result6 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 7 * CENT, CENT);
469
+ const auto result6 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 7 * CENT, CENT);
470
470
BOOST_CHECK (result6);
471
471
BOOST_CHECK_EQUAL (result6->GetSelectedValue (), 7 * CENT);
472
472
BOOST_CHECK_EQUAL (result6->GetInputSet ().size (), 2U );
473
473
474
474
// when we try making 8 cents, the smaller coins (1,2,5) are exactly enough.
475
- const auto result7 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 8 * CENT, CENT);
475
+ const auto result7 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 8 * CENT, CENT);
476
476
BOOST_CHECK (result7);
477
477
BOOST_CHECK (result7->GetSelectedValue () == 8 * CENT);
478
478
BOOST_CHECK_EQUAL (result7->GetInputSet ().size (), 3U );
479
479
480
480
// when we try making 9 cents, no subset of smaller coins is enough, and we get the next bigger coin (10)
481
- const auto result8 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 9 * CENT, CENT);
481
+ const auto result8 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 9 * CENT, CENT);
482
482
BOOST_CHECK (result8);
483
483
BOOST_CHECK_EQUAL (result8->GetSelectedValue (), 10 * CENT);
484
484
BOOST_CHECK_EQUAL (result8->GetInputSet ().size (), 1U );
@@ -493,34 +493,34 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
493
493
add_coin (available_coins, *wallet, 30 *CENT); // now we have 6+7+8+20+30 = 71 cents total
494
494
495
495
// check that we have 71 and not 72
496
- const auto result9 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 71 * CENT, CENT);
496
+ const auto result9 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 71 * CENT, CENT);
497
497
BOOST_CHECK (result9);
498
- BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 72 * CENT, CENT));
498
+ BOOST_CHECK (!KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 72 * CENT, CENT));
499
499
500
500
// now try making 16 cents. the best smaller coins can do is 6+7+8 = 21; not as good at the next biggest coin, 20
501
- const auto result10 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 16 * CENT, CENT);
501
+ const auto result10 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 16 * CENT, CENT);
502
502
BOOST_CHECK (result10);
503
503
BOOST_CHECK_EQUAL (result10->GetSelectedValue (), 20 * CENT); // we should get 20 in one coin
504
504
BOOST_CHECK_EQUAL (result10->GetInputSet ().size (), 1U );
505
505
506
506
add_coin (available_coins, *wallet, 5 *CENT); // now we have 5+6+7+8+20+30 = 75 cents total
507
507
508
508
// now if we try making 16 cents again, the smaller coins can make 5+6+7 = 18 cents, better than the next biggest coin, 20
509
- const auto result11 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 16 * CENT, CENT);
509
+ const auto result11 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 16 * CENT, CENT);
510
510
BOOST_CHECK (result11);
511
511
BOOST_CHECK_EQUAL (result11->GetSelectedValue (), 18 * CENT); // we should get 18 in 3 coins
512
512
BOOST_CHECK_EQUAL (result11->GetInputSet ().size (), 3U );
513
513
514
514
add_coin (available_coins, *wallet, 18 *CENT); // now we have 5+6+7+8+18+20+30
515
515
516
516
// and now if we try making 16 cents again, the smaller coins can make 5+6+7 = 18 cents, the same as the next biggest coin, 18
517
- const auto result12 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 16 * CENT, CENT);
517
+ const auto result12 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 16 * CENT, CENT);
518
518
BOOST_CHECK (result12);
519
519
BOOST_CHECK_EQUAL (result12->GetSelectedValue (), 18 * CENT); // we should get 18 in 1 coin
520
520
BOOST_CHECK_EQUAL (result12->GetInputSet ().size (), 1U ); // because in the event of a tie, the biggest coin wins
521
521
522
522
// now try making 11 cents. we should get 5+6
523
- const auto result13 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 11 * CENT, CENT);
523
+ const auto result13 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 11 * CENT, CENT);
524
524
BOOST_CHECK (result13);
525
525
BOOST_CHECK_EQUAL (result13->GetSelectedValue (), 11 * CENT);
526
526
BOOST_CHECK_EQUAL (result13->GetInputSet ().size (), 2U );
@@ -530,12 +530,12 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
530
530
add_coin (available_coins, *wallet, 2 *COIN);
531
531
add_coin (available_coins, *wallet, 3 *COIN);
532
532
add_coin (available_coins, *wallet, 4 *COIN); // now we have 5+6+7+8+18+20+30+100+200+300+400 = 1094 cents
533
- const auto result14 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 95 * CENT, CENT);
533
+ const auto result14 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 95 * CENT, CENT);
534
534
BOOST_CHECK (result14);
535
535
BOOST_CHECK_EQUAL (result14->GetSelectedValue (), 1 * COIN); // we should get 1 BTC in 1 coin
536
536
BOOST_CHECK_EQUAL (result14->GetInputSet ().size (), 1U );
537
537
538
- const auto result15 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 195 * CENT, CENT);
538
+ const auto result15 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 195 * CENT, CENT);
539
539
BOOST_CHECK (result15);
540
540
BOOST_CHECK_EQUAL (result15->GetSelectedValue (), 2 * COIN); // we should get 2 BTC in 1 coin
541
541
BOOST_CHECK_EQUAL (result15->GetInputSet ().size (), 1U );
@@ -551,15 +551,15 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
551
551
552
552
// try making 1 * CENT from the 1.5 * CENT
553
553
// we'll get change smaller than CENT whatever happens, so can expect CENT exactly
554
- const auto result16 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), CENT, CENT);
554
+ const auto result16 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), CENT, CENT);
555
555
BOOST_CHECK (result16);
556
556
BOOST_CHECK_EQUAL (result16->GetSelectedValue (), CENT);
557
557
558
558
// but if we add a bigger coin, small change is avoided
559
559
add_coin (available_coins, *wallet, 1111 *CENT);
560
560
561
561
// try making 1 from 0.1 + 0.2 + 0.3 + 0.4 + 0.5 + 1111 = 1112.5
562
- const auto result17 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 1 * CENT, CENT);
562
+ const auto result17 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 1 * CENT, CENT);
563
563
BOOST_CHECK (result17);
564
564
BOOST_CHECK_EQUAL (result17->GetSelectedValue (), 1 * CENT); // we should get the exact amount
565
565
@@ -568,7 +568,7 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
568
568
add_coin (available_coins, *wallet, CENT * 7 / 10 );
569
569
570
570
// and try again to make 1.0 * CENT
571
- const auto result18 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 1 * CENT, CENT);
571
+ const auto result18 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 1 * CENT, CENT);
572
572
BOOST_CHECK (result18);
573
573
BOOST_CHECK_EQUAL (result18->GetSelectedValue (), 1 * CENT); // we should get the exact amount
574
574
@@ -578,7 +578,7 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
578
578
for (int j = 0 ; j < 20 ; j++)
579
579
add_coin (available_coins, *wallet, 50000 * COIN);
580
580
581
- const auto result19 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 500000 * COIN, CENT);
581
+ const auto result19 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 500000 * COIN, CENT);
582
582
BOOST_CHECK (result19);
583
583
BOOST_CHECK_EQUAL (result19->GetSelectedValue (), 500000 * COIN); // we should get the exact amount
584
584
BOOST_CHECK_EQUAL (result19->GetInputSet ().size (), 10U ); // in ten coins
@@ -592,7 +592,7 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
592
592
add_coin (available_coins, *wallet, CENT * 6 / 10 );
593
593
add_coin (available_coins, *wallet, CENT * 7 / 10 );
594
594
add_coin (available_coins, *wallet, 1111 * CENT);
595
- const auto result20 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 1 * CENT, CENT);
595
+ const auto result20 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 1 * CENT, CENT);
596
596
BOOST_CHECK (result20);
597
597
BOOST_CHECK_EQUAL (result20->GetSelectedValue (), 1111 * CENT); // we get the bigger coin
598
598
BOOST_CHECK_EQUAL (result20->GetInputSet ().size (), 1U );
@@ -603,7 +603,7 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
603
603
add_coin (available_coins, *wallet, CENT * 6 / 10 );
604
604
add_coin (available_coins, *wallet, CENT * 8 / 10 );
605
605
add_coin (available_coins, *wallet, 1111 * CENT);
606
- const auto result21 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), CENT, CENT);
606
+ const auto result21 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), CENT, CENT);
607
607
BOOST_CHECK (result21);
608
608
BOOST_CHECK_EQUAL (result21->GetSelectedValue (), CENT); // we should get the exact amount
609
609
BOOST_CHECK_EQUAL (result21->GetInputSet ().size (), 2U ); // in two coins 0.4+0.6
@@ -615,13 +615,13 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
615
615
add_coin (available_coins, *wallet, CENT * 100 );
616
616
617
617
// trying to make 100.01 from these three coins
618
- const auto result22 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), CENT * 10001 / 100 , CENT);
618
+ const auto result22 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), CENT * 10001 / 100 , CENT);
619
619
BOOST_CHECK (result22);
620
620
BOOST_CHECK_EQUAL (result22->GetSelectedValue (), CENT * 10105 / 100 ); // we should get all coins
621
621
BOOST_CHECK_EQUAL (result22->GetInputSet ().size (), 3U );
622
622
623
623
// but if we try to make 99.9, we should take the bigger of the two small coins to avoid small change
624
- const auto result23 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), CENT * 9990 / 100 , CENT);
624
+ const auto result23 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), CENT * 9990 / 100 , CENT);
625
625
BOOST_CHECK (result23);
626
626
BOOST_CHECK_EQUAL (result23->GetSelectedValue (), 101 * CENT);
627
627
BOOST_CHECK_EQUAL (result23->GetInputSet ().size (), 2U );
@@ -636,7 +636,7 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
636
636
637
637
// We only create the wallet once to save time, but we still run the coin selection RUN_TESTS times.
638
638
for (int i = 0 ; i < RUN_TESTS; i++) {
639
- const auto result24 = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_confirmed), 2000 , CENT);
639
+ const auto result24 = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_confirmed), 2000 , CENT);
640
640
BOOST_CHECK (result24);
641
641
642
642
if (amt - 2000 < CENT) {
@@ -727,7 +727,7 @@ BOOST_AUTO_TEST_CASE(ApproximateBestSubset)
727
727
add_coin (available_coins, *wallet, 1000 * COIN);
728
728
add_coin (available_coins, *wallet, 3 * COIN);
729
729
730
- const auto result = KnapsackSolver (KnapsackGroupOutputs (available_coins. All () , *wallet, filter_standard), 1003 * COIN, CENT, rand);
730
+ const auto result = KnapsackSolver (KnapsackGroupOutputs (available_coins, *wallet, filter_standard), 1003 * COIN, CENT, rand);
731
731
BOOST_CHECK (result);
732
732
BOOST_CHECK_EQUAL (result->GetSelectedValue (), 1003 * COIN);
733
733
BOOST_CHECK_EQUAL (result->GetInputSet ().size (), 2U );
0 commit comments