Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wallet-cli: add --do-not-relay option #2586

Merged
merged 1 commit into from Oct 15, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
71 changes: 39 additions & 32 deletions src/simplewallet/simplewallet.cpp
Expand Up @@ -121,6 +121,7 @@ namespace
const command_line::arg_descriptor<bool> arg_trusted_daemon = {"trusted-daemon", sw::tr("Enable commands which rely on a trusted daemon"), false};
const command_line::arg_descriptor<bool> arg_allow_mismatched_daemon_version = {"allow-mismatched-daemon-version", sw::tr("Allow communicating with a daemon that uses a different RPC version"), false};
const command_line::arg_descriptor<uint64_t> arg_restore_height = {"restore-height", sw::tr("Restore from specific blockchain height"), 0};
const command_line::arg_descriptor<bool> arg_do_not_relay = {"do-not-relay", sw::tr("The newly created transaction will not be relayed to the monero network"), false};

const command_line::arg_descriptor< std::vector<std::string> > arg_command = {"command", ""};

Expand Down Expand Up @@ -1478,6 +1479,7 @@ bool simple_wallet::handle_command_line(const boost::program_options::variables_
m_trusted_daemon = command_line::get_arg(vm, arg_trusted_daemon);
m_allow_mismatched_daemon_version = command_line::get_arg(vm, arg_allow_mismatched_daemon_version);
m_restore_height = command_line::get_arg(vm, arg_restore_height);
m_do_not_relay = command_line::get_arg(vm, arg_do_not_relay);
m_restoring = !m_generate_from_view_key.empty() ||
!m_generate_from_keys.empty() ||
!m_generate_from_multisig_keys.empty() ||
Expand Down Expand Up @@ -2683,15 +2685,9 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_monero_tx";
}
}
else while (!ptx_vector.empty())
else
{
auto & ptx = ptx_vector.back();
m_wallet->commit_tx(ptx);
success_msg_writer(true) << tr("Transaction successfully submitted, transaction ") << get_transaction_hash(ptx.tx) << ENDL
<< tr("You can check its status by using the `show_transfers` command.");

// if no exception, remove element from vector
ptx_vector.pop_back();
commit_or_save(ptx_vector, m_do_not_relay);
}
}
catch (const tools::error::daemon_busy&)
Expand Down Expand Up @@ -2861,14 +2857,9 @@ bool simple_wallet::sweep_unmixable(const std::vector<std::string> &args_)
success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_monero_tx";
}
}
else while (!ptx_vector.empty())
else
{
auto & ptx = ptx_vector.back();
m_wallet->commit_tx(ptx);
success_msg_writer(true) << tr("Money successfully sent, transaction: ") << get_transaction_hash(ptx.tx);

// if no exception, remove element from vector
ptx_vector.pop_back();
commit_or_save(ptx_vector, m_do_not_relay);
}
}
catch (const tools::error::daemon_busy&)
Expand Down Expand Up @@ -3126,14 +3117,9 @@ bool simple_wallet::sweep_main(uint64_t below, const std::vector<std::string> &a
success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_monero_tx";
}
}
else while (!ptx_vector.empty())
else
{
auto & ptx = ptx_vector.back();
m_wallet->commit_tx(ptx);
success_msg_writer(true) << tr("Money successfully sent, transaction: ") << get_transaction_hash(ptx.tx);

// if no exception, remove element from vector
ptx_vector.pop_back();
commit_or_save(ptx_vector, m_do_not_relay);
}
}
catch (const tools::error::daemon_busy&)
Expand Down Expand Up @@ -3476,16 +3462,7 @@ bool simple_wallet::submit_transfer(const std::vector<std::string> &args_)
return true;
}

// actually commit the transactions
while (!ptx_vector.empty())
{
auto & ptx = ptx_vector.back();
m_wallet->commit_tx(ptx);
success_msg_writer(true) << tr("Money successfully sent, transaction: ") << get_transaction_hash(ptx.tx);

// if no exception, remove element from vector
ptx_vector.pop_back();
}
commit_or_save(ptx_vector, false);
}
catch (const tools::error::daemon_busy&)
{
Expand Down Expand Up @@ -4995,6 +4972,35 @@ void simple_wallet::interrupt()
}
}
//----------------------------------------------------------------------------------------------------
void simple_wallet::commit_or_save(std::vector<tools::wallet2::pending_tx>& ptx_vector, bool do_not_relay)
{
size_t i = 0;
while (!ptx_vector.empty())
{
auto & ptx = ptx_vector.back();
const crypto::hash txid = get_transaction_hash(ptx.tx);
if (do_not_relay)
{
cryptonote::blobdata blob;
tx_to_blob(ptx.tx, blob);
const std::string blob_hex = epee::string_tools::buff_to_hex_nodelimer(blob);
const std::string filename = "raw_monero_tx" + (ptx_vector.size() == 1 ? "" : ("_" + std::to_string(i++)));
if (epee::file_io_utils::save_string_to_file(filename, blob_hex))
success_msg_writer(true) << tr("Transaction successfully saved to ") << filename << tr(", txid ") << txid;
else
fail_msg_writer() << tr("Failed to save transaction to ") << filename << tr(", txid ") << txid;
}
else
{
m_wallet->commit_tx(ptx);
success_msg_writer(true) << tr("Transaction successfully submitted, transaction ") << txid << ENDL
<< tr("You can check its status by using the `show_transfers` command.");
}
// if no exception, remove element from vector
ptx_vector.pop_back();
}
}
//----------------------------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
po::options_description desc_params(wallet_args::tr("Wallet options"));
Expand All @@ -5014,6 +5020,7 @@ int main(int argc, char* argv[])
command_line::add_arg(desc_params, arg_trusted_daemon);
command_line::add_arg(desc_params, arg_allow_mismatched_daemon_version);
command_line::add_arg(desc_params, arg_restore_height);
command_line::add_arg(desc_params, arg_do_not_relay);

po::positional_options_description positional_options;
positional_options.add(arg_command.name, -1);
Expand Down
7 changes: 7 additions & 0 deletions src/simplewallet/simplewallet.h
Expand Up @@ -205,6 +205,12 @@ namespace cryptonote
*/
std::string get_mnemonic_language();

/*!
* \brief When --do-not-relay option is specified, save the raw tx hex blob to a file instead of calling m_wallet->commit_tx(ptx).
* \param ptx_vector Pending tx(es) created by transfer/sweep_all
*/
void commit_or_save(std::vector<tools::wallet2::pending_tx>& ptx_vector, bool do_not_relay);

//----------------- i_wallet2_callback ---------------------
virtual void on_new_block(uint64_t height, const cryptonote::block& block);
virtual void on_money_received(uint64_t height, const crypto::hash &txid, const cryptonote::transaction& tx, uint64_t amount);
Expand Down Expand Up @@ -285,6 +291,7 @@ namespace cryptonote
bool m_allow_mismatched_daemon_version;
bool m_restoring; // are we restoring, by whatever method?
uint64_t m_restore_height; // optional
bool m_do_not_relay;

epee::console_handlers_binder m_cmd_binder;

Expand Down