diff options
Diffstat (limited to 'src/wallet/api/wallet.cpp')
-rw-r--r-- | src/wallet/api/wallet.cpp | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index 6c1c1fea2..134ea601c 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -201,6 +201,7 @@ WalletImpl::WalletImpl(bool testnet) , m_wallet2Callback(nullptr) , m_recoveringFromSeed(false) , m_synchronized(false) + , m_rebuildWalletCache(false) { m_wallet = new tools::wallet2(testnet); m_history = new TransactionHistoryImpl(this); @@ -269,6 +270,14 @@ bool WalletImpl::open(const std::string &path, const std::string &password) m_recoveringFromSeed = false; try { // TODO: handle "deprecated" + // Check if wallet cache exists + bool keys_file_exists; + bool wallet_file_exists; + tools::wallet2::wallet_exists(path, keys_file_exists, wallet_file_exists); + if(!wallet_file_exists){ + // Rebuilding wallet cache, using refresh height from .keys file + m_rebuildWalletCache = true; + } m_wallet->load(path, password); m_password = password; @@ -540,15 +549,14 @@ int WalletImpl::autoRefreshInterval() const // - unconfirmed_transfer_details; // - confirmed_transfer_details) -PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const string &payment_id, uint64_t amount, uint32_t mixin_count, +PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const string &payment_id, optional<uint64_t> amount, uint32_t mixin_count, PendingTransaction::Priority priority) { clearStatus(); // Pause refresh thread while creating transaction pauseRefresh(); - vector<cryptonote::tx_destination_entry> dsts; - cryptonote::tx_destination_entry de; + cryptonote::account_public_address addr; // indicates if dst_addr is integrated address (address + payment_id) bool has_payment_id; @@ -561,7 +569,7 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const PendingTransactionImpl * transaction = new PendingTransactionImpl(*this); do { - if(!cryptonote::get_account_integrated_address_from_str(de.addr, has_payment_id, payment_id_short, m_wallet->testnet(), dst_addr)) { + if(!cryptonote::get_account_integrated_address_from_str(addr, has_payment_id, payment_id_short, m_wallet->testnet(), dst_addr)) { // TODO: copy-paste 'if treating as an address fails, try as url' from simplewallet.cpp:1982 m_status = Status_Error; m_errorString = "Invalid destination address"; @@ -595,14 +603,23 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const } } - de.amount = amount; - dsts.push_back(de); //std::vector<tools::wallet2::pending_tx> ptx_vector; try { - transaction->m_pending_tx = m_wallet->create_transactions_2(dsts, fake_outs_count, 0 /* unlock_time */, - static_cast<uint32_t>(priority), - extra, m_trustedDaemon); + if (amount) { + vector<cryptonote::tx_destination_entry> dsts; + cryptonote::tx_destination_entry de; + de.addr = addr; + de.amount = *amount; + dsts.push_back(de); + transaction->m_pending_tx = m_wallet->create_transactions_2(dsts, fake_outs_count, 0 /* unlock_time */, + static_cast<uint32_t>(priority), + extra, m_trustedDaemon); + } else { + transaction->m_pending_tx = m_wallet->create_transactions_all(addr, fake_outs_count, 0 /* unlock_time */, + static_cast<uint32_t>(priority), + extra, m_trustedDaemon); + } } catch (const tools::error::daemon_busy&) { // TODO: make it translatable with "tr"? @@ -990,8 +1007,9 @@ bool WalletImpl::isNewWallet() const { // in case wallet created without daemon connection, closed and opened again, // it's the same case as if it created from scratch, i.e. we need "fast sync" - // with the daemon (pull hashes instead of pull blocks) - return !(blockChainHeight() > 1 || m_recoveringFromSeed); + // with the daemon (pull hashes instead of pull blocks). + // If wallet cache is rebuilt, creation height stored in .keys is used. + return !(blockChainHeight() > 1 || m_recoveringFromSeed || m_rebuildWalletCache); } void WalletImpl::doInit(const string &daemon_address, uint64_t upper_transaction_size_limit) |