diff --git a/src/currency_core/blockchain_storage.cpp b/src/currency_core/blockchain_storage.cpp index b7159ea0..af0675e9 100644 --- a/src/currency_core/blockchain_storage.cpp +++ b/src/currency_core/blockchain_storage.cpp @@ -2700,11 +2700,27 @@ bool blockchain_storage::get_target_outs_for_amount_prezarcanum(const COMMAND_RP std::set used; used.insert(details.own_global_index); size_t try_count = 0; - for (uint64_t j = 0; j != decoys_count && try_count++ < up_index_limit*2;) + for (uint64_t j = 0; j != decoys_count && try_count++ < decoys_count+1;) { - size_t g_index = crypto::rand() % up_index_limit; - if (used.count(g_index)) - continue; + size_t g_index_initial = crypto::rand() % up_index_limit; + size_t g_index = g_index_initial; + //enumerate via whole loop from g_index to up_index_limit and then from 0 to g_index + while (true) + { + if (!used.count(g_index)) + break; + g_index++; + + if (g_index >= up_index_limit) + g_index = 0; + if (g_index == g_index_initial) + { + // we enumerated full circle and couldn't find needed amount of outs + LOG_PRINT_YELLOW("Not enough inputs for amount " << print_money_brief(amount) << ", needed " << decoys_count << ", added " << result_outs.outs.size() << " good outs from " << up_index_limit << " unlocked of " << outs_container_size << " total", LOG_LEVEL_0); + return true; + } + } + bool added = add_out_to_get_random_outs(result_outs, amount, g_index, decoys_count, req.use_forced_mix_outs, req.height_upper_limit); used.insert(g_index); if (added) diff --git a/tests/core_tests/wallet_tests_basic.cpp b/tests/core_tests/wallet_tests_basic.cpp index 511de148..43707ac8 100644 --- a/tests/core_tests/wallet_tests_basic.cpp +++ b/tests/core_tests/wallet_tests_basic.cpp @@ -67,7 +67,7 @@ bool wallet_test::check_balance(currency::core& c, size_t ev_index, const std::v bool has_aliases = false; w->scan_tx_pool(has_aliases); - if (!check_balance_via_wallet(*w.get(), get_test_account_name_by_id(pcb.account_index).c_str(), pcb.total_balance, pcb.mined_balance, pcb.unlocked_balance, pcb.awaiting_in, pcb.awaiting_out)) + if (!check_balance_via_wallet(*w.get(), get_test_account_name_by_id(pcb.account_index).c_str(), pcb.total_balance, INVALID_BALANCE_VAL, pcb.unlocked_balance, pcb.awaiting_in, pcb.awaiting_out)) return false; return true; diff --git a/tests/core_tests/zarcanum_test.cpp b/tests/core_tests/zarcanum_test.cpp index 245eb085..535ba477 100644 --- a/tests/core_tests/zarcanum_test.cpp +++ b/tests/core_tests/zarcanum_test.cpp @@ -215,8 +215,8 @@ bool zarcanum_basic_test::c1(currency::core& c, size_t ev_index, const std::vect uint64_t mined_amount = (batches_to_Alice_count - 1) * COIN; - CHECK_AND_ASSERT_MES(check_balance_via_wallet(*staker_benefeciary_acc_wlt, "staker_benefeciary", mined_amount, mined_amount, mined_amount), false, ""); - CHECK_AND_ASSERT_MES(check_balance_via_wallet(*miner_benefeciary_acc_wlt, "miner_benefeciary", mined_amount, mined_amount, mined_amount), false, ""); + CHECK_AND_ASSERT_MES(check_balance_via_wallet(*staker_benefeciary_acc_wlt, "staker_benefeciary", mined_amount, INVALID_BALANCE_VAL, mined_amount), false, ""); + CHECK_AND_ASSERT_MES(check_balance_via_wallet(*miner_benefeciary_acc_wlt, "miner_benefeciary", mined_amount, INVALID_BALANCE_VAL, mined_amount), false, ""); staker_benefeciary_acc_wlt->transfer(transfer_amount2, bob_wlt->get_account().get_public_address()); @@ -234,7 +234,7 @@ bool zarcanum_basic_test::c1(currency::core& c, size_t ev_index, const std::vect bob_wlt->refresh(); - CHECK_AND_ASSERT_MES(check_balance_via_wallet(*bob_wlt, "Bob", transfer_amount2*3, UINT64_MAX, transfer_amount2*3), false, ""); + CHECK_AND_ASSERT_MES(check_balance_via_wallet(*bob_wlt, "Bob", transfer_amount2*3, INVALID_BALANCE_VAL, transfer_amount2*3), false, ""); //try to make pre-zarcanum block after hardfork 4 currency::core_runtime_config rc = alice_wlt->get_core_runtime_config(); @@ -712,8 +712,13 @@ bool zarcanum_in_alt_chain::c1(currency::core& c, size_t ev_index, const std::ve uint64_t transfer_amount = COIN; uint64_t transfer_fee = TESTS_DEFAULT_FEE * 3; - size_t nmix = 38; - bob_wlt->transfer(transfer_amount, nmix, m_accounts[ALICE_ACC_IDX].get_public_address(), transfer_fee); + size_t nmix = 36; + try { + bob_wlt->transfer(transfer_amount, nmix, m_accounts[ALICE_ACC_IDX].get_public_address(), transfer_fee); + } + catch (...) + { + } CHECK_AND_FORCE_ASSERT_MES(c.get_pool_transactions_count() == 3, false, "Incorrect txs count in the pool: " << c.get_pool_transactions_count());