LCOV - code coverage report
Current view: top level - src/rpc - server_util.cpp (source / functions) Coverage Total Hit
Test: fuzz_coverage.info Lines: 76.9 % 65 50
Test Date: 2025-02-01 04:14:22 Functions: 88.2 % 17 15
Branches: 21.7 % 60 13

             Branch data     Line data    Source code
       1                 :             : // Copyright (c) 2021-2022 The Bitcoin Core developers
       2                 :             : // Distributed under the MIT software license, see the accompanying
       3                 :             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4                 :             : 
       5                 :             : #include <rpc/server_util.h>
       6                 :             : 
       7                 :             : #include <chain.h>
       8                 :             : #include <common/args.h>
       9                 :             : #include <net_processing.h>
      10                 :             : #include <node/context.h>
      11                 :             : #include <node/miner.h>
      12                 :             : #include <policy/fees.h>
      13                 :             : #include <pow.h>
      14                 :             : #include <rpc/protocol.h>
      15                 :             : #include <rpc/request.h>
      16                 :             : #include <txmempool.h>
      17                 :             : #include <util/any.h>
      18                 :             : #include <validation.h>
      19                 :             : 
      20                 :             : #include <any>
      21                 :             : 
      22                 :             : using node::NodeContext;
      23                 :             : using node::UpdateTime;
      24                 :             : 
      25                 :        2068 : NodeContext& EnsureAnyNodeContext(const std::any& context)
      26                 :             : {
      27                 :        2068 :     auto node_context = util::AnyPtr<NodeContext>(context);
      28         [ -  + ]:        2068 :     if (!node_context) {
      29   [ #  #  #  # ]:           0 :         throw JSONRPCError(RPC_INTERNAL_ERROR, "Node context not found");
      30                 :             :     }
      31                 :        2068 :     return *node_context;
      32                 :             : }
      33                 :             : 
      34                 :         504 : CTxMemPool& EnsureMemPool(const NodeContext& node)
      35                 :             : {
      36         [ -  + ]:         504 :     if (!node.mempool) {
      37   [ #  #  #  # ]:           0 :         throw JSONRPCError(RPC_CLIENT_MEMPOOL_DISABLED, "Mempool disabled or instance not found");
      38                 :             :     }
      39                 :         504 :     return *node.mempool;
      40                 :             : }
      41                 :             : 
      42                 :          50 : CTxMemPool& EnsureAnyMemPool(const std::any& context)
      43                 :             : {
      44                 :          50 :     return EnsureMemPool(EnsureAnyNodeContext(context));
      45                 :             : }
      46                 :             : 
      47                 :             : 
      48                 :           6 : BanMan& EnsureBanman(const NodeContext& node)
      49                 :             : {
      50         [ -  + ]:           6 :     if (!node.banman) {
      51   [ #  #  #  # ]:           0 :         throw JSONRPCError(RPC_DATABASE_ERROR, "Error: Ban database not loaded");
      52                 :             :     }
      53                 :           6 :     return *node.banman;
      54                 :             : }
      55                 :             : 
      56                 :           6 : BanMan& EnsureAnyBanman(const std::any& context)
      57                 :             : {
      58                 :           6 :     return EnsureBanman(EnsureAnyNodeContext(context));
      59                 :             : }
      60                 :             : 
      61                 :           0 : ArgsManager& EnsureArgsman(const NodeContext& node)
      62                 :             : {
      63         [ #  # ]:           0 :     if (!node.args) {
      64   [ #  #  #  # ]:           0 :         throw JSONRPCError(RPC_INTERNAL_ERROR, "Node args not found");
      65                 :             :     }
      66                 :           0 :     return *node.args;
      67                 :             : }
      68                 :             : 
      69                 :           0 : ArgsManager& EnsureAnyArgsman(const std::any& context)
      70                 :             : {
      71                 :           0 :     return EnsureArgsman(EnsureAnyNodeContext(context));
      72                 :             : }
      73                 :             : 
      74                 :         962 : ChainstateManager& EnsureChainman(const NodeContext& node)
      75                 :             : {
      76         [ -  + ]:         962 :     if (!node.chainman) {
      77   [ #  #  #  # ]:           0 :         throw JSONRPCError(RPC_INTERNAL_ERROR, "Node chainman not found");
      78                 :             :     }
      79                 :         962 :     return *node.chainman;
      80                 :             : }
      81                 :             : 
      82                 :         322 : ChainstateManager& EnsureAnyChainman(const std::any& context)
      83                 :             : {
      84                 :         322 :     return EnsureChainman(EnsureAnyNodeContext(context));
      85                 :             : }
      86                 :             : 
      87                 :           4 : CBlockPolicyEstimator& EnsureFeeEstimator(const NodeContext& node)
      88                 :             : {
      89         [ +  - ]:           4 :     if (!node.fee_estimator) {
      90   [ +  -  +  - ]:           8 :         throw JSONRPCError(RPC_INTERNAL_ERROR, "Fee estimation disabled");
      91                 :             :     }
      92                 :           0 :     return *node.fee_estimator;
      93                 :             : }
      94                 :             : 
      95                 :           4 : CBlockPolicyEstimator& EnsureAnyFeeEstimator(const std::any& context)
      96                 :             : {
      97                 :           4 :     return EnsureFeeEstimator(EnsureAnyNodeContext(context));
      98                 :             : }
      99                 :             : 
     100                 :          53 : CConnman& EnsureConnman(const NodeContext& node)
     101                 :             : {
     102         [ -  + ]:          53 :     if (!node.connman) {
     103   [ #  #  #  # ]:           0 :         throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
     104                 :             :     }
     105                 :          53 :     return *node.connman;
     106                 :             : }
     107                 :             : 
     108                 :          45 : interfaces::Mining& EnsureMining(const NodeContext& node)
     109                 :             : {
     110         [ +  - ]:          45 :     if (!node.mining) {
     111   [ +  -  +  - ]:          90 :         throw JSONRPCError(RPC_INTERNAL_ERROR, "Node miner not found");
     112                 :             :     }
     113                 :           0 :     return *node.mining;
     114                 :             : }
     115                 :             : 
     116                 :          11 : PeerManager& EnsurePeerman(const NodeContext& node)
     117                 :             : {
     118         [ -  + ]:          11 :     if (!node.peerman) {
     119   [ #  #  #  # ]:           0 :         throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
     120                 :             :     }
     121                 :          11 :     return *node.peerman;
     122                 :             : }
     123                 :             : 
     124                 :           3 : AddrMan& EnsureAddrman(const NodeContext& node)
     125                 :             : {
     126         [ -  + ]:           3 :     if (!node.addrman) {
     127   [ #  #  #  # ]:           0 :         throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Address manager functionality missing or disabled");
     128                 :             :     }
     129                 :           3 :     return *node.addrman;
     130                 :             : }
     131                 :             : 
     132                 :           3 : AddrMan& EnsureAnyAddrman(const std::any& context)
     133                 :             : {
     134                 :           3 :     return EnsureAddrman(EnsureAnyNodeContext(context));
     135                 :             : }
     136                 :             : 
     137                 :           1 : void NextEmptyBlockIndex(CBlockIndex& tip, const Consensus::Params& consensusParams, CBlockIndex& next_index)
     138                 :             : {
     139                 :           1 :     CBlockHeader next_header{};
     140                 :           1 :     next_header.hashPrevBlock  = tip.GetBlockHash();
     141                 :           1 :     UpdateTime(&next_header, consensusParams, &tip);
     142                 :           1 :     next_header.nBits = GetNextWorkRequired(&tip, &next_header, consensusParams);
     143                 :           1 :     next_header.nNonce = 0;
     144                 :             : 
     145                 :           1 :     next_index.pprev = &tip;
     146                 :           1 :     next_index.nTime = next_header.nTime;
     147                 :           1 :     next_index.nBits = next_header.nBits;
     148                 :           1 :     next_index.nNonce = next_header.nNonce;
     149                 :           1 :     next_index.nHeight = tip.nHeight + 1;
     150                 :           1 : }
        

Generated by: LCOV version 2.0-1