Skip to content

account/GeniusTransaction.hpp

Header file of the base GeniusTransaction class. More...

Namespaces

Name
sgns

Classes

Name
class sgns::GeniusTransaction
Base class of the GeniusTransaction.

Detailed Description

Header file of the base GeniusTransaction class.

Date: 2024-03-11 Henrique A. Klein ([email protected])

Source code

#pragma once

#include <utility>
#include <vector>
#include <string>
#include <optional>

#include <boost/format.hpp>

#include "outcome/outcome.hpp"
#include "account/proto/SGTransaction.pb.h"
#include "blockchain/impl/proto/Consensus.pb.h"
#include "account/UTXOStructs.hpp"
#include "GeniusAccount.hpp"

#include <gsl/span>

namespace sgns
{
    using namespace boost::multiprecision;

    class GeniusTransaction
    {
    public:
        static constexpr std::string_view GENIUS_CHAIN_ID = "supergenius_chain";

        using TransactionDeserializeFn =
            std::function<std::shared_ptr<GeniusTransaction>( const std::vector<uint8_t> & )>;

        GeniusTransaction( std::string type, SGTransaction::DAGStruct dag ) :
            dag_st( std::move( dag ) ), transaction_type( std::move( type ) )
        {
        }

        virtual ~GeniusTransaction() = default;

        [[nodiscard]] std::string GetType() const
        {
            return transaction_type;
        }

        static outcome::result<SGTransaction::DAGStruct> DeSerializeDAGStruct( const std::vector<uint8_t> &data );

        static outcome::result<SGTransaction::DAGStruct> DeSerializeDAGStruct( const std::string &data );

        static SGTransaction::DAGStruct SetDAGWithType( SGTransaction::DAGStruct dag, const std::string &type )
        {
            dag.set_type( type );
            return dag;
        }

        virtual std::vector<uint8_t> SerializeByteVector( const SGTransaction::DAGStruct &dag ) const = 0;

        virtual EmbeddedTransaction SerializeToEmbeddedTransaction( const SGTransaction::DAGStruct &dag ) const = 0;

        EmbeddedTransaction SerializeToEmbeddedTransaction() const
        {
            return SerializeToEmbeddedTransaction( dag_st );
        }

        std::vector<uint8_t> SerializeByteVector() const
        {
            return SerializeByteVector( dag_st );
        }

        virtual bool HasUTXOParameters() const
        {
            return false;
        }

        virtual std::optional<UTXOTxParameters> GetUTXOParametersOpt() const
        {
            return std::nullopt;
        }

        virtual std::string GetChainId() const
        {
            return std::string( GENIUS_CHAIN_ID );
        }

        virtual std::string GetTransactionSpecificPath() const = 0;

        static std::string GetTransactionFullPath( const std::string &tx_hash )
        {
            return "tx/" + tx_hash;
        }

        std::string GetTransactionFullPath() const
        {
            return "tx/" + GetHash();
        }

        std::string GetProofFullPath() const
        {
            return "proof/" + GetHash();
        }

        std::string GetSrcAddress() const
        {
            return dag_st.source_addr();
        }

        [[nodiscard]] std::string GetHash() const;

        [[nodiscard]] std::string GetPreviousHash() const;

        [[nodiscard]] std::string GetUncleHash() const;

        uint64_t GetTimestamp() const
        {
            return dag_st.timestamp();
        }

        uint64_t GetNonce() const
        {
            return dag_st.nonce();
        }

        virtual std::unordered_set<std::string> GetTopics() const;

        void FillHash();

        bool CheckHash() const;

        std::vector<uint8_t> MakeSignature( GeniusAccount &account );

        bool CheckSignature() const;

        bool CheckDAGSignatureLegacy() const;

        virtual std::string GetSlotID() const
        {
            return GetSrcAddress() + ":" + std::to_string( GetNonce() );
        }

        SGTransaction::DAGStruct dag_st;

    private:
        static inline std::unordered_map<std::string, TransactionDeserializeFn> deserializers_map;
        const std::string transaction_type;

    public:
        static void RegisterDeserializer( const std::string &transaction_type, TransactionDeserializeFn fn )
        {
            deserializers_map[transaction_type] = std::move( fn );
        }

        static std::unordered_map<std::string, TransactionDeserializeFn> &GetDeSerializers()
        {
            return deserializers_map;
        }
    };
}

Updated on 2026-06-05 at 17:22:19 -0700