Skip to content

genesis_tool/LocalTrustAdmin.cpp

Namespaces

Name
sgns
sgns::trustedpeer

Source code

#include "trustedpeer/genesis_tool/LocalTrustAdmin.hpp"

#include <system_error>
#include <utility>

namespace sgns::trustedpeer
{
    namespace
    {
        template <typename TryActivate>
        outcome::result<sgns::securecrdt::CandidateId> ActivateIfSubmitted(
            outcome::result<sgns::securecrdt::CandidateId> submitted,
            TryActivate                                 &&try_activate )
        {
            if ( submitted.has_value() )
            {
                auto activated = std::forward<TryActivate>( try_activate )( submitted.value() );
                if ( activated.has_error() )
                    return activated.error();
            }
            return submitted;
        }
    } // namespace

    LocalTrustAdmin::LocalTrustAdmin( std::shared_ptr<TrustedPeerRegistry> registry,
                                      std::shared_ptr<sgns::account::BurnConfig> burn_config,
                                      std::string policy_domain,
                                      std::string burn_domain ) :
        registry_( std::move( registry ) ),
        burn_config_( std::move( burn_config ) ),
        policy_domain_( std::move( policy_domain ) ),
        burn_domain_( std::move( burn_domain ) )
    {
    }

    outcome::result<std::vector<LocalTrustAdmin::CandidateSummary>> LocalTrustAdmin::ListCandidates() const
    {
        if ( !registry_ || !burn_config_ )
            return outcome::failure( std::errc::not_connected );

        BOOST_OUTCOME_TRY( auto policies, registry_->ListPendingPolicyCandidates() );
        BOOST_OUTCOME_TRY( auto burns, burn_config_->ListPendingBurnCandidates() );
        std::vector<CandidateSummary> result;
        result.reserve( policies.size() + burns.size() );
        for ( auto &id : policies )
            result.push_back( { CandidateType::Policy, std::move( id ) } );
        for ( auto &id : burns )
            result.push_back( { CandidateType::Burn, std::move( id ) } );
        return result;
    }

    outcome::result<sgns::securecrdt::CandidateId> LocalTrustAdmin::ProposePolicy(
        const QuorumPolicyState &candidate )
    {
        if ( !registry_ || !burn_config_ )
            return outcome::failure( std::errc::not_connected );
        if ( !burn_config_->IsEconomicallyReady() )
            return outcome::failure( std::errc::operation_not_permitted );
        return ActivateIfSubmitted( registry_->ProposePolicyCandidate( candidate ),
                                    [this]( const sgns::securecrdt::CandidateId &id )
                                    { return registry_->TryActivatePolicyCandidate( id ); } );
    }

    outcome::result<sgns::securecrdt::CandidateId> LocalTrustAdmin::ProposeBurn( uint64_t basis_points )
    {
        if ( !burn_config_ )
            return outcome::failure( std::errc::not_connected );
        return ActivateIfSubmitted( burn_config_->ProposeBurnCandidate( basis_points ),
                                    [this]( const sgns::securecrdt::CandidateId &id )
                                    { return burn_config_->TryActivateBurnCandidate( id ); } );
    }

    outcome::result<sgns::securecrdt::CandidateId> LocalTrustAdmin::Approve(
        const sgns::securecrdt::CandidateId &candidate_id )
    {
        if ( candidate_id.domain == policy_domain_ && registry_ )
        {
            if ( !burn_config_ )
                return outcome::failure( std::errc::not_connected );
            if ( !burn_config_->IsEconomicallyReady() )
                return outcome::failure( std::errc::operation_not_permitted );
            return ActivateIfSubmitted( registry_->ApprovePolicyCandidate( candidate_id ),
                                        [this]( const sgns::securecrdt::CandidateId &id )
                                        { return registry_->TryActivatePolicyCandidate( id ); } );
        }
        if ( candidate_id.domain == burn_domain_ && burn_config_ )
        {
            return ActivateIfSubmitted( burn_config_->ApproveBurnCandidate( candidate_id ),
                                        [this]( const sgns::securecrdt::CandidateId &id )
                                        { return burn_config_->TryActivateBurnCandidate( id ); } );
        }
        return outcome::failure( std::errc::invalid_argument );
    }
} // namespace sgns::trustedpeer

Updated on 2026-09-25 at 15:46:12 +0000