simplewallet: new "address one-off <major> <minor>" command
This commit is contained in:
parent
d1cf16364f
commit
69b5992296
|
@ -194,7 +194,7 @@ namespace
|
||||||
" account tag <tag_name> <account_index_1> [<account_index_2> ...]\n"
|
" account tag <tag_name> <account_index_1> [<account_index_2> ...]\n"
|
||||||
" account untag <account_index_1> [<account_index_2> ...]\n"
|
" account untag <account_index_1> [<account_index_2> ...]\n"
|
||||||
" account tag_description <tag_name> <description>");
|
" account tag_description <tag_name> <description>");
|
||||||
const char* USAGE_ADDRESS("address [ new <label text with white spaces allowed> | all | <index_min> [<index_max>] | label <index> <label text with white spaces allowed> | device [<index>]]");
|
const char* USAGE_ADDRESS("address [ new <label text with white spaces allowed> | all | <index_min> [<index_max>] | label <index> <label text with white spaces allowed> | device [<index>] | one-off <account> <subaddress>]");
|
||||||
const char* USAGE_INTEGRATED_ADDRESS("integrated_address [device] [<payment_id> | <address>]");
|
const char* USAGE_INTEGRATED_ADDRESS("integrated_address [device] [<payment_id> | <address>]");
|
||||||
const char* USAGE_ADDRESS_BOOK("address_book [(add (<address>|<integrated address>) [<description possibly with whitespaces>])|(delete <index>)]");
|
const char* USAGE_ADDRESS_BOOK("address_book [(add (<address>|<integrated address>) [<description possibly with whitespaces>])|(delete <index>)]");
|
||||||
const char* USAGE_SET_VARIABLE("set <option> [<value>]");
|
const char* USAGE_SET_VARIABLE("set <option> [<value>]");
|
||||||
|
@ -3181,7 +3181,7 @@ simple_wallet::simple_wallet()
|
||||||
m_cmd_binder.set_handler("address",
|
m_cmd_binder.set_handler("address",
|
||||||
boost::bind(&simple_wallet::on_command, this, &simple_wallet::print_address, _1),
|
boost::bind(&simple_wallet::on_command, this, &simple_wallet::print_address, _1),
|
||||||
tr(USAGE_ADDRESS),
|
tr(USAGE_ADDRESS),
|
||||||
tr("If no arguments are specified or <index> is specified, the wallet shows the default or specified address. If \"all\" is specified, the wallet shows all the existing addresses in the currently selected account. If \"new \" is specified, the wallet creates a new address with the provided label text (which can be empty). If \"label\" is specified, the wallet sets the label of the address specified by <index> to the provided label text."));
|
tr("If no arguments are specified or <index> is specified, the wallet shows the default or specified address. If \"all\" is specified, the wallet shows all the existing addresses in the currently selected account. If \"new \" is specified, the wallet creates a new address with the provided label text (which can be empty). If \"label\" is specified, the wallet sets the label of the address specified by <index> to the provided label text. If \"one-off\" is specified, the address for the specified index is generated and displayed, and remembered by the wallet"));
|
||||||
m_cmd_binder.set_handler("integrated_address",
|
m_cmd_binder.set_handler("integrated_address",
|
||||||
boost::bind(&simple_wallet::on_command, this, &simple_wallet::print_integrated_address, _1),
|
boost::bind(&simple_wallet::on_command, this, &simple_wallet::print_integrated_address, _1),
|
||||||
tr(USAGE_INTEGRATED_ADDRESS),
|
tr(USAGE_INTEGRATED_ADDRESS),
|
||||||
|
@ -9282,6 +9282,24 @@ bool simple_wallet::print_address(const std::vector<std::string> &args/* = std::
|
||||||
print_address_sub(m_wallet->get_num_subaddresses(m_current_subaddress_account) - 1);
|
print_address_sub(m_wallet->get_num_subaddresses(m_current_subaddress_account) - 1);
|
||||||
m_wallet->device_show_address(m_current_subaddress_account, m_wallet->get_num_subaddresses(m_current_subaddress_account) - 1, boost::none);
|
m_wallet->device_show_address(m_current_subaddress_account, m_wallet->get_num_subaddresses(m_current_subaddress_account) - 1, boost::none);
|
||||||
}
|
}
|
||||||
|
else if (local_args[0] == "one-off")
|
||||||
|
{
|
||||||
|
local_args.erase(local_args.begin());
|
||||||
|
std::string label;
|
||||||
|
if (local_args.size() != 2)
|
||||||
|
{
|
||||||
|
fail_msg_writer() << tr("Expected exactly two arguments for index");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
uint32_t major, minor;
|
||||||
|
if (!epee::string_tools::get_xtype_from_string(major, local_args[0]) || !epee::string_tools::get_xtype_from_string(minor, local_args[1]))
|
||||||
|
{
|
||||||
|
fail_msg_writer() << tr("failed to parse index: ") << local_args[0] << " " << local_args[1];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
m_wallet->create_one_off_subaddress({major, minor});
|
||||||
|
success_msg_writer() << boost::format(tr("Address at %u %u: %s")) % major % minor % m_wallet->get_subaddress_as_str({major, minor});
|
||||||
|
}
|
||||||
else if (local_args.size() >= 2 && local_args[0] == "label")
|
else if (local_args.size() >= 2 && local_args[0] == "label")
|
||||||
{
|
{
|
||||||
if (!epee::string_tools::get_xtype_from_string(index, local_args[1]))
|
if (!epee::string_tools::get_xtype_from_string(index, local_args[1]))
|
||||||
|
|
|
@ -1548,6 +1548,12 @@ void wallet2::expand_subaddresses(const cryptonote::subaddress_index& index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
void wallet2::create_one_off_subaddress(const cryptonote::subaddress_index& index)
|
||||||
|
{
|
||||||
|
const crypto::public_key pkey = get_subaddress_spend_public_key(index);
|
||||||
|
m_subaddresses[pkey] = index;
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
std::string wallet2::get_subaddress_label(const cryptonote::subaddress_index& index) const
|
std::string wallet2::get_subaddress_label(const cryptonote::subaddress_index& index) const
|
||||||
{
|
{
|
||||||
if (index.major >= m_subaddress_labels.size() || index.minor >= m_subaddress_labels[index.major].size())
|
if (index.major >= m_subaddress_labels.size() || index.minor >= m_subaddress_labels[index.major].size())
|
||||||
|
@ -2089,7 +2095,8 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
|
||||||
td.m_amount = amount;
|
td.m_amount = amount;
|
||||||
td.m_pk_index = pk_index - 1;
|
td.m_pk_index = pk_index - 1;
|
||||||
td.m_subaddr_index = tx_scan_info[o].received->index;
|
td.m_subaddr_index = tx_scan_info[o].received->index;
|
||||||
expand_subaddresses(tx_scan_info[o].received->index);
|
if (tx_scan_info[o].received->index.major < m_subaddress_labels.size() && tx_scan_info[o].received->index.minor < m_subaddress_labels[tx_scan_info[o].received->index.major].size())
|
||||||
|
expand_subaddresses(tx_scan_info[o].received->index);
|
||||||
if (tx.vout[o].amount == 0)
|
if (tx.vout[o].amount == 0)
|
||||||
{
|
{
|
||||||
td.m_mask = tx_scan_info[o].mask;
|
td.m_mask = tx_scan_info[o].mask;
|
||||||
|
@ -2167,7 +2174,8 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
|
||||||
td.m_amount = amount;
|
td.m_amount = amount;
|
||||||
td.m_pk_index = pk_index - 1;
|
td.m_pk_index = pk_index - 1;
|
||||||
td.m_subaddr_index = tx_scan_info[o].received->index;
|
td.m_subaddr_index = tx_scan_info[o].received->index;
|
||||||
expand_subaddresses(tx_scan_info[o].received->index);
|
if (tx_scan_info[o].received->index.major < m_subaddress_labels.size() && tx_scan_info[o].received->index.minor < m_subaddress_labels[tx_scan_info[o].received->index.major].size())
|
||||||
|
expand_subaddresses(tx_scan_info[o].received->index);
|
||||||
if (tx.vout[o].amount == 0)
|
if (tx.vout[o].amount == 0)
|
||||||
{
|
{
|
||||||
td.m_mask = tx_scan_info[o].mask;
|
td.m_mask = tx_scan_info[o].mask;
|
||||||
|
@ -12608,7 +12616,8 @@ process:
|
||||||
const crypto::public_key& out_key = boost::get<cryptonote::txout_to_key>(td.m_tx.vout[td.m_internal_output_index].target).key;
|
const crypto::public_key& out_key = boost::get<cryptonote::txout_to_key>(td.m_tx.vout[td.m_internal_output_index].target).key;
|
||||||
bool r = cryptonote::generate_key_image_helper(m_account.get_keys(), m_subaddresses, out_key, tx_pub_key, additional_tx_pub_keys, td.m_internal_output_index, in_ephemeral, td.m_key_image, m_account.get_device());
|
bool r = cryptonote::generate_key_image_helper(m_account.get_keys(), m_subaddresses, out_key, tx_pub_key, additional_tx_pub_keys, td.m_internal_output_index, in_ephemeral, td.m_key_image, m_account.get_device());
|
||||||
THROW_WALLET_EXCEPTION_IF(!r, error::wallet_internal_error, "Failed to generate key image");
|
THROW_WALLET_EXCEPTION_IF(!r, error::wallet_internal_error, "Failed to generate key image");
|
||||||
expand_subaddresses(td.m_subaddr_index);
|
if (td.m_subaddr_index.major < m_subaddress_labels.size() && td.m_subaddr_index.minor < m_subaddress_labels[td.m_subaddr_index.major].size())
|
||||||
|
expand_subaddresses(td.m_subaddr_index);
|
||||||
td.m_key_image_known = true;
|
td.m_key_image_known = true;
|
||||||
td.m_key_image_request = true;
|
td.m_key_image_request = true;
|
||||||
td.m_key_image_partial = false;
|
td.m_key_image_partial = false;
|
||||||
|
|
|
@ -793,6 +793,7 @@ private:
|
||||||
size_t get_num_subaddresses(uint32_t index_major) const { return index_major < m_subaddress_labels.size() ? m_subaddress_labels[index_major].size() : 0; }
|
size_t get_num_subaddresses(uint32_t index_major) const { return index_major < m_subaddress_labels.size() ? m_subaddress_labels[index_major].size() : 0; }
|
||||||
void add_subaddress(uint32_t index_major, const std::string& label); // throws when index is out of bound
|
void add_subaddress(uint32_t index_major, const std::string& label); // throws when index is out of bound
|
||||||
void expand_subaddresses(const cryptonote::subaddress_index& index);
|
void expand_subaddresses(const cryptonote::subaddress_index& index);
|
||||||
|
void create_one_off_subaddress(const cryptonote::subaddress_index& index);
|
||||||
std::string get_subaddress_label(const cryptonote::subaddress_index& index) const;
|
std::string get_subaddress_label(const cryptonote::subaddress_index& index) const;
|
||||||
void set_subaddress_label(const cryptonote::subaddress_index &index, const std::string &label);
|
void set_subaddress_label(const cryptonote::subaddress_index &index, const std::string &label);
|
||||||
void set_subaddress_lookahead(size_t major, size_t minor);
|
void set_subaddress_lookahead(size_t major, size_t minor);
|
||||||
|
|
Loading…
Reference in New Issue