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