git / moonbite-core / src/libmw/include/mw/wallet/Keychain.h · raw
#pragma once#include <mw/models/crypto/SecretKey.h>#include <mw/models/tx/Output.h>#include <mw/models/wallet/Coin.h>#include <mw/models/wallet/StealthAddress.h>#include <memory>// Forward Declarationsclass LegacyScriptPubKeyMan;MW_NAMESPACEclass Keychain{public: using Ptr = std::shared_ptr<Keychain>; Keychain(const LegacyScriptPubKeyMan& spk_man, SecretKey scan_secret, SecretKey spend_secret) : m_spk_man(spk_man), m_scanSecret(std::move(scan_secret)), m_spendSecret(std::move(spend_secret)) { } // If keychain is locked or watch-only (m_spendSecret is null), // this will still identify outputs belonging to the wallet, but // will not be able to calculate the coin's output key. // It will still calculate the shared_secret though, which can be // used to calculate the spend key when the wallet becomes unlocked. bool RewindOutput(const Output& output, mw::Coin& coin) const; // Calculates the output secret key for the given coin. // If the address index is known, it calculates from the keychain's master spend key. // If not, it attempts to lookup the spend key in the database. // Returns boost::empty when keychain is locked or watch-only. boost::optional<SecretKey> CalculateOutputKey(const mw::Coin& coin) const; // Calculates the StealthAddress at the given index. // Requires that keychain be unlocked and not watch-only. StealthAddress GetStealthAddress(const uint32_t index) const; // Requires that keychain be unlocked and not watch-only. SecretKey GetSpendKey(const uint32_t index) const; const SecretKey& GetScanSecret() const noexcept { return m_scanSecret; } const SecretKey& GetSpendSecret() const noexcept { return m_spendSecret; } bool HasSpendSecret() const noexcept { return !m_spendSecret.IsNull(); } // Clears the spend secret from memory, effectively making this a watch-only keychain. void Lock() { m_spendSecret = SecretKey::Null(); } // Reassigns the spend secret. To be used when unlocking the wallet. void Unlock(const SecretKey& spend_secret) { m_spendSecret = spend_secret; } private: const LegacyScriptPubKeyMan& m_spk_man; SecretKey m_scanSecret; SecretKey m_spendSecret;};END_NAMESPACE