// Copyright (c) 2011-2014 The Cryptonote developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #pragma once #include #include "cryptonote_core/cryptonote_format_utils.h" #include "IWallet.h" namespace CryptoNote { struct TransferDetails { uint64_t blockHeight; cryptonote::transaction tx; size_t internalOutputIndex; uint64_t globalOutputIndex; bool spent; crypto::key_image keyImage; uint64_t amount() const { return tx.vout[internalOutputIndex].amount; } }; class WalletTransferDetails { public: WalletTransferDetails(const std::vector& blockchain); ~WalletTransferDetails(); TransferDetails& getTransferDetails(size_t idx); void addTransferDetails(const TransferDetails& details); bool getTransferDetailsIdxByKeyImage(const crypto::key_image& image, size_t& idx); uint64_t countActualBalance() const; uint64_t countPendingBalance() const; bool isTransferUnlocked(const TransferDetails& td) const; uint64_t selectTransfersToSend(uint64_t neededMoney, bool addDust, uint64_t dust, std::list& selectedTransfers); void detachTransferDetails(size_t height); template void save(Archive& ar, bool saveCache) const; template void load(Archive& ar); private: bool isTxSpendtimeUnlocked(uint64_t unlock_time) const; typedef std::vector TransferContainer; TransferContainer m_transfers; typedef std::unordered_map KeyImagesContainer; KeyImagesContainer m_keyImages; const std::vector& m_blockchain; }; template void WalletTransferDetails::save(Archive& ar, bool saveCache) const { const TransferContainer& transfers = saveCache ? m_transfers : TransferContainer(); const KeyImagesContainer& keyImages = saveCache ? m_keyImages : KeyImagesContainer(); ar << transfers; ar << keyImages; } template void WalletTransferDetails::load(Archive& ar) { ar >> m_transfers; ar >> m_keyImages; } } //namespace CryptoNote