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