server_util.cpp
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 <common/args.h> 8 #include <net_processing.h> 9 #include <node/context.h> 10 #include <policy/fees.h> 11 #include <rpc/protocol.h> 12 #include <rpc/request.h> 13 #include <txmempool.h> 14 #include <util/any.h> 15 #include <validation.h> 16 17 #include <any> 18 19 using node::NodeContext; 20 21 NodeContext& EnsureAnyNodeContext(const std::any& context) 22 { 23 auto node_context = util::AnyPtr<NodeContext>(context); 24 if (!node_context) { 25 throw JSONRPCError(RPC_INTERNAL_ERROR, "Node context not found"); 26 } 27 return *node_context; 28 } 29 30 CTxMemPool& EnsureMemPool(const NodeContext& node) 31 { 32 if (!node.mempool) { 33 throw JSONRPCError(RPC_CLIENT_MEMPOOL_DISABLED, "Mempool disabled or instance not found"); 34 } 35 return *node.mempool; 36 } 37 38 CTxMemPool& EnsureAnyMemPool(const std::any& context) 39 { 40 return EnsureMemPool(EnsureAnyNodeContext(context)); 41 } 42 43 44 BanMan& EnsureBanman(const NodeContext& node) 45 { 46 if (!node.banman) { 47 throw JSONRPCError(RPC_DATABASE_ERROR, "Error: Ban database not loaded"); 48 } 49 return *node.banman; 50 } 51 52 BanMan& EnsureAnyBanman(const std::any& context) 53 { 54 return EnsureBanman(EnsureAnyNodeContext(context)); 55 } 56 57 ArgsManager& EnsureArgsman(const NodeContext& node) 58 { 59 if (!node.args) { 60 throw JSONRPCError(RPC_INTERNAL_ERROR, "Node args not found"); 61 } 62 return *node.args; 63 } 64 65 ArgsManager& EnsureAnyArgsman(const std::any& context) 66 { 67 return EnsureArgsman(EnsureAnyNodeContext(context)); 68 } 69 70 ChainstateManager& EnsureChainman(const NodeContext& node) 71 { 72 if (!node.chainman) { 73 throw JSONRPCError(RPC_INTERNAL_ERROR, "Node chainman not found"); 74 } 75 return *node.chainman; 76 } 77 78 ChainstateManager& EnsureAnyChainman(const std::any& context) 79 { 80 return EnsureChainman(EnsureAnyNodeContext(context)); 81 } 82 83 CBlockPolicyEstimator& EnsureFeeEstimator(const NodeContext& node) 84 { 85 if (!node.fee_estimator) { 86 throw JSONRPCError(RPC_INTERNAL_ERROR, "Fee estimation disabled"); 87 } 88 return *node.fee_estimator; 89 } 90 91 CBlockPolicyEstimator& EnsureAnyFeeEstimator(const std::any& context) 92 { 93 return EnsureFeeEstimator(EnsureAnyNodeContext(context)); 94 } 95 96 CConnman& EnsureConnman(const NodeContext& node) 97 { 98 if (!node.connman) { 99 throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled"); 100 } 101 return *node.connman; 102 } 103 104 PeerManager& EnsurePeerman(const NodeContext& node) 105 { 106 if (!node.peerman) { 107 throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled"); 108 } 109 return *node.peerman; 110 } 111 112 AddrMan& EnsureAddrman(const NodeContext& node) 113 { 114 if (!node.addrman) { 115 throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Address manager functionality missing or disabled"); 116 } 117 return *node.addrman; 118 } 119 120 AddrMan& EnsureAnyAddrman(const std::any& context) 121 { 122 return EnsureAddrman(EnsureAnyNodeContext(context)); 123 }