Merge pull request #5952
93d5cf2
wallet2: add ignore-outputs-{above/below} option (stoffu)
This commit is contained in:
commit
40e71742a0
@ -2659,6 +2659,43 @@ bool simple_wallet::set_ignore_fractional_outputs(const std::vector<std::string>
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool simple_wallet::set_ignore_outputs_above(const std::vector<std::string> &args/* = std::vector<std::string>()*/)
|
||||||
|
{
|
||||||
|
const auto pwd_container = get_and_verify_password();
|
||||||
|
if (pwd_container)
|
||||||
|
{
|
||||||
|
uint64_t amount;
|
||||||
|
if (!cryptonote::parse_amount(amount, args[1]))
|
||||||
|
{
|
||||||
|
fail_msg_writer() << tr("Invalid amount");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (amount == 0)
|
||||||
|
amount = MONEY_SUPPLY;
|
||||||
|
m_wallet->ignore_outputs_above(amount);
|
||||||
|
m_wallet->rewrite(m_wallet_file, pwd_container->password());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool simple_wallet::set_ignore_outputs_below(const std::vector<std::string> &args/* = std::vector<std::string>()*/)
|
||||||
|
{
|
||||||
|
const auto pwd_container = get_and_verify_password();
|
||||||
|
if (pwd_container)
|
||||||
|
{
|
||||||
|
uint64_t amount;
|
||||||
|
if (!cryptonote::parse_amount(amount, args[1]))
|
||||||
|
{
|
||||||
|
fail_msg_writer() << tr("Invalid amount");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
m_wallet->ignore_outputs_below(amount);
|
||||||
|
m_wallet->rewrite(m_wallet_file, pwd_container->password());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool simple_wallet::set_track_uses(const std::vector<std::string> &args/* = std::vector<std::string>()*/)
|
bool simple_wallet::set_track_uses(const std::vector<std::string> &args/* = std::vector<std::string>()*/)
|
||||||
{
|
{
|
||||||
const auto pwd_container = get_and_verify_password();
|
const auto pwd_container = get_and_verify_password();
|
||||||
@ -2973,6 +3010,10 @@ simple_wallet::simple_wallet()
|
|||||||
" Set to the height of a key reusing fork you want to use, 0 to use default.\n "
|
" Set to the height of a key reusing fork you want to use, 0 to use default.\n "
|
||||||
"ignore-fractional-outputs <1|0>\n "
|
"ignore-fractional-outputs <1|0>\n "
|
||||||
" Whether to ignore fractional outputs that result in net loss when spending due to fee.\n "
|
" Whether to ignore fractional outputs that result in net loss when spending due to fee.\n "
|
||||||
|
"ignore-outputs-above <amount>\n "
|
||||||
|
" Ignore outputs of amount above this threshold when spending. Value 0 is translated to the maximum value (18 million) which disables this filter.\n "
|
||||||
|
"ignore-outputs-below <amount>\n "
|
||||||
|
" Ignore outputs of amount below this threshold when spending.\n "
|
||||||
"track-uses <1|0>\n "
|
"track-uses <1|0>\n "
|
||||||
" Whether to keep track of owned outputs uses.\n "
|
" Whether to keep track of owned outputs uses.\n "
|
||||||
"setup-background-mining <1|0>\n "
|
"setup-background-mining <1|0>\n "
|
||||||
@ -3349,6 +3390,8 @@ bool simple_wallet::set_variable(const std::vector<std::string> &args)
|
|||||||
success_msg_writer() << "subaddress-lookahead = " << lookahead.first << ":" << lookahead.second;
|
success_msg_writer() << "subaddress-lookahead = " << lookahead.first << ":" << lookahead.second;
|
||||||
success_msg_writer() << "segregation-height = " << m_wallet->segregation_height();
|
success_msg_writer() << "segregation-height = " << m_wallet->segregation_height();
|
||||||
success_msg_writer() << "ignore-fractional-outputs = " << m_wallet->ignore_fractional_outputs();
|
success_msg_writer() << "ignore-fractional-outputs = " << m_wallet->ignore_fractional_outputs();
|
||||||
|
success_msg_writer() << "ignore-outputs-above = " << cryptonote::print_money(m_wallet->ignore_outputs_above());
|
||||||
|
success_msg_writer() << "ignore-outputs-below = " << cryptonote::print_money(m_wallet->ignore_outputs_below());
|
||||||
success_msg_writer() << "track-uses = " << m_wallet->track_uses();
|
success_msg_writer() << "track-uses = " << m_wallet->track_uses();
|
||||||
success_msg_writer() << "setup-background-mining = " << setup_background_mining_string;
|
success_msg_writer() << "setup-background-mining = " << setup_background_mining_string;
|
||||||
success_msg_writer() << "device-name = " << m_wallet->device_name();
|
success_msg_writer() << "device-name = " << m_wallet->device_name();
|
||||||
@ -3412,6 +3455,8 @@ bool simple_wallet::set_variable(const std::vector<std::string> &args)
|
|||||||
CHECK_SIMPLE_VARIABLE("subaddress-lookahead", set_subaddress_lookahead, tr("<major>:<minor>"));
|
CHECK_SIMPLE_VARIABLE("subaddress-lookahead", set_subaddress_lookahead, tr("<major>:<minor>"));
|
||||||
CHECK_SIMPLE_VARIABLE("segregation-height", set_segregation_height, tr("unsigned integer"));
|
CHECK_SIMPLE_VARIABLE("segregation-height", set_segregation_height, tr("unsigned integer"));
|
||||||
CHECK_SIMPLE_VARIABLE("ignore-fractional-outputs", set_ignore_fractional_outputs, tr("0 or 1"));
|
CHECK_SIMPLE_VARIABLE("ignore-fractional-outputs", set_ignore_fractional_outputs, tr("0 or 1"));
|
||||||
|
CHECK_SIMPLE_VARIABLE("ignore-outputs-above", set_ignore_outputs_above, tr("amount"));
|
||||||
|
CHECK_SIMPLE_VARIABLE("ignore-outputs-below", set_ignore_outputs_below, tr("amount"));
|
||||||
CHECK_SIMPLE_VARIABLE("track-uses", set_track_uses, tr("0 or 1"));
|
CHECK_SIMPLE_VARIABLE("track-uses", set_track_uses, tr("0 or 1"));
|
||||||
CHECK_SIMPLE_VARIABLE("inactivity-lock-timeout", set_inactivity_lock_timeout, tr("unsigned integer (seconds, 0 to disable)"));
|
CHECK_SIMPLE_VARIABLE("inactivity-lock-timeout", set_inactivity_lock_timeout, tr("unsigned integer (seconds, 0 to disable)"));
|
||||||
CHECK_SIMPLE_VARIABLE("setup-background-mining", set_setup_background_mining, tr("1/yes or 0/no"));
|
CHECK_SIMPLE_VARIABLE("setup-background-mining", set_setup_background_mining, tr("1/yes or 0/no"));
|
||||||
|
@ -144,6 +144,8 @@ namespace cryptonote
|
|||||||
bool set_subaddress_lookahead(const std::vector<std::string> &args = std::vector<std::string>());
|
bool set_subaddress_lookahead(const std::vector<std::string> &args = std::vector<std::string>());
|
||||||
bool set_segregation_height(const std::vector<std::string> &args = std::vector<std::string>());
|
bool set_segregation_height(const std::vector<std::string> &args = std::vector<std::string>());
|
||||||
bool set_ignore_fractional_outputs(const std::vector<std::string> &args = std::vector<std::string>());
|
bool set_ignore_fractional_outputs(const std::vector<std::string> &args = std::vector<std::string>());
|
||||||
|
bool set_ignore_outputs_above(const std::vector<std::string> &args = std::vector<std::string>());
|
||||||
|
bool set_ignore_outputs_below(const std::vector<std::string> &args = std::vector<std::string>());
|
||||||
bool set_track_uses(const std::vector<std::string> &args = std::vector<std::string>());
|
bool set_track_uses(const std::vector<std::string> &args = std::vector<std::string>());
|
||||||
bool set_inactivity_lock_timeout(const std::vector<std::string> &args = std::vector<std::string>());
|
bool set_inactivity_lock_timeout(const std::vector<std::string> &args = std::vector<std::string>());
|
||||||
bool set_setup_background_mining(const std::vector<std::string> &args = std::vector<std::string>());
|
bool set_setup_background_mining(const std::vector<std::string> &args = std::vector<std::string>());
|
||||||
|
@ -1128,6 +1128,8 @@ wallet2::wallet2(network_type nettype, uint64_t kdf_rounds, bool unattended):
|
|||||||
m_key_reuse_mitigation2(true),
|
m_key_reuse_mitigation2(true),
|
||||||
m_segregation_height(0),
|
m_segregation_height(0),
|
||||||
m_ignore_fractional_outputs(true),
|
m_ignore_fractional_outputs(true),
|
||||||
|
m_ignore_outputs_above(MONEY_SUPPLY),
|
||||||
|
m_ignore_outputs_below(0),
|
||||||
m_track_uses(false),
|
m_track_uses(false),
|
||||||
m_inactivity_lock_timeout(DEFAULT_INACTIVITY_LOCK_TIMEOUT),
|
m_inactivity_lock_timeout(DEFAULT_INACTIVITY_LOCK_TIMEOUT),
|
||||||
m_setup_background_mining(BackgroundMiningMaybe),
|
m_setup_background_mining(BackgroundMiningMaybe),
|
||||||
@ -3695,6 +3697,12 @@ bool wallet2::store_keys(const std::string& keys_file_name, const epee::wipeable
|
|||||||
value2.SetInt(m_ignore_fractional_outputs ? 1 : 0);
|
value2.SetInt(m_ignore_fractional_outputs ? 1 : 0);
|
||||||
json.AddMember("ignore_fractional_outputs", value2, json.GetAllocator());
|
json.AddMember("ignore_fractional_outputs", value2, json.GetAllocator());
|
||||||
|
|
||||||
|
value2.SetUint64(m_ignore_outputs_above);
|
||||||
|
json.AddMember("ignore_outputs_above", value2, json.GetAllocator());
|
||||||
|
|
||||||
|
value2.SetUint64(m_ignore_outputs_below);
|
||||||
|
json.AddMember("ignore_outputs_below", value2, json.GetAllocator());
|
||||||
|
|
||||||
value2.SetInt(m_track_uses ? 1 : 0);
|
value2.SetInt(m_track_uses ? 1 : 0);
|
||||||
json.AddMember("track_uses", value2, json.GetAllocator());
|
json.AddMember("track_uses", value2, json.GetAllocator());
|
||||||
|
|
||||||
@ -3855,6 +3863,8 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_
|
|||||||
m_key_reuse_mitigation2 = true;
|
m_key_reuse_mitigation2 = true;
|
||||||
m_segregation_height = 0;
|
m_segregation_height = 0;
|
||||||
m_ignore_fractional_outputs = true;
|
m_ignore_fractional_outputs = true;
|
||||||
|
m_ignore_outputs_above = MONEY_SUPPLY;
|
||||||
|
m_ignore_outputs_below = 0;
|
||||||
m_track_uses = false;
|
m_track_uses = false;
|
||||||
m_inactivity_lock_timeout = DEFAULT_INACTIVITY_LOCK_TIMEOUT;
|
m_inactivity_lock_timeout = DEFAULT_INACTIVITY_LOCK_TIMEOUT;
|
||||||
m_setup_background_mining = BackgroundMiningMaybe;
|
m_setup_background_mining = BackgroundMiningMaybe;
|
||||||
@ -4009,6 +4019,10 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_
|
|||||||
m_segregation_height = field_segregation_height;
|
m_segregation_height = field_segregation_height;
|
||||||
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, ignore_fractional_outputs, int, Int, false, true);
|
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, ignore_fractional_outputs, int, Int, false, true);
|
||||||
m_ignore_fractional_outputs = field_ignore_fractional_outputs;
|
m_ignore_fractional_outputs = field_ignore_fractional_outputs;
|
||||||
|
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, ignore_outputs_above, uint64_t, Uint64, false, MONEY_SUPPLY);
|
||||||
|
m_ignore_outputs_above = field_ignore_outputs_above;
|
||||||
|
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, ignore_outputs_below, uint64_t, Uint64, false, 0);
|
||||||
|
m_ignore_outputs_below = field_ignore_outputs_below;
|
||||||
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, track_uses, int, Int, false, false);
|
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, track_uses, int, Int, false, false);
|
||||||
m_track_uses = field_track_uses;
|
m_track_uses = field_track_uses;
|
||||||
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, inactivity_lock_timeout, uint32_t, Uint, false, DEFAULT_INACTIVITY_LOCK_TIMEOUT);
|
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, inactivity_lock_timeout, uint32_t, Uint, false, DEFAULT_INACTIVITY_LOCK_TIMEOUT);
|
||||||
@ -8604,6 +8618,11 @@ std::vector<size_t> wallet2::pick_preferred_rct_inputs(uint64_t needed_money, ui
|
|||||||
const transfer_details& td = m_transfers[i];
|
const transfer_details& td = m_transfers[i];
|
||||||
if (!is_spent(td, false) && !td.m_frozen && td.is_rct() && td.amount() >= needed_money && is_transfer_unlocked(td) && td.m_subaddr_index.major == subaddr_account && subaddr_indices.count(td.m_subaddr_index.minor) == 1)
|
if (!is_spent(td, false) && !td.m_frozen && td.is_rct() && td.amount() >= needed_money && is_transfer_unlocked(td) && td.m_subaddr_index.major == subaddr_account && subaddr_indices.count(td.m_subaddr_index.minor) == 1)
|
||||||
{
|
{
|
||||||
|
if (td.amount() > m_ignore_outputs_above || td.amount() < m_ignore_outputs_below)
|
||||||
|
{
|
||||||
|
MDEBUG("Ignoring output " << i << " of amount " << print_money(td.amount()) << " which is outside prescribed range [" << print_money(m_ignore_outputs_below) << ", " << print_money(m_ignore_outputs_above) << "]");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
LOG_PRINT_L2("We can use " << i << " alone: " << print_money(td.amount()));
|
LOG_PRINT_L2("We can use " << i << " alone: " << print_money(td.amount()));
|
||||||
picks.push_back(i);
|
picks.push_back(i);
|
||||||
return picks;
|
return picks;
|
||||||
@ -8619,10 +8638,20 @@ std::vector<size_t> wallet2::pick_preferred_rct_inputs(uint64_t needed_money, ui
|
|||||||
const transfer_details& td = m_transfers[i];
|
const transfer_details& td = m_transfers[i];
|
||||||
if (!is_spent(td, false) && !td.m_frozen && !td.m_key_image_partial && td.is_rct() && is_transfer_unlocked(td) && td.m_subaddr_index.major == subaddr_account && subaddr_indices.count(td.m_subaddr_index.minor) == 1)
|
if (!is_spent(td, false) && !td.m_frozen && !td.m_key_image_partial && td.is_rct() && is_transfer_unlocked(td) && td.m_subaddr_index.major == subaddr_account && subaddr_indices.count(td.m_subaddr_index.minor) == 1)
|
||||||
{
|
{
|
||||||
|
if (td.amount() > m_ignore_outputs_above || td.amount() < m_ignore_outputs_below)
|
||||||
|
{
|
||||||
|
MDEBUG("Ignoring output " << i << " of amount " << print_money(td.amount()) << " which is outside prescribed range [" << print_money(m_ignore_outputs_below) << ", " << print_money(m_ignore_outputs_above) << "]");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
LOG_PRINT_L2("Considering input " << i << ", " << print_money(td.amount()));
|
LOG_PRINT_L2("Considering input " << i << ", " << print_money(td.amount()));
|
||||||
for (size_t j = i + 1; j < m_transfers.size(); ++j)
|
for (size_t j = i + 1; j < m_transfers.size(); ++j)
|
||||||
{
|
{
|
||||||
const transfer_details& td2 = m_transfers[j];
|
const transfer_details& td2 = m_transfers[j];
|
||||||
|
if (td2.amount() > m_ignore_outputs_above || td2.amount() < m_ignore_outputs_below)
|
||||||
|
{
|
||||||
|
MDEBUG("Ignoring output " << j << " of amount " << print_money(td2.amount()) << " which is outside prescribed range [" << print_money(m_ignore_outputs_below) << ", " << print_money(m_ignore_outputs_above) << "]");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (!is_spent(td2, false) && !td2.m_frozen && !td.m_key_image_partial && td2.is_rct() && td.amount() + td2.amount() >= needed_money && is_transfer_unlocked(td2) && td2.m_subaddr_index == td.m_subaddr_index)
|
if (!is_spent(td2, false) && !td2.m_frozen && !td.m_key_image_partial && td2.is_rct() && td.amount() + td2.amount() >= needed_money && is_transfer_unlocked(td2) && td2.m_subaddr_index == td.m_subaddr_index)
|
||||||
{
|
{
|
||||||
// update our picks if those outputs are less related than any we
|
// update our picks if those outputs are less related than any we
|
||||||
@ -9322,11 +9351,16 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
|
|||||||
const transfer_details& td = m_transfers[i];
|
const transfer_details& td = m_transfers[i];
|
||||||
if (m_ignore_fractional_outputs && td.amount() < fractional_threshold)
|
if (m_ignore_fractional_outputs && td.amount() < fractional_threshold)
|
||||||
{
|
{
|
||||||
MDEBUG("Ignoring output " << i << " of amount " << print_money(td.amount()) << " which is below threshold " << print_money(fractional_threshold));
|
MDEBUG("Ignoring output " << i << " of amount " << print_money(td.amount()) << " which is below fractional threshold " << print_money(fractional_threshold));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!is_spent(td, false) && !td.m_frozen && !td.m_key_image_partial && (use_rct ? true : !td.is_rct()) && is_transfer_unlocked(td) && td.m_subaddr_index.major == subaddr_account && subaddr_indices.count(td.m_subaddr_index.minor) == 1)
|
if (!is_spent(td, false) && !td.m_frozen && !td.m_key_image_partial && (use_rct ? true : !td.is_rct()) && is_transfer_unlocked(td) && td.m_subaddr_index.major == subaddr_account && subaddr_indices.count(td.m_subaddr_index.minor) == 1)
|
||||||
{
|
{
|
||||||
|
if (td.amount() > m_ignore_outputs_above || td.amount() < m_ignore_outputs_below)
|
||||||
|
{
|
||||||
|
MDEBUG("Ignoring output " << i << " of amount " << print_money(td.amount()) << " which is outside prescribed range [" << print_money(m_ignore_outputs_below) << ", " << print_money(m_ignore_outputs_above) << "]");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const uint32_t index_minor = td.m_subaddr_index.minor;
|
const uint32_t index_minor = td.m_subaddr_index.minor;
|
||||||
auto find_predicate = [&index_minor](const std::pair<uint32_t, std::vector<size_t>>& x) { return x.first == index_minor; };
|
auto find_predicate = [&index_minor](const std::pair<uint32_t, std::vector<size_t>>& x) { return x.first == index_minor; };
|
||||||
if ((td.is_rct()) || is_valid_decomposed_amount(td.amount()))
|
if ((td.is_rct()) || is_valid_decomposed_amount(td.amount()))
|
||||||
|
@ -1045,6 +1045,10 @@ private:
|
|||||||
void ignore_fractional_outputs(bool value) { m_ignore_fractional_outputs = value; }
|
void ignore_fractional_outputs(bool value) { m_ignore_fractional_outputs = value; }
|
||||||
bool confirm_non_default_ring_size() const { return m_confirm_non_default_ring_size; }
|
bool confirm_non_default_ring_size() const { return m_confirm_non_default_ring_size; }
|
||||||
void confirm_non_default_ring_size(bool always) { m_confirm_non_default_ring_size = always; }
|
void confirm_non_default_ring_size(bool always) { m_confirm_non_default_ring_size = always; }
|
||||||
|
uint64_t ignore_outputs_above() const { return m_ignore_outputs_above; }
|
||||||
|
void ignore_outputs_above(uint64_t value) { m_ignore_outputs_above = value; }
|
||||||
|
uint64_t ignore_outputs_below() const { return m_ignore_outputs_below; }
|
||||||
|
void ignore_outputs_below(uint64_t value) { m_ignore_outputs_below = value; }
|
||||||
bool track_uses() const { return m_track_uses; }
|
bool track_uses() const { return m_track_uses; }
|
||||||
void track_uses(bool value) { m_track_uses = value; }
|
void track_uses(bool value) { m_track_uses = value; }
|
||||||
BackgroundMiningSetupType setup_background_mining() const { return m_setup_background_mining; }
|
BackgroundMiningSetupType setup_background_mining() const { return m_setup_background_mining; }
|
||||||
@ -1507,6 +1511,8 @@ private:
|
|||||||
bool m_key_reuse_mitigation2;
|
bool m_key_reuse_mitigation2;
|
||||||
uint64_t m_segregation_height;
|
uint64_t m_segregation_height;
|
||||||
bool m_ignore_fractional_outputs;
|
bool m_ignore_fractional_outputs;
|
||||||
|
uint64_t m_ignore_outputs_above;
|
||||||
|
uint64_t m_ignore_outputs_below;
|
||||||
bool m_track_uses;
|
bool m_track_uses;
|
||||||
uint32_t m_inactivity_lock_timeout;
|
uint32_t m_inactivity_lock_timeout;
|
||||||
BackgroundMiningSetupType m_setup_background_mining;
|
BackgroundMiningSetupType m_setup_background_mining;
|
||||||
|
Loading…
Reference in New Issue
Block a user