Merge pull request #4245
8ca1215
wallet: store trusted-daemon flag in wallet2 (stoffu)
This commit is contained in:
commit
88e5ed0072
|
@ -129,8 +129,6 @@ namespace
|
||||||
const command_line::arg_descriptor<bool> arg_restore_deterministic_wallet = {"restore-deterministic-wallet", sw::tr("Recover wallet using Electrum-style mnemonic seed"), false};
|
const command_line::arg_descriptor<bool> arg_restore_deterministic_wallet = {"restore-deterministic-wallet", sw::tr("Recover wallet using Electrum-style mnemonic seed"), false};
|
||||||
const command_line::arg_descriptor<bool> arg_restore_multisig_wallet = {"restore-multisig-wallet", sw::tr("Recover multisig wallet using Electrum-style mnemonic seed"), false};
|
const command_line::arg_descriptor<bool> arg_restore_multisig_wallet = {"restore-multisig-wallet", sw::tr("Recover multisig wallet using Electrum-style mnemonic seed"), false};
|
||||||
const command_line::arg_descriptor<bool> arg_non_deterministic = {"non-deterministic", sw::tr("Generate non-deterministic view and spend keys"), false};
|
const command_line::arg_descriptor<bool> arg_non_deterministic = {"non-deterministic", sw::tr("Generate non-deterministic view and spend keys"), false};
|
||||||
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_untrusted_daemon = {"untrusted-daemon", sw::tr("Disable 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<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<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<bool> arg_do_not_relay = {"do-not-relay", sw::tr("The newly created transaction will not be relayed to the monero network"), false};
|
||||||
|
@ -1137,7 +1135,7 @@ bool simple_wallet::import_multisig(const std::vector<std::string> &args)
|
||||||
fail_msg_writer() << tr("Failed to import multisig info: ") << e.what();
|
fail_msg_writer() << tr("Failed to import multisig info: ") << e.what();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (is_daemon_trusted())
|
if (m_wallet->is_trusted_daemon())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -1291,7 +1289,7 @@ bool simple_wallet::submit_multisig(const std::vector<std::string> &args)
|
||||||
}
|
}
|
||||||
catch (const std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
handle_transfer_exception(std::current_exception(), is_daemon_trusted());
|
handle_transfer_exception(std::current_exception(), m_wallet->is_trusted_daemon());
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
@ -3363,22 +3361,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set --trusted-daemon if local and not overridden
|
if (!m_wallet->is_trusted_daemon())
|
||||||
if (!m_trusted_daemon)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
m_trusted_daemon = false;
|
|
||||||
if (tools::is_local_address(m_wallet->get_daemon_address()))
|
|
||||||
{
|
|
||||||
MINFO(tr("Daemon is local, assuming trusted"));
|
|
||||||
m_trusted_daemon = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (const std::exception &e) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_daemon_trusted())
|
|
||||||
message_writer() << (boost::format(tr("Warning: using an untrusted daemon at %s, privacy will be lessened")) % m_wallet->get_daemon_address()).str();
|
message_writer() << (boost::format(tr("Warning: using an untrusted daemon at %s, privacy will be lessened")) % m_wallet->get_daemon_address()).str();
|
||||||
|
|
||||||
if (m_wallet->get_ring_database().empty())
|
if (m_wallet->get_ring_database().empty())
|
||||||
|
@ -3412,10 +3395,6 @@ bool simple_wallet::handle_command_line(const boost::program_options::variables_
|
||||||
m_restore_deterministic_wallet = command_line::get_arg(vm, arg_restore_deterministic_wallet);
|
m_restore_deterministic_wallet = command_line::get_arg(vm, arg_restore_deterministic_wallet);
|
||||||
m_restore_multisig_wallet = command_line::get_arg(vm, arg_restore_multisig_wallet);
|
m_restore_multisig_wallet = command_line::get_arg(vm, arg_restore_multisig_wallet);
|
||||||
m_non_deterministic = command_line::get_arg(vm, arg_non_deterministic);
|
m_non_deterministic = command_line::get_arg(vm, arg_non_deterministic);
|
||||||
if (!command_line::is_arg_defaulted(vm, arg_trusted_daemon) || !command_line::is_arg_defaulted(vm, arg_untrusted_daemon))
|
|
||||||
m_trusted_daemon = command_line::get_arg(vm, arg_trusted_daemon) && !command_line::get_arg(vm, arg_untrusted_daemon);
|
|
||||||
if (!command_line::is_arg_defaulted(vm, arg_trusted_daemon) && !command_line::is_arg_defaulted(vm, arg_untrusted_daemon))
|
|
||||||
message_writer() << tr("--trusted-daemon and --untrusted-daemon are both seen, assuming untrusted");
|
|
||||||
m_allow_mismatched_daemon_version = command_line::get_arg(vm, arg_allow_mismatched_daemon_version);
|
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_restore_height = command_line::get_arg(vm, arg_restore_height);
|
||||||
m_do_not_relay = command_line::get_arg(vm, arg_do_not_relay);
|
m_do_not_relay = command_line::get_arg(vm, arg_do_not_relay);
|
||||||
|
@ -3927,7 +3906,7 @@ bool simple_wallet::save_watch_only(const std::vector<std::string> &args/* = std
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
bool simple_wallet::start_mining(const std::vector<std::string>& args)
|
bool simple_wallet::start_mining(const std::vector<std::string>& args)
|
||||||
{
|
{
|
||||||
if (!is_daemon_trusted())
|
if (!m_wallet->is_trusted_daemon())
|
||||||
{
|
{
|
||||||
fail_msg_writer() << tr("this command requires a trusted daemon. Enable with --trusted-daemon");
|
fail_msg_writer() << tr("this command requires a trusted daemon. Enable with --trusted-daemon");
|
||||||
return true;
|
return true;
|
||||||
|
@ -4040,29 +4019,29 @@ bool simple_wallet::set_daemon(const std::vector<std::string>& args)
|
||||||
if (args.size() == 2)
|
if (args.size() == 2)
|
||||||
{
|
{
|
||||||
if (args[1] == "trusted")
|
if (args[1] == "trusted")
|
||||||
m_trusted_daemon = true;
|
m_wallet->set_trusted_daemon(true);
|
||||||
else if (args[1] == "untrusted")
|
else if (args[1] == "untrusted")
|
||||||
m_trusted_daemon = false;
|
m_wallet->set_trusted_daemon(false);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fail_msg_writer() << tr("Expected trusted or untrusted, got ") << args[1] << ": assuming untrusted";
|
fail_msg_writer() << tr("Expected trusted or untrusted, got ") << args[1] << ": assuming untrusted";
|
||||||
m_trusted_daemon = false;
|
m_wallet->set_trusted_daemon(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_trusted_daemon = false;
|
m_wallet->set_trusted_daemon(false);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (tools::is_local_address(m_wallet->get_daemon_address()))
|
if (tools::is_local_address(m_wallet->get_daemon_address()))
|
||||||
{
|
{
|
||||||
MINFO(tr("Daemon is local, assuming trusted"));
|
MINFO(tr("Daemon is local, assuming trusted"));
|
||||||
m_trusted_daemon = true;
|
m_wallet->set_trusted_daemon(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const std::exception &e) { }
|
catch (const std::exception &e) { }
|
||||||
}
|
}
|
||||||
success_msg_writer() << boost::format("Daemon set to %s, %s") % daemon_url % (*m_trusted_daemon ? tr("trusted") : tr("untrusted"));
|
success_msg_writer() << boost::format("Daemon set to %s, %s") % daemon_url % (m_wallet->is_trusted_daemon() ? tr("trusted") : tr("untrusted"));
|
||||||
} else {
|
} else {
|
||||||
fail_msg_writer() << tr("This does not seem to be a valid daemon URL.");
|
fail_msg_writer() << tr("This does not seem to be a valid daemon URL.");
|
||||||
}
|
}
|
||||||
|
@ -4198,7 +4177,7 @@ bool simple_wallet::refresh_main(uint64_t start_height, bool reset, bool is_init
|
||||||
{
|
{
|
||||||
m_in_manual_refresh.store(true, std::memory_order_relaxed);
|
m_in_manual_refresh.store(true, std::memory_order_relaxed);
|
||||||
epee::misc_utils::auto_scope_leave_caller scope_exit_handler = epee::misc_utils::create_scope_leave_handler([&](){m_in_manual_refresh.store(false, std::memory_order_relaxed);});
|
epee::misc_utils::auto_scope_leave_caller scope_exit_handler = epee::misc_utils::create_scope_leave_handler([&](){m_in_manual_refresh.store(false, std::memory_order_relaxed);});
|
||||||
m_wallet->refresh(is_daemon_trusted(), start_height, fetched_blocks);
|
m_wallet->refresh(m_wallet->is_trusted_daemon(), start_height, fetched_blocks);
|
||||||
ok = true;
|
ok = true;
|
||||||
// Clear line "Height xxx of xxx"
|
// Clear line "Height xxx of xxx"
|
||||||
std::cout << "\r \r";
|
std::cout << "\r \r";
|
||||||
|
@ -4489,7 +4468,7 @@ bool simple_wallet::show_blockchain_height(const std::vector<std::string>& args)
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
bool simple_wallet::rescan_spent(const std::vector<std::string> &args)
|
bool simple_wallet::rescan_spent(const std::vector<std::string> &args)
|
||||||
{
|
{
|
||||||
if (!is_daemon_trusted())
|
if (!m_wallet->is_trusted_daemon())
|
||||||
{
|
{
|
||||||
fail_msg_writer() << tr("this command requires a trusted daemon. Enable with --trusted-daemon");
|
fail_msg_writer() << tr("this command requires a trusted daemon. Enable with --trusted-daemon");
|
||||||
return true;
|
return true;
|
||||||
|
@ -4837,16 +4816,16 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
unlock_block = bc_height + locked_blocks;
|
unlock_block = bc_height + locked_blocks;
|
||||||
ptx_vector = m_wallet->create_transactions_2(dsts, fake_outs_count, unlock_block /* unlock_time */, priority, extra, m_current_subaddress_account, subaddr_indices, is_daemon_trusted());
|
ptx_vector = m_wallet->create_transactions_2(dsts, fake_outs_count, unlock_block /* unlock_time */, priority, extra, m_current_subaddress_account, subaddr_indices);
|
||||||
break;
|
break;
|
||||||
case TransferNew:
|
case TransferNew:
|
||||||
ptx_vector = m_wallet->create_transactions_2(dsts, fake_outs_count, 0 /* unlock_time */, priority, extra, m_current_subaddress_account, subaddr_indices, is_daemon_trusted());
|
ptx_vector = m_wallet->create_transactions_2(dsts, fake_outs_count, 0 /* unlock_time */, priority, extra, m_current_subaddress_account, subaddr_indices);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_ERROR("Unknown transfer method, using original");
|
LOG_ERROR("Unknown transfer method, using original");
|
||||||
/* FALLTHRU */
|
/* FALLTHRU */
|
||||||
case TransferOriginal:
|
case TransferOriginal:
|
||||||
ptx_vector = m_wallet->create_transactions(dsts, fake_outs_count, 0 /* unlock_time */, priority, extra, is_daemon_trusted());
|
ptx_vector = m_wallet->create_transactions(dsts, fake_outs_count, 0 /* unlock_time */, priority, extra);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5022,7 +5001,7 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
|
||||||
}
|
}
|
||||||
catch (const std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
handle_transfer_exception(std::current_exception(), is_daemon_trusted());
|
handle_transfer_exception(std::current_exception(), m_wallet->is_trusted_daemon());
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
@ -5064,7 +5043,7 @@ bool simple_wallet::sweep_unmixable(const std::vector<std::string> &args_)
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// figure out what tx will be necessary
|
// figure out what tx will be necessary
|
||||||
auto ptx_vector = m_wallet->create_unmixable_sweep_transactions(is_daemon_trusted());
|
auto ptx_vector = m_wallet->create_unmixable_sweep_transactions();
|
||||||
|
|
||||||
if (ptx_vector.empty())
|
if (ptx_vector.empty())
|
||||||
{
|
{
|
||||||
|
@ -5143,13 +5122,13 @@ bool simple_wallet::sweep_unmixable(const std::vector<std::string> &args_)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_wallet->discard_unmixable_outputs(is_daemon_trusted());
|
m_wallet->discard_unmixable_outputs();
|
||||||
} catch (...) {}
|
} catch (...) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
handle_transfer_exception(std::current_exception(), is_daemon_trusted());
|
handle_transfer_exception(std::current_exception(), m_wallet->is_trusted_daemon());
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
@ -5341,7 +5320,7 @@ bool simple_wallet::sweep_main(uint64_t below, bool locked, const std::vector<st
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// figure out what tx will be necessary
|
// figure out what tx will be necessary
|
||||||
auto ptx_vector = m_wallet->create_transactions_all(below, info.address, info.is_subaddress, fake_outs_count, unlock_block /* unlock_time */, priority, extra, m_current_subaddress_account, subaddr_indices, is_daemon_trusted());
|
auto ptx_vector = m_wallet->create_transactions_all(below, info.address, info.is_subaddress, fake_outs_count, unlock_block /* unlock_time */, priority, extra, m_current_subaddress_account, subaddr_indices);
|
||||||
|
|
||||||
if (ptx_vector.empty())
|
if (ptx_vector.empty())
|
||||||
{
|
{
|
||||||
|
@ -5425,7 +5404,7 @@ bool simple_wallet::sweep_main(uint64_t below, bool locked, const std::vector<st
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
handle_transfer_exception(std::current_exception(), is_daemon_trusted());
|
handle_transfer_exception(std::current_exception(), m_wallet->is_trusted_daemon());
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
@ -5554,7 +5533,7 @@ bool simple_wallet::sweep_single(const std::vector<std::string> &args_)
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// figure out what tx will be necessary
|
// figure out what tx will be necessary
|
||||||
auto ptx_vector = m_wallet->create_transactions_single(ki, info.address, info.is_subaddress, fake_outs_count, 0 /* unlock_time */, priority, extra, is_daemon_trusted());
|
auto ptx_vector = m_wallet->create_transactions_single(ki, info.address, info.is_subaddress, fake_outs_count, 0 /* unlock_time */, priority, extra);
|
||||||
|
|
||||||
if (ptx_vector.empty())
|
if (ptx_vector.empty())
|
||||||
{
|
{
|
||||||
|
@ -5624,7 +5603,7 @@ bool simple_wallet::sweep_single(const std::vector<std::string> &args_)
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
handle_transfer_exception(std::current_exception(), is_daemon_trusted());
|
handle_transfer_exception(std::current_exception(), m_wallet->is_trusted_daemon());
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
@ -5930,7 +5909,7 @@ bool simple_wallet::submit_transfer(const std::vector<std::string> &args_)
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
handle_transfer_exception(std::current_exception(), is_daemon_trusted());
|
handle_transfer_exception(std::current_exception(), m_wallet->is_trusted_daemon());
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
@ -6843,7 +6822,7 @@ void simple_wallet::wallet_idle_thread()
|
||||||
{
|
{
|
||||||
uint64_t fetched_blocks;
|
uint64_t fetched_blocks;
|
||||||
if (try_connect_to_daemon(true))
|
if (try_connect_to_daemon(true))
|
||||||
m_wallet->refresh(is_daemon_trusted(), 0, fetched_blocks);
|
m_wallet->refresh(m_wallet->is_trusted_daemon(), 0, fetched_blocks);
|
||||||
}
|
}
|
||||||
catch(...) {}
|
catch(...) {}
|
||||||
m_auto_refresh_refreshing = false;
|
m_auto_refresh_refreshing = false;
|
||||||
|
@ -7591,7 +7570,7 @@ bool simple_wallet::import_key_images(const std::vector<std::string> &args)
|
||||||
fail_msg_writer() << tr("command not supported by HW wallet");
|
fail_msg_writer() << tr("command not supported by HW wallet");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!is_daemon_trusted())
|
if (!m_wallet->is_trusted_daemon())
|
||||||
{
|
{
|
||||||
fail_msg_writer() << tr("this command requires a trusted daemon. Enable with --trusted-daemon");
|
fail_msg_writer() << tr("this command requires a trusted daemon. Enable with --trusted-daemon");
|
||||||
return true;
|
return true;
|
||||||
|
@ -7922,8 +7901,6 @@ int main(int argc, char* argv[])
|
||||||
command_line::add_arg(desc_params, arg_restore_multisig_wallet );
|
command_line::add_arg(desc_params, arg_restore_multisig_wallet );
|
||||||
command_line::add_arg(desc_params, arg_non_deterministic );
|
command_line::add_arg(desc_params, arg_non_deterministic );
|
||||||
command_line::add_arg(desc_params, arg_electrum_seed );
|
command_line::add_arg(desc_params, arg_electrum_seed );
|
||||||
command_line::add_arg(desc_params, arg_trusted_daemon);
|
|
||||||
command_line::add_arg(desc_params, arg_untrusted_daemon);
|
|
||||||
command_line::add_arg(desc_params, arg_allow_mismatched_daemon_version);
|
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_restore_height);
|
||||||
command_line::add_arg(desc_params, arg_do_not_relay);
|
command_line::add_arg(desc_params, arg_do_not_relay);
|
||||||
|
|
|
@ -233,7 +233,6 @@ namespace cryptonote
|
||||||
bool print_ring_members(const std::vector<tools::wallet2::pending_tx>& ptx_vector, std::ostream& ostr);
|
bool print_ring_members(const std::vector<tools::wallet2::pending_tx>& ptx_vector, std::ostream& ostr);
|
||||||
std::string get_prompt() const;
|
std::string get_prompt() const;
|
||||||
bool print_seed(bool encrypted);
|
bool print_seed(bool encrypted);
|
||||||
bool is_daemon_trusted() const { return *m_trusted_daemon; }
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Prints the seed with a nice message
|
* \brief Prints the seed with a nice message
|
||||||
|
@ -337,7 +336,6 @@ namespace cryptonote
|
||||||
bool m_restore_deterministic_wallet; // recover flag
|
bool m_restore_deterministic_wallet; // recover flag
|
||||||
bool m_restore_multisig_wallet; // recover flag
|
bool m_restore_multisig_wallet; // recover flag
|
||||||
bool m_non_deterministic; // old 2-random generation
|
bool m_non_deterministic; // old 2-random generation
|
||||||
boost::optional<bool> m_trusted_daemon;
|
|
||||||
bool m_allow_mismatched_daemon_version;
|
bool m_allow_mismatched_daemon_version;
|
||||||
bool m_restoring; // are we restoring, by whatever method?
|
bool m_restoring; // are we restoring, by whatever method?
|
||||||
uint64_t m_restore_height; // optional
|
uint64_t m_restore_height; // optional
|
||||||
|
|
|
@ -369,7 +369,6 @@ void Wallet::error(const std::string &category, const std::string &str) {
|
||||||
WalletImpl::WalletImpl(NetworkType nettype, uint64_t kdf_rounds)
|
WalletImpl::WalletImpl(NetworkType nettype, uint64_t kdf_rounds)
|
||||||
:m_wallet(nullptr)
|
:m_wallet(nullptr)
|
||||||
, m_status(Wallet::Status_Ok)
|
, m_status(Wallet::Status_Ok)
|
||||||
, m_trustedDaemon(false)
|
|
||||||
, m_wallet2Callback(nullptr)
|
, m_wallet2Callback(nullptr)
|
||||||
, m_recoveringFromSeed(false)
|
, m_recoveringFromSeed(false)
|
||||||
, m_recoveringFromDevice(false)
|
, m_recoveringFromDevice(false)
|
||||||
|
@ -1358,7 +1357,7 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const
|
||||||
dsts.push_back(de);
|
dsts.push_back(de);
|
||||||
transaction->m_pending_tx = m_wallet->create_transactions_2(dsts, fake_outs_count, 0 /* unlock_time */,
|
transaction->m_pending_tx = m_wallet->create_transactions_2(dsts, fake_outs_count, 0 /* unlock_time */,
|
||||||
adjusted_priority,
|
adjusted_priority,
|
||||||
extra, subaddr_account, subaddr_indices, m_trustedDaemon);
|
extra, subaddr_account, subaddr_indices);
|
||||||
} else {
|
} else {
|
||||||
// for the GUI, sweep_all (i.e. amount set as "(all)") will always sweep all the funds in all the addresses
|
// for the GUI, sweep_all (i.e. amount set as "(all)") will always sweep all the funds in all the addresses
|
||||||
if (subaddr_indices.empty())
|
if (subaddr_indices.empty())
|
||||||
|
@ -1368,7 +1367,7 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const
|
||||||
}
|
}
|
||||||
transaction->m_pending_tx = m_wallet->create_transactions_all(0, info.address, info.is_subaddress, fake_outs_count, 0 /* unlock_time */,
|
transaction->m_pending_tx = m_wallet->create_transactions_all(0, info.address, info.is_subaddress, fake_outs_count, 0 /* unlock_time */,
|
||||||
adjusted_priority,
|
adjusted_priority,
|
||||||
extra, subaddr_account, subaddr_indices, m_trustedDaemon);
|
extra, subaddr_account, subaddr_indices);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (multisig().isMultisig) {
|
if (multisig().isMultisig) {
|
||||||
|
@ -1454,7 +1453,7 @@ PendingTransaction *WalletImpl::createSweepUnmixableTransaction()
|
||||||
|
|
||||||
do {
|
do {
|
||||||
try {
|
try {
|
||||||
transaction->m_pending_tx = m_wallet->create_unmixable_sweep_transactions(m_trustedDaemon);
|
transaction->m_pending_tx = m_wallet->create_unmixable_sweep_transactions();
|
||||||
|
|
||||||
} catch (const tools::error::daemon_busy&) {
|
} catch (const tools::error::daemon_busy&) {
|
||||||
// TODO: make it translatable with "tr"?
|
// TODO: make it translatable with "tr"?
|
||||||
|
@ -1891,12 +1890,12 @@ Wallet::ConnectionStatus WalletImpl::connected() const
|
||||||
|
|
||||||
void WalletImpl::setTrustedDaemon(bool arg)
|
void WalletImpl::setTrustedDaemon(bool arg)
|
||||||
{
|
{
|
||||||
m_trustedDaemon = arg;
|
m_wallet->set_trusted_daemon(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WalletImpl::trustedDaemon() const
|
bool WalletImpl::trustedDaemon() const
|
||||||
{
|
{
|
||||||
return m_trustedDaemon;
|
return m_wallet->is_trusted_daemon();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WalletImpl::watchOnly() const
|
bool WalletImpl::watchOnly() const
|
||||||
|
|
|
@ -219,7 +219,6 @@ private:
|
||||||
mutable std::string m_errorString;
|
mutable std::string m_errorString;
|
||||||
std::string m_password;
|
std::string m_password;
|
||||||
TransactionHistoryImpl * m_history;
|
TransactionHistoryImpl * m_history;
|
||||||
bool m_trustedDaemon;
|
|
||||||
Wallet2CallbackImpl * m_wallet2Callback;
|
Wallet2CallbackImpl * m_wallet2Callback;
|
||||||
AddressBookImpl * m_addressBook;
|
AddressBookImpl * m_addressBook;
|
||||||
SubaddressImpl * m_subaddress;
|
SubaddressImpl * m_subaddress;
|
||||||
|
|
|
@ -140,6 +140,8 @@ namespace
|
||||||
struct options {
|
struct options {
|
||||||
const command_line::arg_descriptor<std::string> daemon_address = {"daemon-address", tools::wallet2::tr("Use daemon instance at <host>:<port>"), ""};
|
const command_line::arg_descriptor<std::string> daemon_address = {"daemon-address", tools::wallet2::tr("Use daemon instance at <host>:<port>"), ""};
|
||||||
const command_line::arg_descriptor<std::string> daemon_host = {"daemon-host", tools::wallet2::tr("Use daemon instance at host <arg> instead of localhost"), ""};
|
const command_line::arg_descriptor<std::string> daemon_host = {"daemon-host", tools::wallet2::tr("Use daemon instance at host <arg> instead of localhost"), ""};
|
||||||
|
const command_line::arg_descriptor<bool> trusted_daemon = {"trusted-daemon", tools::wallet2::tr("Enable commands which rely on a trusted daemon"), false};
|
||||||
|
const command_line::arg_descriptor<bool> untrusted_daemon = {"untrusted-daemon", tools::wallet2::tr("Disable commands which rely on a trusted daemon"), false};
|
||||||
const command_line::arg_descriptor<std::string> password = {"password", tools::wallet2::tr("Wallet password (escape/quote as needed)"), "", true};
|
const command_line::arg_descriptor<std::string> password = {"password", tools::wallet2::tr("Wallet password (escape/quote as needed)"), "", true};
|
||||||
const command_line::arg_descriptor<std::string> password_file = {"password-file", tools::wallet2::tr("Wallet password file"), "", true};
|
const command_line::arg_descriptor<std::string> password_file = {"password-file", tools::wallet2::tr("Wallet password file"), "", true};
|
||||||
const command_line::arg_descriptor<int> daemon_port = {"daemon-port", tools::wallet2::tr("Use daemon instance at port <arg> instead of 18081"), 0};
|
const command_line::arg_descriptor<int> daemon_port = {"daemon-port", tools::wallet2::tr("Use daemon instance at port <arg> instead of 18081"), 0};
|
||||||
|
@ -236,8 +238,29 @@ std::unique_ptr<tools::wallet2> make_basic(const boost::program_options::variabl
|
||||||
if (daemon_address.empty())
|
if (daemon_address.empty())
|
||||||
daemon_address = std::string("http://") + daemon_host + ":" + std::to_string(daemon_port);
|
daemon_address = std::string("http://") + daemon_host + ":" + std::to_string(daemon_port);
|
||||||
|
|
||||||
|
boost::optional<bool> trusted_daemon;
|
||||||
|
if (!command_line::is_arg_defaulted(vm, opts.trusted_daemon) || !command_line::is_arg_defaulted(vm, opts.untrusted_daemon))
|
||||||
|
trusted_daemon = command_line::get_arg(vm, opts.trusted_daemon) && !command_line::get_arg(vm, opts.untrusted_daemon);
|
||||||
|
THROW_WALLET_EXCEPTION_IF(!command_line::is_arg_defaulted(vm, opts.trusted_daemon) && !command_line::is_arg_defaulted(vm, opts.untrusted_daemon),
|
||||||
|
tools::error::wallet_internal_error, tools::wallet2::tr("--trusted-daemon and --untrusted-daemon are both seen, assuming untrusted"));
|
||||||
|
|
||||||
|
// set --trusted-daemon if local and not overridden
|
||||||
|
if (!trusted_daemon)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
trusted_daemon = false;
|
||||||
|
if (tools::is_local_address(daemon_address))
|
||||||
|
{
|
||||||
|
MINFO(tr("Daemon is local, assuming trusted"));
|
||||||
|
trusted_daemon = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const std::exception &e) { }
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<tools::wallet2> wallet(new tools::wallet2(nettype, kdf_rounds));
|
std::unique_ptr<tools::wallet2> wallet(new tools::wallet2(nettype, kdf_rounds));
|
||||||
wallet->init(rpc, std::move(daemon_address), std::move(login));
|
wallet->init(rpc, std::move(daemon_address), std::move(login), 0, false, *trusted_daemon);
|
||||||
boost::filesystem::path ringdb_path = command_line::get_arg(vm, opts.shared_ringdb_dir);
|
boost::filesystem::path ringdb_path = command_line::get_arg(vm, opts.shared_ringdb_dir);
|
||||||
wallet->set_ring_database(ringdb_path.string());
|
wallet->set_ring_database(ringdb_path.string());
|
||||||
return wallet;
|
return wallet;
|
||||||
|
@ -680,6 +703,7 @@ wallet2::wallet2(network_type nettype, uint64_t kdf_rounds):
|
||||||
m_multisig_rescan_k(NULL),
|
m_multisig_rescan_k(NULL),
|
||||||
m_run(true),
|
m_run(true),
|
||||||
m_callback(0),
|
m_callback(0),
|
||||||
|
m_trusted_daemon(false),
|
||||||
m_nettype(nettype),
|
m_nettype(nettype),
|
||||||
m_always_confirm_transfers(true),
|
m_always_confirm_transfers(true),
|
||||||
m_print_ring_members(false),
|
m_print_ring_members(false),
|
||||||
|
@ -745,6 +769,8 @@ void wallet2::init_options(boost::program_options::options_description& desc_par
|
||||||
const options opts{};
|
const options opts{};
|
||||||
command_line::add_arg(desc_params, opts.daemon_address);
|
command_line::add_arg(desc_params, opts.daemon_address);
|
||||||
command_line::add_arg(desc_params, opts.daemon_host);
|
command_line::add_arg(desc_params, opts.daemon_host);
|
||||||
|
command_line::add_arg(desc_params, opts.trusted_daemon);
|
||||||
|
command_line::add_arg(desc_params, opts.untrusted_daemon);
|
||||||
command_line::add_arg(desc_params, opts.password);
|
command_line::add_arg(desc_params, opts.password);
|
||||||
command_line::add_arg(desc_params, opts.password_file);
|
command_line::add_arg(desc_params, opts.password_file);
|
||||||
command_line::add_arg(desc_params, opts.daemon_port);
|
command_line::add_arg(desc_params, opts.daemon_port);
|
||||||
|
@ -796,7 +822,7 @@ std::unique_ptr<wallet2> wallet2::make_dummy(const boost::program_options::varia
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
bool wallet2::init(bool rpc, std::string daemon_address, boost::optional<epee::net_utils::http::login> daemon_login, uint64_t upper_transaction_size_limit, bool ssl)
|
bool wallet2::init(bool rpc, std::string daemon_address, boost::optional<epee::net_utils::http::login> daemon_login, uint64_t upper_transaction_size_limit, bool ssl, bool trusted_daemon)
|
||||||
{
|
{
|
||||||
m_rpc = rpc;
|
m_rpc = rpc;
|
||||||
m_checkpoints.init_default_checkpoints(m_nettype);
|
m_checkpoints.init_default_checkpoints(m_nettype);
|
||||||
|
@ -806,6 +832,7 @@ bool wallet2::init(bool rpc, std::string daemon_address, boost::optional<epee::n
|
||||||
m_upper_transaction_size_limit = upper_transaction_size_limit;
|
m_upper_transaction_size_limit = upper_transaction_size_limit;
|
||||||
m_daemon_address = std::move(daemon_address);
|
m_daemon_address = std::move(daemon_address);
|
||||||
m_daemon_login = std::move(daemon_login);
|
m_daemon_login = std::move(daemon_login);
|
||||||
|
m_trusted_daemon = trusted_daemon;
|
||||||
// When switching from light wallet to full wallet, we need to reset the height we got from lw node.
|
// When switching from light wallet to full wallet, we need to reset the height we got from lw node.
|
||||||
return m_http_client.set_server(get_daemon_address(), get_daemon_login(), ssl);
|
return m_http_client.set_server(get_daemon_address(), get_daemon_login(), ssl);
|
||||||
}
|
}
|
||||||
|
@ -4901,7 +4928,7 @@ size_t wallet2::pop_best_value(std::vector<size_t> &unused_indices, const std::v
|
||||||
// returns:
|
// returns:
|
||||||
// direct return: amount of money found
|
// direct return: amount of money found
|
||||||
// modified reference: selected_transfers, a list of iterators/indices of input sources
|
// modified reference: selected_transfers, a list of iterators/indices of input sources
|
||||||
uint64_t wallet2::select_transfers(uint64_t needed_money, std::vector<size_t> unused_transfers_indices, std::vector<size_t>& selected_transfers, bool trusted_daemon) const
|
uint64_t wallet2::select_transfers(uint64_t needed_money, std::vector<size_t> unused_transfers_indices, std::vector<size_t>& selected_transfers) const
|
||||||
{
|
{
|
||||||
uint64_t found_money = 0;
|
uint64_t found_money = 0;
|
||||||
selected_transfers.reserve(unused_transfers_indices.size());
|
selected_transfers.reserve(unused_transfers_indices.size());
|
||||||
|
@ -4945,17 +4972,17 @@ void wallet2::add_unconfirmed_tx(const cryptonote::transaction& tx, uint64_t amo
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
void wallet2::transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outs_count, const std::vector<size_t> &unused_transfers_indices,
|
void wallet2::transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outs_count, const std::vector<size_t> &unused_transfers_indices,
|
||||||
uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, cryptonote::transaction& tx, pending_tx& ptx, bool trusted_daemon)
|
uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, cryptonote::transaction& tx, pending_tx& ptx)
|
||||||
{
|
{
|
||||||
transfer(dsts, fake_outs_count, unused_transfers_indices, unlock_time, fee, extra, detail::digit_split_strategy, tx_dust_policy(::config::DEFAULT_DUST_THRESHOLD), tx, ptx, trusted_daemon);
|
transfer(dsts, fake_outs_count, unused_transfers_indices, unlock_time, fee, extra, detail::digit_split_strategy, tx_dust_policy(::config::DEFAULT_DUST_THRESHOLD), tx, ptx);
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
void wallet2::transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outs_count, const std::vector<size_t> &unused_transfers_indices,
|
void wallet2::transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outs_count, const std::vector<size_t> &unused_transfers_indices,
|
||||||
uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, bool trusted_daemon)
|
uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra)
|
||||||
{
|
{
|
||||||
cryptonote::transaction tx;
|
cryptonote::transaction tx;
|
||||||
pending_tx ptx;
|
pending_tx ptx;
|
||||||
transfer(dsts, fake_outs_count, unused_transfers_indices, unlock_time, fee, extra, tx, ptx, trusted_daemon);
|
transfer(dsts, fake_outs_count, unused_transfers_indices, unlock_time, fee, extra, tx, ptx);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -5941,9 +5968,9 @@ uint32_t wallet2::adjust_priority(uint32_t priority)
|
||||||
//
|
//
|
||||||
// this function will make multiple calls to wallet2::transfer if multiple
|
// this function will make multiple calls to wallet2::transfer if multiple
|
||||||
// transactions will be required
|
// transactions will be required
|
||||||
std::vector<wallet2::pending_tx> wallet2::create_transactions(std::vector<cryptonote::tx_destination_entry> dsts, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, bool trusted_daemon)
|
std::vector<wallet2::pending_tx> wallet2::create_transactions(std::vector<cryptonote::tx_destination_entry> dsts, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra)
|
||||||
{
|
{
|
||||||
const std::vector<size_t> unused_transfers_indices = select_available_outputs_from_histogram(fake_outs_count + 1, true, true, true, trusted_daemon);
|
const std::vector<size_t> unused_transfers_indices = select_available_outputs_from_histogram(fake_outs_count + 1, true, true, true);
|
||||||
|
|
||||||
const uint64_t fee_per_kb = get_per_kb_fee();
|
const uint64_t fee_per_kb = get_per_kb_fee();
|
||||||
const uint64_t fee_multiplier = get_fee_multiplier(priority, get_fee_algorithm());
|
const uint64_t fee_multiplier = get_fee_multiplier(priority, get_fee_algorithm());
|
||||||
|
@ -5977,7 +6004,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions(std::vector<crypto
|
||||||
uint64_t needed_fee = calculate_fee(fee_per_kb, estimated_tx_size, fee_multiplier);
|
uint64_t needed_fee = calculate_fee(fee_per_kb, estimated_tx_size, fee_multiplier);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
transfer(dst_vector, fake_outs_count, unused_transfers_indices, unlock_time, needed_fee, extra, tx, ptx, trusted_daemon);
|
transfer(dst_vector, fake_outs_count, unused_transfers_indices, unlock_time, needed_fee, extra, tx, ptx);
|
||||||
auto txBlob = t_serializable_object_to_blob(ptx.tx);
|
auto txBlob = t_serializable_object_to_blob(ptx.tx);
|
||||||
needed_fee = calculate_fee(fee_per_kb, txBlob, fee_multiplier);
|
needed_fee = calculate_fee(fee_per_kb, txBlob, fee_multiplier);
|
||||||
} while (ptx.fee < needed_fee);
|
} while (ptx.fee < needed_fee);
|
||||||
|
@ -7951,7 +7978,7 @@ bool wallet2::light_wallet_key_image_is_ours(const crypto::key_image& key_image,
|
||||||
// This system allows for sending (almost) the entire balance, since it does
|
// This system allows for sending (almost) the entire balance, since it does
|
||||||
// not generate spurious change in all txes, thus decreasing the instantaneous
|
// not generate spurious change in all txes, thus decreasing the instantaneous
|
||||||
// usable balance.
|
// usable balance.
|
||||||
std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryptonote::tx_destination_entry> dsts, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, uint32_t subaddr_account, std::set<uint32_t> subaddr_indices, bool trusted_daemon)
|
std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryptonote::tx_destination_entry> dsts, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, uint32_t subaddr_account, std::set<uint32_t> subaddr_indices)
|
||||||
{
|
{
|
||||||
//ensure device is let in NONE mode in any case
|
//ensure device is let in NONE mode in any case
|
||||||
hw::device &hwdev = m_account.get_device();
|
hw::device &hwdev = m_account.get_device();
|
||||||
|
@ -8476,7 +8503,7 @@ skip_tx:
|
||||||
return ptx_vector;
|
return ptx_vector;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<wallet2::pending_tx> wallet2::create_transactions_all(uint64_t below, const cryptonote::account_public_address &address, bool is_subaddress, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, uint32_t subaddr_account, std::set<uint32_t> subaddr_indices, bool trusted_daemon)
|
std::vector<wallet2::pending_tx> wallet2::create_transactions_all(uint64_t below, const cryptonote::account_public_address &address, bool is_subaddress, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, uint32_t subaddr_account, std::set<uint32_t> subaddr_indices)
|
||||||
{
|
{
|
||||||
std::vector<size_t> unused_transfers_indices;
|
std::vector<size_t> unused_transfers_indices;
|
||||||
std::vector<size_t> unused_dust_indices;
|
std::vector<size_t> unused_dust_indices;
|
||||||
|
@ -8527,10 +8554,10 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_all(uint64_t below
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return create_transactions_from(address, is_subaddress, unused_transfers_indices, unused_dust_indices, fake_outs_count, unlock_time, priority, extra, trusted_daemon);
|
return create_transactions_from(address, is_subaddress, unused_transfers_indices, unused_dust_indices, fake_outs_count, unlock_time, priority, extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<wallet2::pending_tx> wallet2::create_transactions_single(const crypto::key_image &ki, const cryptonote::account_public_address &address, bool is_subaddress, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, bool trusted_daemon)
|
std::vector<wallet2::pending_tx> wallet2::create_transactions_single(const crypto::key_image &ki, const cryptonote::account_public_address &address, bool is_subaddress, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra)
|
||||||
{
|
{
|
||||||
std::vector<size_t> unused_transfers_indices;
|
std::vector<size_t> unused_transfers_indices;
|
||||||
std::vector<size_t> unused_dust_indices;
|
std::vector<size_t> unused_dust_indices;
|
||||||
|
@ -8548,10 +8575,10 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_single(const crypt
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return create_transactions_from(address, is_subaddress, unused_transfers_indices, unused_dust_indices, fake_outs_count, unlock_time, priority, extra, trusted_daemon);
|
return create_transactions_from(address, is_subaddress, unused_transfers_indices, unused_dust_indices, fake_outs_count, unlock_time, priority, extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const cryptonote::account_public_address &address, bool is_subaddress, std::vector<size_t> unused_transfers_indices, std::vector<size_t> unused_dust_indices, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, bool trusted_daemon)
|
std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const cryptonote::account_public_address &address, bool is_subaddress, std::vector<size_t> unused_transfers_indices, std::vector<size_t> unused_dust_indices, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra)
|
||||||
{
|
{
|
||||||
//ensure device is let in NONE mode in any case
|
//ensure device is let in NONE mode in any case
|
||||||
hw::device &hwdev = m_account.get_device();
|
hw::device &hwdev = m_account.get_device();
|
||||||
|
@ -8785,12 +8812,12 @@ std::vector<uint64_t> wallet2::get_unspent_amounts_vector() const
|
||||||
return vector;
|
return vector;
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
std::vector<size_t> wallet2::select_available_outputs_from_histogram(uint64_t count, bool atleast, bool unlocked, bool allow_rct, bool trusted_daemon)
|
std::vector<size_t> wallet2::select_available_outputs_from_histogram(uint64_t count, bool atleast, bool unlocked, bool allow_rct)
|
||||||
{
|
{
|
||||||
cryptonote::COMMAND_RPC_GET_OUTPUT_HISTOGRAM::request req_t = AUTO_VAL_INIT(req_t);
|
cryptonote::COMMAND_RPC_GET_OUTPUT_HISTOGRAM::request req_t = AUTO_VAL_INIT(req_t);
|
||||||
cryptonote::COMMAND_RPC_GET_OUTPUT_HISTOGRAM::response resp_t = AUTO_VAL_INIT(resp_t);
|
cryptonote::COMMAND_RPC_GET_OUTPUT_HISTOGRAM::response resp_t = AUTO_VAL_INIT(resp_t);
|
||||||
m_daemon_rpc_mutex.lock();
|
m_daemon_rpc_mutex.lock();
|
||||||
if (trusted_daemon)
|
if (is_trusted_daemon())
|
||||||
req_t.amounts = get_unspent_amounts_vector();
|
req_t.amounts = get_unspent_amounts_vector();
|
||||||
req_t.min_count = count;
|
req_t.min_count = count;
|
||||||
req_t.max_count = 0;
|
req_t.max_count = 0;
|
||||||
|
@ -8851,21 +8878,21 @@ const wallet2::transfer_details &wallet2::get_transfer_details(size_t idx) const
|
||||||
return m_transfers[idx];
|
return m_transfers[idx];
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
std::vector<size_t> wallet2::select_available_unmixable_outputs(bool trusted_daemon)
|
std::vector<size_t> wallet2::select_available_unmixable_outputs()
|
||||||
{
|
{
|
||||||
// request all outputs with less than 3 instances
|
// request all outputs with less than 3 instances
|
||||||
const size_t min_mixin = use_fork_rules(7, 10) ? 6 : use_fork_rules(6, 10) ? 4 : 2; // v6 increases min mixin from 2 to 4, v7 to 6
|
const size_t min_mixin = use_fork_rules(7, 10) ? 6 : use_fork_rules(6, 10) ? 4 : 2; // v6 increases min mixin from 2 to 4, v7 to 6
|
||||||
return select_available_outputs_from_histogram(min_mixin + 1, false, true, false, trusted_daemon);
|
return select_available_outputs_from_histogram(min_mixin + 1, false, true, false);
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
std::vector<size_t> wallet2::select_available_mixable_outputs(bool trusted_daemon)
|
std::vector<size_t> wallet2::select_available_mixable_outputs()
|
||||||
{
|
{
|
||||||
// request all outputs with at least 3 instances, so we can use mixin 2 with
|
// request all outputs with at least 3 instances, so we can use mixin 2 with
|
||||||
const size_t min_mixin = use_fork_rules(7, 10) ? 6 : use_fork_rules(6, 10) ? 4 : 2; // v6 increases min mixin from 2 to 4, v7 to 6
|
const size_t min_mixin = use_fork_rules(7, 10) ? 6 : use_fork_rules(6, 10) ? 4 : 2; // v6 increases min mixin from 2 to 4, v7 to 6
|
||||||
return select_available_outputs_from_histogram(min_mixin + 1, true, true, true, trusted_daemon);
|
return select_available_outputs_from_histogram(min_mixin + 1, true, true, true);
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
std::vector<wallet2::pending_tx> wallet2::create_unmixable_sweep_transactions(bool trusted_daemon)
|
std::vector<wallet2::pending_tx> wallet2::create_unmixable_sweep_transactions()
|
||||||
{
|
{
|
||||||
// From hard fork 1, we don't consider small amounts to be dust anymore
|
// From hard fork 1, we don't consider small amounts to be dust anymore
|
||||||
const bool hf1_rules = use_fork_rules(2, 10); // first hard fork has version 2
|
const bool hf1_rules = use_fork_rules(2, 10); // first hard fork has version 2
|
||||||
|
@ -8874,7 +8901,7 @@ std::vector<wallet2::pending_tx> wallet2::create_unmixable_sweep_transactions(bo
|
||||||
const uint64_t fee_per_kb = get_per_kb_fee();
|
const uint64_t fee_per_kb = get_per_kb_fee();
|
||||||
|
|
||||||
// may throw
|
// may throw
|
||||||
std::vector<size_t> unmixable_outputs = select_available_unmixable_outputs(trusted_daemon);
|
std::vector<size_t> unmixable_outputs = select_available_unmixable_outputs();
|
||||||
size_t num_dust_outputs = unmixable_outputs.size();
|
size_t num_dust_outputs = unmixable_outputs.size();
|
||||||
|
|
||||||
if (num_dust_outputs == 0)
|
if (num_dust_outputs == 0)
|
||||||
|
@ -8892,13 +8919,13 @@ std::vector<wallet2::pending_tx> wallet2::create_unmixable_sweep_transactions(bo
|
||||||
unmixable_transfer_outputs.push_back(n);
|
unmixable_transfer_outputs.push_back(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
return create_transactions_from(m_account_public_address, false, unmixable_transfer_outputs, unmixable_dust_outputs, 0 /*fake_outs_count */, 0 /* unlock_time */, 1 /*priority */, std::vector<uint8_t>(), trusted_daemon);
|
return create_transactions_from(m_account_public_address, false, unmixable_transfer_outputs, unmixable_dust_outputs, 0 /*fake_outs_count */, 0 /* unlock_time */, 1 /*priority */, std::vector<uint8_t>());
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
void wallet2::discard_unmixable_outputs(bool trusted_daemon)
|
void wallet2::discard_unmixable_outputs()
|
||||||
{
|
{
|
||||||
// may throw
|
// may throw
|
||||||
std::vector<size_t> unmixable_outputs = select_available_unmixable_outputs(trusted_daemon);
|
std::vector<size_t> unmixable_outputs = select_available_unmixable_outputs();
|
||||||
for (size_t idx : unmixable_outputs)
|
for (size_t idx : unmixable_outputs)
|
||||||
{
|
{
|
||||||
m_transfers[idx].m_spent = true;
|
m_transfers[idx].m_spent = true;
|
||||||
|
|
|
@ -637,13 +637,16 @@ namespace tools
|
||||||
// the minimum block size.
|
// the minimum block size.
|
||||||
bool deinit();
|
bool deinit();
|
||||||
bool init(bool rpc, std::string daemon_address = "http://localhost:8080",
|
bool init(bool rpc, std::string daemon_address = "http://localhost:8080",
|
||||||
boost::optional<epee::net_utils::http::login> daemon_login = boost::none, uint64_t upper_transaction_size_limit = 0, bool ssl = false);
|
boost::optional<epee::net_utils::http::login> daemon_login = boost::none, uint64_t upper_transaction_size_limit = 0, bool ssl = false, bool trusted_daemon = false);
|
||||||
|
|
||||||
void stop() { m_run.store(false, std::memory_order_relaxed); }
|
void stop() { m_run.store(false, std::memory_order_relaxed); }
|
||||||
|
|
||||||
i_wallet2_callback* callback() const { return m_callback; }
|
i_wallet2_callback* callback() const { return m_callback; }
|
||||||
void callback(i_wallet2_callback* callback) { m_callback = callback; }
|
void callback(i_wallet2_callback* callback) { m_callback = callback; }
|
||||||
|
|
||||||
|
bool is_trusted_daemon() const { return m_trusted_daemon; }
|
||||||
|
void set_trusted_daemon(bool trusted) { m_trusted_daemon = trusted; }
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Checks if deterministic wallet
|
* \brief Checks if deterministic wallet
|
||||||
*/
|
*/
|
||||||
|
@ -715,11 +718,11 @@ namespace tools
|
||||||
uint64_t balance_all() const;
|
uint64_t balance_all() const;
|
||||||
uint64_t unlocked_balance_all() const;
|
uint64_t unlocked_balance_all() const;
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outputs_count, const std::vector<size_t> &unused_transfers_indices, uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, T destination_split_strategy, const tx_dust_policy& dust_policy, bool trusted_daemon);
|
void transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outputs_count, const std::vector<size_t> &unused_transfers_indices, uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, T destination_split_strategy, const tx_dust_policy& dust_policy);
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outputs_count, const std::vector<size_t> &unused_transfers_indices, uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, T destination_split_strategy, const tx_dust_policy& dust_policy, cryptonote::transaction& tx, pending_tx& ptx, bool trusted_daemon);
|
void transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outputs_count, const std::vector<size_t> &unused_transfers_indices, uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, T destination_split_strategy, const tx_dust_policy& dust_policy, cryptonote::transaction& tx, pending_tx& ptx);
|
||||||
void transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outputs_count, const std::vector<size_t> &unused_transfers_indices, uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, bool trusted_daemon);
|
void transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outputs_count, const std::vector<size_t> &unused_transfers_indices, uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra);
|
||||||
void transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outputs_count, const std::vector<size_t> &unused_transfers_indices, uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, cryptonote::transaction& tx, pending_tx& ptx, bool trusted_daemon);
|
void transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outputs_count, const std::vector<size_t> &unused_transfers_indices, uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, cryptonote::transaction& tx, pending_tx& ptx);
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void transfer_selected(const std::vector<cryptonote::tx_destination_entry>& dsts, const std::vector<size_t>& selected_transfers, size_t fake_outputs_count,
|
void transfer_selected(const std::vector<cryptonote::tx_destination_entry>& dsts, const std::vector<size_t>& selected_transfers, size_t fake_outputs_count,
|
||||||
std::vector<std::vector<tools::wallet2::get_outs_entry>> &outs,
|
std::vector<std::vector<tools::wallet2::get_outs_entry>> &outs,
|
||||||
|
@ -748,18 +751,18 @@ namespace tools
|
||||||
bool parse_unsigned_tx_from_str(const std::string &unsigned_tx_st, unsigned_tx_set &exported_txs) const;
|
bool parse_unsigned_tx_from_str(const std::string &unsigned_tx_st, unsigned_tx_set &exported_txs) const;
|
||||||
bool load_tx(const std::string &signed_filename, std::vector<tools::wallet2::pending_tx> &ptx, std::function<bool(const signed_tx_set&)> accept_func = NULL);
|
bool load_tx(const std::string &signed_filename, std::vector<tools::wallet2::pending_tx> &ptx, std::function<bool(const signed_tx_set&)> accept_func = NULL);
|
||||||
bool parse_tx_from_str(const std::string &signed_tx_st, std::vector<tools::wallet2::pending_tx> &ptx, std::function<bool(const signed_tx_set &)> accept_func);
|
bool parse_tx_from_str(const std::string &signed_tx_st, std::vector<tools::wallet2::pending_tx> &ptx, std::function<bool(const signed_tx_set &)> accept_func);
|
||||||
std::vector<pending_tx> create_transactions(std::vector<cryptonote::tx_destination_entry> dsts, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, bool trusted_daemon);
|
std::vector<pending_tx> create_transactions(std::vector<cryptonote::tx_destination_entry> dsts, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra);
|
||||||
std::vector<wallet2::pending_tx> create_transactions_2(std::vector<cryptonote::tx_destination_entry> dsts, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, uint32_t subaddr_account, std::set<uint32_t> subaddr_indices, bool trusted_daemon); // pass subaddr_indices by value on purpose
|
std::vector<wallet2::pending_tx> create_transactions_2(std::vector<cryptonote::tx_destination_entry> dsts, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, uint32_t subaddr_account, std::set<uint32_t> subaddr_indices); // pass subaddr_indices by value on purpose
|
||||||
std::vector<wallet2::pending_tx> create_transactions_all(uint64_t below, const cryptonote::account_public_address &address, bool is_subaddress, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, uint32_t subaddr_account, std::set<uint32_t> subaddr_indices, bool trusted_daemon);
|
std::vector<wallet2::pending_tx> create_transactions_all(uint64_t below, const cryptonote::account_public_address &address, bool is_subaddress, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, uint32_t subaddr_account, std::set<uint32_t> subaddr_indices);
|
||||||
std::vector<wallet2::pending_tx> create_transactions_single(const crypto::key_image &ki, const cryptonote::account_public_address &address, bool is_subaddress, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, bool trusted_daemon);
|
std::vector<wallet2::pending_tx> create_transactions_single(const crypto::key_image &ki, const cryptonote::account_public_address &address, bool is_subaddress, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra);
|
||||||
std::vector<wallet2::pending_tx> create_transactions_from(const cryptonote::account_public_address &address, bool is_subaddress, std::vector<size_t> unused_transfers_indices, std::vector<size_t> unused_dust_indices, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, bool trusted_daemon);
|
std::vector<wallet2::pending_tx> create_transactions_from(const cryptonote::account_public_address &address, bool is_subaddress, std::vector<size_t> unused_transfers_indices, std::vector<size_t> unused_dust_indices, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra);
|
||||||
bool load_multisig_tx(cryptonote::blobdata blob, multisig_tx_set &exported_txs, std::function<bool(const multisig_tx_set&)> accept_func = NULL);
|
bool load_multisig_tx(cryptonote::blobdata blob, multisig_tx_set &exported_txs, std::function<bool(const multisig_tx_set&)> accept_func = NULL);
|
||||||
bool load_multisig_tx_from_file(const std::string &filename, multisig_tx_set &exported_txs, std::function<bool(const multisig_tx_set&)> accept_func = NULL);
|
bool load_multisig_tx_from_file(const std::string &filename, multisig_tx_set &exported_txs, std::function<bool(const multisig_tx_set&)> accept_func = NULL);
|
||||||
bool sign_multisig_tx_from_file(const std::string &filename, std::vector<crypto::hash> &txids, std::function<bool(const multisig_tx_set&)> accept_func);
|
bool sign_multisig_tx_from_file(const std::string &filename, std::vector<crypto::hash> &txids, std::function<bool(const multisig_tx_set&)> accept_func);
|
||||||
bool sign_multisig_tx(multisig_tx_set &exported_txs, std::vector<crypto::hash> &txids);
|
bool sign_multisig_tx(multisig_tx_set &exported_txs, std::vector<crypto::hash> &txids);
|
||||||
bool sign_multisig_tx_to_file(multisig_tx_set &exported_txs, const std::string &filename, std::vector<crypto::hash> &txids);
|
bool sign_multisig_tx_to_file(multisig_tx_set &exported_txs, const std::string &filename, std::vector<crypto::hash> &txids);
|
||||||
std::vector<pending_tx> create_unmixable_sweep_transactions(bool trusted_daemon);
|
std::vector<pending_tx> create_unmixable_sweep_transactions();
|
||||||
void discard_unmixable_outputs(bool trusted_daemon);
|
void discard_unmixable_outputs();
|
||||||
bool check_connection(uint32_t *version = NULL, uint32_t timeout = 200000);
|
bool check_connection(uint32_t *version = NULL, uint32_t timeout = 200000);
|
||||||
void get_transfers(wallet2::transfer_container& incoming_transfers) const;
|
void get_transfers(wallet2::transfer_container& incoming_transfers) const;
|
||||||
void get_payments(const crypto::hash& payment_id, std::list<wallet2::payment_details>& payments, uint64_t min_height = 0, const boost::optional<uint32_t>& subaddr_account = boost::none, const std::set<uint32_t>& subaddr_indices = {}) const;
|
void get_payments(const crypto::hash& payment_id, std::list<wallet2::payment_details>& payments, uint64_t min_height = 0, const boost::optional<uint32_t>& subaddr_account = boost::none, const std::set<uint32_t>& subaddr_indices = {}) const;
|
||||||
|
@ -996,10 +999,10 @@ namespace tools
|
||||||
*/
|
*/
|
||||||
uint64_t get_approximate_blockchain_height() const;
|
uint64_t get_approximate_blockchain_height() const;
|
||||||
uint64_t estimate_blockchain_height();
|
uint64_t estimate_blockchain_height();
|
||||||
std::vector<size_t> select_available_outputs_from_histogram(uint64_t count, bool atleast, bool unlocked, bool allow_rct, bool trusted_daemon);
|
std::vector<size_t> select_available_outputs_from_histogram(uint64_t count, bool atleast, bool unlocked, bool allow_rct);
|
||||||
std::vector<size_t> select_available_outputs(const std::function<bool(const transfer_details &td)> &f) const;
|
std::vector<size_t> select_available_outputs(const std::function<bool(const transfer_details &td)> &f) const;
|
||||||
std::vector<size_t> select_available_unmixable_outputs(bool trusted_daemon);
|
std::vector<size_t> select_available_unmixable_outputs();
|
||||||
std::vector<size_t> select_available_mixable_outputs(bool trusted_daemon);
|
std::vector<size_t> select_available_mixable_outputs();
|
||||||
|
|
||||||
size_t pop_best_value_from(const transfer_container &transfers, std::vector<size_t> &unused_dust_indices, const std::vector<size_t>& selected_transfers, bool smallest = false) const;
|
size_t pop_best_value_from(const transfer_container &transfers, std::vector<size_t> &unused_dust_indices, const std::vector<size_t>& selected_transfers, bool smallest = false) const;
|
||||||
size_t pop_best_value(std::vector<size_t> &unused_dust_indices, const std::vector<size_t>& selected_transfers, bool smallest = false) const;
|
size_t pop_best_value(std::vector<size_t> &unused_dust_indices, const std::vector<size_t>& selected_transfers, bool smallest = false) const;
|
||||||
|
@ -1195,7 +1198,7 @@ namespace tools
|
||||||
void fast_refresh(uint64_t stop_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, bool force = false);
|
void fast_refresh(uint64_t stop_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, bool force = false);
|
||||||
void pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, const std::vector<cryptonote::block_complete_entry> &prev_blocks, const std::vector<parsed_block> &prev_parsed_blocks, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<parsed_block> &parsed_blocks, bool &error);
|
void pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, const std::vector<cryptonote::block_complete_entry> &prev_blocks, const std::vector<parsed_block> &prev_parsed_blocks, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<parsed_block> &parsed_blocks, bool &error);
|
||||||
void process_parsed_blocks(uint64_t start_height, const std::vector<cryptonote::block_complete_entry> &blocks, const std::vector<parsed_block> &parsed_blocks, uint64_t& blocks_added);
|
void process_parsed_blocks(uint64_t start_height, const std::vector<cryptonote::block_complete_entry> &blocks, const std::vector<parsed_block> &parsed_blocks, uint64_t& blocks_added);
|
||||||
uint64_t select_transfers(uint64_t needed_money, std::vector<size_t> unused_transfers_indices, std::vector<size_t>& selected_transfers, bool trusted_daemon) const;
|
uint64_t select_transfers(uint64_t needed_money, std::vector<size_t> unused_transfers_indices, std::vector<size_t>& selected_transfers) const;
|
||||||
bool prepare_file_names(const std::string& file_path);
|
bool prepare_file_names(const std::string& file_path);
|
||||||
void process_unconfirmed(const crypto::hash &txid, const cryptonote::transaction& tx, uint64_t height);
|
void process_unconfirmed(const crypto::hash &txid, const cryptonote::transaction& tx, uint64_t height);
|
||||||
void process_outgoing(const crypto::hash &txid, const cryptonote::transaction& tx, uint64_t height, uint64_t ts, uint64_t spent, uint64_t received, uint32_t subaddr_account, const std::set<uint32_t>& subaddr_indices);
|
void process_outgoing(const crypto::hash &txid, const cryptonote::transaction& tx, uint64_t height, uint64_t ts, uint64_t spent, uint64_t received, uint32_t subaddr_account, const std::set<uint32_t>& subaddr_indices);
|
||||||
|
@ -1274,6 +1277,7 @@ namespace tools
|
||||||
|
|
||||||
boost::mutex m_daemon_rpc_mutex;
|
boost::mutex m_daemon_rpc_mutex;
|
||||||
|
|
||||||
|
bool m_trusted_daemon;
|
||||||
i_wallet2_callback* m_callback;
|
i_wallet2_callback* m_callback;
|
||||||
bool m_key_on_device;
|
bool m_key_on_device;
|
||||||
cryptonote::network_type m_nettype;
|
cryptonote::network_type m_nettype;
|
||||||
|
@ -1817,16 +1821,16 @@ namespace tools
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void wallet2::transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outs_count, const std::vector<size_t> &unused_transfers_indices,
|
void wallet2::transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outs_count, const std::vector<size_t> &unused_transfers_indices,
|
||||||
uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, T destination_split_strategy, const tx_dust_policy& dust_policy, bool trusted_daemon)
|
uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, T destination_split_strategy, const tx_dust_policy& dust_policy)
|
||||||
{
|
{
|
||||||
pending_tx ptx;
|
pending_tx ptx;
|
||||||
cryptonote::transaction tx;
|
cryptonote::transaction tx;
|
||||||
transfer(dsts, fake_outs_count, unused_transfers_indices, unlock_time, fee, extra, destination_split_strategy, dust_policy, tx, ptx, trusted_daemon);
|
transfer(dsts, fake_outs_count, unused_transfers_indices, unlock_time, fee, extra, destination_split_strategy, dust_policy, tx, ptx);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void wallet2::transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outputs_count, const std::vector<size_t> &unused_transfers_indices,
|
void wallet2::transfer(const std::vector<cryptonote::tx_destination_entry>& dsts, const size_t fake_outputs_count, const std::vector<size_t> &unused_transfers_indices,
|
||||||
uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, T destination_split_strategy, const tx_dust_policy& dust_policy, cryptonote::transaction& tx, pending_tx &ptx, bool trusted_daemon)
|
uint64_t unlock_time, uint64_t fee, const std::vector<uint8_t>& extra, T destination_split_strategy, const tx_dust_policy& dust_policy, cryptonote::transaction& tx, pending_tx &ptx)
|
||||||
{
|
{
|
||||||
using namespace cryptonote;
|
using namespace cryptonote;
|
||||||
// throw if attempting a transaction with no destinations
|
// throw if attempting a transaction with no destinations
|
||||||
|
@ -1849,7 +1853,7 @@ namespace tools
|
||||||
// randomly select inputs for transaction
|
// randomly select inputs for transaction
|
||||||
// throw if requested send amount is greater than (unlocked) amount available to send
|
// throw if requested send amount is greater than (unlocked) amount available to send
|
||||||
std::vector<size_t> selected_transfers;
|
std::vector<size_t> selected_transfers;
|
||||||
uint64_t found_money = select_transfers(needed_money, unused_transfers_indices, selected_transfers, trusted_daemon);
|
uint64_t found_money = select_transfers(needed_money, unused_transfers_indices, selected_transfers);
|
||||||
THROW_WALLET_EXCEPTION_IF(found_money < needed_money, error::not_enough_unlocked_money, found_money, needed_money - fee, fee);
|
THROW_WALLET_EXCEPTION_IF(found_money < needed_money, error::not_enough_unlocked_money, found_money, needed_money - fee, fee);
|
||||||
|
|
||||||
uint32_t subaddr_account = m_transfers[*selected_transfers.begin()].m_subaddr_index.major;
|
uint32_t subaddr_account = m_transfers[*selected_transfers.begin()].m_subaddr_index.major;
|
||||||
|
|
|
@ -59,7 +59,6 @@ namespace
|
||||||
{
|
{
|
||||||
const command_line::arg_descriptor<std::string, true> arg_rpc_bind_port = {"rpc-bind-port", "Sets bind port for server"};
|
const command_line::arg_descriptor<std::string, true> arg_rpc_bind_port = {"rpc-bind-port", "Sets bind port for server"};
|
||||||
const command_line::arg_descriptor<bool> arg_disable_rpc_login = {"disable-rpc-login", "Disable HTTP authentication for RPC connections served by this process"};
|
const command_line::arg_descriptor<bool> arg_disable_rpc_login = {"disable-rpc-login", "Disable HTTP authentication for RPC connections served by this process"};
|
||||||
const command_line::arg_descriptor<bool> arg_trusted_daemon = {"trusted-daemon", "Enable commands which rely on a trusted daemon", false};
|
|
||||||
const command_line::arg_descriptor<bool> arg_restricted = {"restricted-rpc", "Restricts to view-only commands", false};
|
const command_line::arg_descriptor<bool> arg_restricted = {"restricted-rpc", "Restricts to view-only commands", false};
|
||||||
const command_line::arg_descriptor<std::string> arg_wallet_dir = {"wallet-dir", "Directory for newly created wallets"};
|
const command_line::arg_descriptor<std::string> arg_wallet_dir = {"wallet-dir", "Directory for newly created wallets"};
|
||||||
const command_line::arg_descriptor<bool> arg_prompt_for_password = {"prompt-for-password", "Prompts for password when not provided", false};
|
const command_line::arg_descriptor<bool> arg_prompt_for_password = {"prompt-for-password", "Prompts for password when not provided", false};
|
||||||
|
@ -100,7 +99,7 @@ namespace tools
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
wallet_rpc_server::wallet_rpc_server():m_wallet(NULL), rpc_login_file(), m_stop(false), m_trusted_daemon(false), m_restricted(false), m_vm(NULL)
|
wallet_rpc_server::wallet_rpc_server():m_wallet(NULL), rpc_login_file(), m_stop(false), m_restricted(false), m_vm(NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -120,7 +119,7 @@ namespace tools
|
||||||
m_stop = false;
|
m_stop = false;
|
||||||
m_net_server.add_idle_handler([this](){
|
m_net_server.add_idle_handler([this](){
|
||||||
try {
|
try {
|
||||||
if (m_wallet) m_wallet->refresh(m_trusted_daemon);
|
if (m_wallet) m_wallet->refresh(m_wallet->is_trusted_daemon());
|
||||||
} catch (const std::exception& ex) {
|
} catch (const std::exception& ex) {
|
||||||
LOG_ERROR("Exception at while refreshing, what=" << ex.what());
|
LOG_ERROR("Exception at while refreshing, what=" << ex.what());
|
||||||
}
|
}
|
||||||
|
@ -169,15 +168,6 @@ namespace tools
|
||||||
boost::optional<epee::net_utils::http::login> http_login{};
|
boost::optional<epee::net_utils::http::login> http_login{};
|
||||||
std::string bind_port = command_line::get_arg(*m_vm, arg_rpc_bind_port);
|
std::string bind_port = command_line::get_arg(*m_vm, arg_rpc_bind_port);
|
||||||
const bool disable_auth = command_line::get_arg(*m_vm, arg_disable_rpc_login);
|
const bool disable_auth = command_line::get_arg(*m_vm, arg_disable_rpc_login);
|
||||||
m_trusted_daemon = command_line::get_arg(*m_vm, arg_trusted_daemon);
|
|
||||||
if (!command_line::has_arg(*m_vm, arg_trusted_daemon))
|
|
||||||
{
|
|
||||||
if (tools::is_local_address(walvars->get_daemon_address()))
|
|
||||||
{
|
|
||||||
MINFO(tr("Daemon is local, assuming trusted"));
|
|
||||||
m_trusted_daemon = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_restricted = command_line::get_arg(*m_vm, arg_restricted);
|
m_restricted = command_line::get_arg(*m_vm, arg_restricted);
|
||||||
if (command_line::has_arg(*m_vm, arg_wallet_dir))
|
if (command_line::has_arg(*m_vm, arg_wallet_dir))
|
||||||
{
|
{
|
||||||
|
@ -857,7 +847,7 @@ namespace tools
|
||||||
mixin = m_wallet->adjust_mixin(req.mixin);
|
mixin = m_wallet->adjust_mixin(req.mixin);
|
||||||
}
|
}
|
||||||
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_2(dsts, mixin, req.unlock_time, priority, extra, req.account_index, req.subaddr_indices, m_trusted_daemon);
|
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_transactions_2(dsts, mixin, req.unlock_time, priority, extra, req.account_index, req.subaddr_indices);
|
||||||
|
|
||||||
if (ptx_vector.empty())
|
if (ptx_vector.empty())
|
||||||
{
|
{
|
||||||
|
@ -918,7 +908,7 @@ namespace tools
|
||||||
}
|
}
|
||||||
uint32_t priority = m_wallet->adjust_priority(req.priority);
|
uint32_t priority = m_wallet->adjust_priority(req.priority);
|
||||||
LOG_PRINT_L2("on_transfer_split calling create_transactions_2");
|
LOG_PRINT_L2("on_transfer_split calling create_transactions_2");
|
||||||
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_transactions_2(dsts, mixin, req.unlock_time, priority, extra, req.account_index, req.subaddr_indices, m_trusted_daemon);
|
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_transactions_2(dsts, mixin, req.unlock_time, priority, extra, req.account_index, req.subaddr_indices);
|
||||||
LOG_PRINT_L2("on_transfer_split called create_transactions_2");
|
LOG_PRINT_L2("on_transfer_split called create_transactions_2");
|
||||||
|
|
||||||
return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_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.multisig_txset, res.unsigned_txset, req.do_not_relay,
|
||||||
|
@ -1079,7 +1069,7 @@ namespace tools
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_unmixable_sweep_transactions(m_trusted_daemon);
|
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_unmixable_sweep_transactions();
|
||||||
|
|
||||||
return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_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.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);
|
||||||
|
@ -1127,7 +1117,7 @@ namespace tools
|
||||||
mixin = m_wallet->adjust_mixin(req.mixin);
|
mixin = m_wallet->adjust_mixin(req.mixin);
|
||||||
}
|
}
|
||||||
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, mixin, req.unlock_time, priority, extra, req.account_index, req.subaddr_indices, m_trusted_daemon);
|
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_transactions_all(req.below_amount, dsts[0].addr, dsts[0].is_subaddress, mixin, req.unlock_time, priority, extra, req.account_index, req.subaddr_indices);
|
||||||
|
|
||||||
return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_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.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);
|
||||||
|
@ -1183,7 +1173,7 @@ namespace tools
|
||||||
mixin = m_wallet->adjust_mixin(req.mixin);
|
mixin = m_wallet->adjust_mixin(req.mixin);
|
||||||
}
|
}
|
||||||
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_single(ki, dsts[0].addr, dsts[0].is_subaddress, mixin, req.unlock_time, priority, extra, m_trusted_daemon);
|
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_transactions_single(ki, dsts[0].addr, dsts[0].is_subaddress, mixin, req.unlock_time, priority, extra);
|
||||||
|
|
||||||
if (ptx_vector.empty())
|
if (ptx_vector.empty())
|
||||||
{
|
{
|
||||||
|
@ -2304,7 +2294,7 @@ namespace tools
|
||||||
er.message = "Command unavailable in restricted mode.";
|
er.message = "Command unavailable in restricted mode.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!m_trusted_daemon)
|
if (!m_wallet->is_trusted_daemon())
|
||||||
{
|
{
|
||||||
er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
|
er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
|
||||||
er.message = "This command requires a trusted daemon.";
|
er.message = "This command requires a trusted daemon.";
|
||||||
|
@ -2518,7 +2508,7 @@ namespace tools
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_wallet->refresh(m_trusted_daemon, req.start_height, res.blocks_fetched, res.received_money);
|
m_wallet->refresh(m_wallet->is_trusted_daemon(), req.start_height, res.blocks_fetched, res.received_money);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
|
@ -2554,7 +2544,7 @@ namespace tools
|
||||||
bool wallet_rpc_server::on_start_mining(const wallet_rpc::COMMAND_RPC_START_MINING::request& req, wallet_rpc::COMMAND_RPC_START_MINING::response& res, epee::json_rpc::error& er)
|
bool wallet_rpc_server::on_start_mining(const wallet_rpc::COMMAND_RPC_START_MINING::request& req, wallet_rpc::COMMAND_RPC_START_MINING::response& res, epee::json_rpc::error& er)
|
||||||
{
|
{
|
||||||
if (!m_wallet) return not_open(er);
|
if (!m_wallet) return not_open(er);
|
||||||
if (!m_trusted_daemon)
|
if (!m_wallet->is_trusted_daemon())
|
||||||
{
|
{
|
||||||
er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
|
er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
|
||||||
er.message = "This command requires a trusted daemon.";
|
er.message = "This command requires a trusted daemon.";
|
||||||
|
@ -2993,7 +2983,7 @@ namespace tools
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_trusted_daemon)
|
if (m_wallet->is_trusted_daemon())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -3216,7 +3206,6 @@ int main(int argc, char** argv) {
|
||||||
tools::wallet2::init_options(desc_params);
|
tools::wallet2::init_options(desc_params);
|
||||||
command_line::add_arg(desc_params, arg_rpc_bind_port);
|
command_line::add_arg(desc_params, arg_rpc_bind_port);
|
||||||
command_line::add_arg(desc_params, arg_disable_rpc_login);
|
command_line::add_arg(desc_params, arg_disable_rpc_login);
|
||||||
command_line::add_arg(desc_params, arg_trusted_daemon);
|
|
||||||
command_line::add_arg(desc_params, arg_restricted);
|
command_line::add_arg(desc_params, arg_restricted);
|
||||||
cryptonote::rpc_args::init_options(desc_params);
|
cryptonote::rpc_args::init_options(desc_params);
|
||||||
command_line::add_arg(desc_params, arg_wallet_file);
|
command_line::add_arg(desc_params, arg_wallet_file);
|
||||||
|
@ -3309,7 +3298,7 @@ int main(int argc, char** argv) {
|
||||||
wal->stop();
|
wal->stop();
|
||||||
});
|
});
|
||||||
|
|
||||||
wal->refresh(command_line::get_arg(*vm, arg_trusted_daemon));
|
wal->refresh(wal->is_trusted_daemon());
|
||||||
// if we ^C during potentially length load/refresh, there's no server loop yet
|
// if we ^C during potentially length load/refresh, there's no server loop yet
|
||||||
if (quit)
|
if (quit)
|
||||||
{
|
{
|
||||||
|
|
|
@ -238,7 +238,6 @@ namespace tools
|
||||||
std::string m_wallet_dir;
|
std::string m_wallet_dir;
|
||||||
tools::private_file rpc_login_file;
|
tools::private_file rpc_login_file;
|
||||||
std::atomic<bool> m_stop;
|
std::atomic<bool> m_stop;
|
||||||
bool m_trusted_daemon;
|
|
||||||
bool m_restricted;
|
bool m_restricted;
|
||||||
const boost::program_options::variables_map *m_vm;
|
const boost::program_options::variables_map *m_vm;
|
||||||
};
|
};
|
||||||
|
|
|
@ -86,7 +86,7 @@ bool do_send_money(tools::wallet2& w1, tools::wallet2& w2, size_t mix_in_factor,
|
||||||
{
|
{
|
||||||
tools::wallet2::pending_tx ptx;
|
tools::wallet2::pending_tx ptx;
|
||||||
std::vector<size_t> indices = w1.select_available_outputs([](const tools::wallet2::transfer_details&) { return true; });
|
std::vector<size_t> indices = w1.select_available_outputs([](const tools::wallet2::transfer_details&) { return true; });
|
||||||
w1.transfer(dsts, mix_in_factor, indices, 0, TEST_FEE, std::vector<uint8_t>(), tools::detail::null_split_strategy, tools::tx_dust_policy(TEST_DUST_THRESHOLD), tx, ptx, true);
|
w1.transfer(dsts, mix_in_factor, indices, 0, TEST_FEE, std::vector<uint8_t>(), tools::detail::null_split_strategy, tools::tx_dust_policy(TEST_DUST_THRESHOLD), tx, ptx);
|
||||||
w1.commit_tx(ptx);
|
w1.commit_tx(ptx);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue