xrpld
Loading...
Searching...
No Matches
Handler.h
1#pragma once
2
3#include <xrpld/rpc/RPCHandler.h>
4#include <xrpld/rpc/Role.h>
5#include <xrpld/rpc/Status.h>
6#include <xrpld/rpc/detail/Tuning.h>
7
8#include <xrpl/basics/Log.h>
9#include <xrpl/json/json_value.h>
10#include <xrpl/protocol/ApiVersion.h>
11#include <xrpl/protocol/ErrorCodes.h>
12#include <xrpl/protocol/jss.h>
13#include <xrpl/server/NetworkOPs.h>
14
15#include <functional>
16#include <set>
17#include <string>
18
19namespace json {
20class Object;
21} // namespace json
22
23namespace xrpl::rpc {
24
25// Under what condition can we call this RPC?
32
46
47Handler const*
48getHandler(unsigned int version, bool betaEnabled, std::string const&);
49
53template <class Value>
55makeObjectValue(Value const& value, json::StaticString const& field = jss::message)
56{
58 result[field] = value;
59 return result;
60}
61
67
68template <class T>
70conditionMet(Condition conditionRequired, T& context)
71{
72 if (context.app.getOPs().isAmendmentBlocked() && (conditionRequired != Condition::NoCondition))
73 {
75 }
76
77 if (context.app.getOPs().isUNLBlocked() && (conditionRequired != Condition::NoCondition))
78 {
80 }
81
82 if ((conditionRequired != Condition::NoCondition) &&
83 (context.netOps.getOperatingMode() < OperatingMode::SYNCING))
84 {
85 JLOG(context.j.info()) << "Insufficient network mode for RPC: "
86 << context.netOps.strOperatingMode();
87
88 if (context.apiVersion == 1)
89 return RpcNoNetwork;
90 return RpcNotSynced;
91 }
92
93 if (!context.app.config().standalone() && conditionRequired != Condition::NoCondition)
94 {
95 if (context.ledgerMaster.getValidatedLedgerAge() > tuning::kMaxValidatedLedgerAge)
96 {
97 if (context.apiVersion == 1)
98 return RpcNoCurrent;
99 return RpcNotSynced;
100 }
101
102 auto const cID = context.ledgerMaster.getCurrentLedgerIndex();
103 auto const vID = context.ledgerMaster.getValidLedgerIndex();
104
105 if (cID + 10 < vID)
106 {
107 JLOG(context.j.debug()) << "Current ledger ID(" << cID
108 << ") is less than validated ledger ID(" << vID << ")";
109 if (context.apiVersion == 1)
110 return RpcNoCurrent;
111 return RpcNotSynced;
112 }
113 }
114
115 if ((conditionRequired != Condition::NoCondition) && !context.ledgerMaster.getClosedLedger())
116 {
117 if (context.apiVersion == 1)
118 return RpcNoClosed;
119 return RpcNotSynced;
120 }
121
122 return RpcSuccess;
123}
124
125} // namespace xrpl::rpc
Lightweight wrapper to tag static string.
Definition json_value.h:48
Represents a JSON value.
Definition json_value.h:117
JSON (JavaScript Object Notation).
Definition json_errors.h:5
@ Object
object value (collection of name/value pairs).
Definition json_value.h:29
API version numbers used in later API versions.
Definition ApiVersion.h:36
ErrorCodeI conditionMet(Condition conditionRequired, T &context)
Definition Handler.h:70
json::Value makeObjectValue(Value const &value, json::StaticString const &field=jss::message)
Return a json::ValueType::Object with a single entry.
Definition Handler.h:55
static constexpr auto kApiMaximumValidVersion
Definition ApiVersion.h:47
static constexpr auto kApiMinimumSupportedVersion
Definition ApiVersion.h:42
Handler const * getHandler(unsigned version, bool betaEnabled, std::string const &name)
Definition Handler.cpp:480
std::set< char const * > getHandlerNames()
Return names of all methods.
Definition Handler.cpp:486
ErrorCodeI
Definition ErrorCodes.h:23
@ RpcNoClosed
Definition ErrorCodes.h:47
@ RpcNoNetwork
Definition ErrorCodes.h:49
@ RpcAmendmentBlocked
Definition ErrorCodes.h:44
@ RpcSuccess
Definition ErrorCodes.h:27
@ RpcExpiredValidatorList
Definition ErrorCodes.h:120
@ RpcNotSynced
Definition ErrorCodes.h:50
@ RpcNoCurrent
Definition ErrorCodes.h:48
Role
Indicates the level of administrative permission to grant.
Definition Role.h:27
@ SYNCING
fallen slightly behind
Definition NetworkOPs.h:63
unsigned minApiVer
Definition Handler.h:43
char const * name
Definition Handler.h:38
unsigned maxApiVer
Definition Handler.h:44
rpc::Condition condition
Definition Handler.h:41
Method< json::Value > valueMethod
Definition Handler.h:39
std::function< Status(JsonContext &, JsonValue &)> Method
Definition Handler.h:36
Status represents the results of an operation that might fail.
Definition Status.h:27