From adce8ae466cd86167f55b757dcf1188850f1cb27 Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Sun, 27 Aug 2017 21:04:56 +0100 Subject: simplewallet: new "fee" command to display fee information including expected transaction backlog at different priorities --- src/simplewallet/simplewallet.cpp | 69 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 3 deletions(-) (limited to 'src/simplewallet/simplewallet.cpp') diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index 479adcafc..ecdae2891 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -391,6 +391,61 @@ bool simple_wallet::payment_id(const std::vector &args/* = std::vec return true; } +bool simple_wallet::print_fee_info(const std::vector &args/* = std::vector()*/) +{ + if (!try_connect_to_daemon()) + { + fail_msg_writer() << tr("Cannot connect to daemon"); + return true; + } + const uint64_t per_kb_fee = m_wallet->get_per_kb_fee(); + const uint64_t typical_size_kb = 13; + message_writer() << (boost::format(tr("Current fee is %s monero per kB")) % print_money(per_kb_fee)).str(); + + std::vector fees; + for (uint32_t priority = 1; priority <= 4; ++priority) + { + uint64_t mult = m_wallet->get_fee_multiplier(priority); + fees.push_back(per_kb_fee * typical_size_kb * mult); + } + std::vector> blocks; + try + { + uint64_t base_size = typical_size_kb * 1024; + blocks = m_wallet->estimate_backlog(base_size, base_size + 1023, fees); + } + catch (const std::exception &e) + { + fail_msg_writer() << tr("Error: failed to estimate backlog array size: ") << e.what(); + return true; + } + if (blocks.size() != 4) + { + fail_msg_writer() << tr("Error: bad estimated backlog array size"); + return true; + } + + for (uint32_t priority = 1; priority <= 4; ++priority) + { + uint64_t nblocks_low = blocks[priority - 1].first; + uint64_t nblocks_high = blocks[priority - 1].second; + if (nblocks_low > 0) + { + std::string msg; + if (priority == m_wallet->get_default_priority() || (m_wallet->get_default_priority() == 0 && priority == 2)) + msg = tr(" (current)"); + uint64_t minutes_low = nblocks_low * DIFFICULTY_TARGET_V2 / 60, minutes_high = nblocks_high * DIFFICULTY_TARGET_V2 / 60; + if (nblocks_high == nblocks_low) + message_writer() << (boost::format(tr("%u block (%u minutes) backlog at priority %u%s")) % nblocks_low % minutes_low % priority % msg).str(); + else + message_writer() << (boost::format(tr("%u to %u block (%u to %u minutes) backlog at priority %u")) % nblocks_low % nblocks_high % minutes_low % minutes_high % priority).str(); + } + else + message_writer() << tr("No backlog at priority ") << priority; + } + return true; +} + bool simple_wallet::set_always_confirm_transfers(const std::vector &args/* = std::vector()*/) { const auto pwd_container = get_and_verify_password(); @@ -722,6 +777,7 @@ simple_wallet::simple_wallet() m_cmd_binder.set_handler("show_transfer", boost::bind(&simple_wallet::show_transfer, this, _1), tr("Show information about a transfer to/from this address")); m_cmd_binder.set_handler("password", boost::bind(&simple_wallet::change_password, this, _1), tr("Change wallet password")); m_cmd_binder.set_handler("payment_id", boost::bind(&simple_wallet::payment_id, this, _1), tr("Generate a new random full size payment id - these will be unencrypted on the blockchain, see integrated_address for encrypted short payment ids")); + m_cmd_binder.set_handler("fee", boost::bind(&simple_wallet::print_fee_info, this, _1), tr("Print information about fee and current transaction backlog")); m_cmd_binder.set_handler("help", boost::bind(&simple_wallet::help, this, _1), tr("Show this help")); } //---------------------------------------------------------------------------------------------------- @@ -2461,9 +2517,16 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vectorestimate_backlog(size, fee); - if (nblocks > 0) - prompt << (boost::format(tr("There is currently a %u block backlog at that fee level. Is this okay? (Y/Yes/N/No)")) % nblocks).str(); + std::vector> nblocks = m_wallet->estimate_backlog(size, size, {fee}); + if (nblocks.size() != 1) + { + prompt << "Internal error checking for backlog. " << tr("Is this okay anyway? (Y/Yes/N/No): "); + } + else + { + if (nblocks[0].first > 0) + prompt << (boost::format(tr("There is currently a %u block backlog at that fee level. Is this okay? (Y/Yes/N/No)")) % nblocks[0].first).str(); + } } catch (const std::exception &e) { -- cgit v1.2.3