diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp index 3702908e7..02f592b61 100644 --- a/src/cryptonote_core/blockchain.cpp +++ b/src/cryptonote_core/blockchain.cpp @@ -2043,6 +2043,7 @@ bool Blockchain::check_tx_inputs(const transaction& tx, uint64_t* pmax_used_bloc { const txin_to_key& in_to_key = boost::get(txin); uint64_t n_outputs = m_db->get_num_outputs(in_to_key.amount); + LOG_PRINT_L2("output size " << print_money(in_to_key.amount) << ": " << n_outputs << " available"); // n_outputs includes the output we're considering if (n_outputs <= 2) ++n_unmixable; diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index cf90d1aca..49e090904 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1587,7 +1587,7 @@ namespace // returns: // direct return: amount of money found // modified reference: selected_transfers, a list of iterators/indices of input sources -uint64_t wallet2::select_transfers(uint64_t needed_money, bool add_dust, uint64_t dust, std::list& selected_transfers) +uint64_t wallet2::select_transfers(uint64_t needed_money, bool add_dust, uint64_t dust, bool hf2_rules, std::list& selected_transfers) { std::vector unused_transfers_indices; std::vector unused_dust_indices; @@ -1602,7 +1602,15 @@ uint64_t wallet2::select_transfers(uint64_t needed_money, bool add_dust, uint64_ if (dust < td.amount() && is_valid_decomposed_amount(td.amount())) unused_transfers_indices.push_back(i); else - unused_dust_indices.push_back(i); + { + // for hf2 rules, we disregard dust, which will be spendable only + // via sweep_dust. If we're asked to add dust, though, we still + // consider them, as this will be a mixin 0 tx (and thus we may + // end up with a tx with one mixable output and N dusty ones). + // This should be made better at some point... + if (!hf2_rules || add_dust) + unused_dust_indices.push_back(i); + } } } diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 6ecfdf026..c9f00bfc9 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -363,7 +363,7 @@ namespace tools void pull_blocks(uint64_t start_height, uint64_t& blocks_start_height, const std::list &short_chain_history, std::list &blocks); void pull_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list &short_chain_history, const std::list &prev_blocks, std::list &blocks, bool &error); void process_blocks(uint64_t start_height, const std::list &blocks, uint64_t& blocks_added); - uint64_t select_transfers(uint64_t needed_money, bool add_dust, uint64_t dust, std::list& selected_transfers); + uint64_t select_transfers(uint64_t needed_money, bool add_dust, uint64_t dust, bool hf2_rules, std::list& selected_transfers); bool prepare_file_names(const std::string& file_path); void process_unconfirmed(const cryptonote::transaction& tx, uint64_t height); void process_outgoing(const cryptonote::transaction& tx, uint64_t height, uint64_t spent, uint64_t received); @@ -564,8 +564,9 @@ namespace tools // randomly select inputs for transaction // throw if requested send amount is greater than amount available to send std::list selected_transfers; - const bool add_dust = (0 == fake_outputs_count) && !use_fork_rules(2); // first fork has version 2 - uint64_t found_money = select_transfers(needed_money, add_dust, dust_policy.dust_threshold, selected_transfers); + bool hf2_rules = use_fork_rules(2); // first fork has version 2 + const bool add_dust = (0 == fake_outputs_count) && hf2_rules; + uint64_t found_money = select_transfers(needed_money, add_dust, dust_policy.dust_threshold, hf2_rules, selected_transfers); THROW_WALLET_EXCEPTION_IF(found_money < needed_money, error::not_enough_money, found_money, needed_money - fee, fee); typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::out_entry out_entry;