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