aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstoffu <stoffu@protonmail.ch>2017-10-06 10:14:09 +0900
committerstoffu <stoffu@protonmail.ch>2017-10-07 12:46:09 +0900
commit7b8d3ec6ba9932a8ebc509f382458ca6988d96ac (patch)
tree0022ae97c04bc7ff81b8d60c444167181eb0e84c
parentMerge pull request #2548 (diff)
downloadmonero-7b8d3ec6ba9932a8ebc509f382458ca6988d96ac.tar.xz
wallet-cli: add --do-not-relay option
-rw-r--r--src/simplewallet/simplewallet.cpp71
-rw-r--r--src/simplewallet/simplewallet.h7
2 files changed, 46 insertions, 32 deletions
diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp
index 314670327..96cf39962 100644
--- a/src/simplewallet/simplewallet.cpp
+++ b/src/simplewallet/simplewallet.cpp
@@ -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", ""};
@@ -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() ||
@@ -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&)
@@ -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&)
@@ -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&)
@@ -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&)
{
@@ -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"));
@@ -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);
diff --git a/src/simplewallet/simplewallet.h b/src/simplewallet/simplewallet.h
index 6c6d0cf05..5a038e9a3 100644
--- a/src/simplewallet/simplewallet.h
+++ b/src/simplewallet/simplewallet.h
@@ -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);
@@ -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;