|
|
@ -372,6 +372,7 @@ WalletImpl::WalletImpl(NetworkType nettype)
|
|
|
|
, m_trustedDaemon(false)
|
|
|
|
, m_trustedDaemon(false)
|
|
|
|
, m_wallet2Callback(nullptr)
|
|
|
|
, m_wallet2Callback(nullptr)
|
|
|
|
, m_recoveringFromSeed(false)
|
|
|
|
, m_recoveringFromSeed(false)
|
|
|
|
|
|
|
|
, m_recoveringFromDevice(false)
|
|
|
|
, m_synchronized(false)
|
|
|
|
, m_synchronized(false)
|
|
|
|
, m_rebuildWalletCache(false)
|
|
|
|
, m_rebuildWalletCache(false)
|
|
|
|
, m_is_connected(false)
|
|
|
|
, m_is_connected(false)
|
|
|
@ -419,6 +420,7 @@ bool WalletImpl::create(const std::string &path, const std::string &password, co
|
|
|
|
|
|
|
|
|
|
|
|
clearStatus();
|
|
|
|
clearStatus();
|
|
|
|
m_recoveringFromSeed = false;
|
|
|
|
m_recoveringFromSeed = false;
|
|
|
|
|
|
|
|
m_recoveringFromDevice = false;
|
|
|
|
bool keys_file_exists;
|
|
|
|
bool keys_file_exists;
|
|
|
|
bool wallet_file_exists;
|
|
|
|
bool wallet_file_exists;
|
|
|
|
tools::wallet2::wallet_exists(path, keys_file_exists, wallet_file_exists);
|
|
|
|
tools::wallet2::wallet_exists(path, keys_file_exists, wallet_file_exists);
|
|
|
@ -621,11 +623,28 @@ bool WalletImpl::recoverFromKeysWithPassword(const std::string &path,
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool WalletImpl::recoverFromDevice(const std::string &path, const std::string &password, const std::string &device_name)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
clearStatus();
|
|
|
|
|
|
|
|
m_recoveringFromSeed = false;
|
|
|
|
|
|
|
|
m_recoveringFromDevice = true;
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
m_wallet->restore(path, password, device_name);
|
|
|
|
|
|
|
|
LOG_PRINT_L1("Generated new wallet from device: " + device_name);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (const std::exception& e) {
|
|
|
|
|
|
|
|
setStatusError(string(tr("failed to generate new wallet: ")) + e.what());
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool WalletImpl::open(const std::string &path, const std::string &password)
|
|
|
|
bool WalletImpl::open(const std::string &path, const std::string &password)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
clearStatus();
|
|
|
|
clearStatus();
|
|
|
|
m_recoveringFromSeed = false;
|
|
|
|
m_recoveringFromSeed = false;
|
|
|
|
|
|
|
|
m_recoveringFromDevice = false;
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// TODO: handle "deprecated"
|
|
|
|
// TODO: handle "deprecated"
|
|
|
|
// Check if wallet cache exists
|
|
|
|
// Check if wallet cache exists
|
|
|
@ -663,6 +682,7 @@ bool WalletImpl::recover(const std::string &path, const std::string &password, c
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_recoveringFromSeed = true;
|
|
|
|
m_recoveringFromSeed = true;
|
|
|
|
|
|
|
|
m_recoveringFromDevice = false;
|
|
|
|
crypto::secret_key recovery_key;
|
|
|
|
crypto::secret_key recovery_key;
|
|
|
|
std::string old_language;
|
|
|
|
std::string old_language;
|
|
|
|
if (!crypto::ElectrumWords::words_to_bytes(seed, recovery_key, old_language)) {
|
|
|
|
if (!crypto::ElectrumWords::words_to_bytes(seed, recovery_key, old_language)) {
|
|
|
@ -884,6 +904,16 @@ void WalletImpl::setRecoveringFromSeed(bool recoveringFromSeed)
|
|
|
|
m_recoveringFromSeed = recoveringFromSeed;
|
|
|
|
m_recoveringFromSeed = recoveringFromSeed;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void WalletImpl::setRecoveringFromDevice(bool recoveringFromDevice)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
m_recoveringFromDevice = recoveringFromDevice;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void WalletImpl::setSubaddressLookahead(uint32_t major, uint32_t minor)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
m_wallet->set_subaddress_lookahead(major, minor);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint64_t WalletImpl::balance(uint32_t accountIndex) const
|
|
|
|
uint64_t WalletImpl::balance(uint32_t accountIndex) const
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return m_wallet->balance(accountIndex);
|
|
|
|
return m_wallet->balance(accountIndex);
|
|
|
@ -1996,7 +2026,7 @@ bool WalletImpl::isNewWallet() const
|
|
|
|
// with the daemon (pull hashes instead of pull blocks).
|
|
|
|
// with the daemon (pull hashes instead of pull blocks).
|
|
|
|
// If wallet cache is rebuilt, creation height stored in .keys is used.
|
|
|
|
// If wallet cache is rebuilt, creation height stored in .keys is used.
|
|
|
|
// Watch only wallet is a copy of an existing wallet.
|
|
|
|
// Watch only wallet is a copy of an existing wallet.
|
|
|
|
return !(blockChainHeight() > 1 || m_recoveringFromSeed || m_rebuildWalletCache) && !watchOnly();
|
|
|
|
return !(blockChainHeight() > 1 || m_recoveringFromSeed || m_recoveringFromDevice || m_rebuildWalletCache) && !watchOnly();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool WalletImpl::doInit(const string &daemon_address, uint64_t upper_transaction_size_limit, bool ssl)
|
|
|
|
bool WalletImpl::doInit(const string &daemon_address, uint64_t upper_transaction_size_limit, bool ssl)
|
|
|
|