@@ -86,7 +86,6 @@ FUZZ_TARGET(coinselection)
86
86
const CFeeRate effective_fee_rate{ConsumeMoney (fuzzed_data_provider, /* max=*/ COIN)};
87
87
// Discard feerate must be at least dust relay feerate
88
88
const CFeeRate discard_fee_rate{fuzzed_data_provider.ConsumeIntegralInRange <CAmount>(DUST_RELAY_TX_FEE, COIN)};
89
- const CAmount min_viable_change{ConsumeMoney (fuzzed_data_provider, /* max=*/ COIN)};
90
89
const CAmount target{fuzzed_data_provider.ConsumeIntegralInRange <CAmount>(1 , MAX_MONEY)};
91
90
const bool subtract_fee_outputs{fuzzed_data_provider.ConsumeBool ()};
92
91
@@ -95,12 +94,15 @@ FUZZ_TARGET(coinselection)
95
94
coin_params.m_subtract_fee_outputs = subtract_fee_outputs;
96
95
coin_params.m_long_term_feerate = long_term_fee_rate;
97
96
coin_params.m_effective_feerate = effective_fee_rate;
98
- coin_params.min_viable_change = min_viable_change;
99
- coin_params.change_output_size = fuzzed_data_provider.ConsumeIntegralInRange <int >(10 , 1000 );
97
+ coin_params.change_output_size = fuzzed_data_provider.ConsumeIntegralInRange (1 , MAX_SCRIPT_SIZE);
100
98
coin_params.m_change_fee = effective_fee_rate.GetFee (coin_params.change_output_size );
101
99
coin_params.m_discard_feerate = discard_fee_rate;
102
100
coin_params.change_spend_size = fuzzed_data_provider.ConsumeIntegralInRange <int >(41 , 1000 );
103
- coin_params.m_cost_of_change = coin_params.m_change_fee + coin_params.m_discard_feerate .GetFee (coin_params.change_spend_size );
101
+ const auto change_spend_fee{coin_params.m_discard_feerate .GetFee (coin_params.change_spend_size )};
102
+ coin_params.m_cost_of_change = coin_params.m_change_fee + change_spend_fee;
103
+ CScript change_out_script = CScript () << std::vector<unsigned char >(coin_params.change_output_size , OP_TRUE);
104
+ const auto dust{GetDustThreshold (CTxOut{/* nValueIn=*/ 0 , change_out_script}, coin_params.m_discard_feerate )};
105
+ coin_params.min_viable_change = std::max (change_spend_fee + 1 , dust);
104
106
105
107
int next_locktime{0 };
106
108
CAmount total_balance{CreateCoins (fuzzed_data_provider, utxo_pool, coin_params, next_locktime)};
@@ -119,7 +121,7 @@ FUZZ_TARGET(coinselection)
119
121
auto result_bnb = coin_params.m_subtract_fee_outputs ? util::Error{Untranslated (" BnB disabled when SFFO is enabled" )} :
120
122
SelectCoinsBnB (group_pos, target, coin_params.m_cost_of_change , MAX_STANDARD_TX_WEIGHT);
121
123
if (result_bnb) {
122
- assert (result_bnb->GetChange (coin_params.m_cost_of_change , CAmount{ 0 } ) == 0 );
124
+ assert (result_bnb->GetChange (coin_params.min_viable_change , coin_params. m_change_fee ) == 0 );
123
125
assert (result_bnb->GetSelectedValue () >= target);
124
126
(void )result_bnb->GetShuffledInputVector ();
125
127
(void )result_bnb->GetInputSet ();
0 commit comments