git / moonbite-core / src/mweb/mweb_models.h · raw

// Copyright(C) 2011 - 2020 The Litecoin Core developers// Distributed under the MIT software license, see the accompanying// file COPYING or http://www.opensource.org/licenses/mit-license.php.#ifndef LITECOIN_MWEB_MODELS_H#define LITECOIN_MWEB_MODELS_H#include <amount.h>#include <mw/models/block/Block.h>#include <mw/models/tx/Transaction.h>#include <serialize.h>#include <tinyformat.h>#include <memory>#include <vector>namespace MWEB {/// <summary>/// A convenience wrapper around a possibly-null extension block./// </summary>struct Block {    mw::Block::CPtr m_block;    Block() = default;    Block(const mw::Block::CPtr& block)        : m_block(block) {}    boost::optional<CAmount> GetTotalFee() const noexcept    {        return IsNull() ? boost::optional<CAmount>(0) : m_block->GetTotalFee();    }    boost::optional<CAmount> GetSupplyChange() const noexcept    {        return IsNull() ? boost::optional<CAmount>(0) : m_block->GetSupplyChange();    }    mw::Hash GetHash() const noexcept    {        return IsNull() ? mw::Hash{} : m_block->GetHeader()->GetHash();    }    mw::Header::CPtr GetMWEBHeader() const noexcept    {        return IsNull() ? mw::Header::CPtr{nullptr} : m_block->GetHeader();    }    int32_t GetHeight() const noexcept    {        return IsNull() ? -1 : m_block->GetHeight();    }    std::vector<mw::Hash> GetSpentIDs() const    {        if (IsNull()) {            return std::vector<mw::Hash>{};        }        std::vector<mw::Hash> spent_ids;        for (const Input& input : m_block->GetInputs()) {            spent_ids.push_back(input.GetOutputID());        }        return spent_ids;    }    std::vector<mw::Hash> GetOutputIDs() const    {        if (IsNull()) {            return std::vector<mw::Hash>{};        }        std::vector<mw::Hash> output_ids;        for (const Output& output : m_block->GetOutputs()) {            output_ids.push_back(output.GetOutputID());        }        return output_ids;    }    std::set<mw::Hash> GetKernelIDs() const    {        if (IsNull()) {            return std::set<mw::Hash>{};        }        std::set<mw::Hash> kernel_ids;        for (const Kernel& kernel : m_block->GetKernels()) {            kernel_ids.insert(kernel.GetKernelID());        }        return kernel_ids;    }    SERIALIZE_METHODS(Block, obj)    {        READWRITE(WrapOptionalPtr(obj.m_block));    }    bool IsNull() const noexcept { return m_block == nullptr; }    void SetNull() noexcept { m_block.reset(); }};/// <summary>/// A convenience wrapper around a possibly-null MWEB transcation./// </summary>struct Tx {    mw::Transaction::CPtr m_transaction;    Tx() = default;    Tx(const mw::Transaction::CPtr& tx)        : m_transaction(tx) {}    std::set<mw::Hash> GetSpentIDs() const noexcept    {        if (IsNull()) {            return std::set<mw::Hash>{};        }        std::set<mw::Hash> spent_ids;        for (const Input& input : m_transaction->GetInputs()) {            spent_ids.insert(input.GetOutputID());        }        return spent_ids;    }    std::set<mw::Hash> GetKernelIDs() const noexcept    {        if (IsNull()) {            return std::set<mw::Hash>{};        }        std::set<mw::Hash> kernel_ids;        for (const Kernel& kernel : m_transaction->GetKernels()) {            kernel_ids.insert(kernel.GetKernelID());        }        return kernel_ids;    }    std::set<mw::Hash> GetOutputIDs() const noexcept    {        if (IsNull()) {            return std::set<mw::Hash>{};        }        std::set<mw::Hash> output_ids;        for (const Output& output : m_transaction->GetOutputs()) {            output_ids.insert(output.GetOutputID());        }        return output_ids;    }    std::vector<PegInCoin> GetPegIns() const noexcept    {        if (IsNull()) {            return std::vector<PegInCoin>{};        }        return m_transaction->GetPegIns();    }    bool HasPegOut() const noexcept    {        if (IsNull()) {            return false;        }        const std::vector<Kernel>& kernels = m_transaction->GetKernels();        return std::any_of(            kernels.cbegin(), kernels.cend(),            [](const Kernel& kernel) { return kernel.HasPegOut(); }        );    }    std::vector<PegOutCoin> GetPegOuts() const noexcept    {        if (IsNull()) {            return std::vector<PegOutCoin>{};        }        return m_transaction->GetPegOuts();    }    uint64_t GetMWEBWeight() const noexcept    {        return IsNull() ? 0 : m_transaction->CalcWeight();    }    boost::optional<CAmount> GetFee() const noexcept    {        return IsNull() ? boost::optional<CAmount>(0) : m_transaction->GetTotalFee();    }    int32_t GetLockHeight() const noexcept    {        return IsNull() ? 0 : m_transaction->GetLockHeight();    }    bool GetOutput(const mw::Hash& output_id, Output& output) const noexcept    {        if (IsNull()) {            return false;        }        for (const Output& o : m_transaction->GetOutputs()) {            if (o.GetOutputID() == output_id) {                output = o;                return true;            }        }        return false;    }    SERIALIZE_METHODS(Tx, obj)    {        READWRITE(WrapOptionalPtr(obj.m_transaction));    }    bool IsNull() const noexcept { return m_transaction == nullptr; }    void SetNull() noexcept { m_transaction.reset(); }    std::string ToString() const    {        return IsNull() ? "" : m_transaction->Print();    }};} // namespace MWEB#endif // LITECOIN_MWEB_MODELS_H