mirror of
https://github.com/monero-project/monero.git
synced 2024-12-24 12:39:59 +00:00
Merge pull request #1220
e76dcdd
wallet: improve error messages when not enough money for transfer (moneromooo-monero)
This commit is contained in:
commit
9feb358e46
4 changed files with 87 additions and 9 deletions
|
@ -2563,13 +2563,20 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
|
||||||
fail_msg_writer() << tr("failed to get random outputs to mix");
|
fail_msg_writer() << tr("failed to get random outputs to mix");
|
||||||
}
|
}
|
||||||
catch (const tools::error::not_enough_money& e)
|
catch (const tools::error::not_enough_money& e)
|
||||||
|
{
|
||||||
|
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, sent amount %s") %
|
||||||
|
print_money(e.available()) %
|
||||||
|
print_money(e.tx_amount()));
|
||||||
|
fail_msg_writer() << tr("Not enough money in unlocked balance");
|
||||||
|
}
|
||||||
|
catch (const tools::error::tx_not_possible& e)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)") %
|
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)") %
|
||||||
print_money(e.available()) %
|
print_money(e.available()) %
|
||||||
print_money(e.tx_amount() + e.fee()) %
|
print_money(e.tx_amount() + e.fee()) %
|
||||||
print_money(e.tx_amount()) %
|
print_money(e.tx_amount()) %
|
||||||
print_money(e.fee()));
|
print_money(e.fee()));
|
||||||
fail_msg_writer() << tr("Failed to find a way to create transactions. This is usually due to dust which is so small it cannot pay for itself in fees");
|
fail_msg_writer() << tr("Failed to find a way to create transactions. This is usually due to dust which is so small it cannot pay for itself in fees, or trying to send more money than the unlocked balance, or not leaving enough for fees");
|
||||||
}
|
}
|
||||||
catch (const tools::error::not_enough_outs_to_mix& e)
|
catch (const tools::error::not_enough_outs_to_mix& e)
|
||||||
{
|
{
|
||||||
|
@ -2824,13 +2831,20 @@ bool simple_wallet::locked_transfer(const std::vector<std::string> &args_)
|
||||||
fail_msg_writer() << tr("failed to get random outputs to mix");
|
fail_msg_writer() << tr("failed to get random outputs to mix");
|
||||||
}
|
}
|
||||||
catch (const tools::error::not_enough_money& e)
|
catch (const tools::error::not_enough_money& e)
|
||||||
|
{
|
||||||
|
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, sent amount %s") %
|
||||||
|
print_money(e.available()) %
|
||||||
|
print_money(e.tx_amount()));
|
||||||
|
fail_msg_writer() << tr("Not enough money in unlocked balance");
|
||||||
|
}
|
||||||
|
catch (const tools::error::tx_not_possible& e)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)") %
|
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)") %
|
||||||
print_money(e.available()) %
|
print_money(e.available()) %
|
||||||
print_money(e.tx_amount() + e.fee()) %
|
print_money(e.tx_amount() + e.fee()) %
|
||||||
print_money(e.tx_amount()) %
|
print_money(e.tx_amount()) %
|
||||||
print_money(e.fee()));
|
print_money(e.fee()));
|
||||||
fail_msg_writer() << tr("Not enough money to transfer.");
|
fail_msg_writer() << tr("Failed to find a way to create transactions. This is usually due to dust which is so small it cannot pay for itself in fees, or trying to send more money than the unlocked balance, or not leaving enough for fees");
|
||||||
}
|
}
|
||||||
catch (const tools::error::not_enough_outs_to_mix& e)
|
catch (const tools::error::not_enough_outs_to_mix& e)
|
||||||
{
|
{
|
||||||
|
@ -2983,13 +2997,20 @@ bool simple_wallet::sweep_unmixable(const std::vector<std::string> &args_)
|
||||||
fail_msg_writer() << tr("failed to get random outputs to mix");
|
fail_msg_writer() << tr("failed to get random outputs to mix");
|
||||||
}
|
}
|
||||||
catch (const tools::error::not_enough_money& e)
|
catch (const tools::error::not_enough_money& e)
|
||||||
|
{
|
||||||
|
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, sent amount %s") %
|
||||||
|
print_money(e.available()) %
|
||||||
|
print_money(e.tx_amount()));
|
||||||
|
fail_msg_writer() << tr("Not enough money in unlocked balance");
|
||||||
|
}
|
||||||
|
catch (const tools::error::tx_not_possible& e)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)") %
|
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)") %
|
||||||
print_money(e.available()) %
|
print_money(e.available()) %
|
||||||
print_money(e.tx_amount() + e.fee()) %
|
print_money(e.tx_amount() + e.fee()) %
|
||||||
print_money(e.tx_amount()) %
|
print_money(e.tx_amount()) %
|
||||||
print_money(e.fee()));
|
print_money(e.fee()));
|
||||||
fail_msg_writer() << tr("Failed to find a way to create transactions. This is usually due to dust which is so small it cannot pay for itself in fees");
|
fail_msg_writer() << tr("Failed to find a way to create transactions. This is usually due to dust which is so small it cannot pay for itself in fees, or trying to send more money than the unlocked balance, or not leaving enough for fees");
|
||||||
}
|
}
|
||||||
catch (const tools::error::not_enough_outs_to_mix& e)
|
catch (const tools::error::not_enough_outs_to_mix& e)
|
||||||
{
|
{
|
||||||
|
@ -3238,13 +3259,20 @@ bool simple_wallet::sweep_all(const std::vector<std::string> &args_)
|
||||||
fail_msg_writer() << tr("failed to get random outputs to mix");
|
fail_msg_writer() << tr("failed to get random outputs to mix");
|
||||||
}
|
}
|
||||||
catch (const tools::error::not_enough_money& e)
|
catch (const tools::error::not_enough_money& e)
|
||||||
|
{
|
||||||
|
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, sent amount %s") %
|
||||||
|
print_money(e.available()) %
|
||||||
|
print_money(e.tx_amount()));
|
||||||
|
fail_msg_writer() << tr("Not enough money in unlocked balance");
|
||||||
|
}
|
||||||
|
catch (const tools::error::tx_not_possible& e)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)") %
|
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)") %
|
||||||
print_money(e.available()) %
|
print_money(e.available()) %
|
||||||
print_money(e.tx_amount() + e.fee()) %
|
print_money(e.tx_amount() + e.fee()) %
|
||||||
print_money(e.tx_amount()) %
|
print_money(e.tx_amount()) %
|
||||||
print_money(e.fee()));
|
print_money(e.fee()));
|
||||||
fail_msg_writer() << tr("Failed to find a way to create transactions. This is usually due to dust which is so small it cannot pay for itself in fees");
|
fail_msg_writer() << tr("Failed to find a way to create transactions. This is usually due to dust which is so small it cannot pay for itself in fees, or trying to send more money than the unlocked balance, or not leaving enough for fees");
|
||||||
}
|
}
|
||||||
catch (const tools::error::not_enough_outs_to_mix& e)
|
catch (const tools::error::not_enough_outs_to_mix& e)
|
||||||
{
|
{
|
||||||
|
@ -3472,11 +3500,19 @@ bool simple_wallet::submit_transfer(const std::vector<std::string> &args_)
|
||||||
}
|
}
|
||||||
catch (const tools::error::not_enough_money& e)
|
catch (const tools::error::not_enough_money& e)
|
||||||
{
|
{
|
||||||
fail_msg_writer() << boost::format(tr("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)")) %
|
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, sent amount %s") %
|
||||||
print_money(e.available()) %
|
print_money(e.available()) %
|
||||||
print_money(e.tx_amount() + e.fee()) %
|
print_money(e.tx_amount()));
|
||||||
|
fail_msg_writer() << tr("Not enough money in unlocked balance");
|
||||||
|
}
|
||||||
|
catch (const tools::error::tx_not_possible& e)
|
||||||
|
{
|
||||||
|
LOG_PRINT_L0(boost::format("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)") %
|
||||||
|
print_money(e.available()) %
|
||||||
|
print_money(e.tx_amount() + e.fee()) %
|
||||||
print_money(e.tx_amount()) %
|
print_money(e.tx_amount()) %
|
||||||
print_money(e.fee());
|
print_money(e.fee()));
|
||||||
|
fail_msg_writer() << tr("Failed to find a way to create transactions. This is usually due to dust which is so small it cannot pay for itself in fees, or trying to send more money than the unlocked balance, or not leaving enough for fees");
|
||||||
}
|
}
|
||||||
catch (const tools::error::not_enough_outs_to_mix& e)
|
catch (const tools::error::not_enough_outs_to_mix& e)
|
||||||
{
|
{
|
||||||
|
|
|
@ -595,6 +595,15 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const
|
||||||
m_status = Status_Error;
|
m_status = Status_Error;
|
||||||
std::ostringstream writer;
|
std::ostringstream writer;
|
||||||
|
|
||||||
|
writer << boost::format(tr("not enough money to transfer, available only %s, sent amount %s")) %
|
||||||
|
print_money(e.available()) %
|
||||||
|
print_money(e.tx_amount());
|
||||||
|
m_errorString = writer.str();
|
||||||
|
|
||||||
|
} catch (const tools::error::tx_not_possible& e) {
|
||||||
|
m_status = Status_Error;
|
||||||
|
std::ostringstream writer;
|
||||||
|
|
||||||
writer << boost::format(tr("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)")) %
|
writer << boost::format(tr("not enough money to transfer, available only %s, transaction amount %s = %s + %s (fee)")) %
|
||||||
print_money(e.available()) %
|
print_money(e.available()) %
|
||||||
print_money(e.tx_amount() + e.fee()) %
|
print_money(e.tx_amount() + e.fee()) %
|
||||||
|
|
|
@ -3489,6 +3489,12 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
|
||||||
}
|
}
|
||||||
LOG_PRINT_L2("Starting with " << unused_transfers_indices.size() << " non-dust outputs and " << unused_dust_indices.size() << " dust outputs");
|
LOG_PRINT_L2("Starting with " << unused_transfers_indices.size() << " non-dust outputs and " << unused_dust_indices.size() << " dust outputs");
|
||||||
|
|
||||||
|
// early out if we know we can't make it anyway
|
||||||
|
// we could also check for being within FEE_PER_KB, but if the fee calculation
|
||||||
|
// ever changes, this might be missed, so let this go through
|
||||||
|
THROW_WALLET_EXCEPTION_IF(needed_money > unlocked_balance(), error::not_enough_money,
|
||||||
|
unlocked_balance(), needed_money, 0);
|
||||||
|
|
||||||
if (unused_dust_indices.empty() && unused_transfers_indices.empty())
|
if (unused_dust_indices.empty() && unused_transfers_indices.empty())
|
||||||
return std::vector<wallet2::pending_tx>();
|
return std::vector<wallet2::pending_tx>();
|
||||||
|
|
||||||
|
@ -3529,7 +3535,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
|
||||||
// if we need to spend money and don't have any left, we fail
|
// if we need to spend money and don't have any left, we fail
|
||||||
if (unused_dust_indices.empty() && unused_transfers_indices.empty()) {
|
if (unused_dust_indices.empty() && unused_transfers_indices.empty()) {
|
||||||
LOG_PRINT_L2("No more outputs to choose from");
|
LOG_PRINT_L2("No more outputs to choose from");
|
||||||
THROW_WALLET_EXCEPTION_IF(1, error::not_enough_money, unlocked_balance(), needed_money, accumulated_fee + needed_fee);
|
THROW_WALLET_EXCEPTION_IF(1, error::tx_not_possible, unlocked_balance(), needed_money, accumulated_fee + needed_fee);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get a random unspent output and use it to pay part (or all) of the current destination (and maybe next one, etc)
|
// get a random unspent output and use it to pay part (or all) of the current destination (and maybe next one, etc)
|
||||||
|
@ -3669,7 +3675,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
|
||||||
if (adding_fee)
|
if (adding_fee)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L1("We ran out of outputs while trying to gather final fee");
|
LOG_PRINT_L1("We ran out of outputs while trying to gather final fee");
|
||||||
THROW_WALLET_EXCEPTION_IF(1, error::not_enough_money, unlocked_balance(), needed_money, accumulated_fee + needed_fee);
|
THROW_WALLET_EXCEPTION_IF(1, error::tx_not_possible, unlocked_balance(), needed_money, accumulated_fee + needed_fee);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_PRINT_L1("Done creating " << txes.size() << " transactions, " << print_money(accumulated_fee) <<
|
LOG_PRINT_L1("Done creating " << txes.size() << " transactions, " << print_money(accumulated_fee) <<
|
||||||
|
|
|
@ -68,6 +68,7 @@ namespace tools
|
||||||
// transfer_error *
|
// transfer_error *
|
||||||
// get_random_outs_general_error
|
// get_random_outs_general_error
|
||||||
// not_enough_money
|
// not_enough_money
|
||||||
|
// tx_not_possible
|
||||||
// not_enough_outs_to_mix
|
// not_enough_outs_to_mix
|
||||||
// tx_not_constructed
|
// tx_not_constructed
|
||||||
// tx_rejected
|
// tx_rejected
|
||||||
|
@ -351,6 +352,32 @@ namespace tools
|
||||||
: transfer_error(std::move(loc), "not enough money")
|
: transfer_error(std::move(loc), "not enough money")
|
||||||
, m_available(availbable)
|
, m_available(availbable)
|
||||||
, m_tx_amount(tx_amount)
|
, m_tx_amount(tx_amount)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t available() const { return m_available; }
|
||||||
|
uint64_t tx_amount() const { return m_tx_amount; }
|
||||||
|
|
||||||
|
std::string to_string() const
|
||||||
|
{
|
||||||
|
std::ostringstream ss;
|
||||||
|
ss << transfer_error::to_string() <<
|
||||||
|
", available = " << cryptonote::print_money(m_available) <<
|
||||||
|
", tx_amount = " << cryptonote::print_money(m_tx_amount);
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint64_t m_available;
|
||||||
|
uint64_t m_tx_amount;
|
||||||
|
};
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
struct tx_not_possible : public transfer_error
|
||||||
|
{
|
||||||
|
explicit tx_not_possible(std::string&& loc, uint64_t availbable, uint64_t tx_amount, uint64_t fee)
|
||||||
|
: transfer_error(std::move(loc), "tx not possible")
|
||||||
|
, m_available(availbable)
|
||||||
|
, m_tx_amount(tx_amount)
|
||||||
, m_fee(fee)
|
, m_fee(fee)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue