83 std::unordered_set<size_t> selected_idx;
84 std::unordered_set<crypto::key_image> selected_kis;
86 size_t roffset = offset >= 0 ? offset : ntrans - offset - 1;
91 unsigned brk_cond = 0;
92 unsigned brk_thresh = num_utxo && min_amount ? 2 : (num_utxo || min_amount ? 1 : 0);
94 #define EVAL_BRK_COND() do { \ 96 if (num_utxo && num_utxo.get() <= cur_utxo) \ 98 if (min_amount && min_amount.get() <= sum) \ 102 for(ssize_t i = roffset; iters < ntrans && !abort; i += step, ++iters)
105 if (brk_cond >= brk_thresh)
108 i = i < 0 ? (i + ntrans) : i % ntrans;
109 auto & td = transfers[i];
114 if (selected_idx.find((
size_t)i) != selected_idx.end()){
115 MERROR(
"Should not happen (selected_idx not found): " << i);
118 if (selected_kis.find(td.m_key_image) != selected_kis.end()){
119 MERROR(
"Should not happen (selected KI): " << i <<
"ki: " <<
dump_keys(td.m_key_image.data));
130 .ntrans=ntrans, .iters=iters, .sum=sum, .cur_utxo=cur_utxo};
132 bool take_it = (fnc_accept.get())(c_info, abort);
139 <<
" ki: " <<
dump_keys(td.m_key_image.data)
140 <<
" amnt: " << td.amount()
141 <<
" rct: " << td.is_rct()
142 <<
" glob: " << td.m_global_output_index);
147 sources.emplace_back(src);
148 selected.push_back((
size_t)i);
149 selected_idx.insert((
size_t)i);
150 selected_kis.insert(td.m_key_image);
152 }
catch(
const std::exception &e){
154 <<
", amnt: " << td.amount() <<
", rct: " << td.is_rct()
155 <<
", glob: " << td.m_global_output_index <<
" is not applicable: " << e.what());
160 return brk_cond >= brk_thresh;
#define CRYPTONOTE_MINED_ETN_UNLOCK_WINDOW
#define CHECK_AND_ASSERT_THROW_MES(expr, message)
unsigned __int64 uint64_t
tools::wallet2::transfer_details * td
std::string dump_keys(T *buff32)
static tools::wallet2::transfer_container & get_transfers(tools::wallet2 *wallet)