@@ -85,6 +85,7 @@ FUZZ_TARGET(coinselection)
85
85
const CFeeRate long_term_fee_rate{ConsumeMoney (fuzzed_data_provider, /* max=*/ COIN)};
86
86
const CFeeRate effective_fee_rate{ConsumeMoney (fuzzed_data_provider, /* max=*/ COIN)};
87
87
const CAmount cost_of_change{ConsumeMoney (fuzzed_data_provider, /* max=*/ COIN)};
88
+ const CAmount min_viable_change{ConsumeMoney (fuzzed_data_provider, /* max=*/ COIN)};
88
89
const CAmount target{fuzzed_data_provider.ConsumeIntegralInRange <CAmount>(1 , MAX_MONEY)};
89
90
const bool subtract_fee_outputs{fuzzed_data_provider.ConsumeBool ()};
90
91
@@ -93,6 +94,8 @@ FUZZ_TARGET(coinselection)
93
94
coin_params.m_subtract_fee_outputs = subtract_fee_outputs;
94
95
coin_params.m_long_term_feerate = long_term_fee_rate;
95
96
coin_params.m_effective_feerate = effective_fee_rate;
97
+ coin_params.min_viable_change = min_viable_change;
98
+ coin_params.m_cost_of_change = cost_of_change;
96
99
coin_params.change_output_size = fuzzed_data_provider.ConsumeIntegralInRange <int >(10 , 1000 );
97
100
coin_params.m_change_fee = effective_fee_rate.GetFee (coin_params.change_output_size );
98
101
@@ -110,7 +113,7 @@ FUZZ_TARGET(coinselection)
110
113
}
111
114
112
115
// Run coinselection algorithms
113
- auto result_bnb = SelectCoinsBnB (group_pos, target, cost_of_change , MAX_STANDARD_TX_WEIGHT);
116
+ auto result_bnb = SelectCoinsBnB (group_pos, target, coin_params. m_cost_of_change , MAX_STANDARD_TX_WEIGHT);
114
117
if (result_bnb) {
115
118
(void )result_bnb->GetShuffledInputVector ();
116
119
(void )result_bnb->GetInputSet ();
@@ -119,15 +122,15 @@ FUZZ_TARGET(coinselection)
119
122
auto result_srd = SelectCoinsSRD (group_pos, target, coin_params.m_change_fee , fast_random_context, MAX_STANDARD_TX_WEIGHT);
120
123
if (result_srd) {
121
124
assert (result_srd->GetChange (CHANGE_LOWER, coin_params.m_change_fee ) > 0 ); // Demonstrate that SRD creates change of at least CHANGE_LOWER
122
- result_srd->ComputeAndSetWaste (cost_of_change, cost_of_change, 0 );
125
+ result_srd->ComputeAndSetWaste (coin_params. min_viable_change , coin_params. m_cost_of_change , coin_params. m_change_fee );
123
126
(void )result_srd->GetShuffledInputVector ();
124
127
(void )result_srd->GetInputSet ();
125
128
}
126
129
127
130
CAmount change_target{GenerateChangeTarget (target, coin_params.m_change_fee , fast_random_context)};
128
131
auto result_knapsack = KnapsackSolver (group_all, target, change_target, fast_random_context, MAX_STANDARD_TX_WEIGHT);
129
132
if (result_knapsack) {
130
- result_knapsack->ComputeAndSetWaste (cost_of_change, cost_of_change, 0 );
133
+ result_knapsack->ComputeAndSetWaste (coin_params. min_viable_change , coin_params. m_cost_of_change , coin_params. m_change_fee );
131
134
(void )result_knapsack->GetShuffledInputVector ();
132
135
(void )result_knapsack->GetInputSet ();
133
136
}
0 commit comments