Merge pull request #6241
ae84ec90
wallet-cli/rpc: allow sweep_all to use outputs in all subaddresses within an account (stoffu)
This commit is contained in:
commit
5bd496e8ef
|
@ -180,8 +180,8 @@ namespace
|
||||||
const char* USAGE_PAYMENT_ID("payment_id");
|
const char* USAGE_PAYMENT_ID("payment_id");
|
||||||
const char* USAGE_TRANSFER("transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] (<URI> | <address> <amount>) [<payment_id>]");
|
const char* USAGE_TRANSFER("transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] (<URI> | <address> <amount>) [<payment_id>]");
|
||||||
const char* USAGE_LOCKED_TRANSFER("locked_transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] (<URI> | <addr> <amount>) <lockblocks> [<payment_id (obsolete)>]");
|
const char* USAGE_LOCKED_TRANSFER("locked_transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] (<URI> | <addr> <amount>) <lockblocks> [<payment_id (obsolete)>]");
|
||||||
const char* USAGE_LOCKED_SWEEP_ALL("locked_sweep_all [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> <lockblocks> [<payment_id (obsolete)>]");
|
const char* USAGE_LOCKED_SWEEP_ALL("locked_sweep_all [index=<N1>[,<N2>,...] | index=all] [<priority>] [<ring_size>] <address> <lockblocks> [<payment_id (obsolete)>]");
|
||||||
const char* USAGE_SWEEP_ALL("sweep_all [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] [outputs=<N>] <address> [<payment_id (obsolete)>]");
|
const char* USAGE_SWEEP_ALL("sweep_all [index=<N1>[,<N2>,...] | index=all] [<priority>] [<ring_size>] [outputs=<N>] <address> [<payment_id (obsolete)>]");
|
||||||
const char* USAGE_SWEEP_BELOW("sweep_below <amount_threshold> [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> [<payment_id (obsolete)>]");
|
const char* USAGE_SWEEP_BELOW("sweep_below <amount_threshold> [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> [<payment_id (obsolete)>]");
|
||||||
const char* USAGE_SWEEP_SINGLE("sweep_single [<priority>] [<ring_size>] [outputs=<N>] <key_image> <address> [<payment_id (obsolete)>]");
|
const char* USAGE_SWEEP_SINGLE("sweep_single [<priority>] [<ring_size>] [outputs=<N>] <key_image> <address> [<payment_id (obsolete)>]");
|
||||||
const char* USAGE_DONATE("donate [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <amount> [<payment_id (obsolete)>]");
|
const char* USAGE_DONATE("donate [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <amount> [<payment_id (obsolete)>]");
|
||||||
|
@ -3138,13 +3138,13 @@ simple_wallet::simple_wallet()
|
||||||
m_cmd_binder.set_handler("locked_sweep_all",
|
m_cmd_binder.set_handler("locked_sweep_all",
|
||||||
boost::bind(&simple_wallet::on_command, this, &simple_wallet::locked_sweep_all,_1),
|
boost::bind(&simple_wallet::on_command, this, &simple_wallet::locked_sweep_all,_1),
|
||||||
tr(USAGE_LOCKED_SWEEP_ALL),
|
tr(USAGE_LOCKED_SWEEP_ALL),
|
||||||
tr("Send all unlocked balance to an address and lock it for <lockblocks> (max. 1000000). If the parameter \"index<N1>[,<N2>,...]\" is specified, the wallet sweeps outputs received by those address indices. If omitted, the wallet randomly chooses an address index to be used. <priority> is the priority of the sweep. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command \"set priority\") is used. <ring_size> is the number of inputs to include for untraceability."));
|
tr("Send all unlocked balance to an address and lock it for <lockblocks> (max. 1000000). If the parameter \"index=<N1>[,<N2>,...]\" or \"index=all\" is specified, the wallet sweeps outputs received by those or all address indices, respectively. If omitted, the wallet randomly chooses an address index to be used. <priority> is the priority of the sweep. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command \"set priority\") is used. <ring_size> is the number of inputs to include for untraceability."));
|
||||||
m_cmd_binder.set_handler("sweep_unmixable",
|
m_cmd_binder.set_handler("sweep_unmixable",
|
||||||
boost::bind(&simple_wallet::on_command, this, &simple_wallet::sweep_unmixable, _1),
|
boost::bind(&simple_wallet::on_command, this, &simple_wallet::sweep_unmixable, _1),
|
||||||
tr("Send all unmixable outputs to yourself with ring_size 1"));
|
tr("Send all unmixable outputs to yourself with ring_size 1"));
|
||||||
m_cmd_binder.set_handler("sweep_all", boost::bind(&simple_wallet::sweep_all, this, _1),
|
m_cmd_binder.set_handler("sweep_all", boost::bind(&simple_wallet::sweep_all, this, _1),
|
||||||
tr(USAGE_SWEEP_ALL),
|
tr(USAGE_SWEEP_ALL),
|
||||||
tr("Send all unlocked balance to an address. If the parameter \"index<N1>[,<N2>,...]\" is specified, the wallet sweeps outputs received by those address indices. If omitted, the wallet randomly chooses an address index to be used. If the parameter \"outputs=<N>\" is specified and N > 0, wallet splits the transaction into N even outputs."));
|
tr("Send all unlocked balance to an address. If the parameter \"index=<N1>[,<N2>,...]\" or \"index=all\" is specified, the wallet sweeps outputs received by those or all address indices, respectively. If omitted, the wallet randomly chooses an address index to be used. If the parameter \"outputs=<N>\" is specified and N > 0, wallet splits the transaction into N even outputs."));
|
||||||
m_cmd_binder.set_handler("sweep_below",
|
m_cmd_binder.set_handler("sweep_below",
|
||||||
boost::bind(&simple_wallet::on_command, this, &simple_wallet::sweep_below, _1),
|
boost::bind(&simple_wallet::on_command, this, &simple_wallet::sweep_below, _1),
|
||||||
tr(USAGE_SWEEP_BELOW),
|
tr(USAGE_SWEEP_BELOW),
|
||||||
|
@ -6872,7 +6872,12 @@ bool simple_wallet::sweep_main(uint64_t below, bool locked, const std::vector<st
|
||||||
std::set<uint32_t> subaddr_indices;
|
std::set<uint32_t> subaddr_indices;
|
||||||
if (local_args.size() > 0 && local_args[0].substr(0, 6) == "index=")
|
if (local_args.size() > 0 && local_args[0].substr(0, 6) == "index=")
|
||||||
{
|
{
|
||||||
if (!parse_subaddress_indices(local_args[0], subaddr_indices))
|
if (local_args[0] == "index=all")
|
||||||
|
{
|
||||||
|
for (uint32_t i = 0; i < m_wallet->get_num_subaddresses(m_current_subaddress_account); ++i)
|
||||||
|
subaddr_indices.insert(i);
|
||||||
|
}
|
||||||
|
else if (!parse_subaddress_indices(local_args[0], subaddr_indices))
|
||||||
{
|
{
|
||||||
print_usage();
|
print_usage();
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1416,11 +1416,22 @@ namespace tools
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::set<uint32_t> subaddr_indices;
|
||||||
|
if (req.subaddr_indices_all)
|
||||||
|
{
|
||||||
|
for (uint32_t i = 0; i < m_wallet->get_num_subaddresses(req.account_index); ++i)
|
||||||
|
subaddr_indices.insert(i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
subaddr_indices= req.subaddr_indices;
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
uint64_t mixin = m_wallet->adjust_mixin(req.ring_size ? req.ring_size - 1 : 0);
|
uint64_t mixin = m_wallet->adjust_mixin(req.ring_size ? req.ring_size - 1 : 0);
|
||||||
uint32_t priority = m_wallet->adjust_priority(req.priority);
|
uint32_t priority = m_wallet->adjust_priority(req.priority);
|
||||||
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_transactions_all(req.below_amount, dsts[0].addr, dsts[0].is_subaddress, req.outputs, mixin, req.unlock_time, priority, extra, req.account_index, req.subaddr_indices);
|
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_transactions_all(req.below_amount, dsts[0].addr, dsts[0].is_subaddress, req.outputs, mixin, req.unlock_time, priority, extra, req.account_index, subaddr_indices);
|
||||||
|
|
||||||
return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_list, res.weight_list, res.multisig_txset, res.unsigned_txset, req.do_not_relay,
|
return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_list, res.weight_list, res.multisig_txset, res.unsigned_txset, req.do_not_relay,
|
||||||
res.tx_hash_list, req.get_tx_hex, res.tx_blob_list, req.get_tx_metadata, res.tx_metadata_list, er);
|
res.tx_hash_list, req.get_tx_hex, res.tx_blob_list, req.get_tx_metadata, res.tx_metadata_list, er);
|
||||||
|
|
|
@ -761,6 +761,7 @@ namespace wallet_rpc
|
||||||
std::string address;
|
std::string address;
|
||||||
uint32_t account_index;
|
uint32_t account_index;
|
||||||
std::set<uint32_t> subaddr_indices;
|
std::set<uint32_t> subaddr_indices;
|
||||||
|
bool subaddr_indices_all;
|
||||||
uint32_t priority;
|
uint32_t priority;
|
||||||
uint64_t ring_size;
|
uint64_t ring_size;
|
||||||
uint64_t outputs;
|
uint64_t outputs;
|
||||||
|
@ -776,6 +777,7 @@ namespace wallet_rpc
|
||||||
KV_SERIALIZE(address)
|
KV_SERIALIZE(address)
|
||||||
KV_SERIALIZE(account_index)
|
KV_SERIALIZE(account_index)
|
||||||
KV_SERIALIZE(subaddr_indices)
|
KV_SERIALIZE(subaddr_indices)
|
||||||
|
KV_SERIALIZE_OPT(subaddr_indices_all, false)
|
||||||
KV_SERIALIZE(priority)
|
KV_SERIALIZE(priority)
|
||||||
KV_SERIALIZE_OPT(ring_size, (uint64_t)0)
|
KV_SERIALIZE_OPT(ring_size, (uint64_t)0)
|
||||||
KV_SERIALIZE_OPT(outputs, (uint64_t)1)
|
KV_SERIALIZE_OPT(outputs, (uint64_t)1)
|
||||||
|
|
Loading…
Reference in New Issue