29 auto const result = env.
rpc(
"server_definitions");
30 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
31 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
32 BEAST_EXPECT(result[jss::result].isMember(jss::FIELDS));
33 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
34 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_RESULTS));
35 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_TYPES));
36 BEAST_EXPECT(result[jss::result].isMember(jss::TYPES));
37 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
43 auto const firstField = result[jss::result][jss::FIELDS][0u];
44 BEAST_EXPECT(firstField[0u].asString() ==
"Invalid");
45 BEAST_EXPECT(firstField[1][jss::isSerialized].asBool() ==
false);
46 BEAST_EXPECT(firstField[1][jss::isSigningField].asBool() ==
false);
47 BEAST_EXPECT(firstField[1][jss::isVLEncoded].asBool() ==
false);
48 BEAST_EXPECT(firstField[1][jss::nth].asInt() == -1);
49 BEAST_EXPECT(firstField[1][jss::type].asString() ==
"Unknown");
53 auto const field = result[jss::result][jss::FIELDS][6u];
54 BEAST_EXPECT(field[0u].asString() ==
"LedgerEntryType");
55 BEAST_EXPECT(field[1][jss::isSerialized].asBool() ==
true);
56 BEAST_EXPECT(field[1][jss::isSigningField].asBool() ==
true);
57 BEAST_EXPECT(field[1][jss::isVLEncoded].asBool() ==
false);
58 BEAST_EXPECT(field[1][jss::nth].asUInt() == 1);
59 BEAST_EXPECT(field[1][jss::type].asString() ==
"UInt16");
65 auto& fields = result[jss::result][jss::FIELDS];
68 return std::any_of(fields.begin(), fields.end(), [&](
auto& field) {
69 return field[0u].asString() == name;
72 BEAST_EXPECT(fieldExists(
"Generic"));
73 BEAST_EXPECT(fieldExists(
"Invalid"));
74 BEAST_EXPECT(fieldExists(
"ObjectEndMarker"));
75 BEAST_EXPECT(fieldExists(
"ArrayEndMarker"));
76 BEAST_EXPECT(fieldExists(
"taker_gets_funded"));
77 BEAST_EXPECT(fieldExists(
"taker_pays_funded"));
78 BEAST_EXPECT(fieldExists(
"hash"));
79 BEAST_EXPECT(fieldExists(
"index"));
85 for (
auto const& field : result[jss::result][jss::FIELDS])
87 auto const name = field[0u].asString();
88 BEAST_EXPECT(fieldNames.
insert(name).second);
94 auto const types = result[jss::result][jss::TYPES];
95 BEAST_EXPECT(types.isMember(
"Hash128") && types[
"Hash128"].asUInt() == 4);
96 BEAST_EXPECT(types.isMember(
"Hash160") && types[
"Hash160"].asUInt() == 17);
97 BEAST_EXPECT(types.isMember(
"Hash192") && types[
"Hash192"].asUInt() == 21);
98 BEAST_EXPECT(types.isMember(
"Hash256") && types[
"Hash256"].asUInt() == 5);
99 BEAST_EXPECT(types.isMember(
"Hash384") && types[
"Hash384"].asUInt() == 22);
100 BEAST_EXPECT(types.isMember(
"Hash512") && types[
"Hash512"].asUInt() == 23);
104 result[jss::result][jss::LEDGER_ENTRY_TYPES][
"AccountRoot"].asUInt() == 97);
106 result[jss::result][jss::TRANSACTION_RESULTS][
"tecDIR_FULL"].asUInt() == 121);
107 BEAST_EXPECT(result[jss::result][jss::TRANSACTION_TYPES][
"Payment"].asUInt() == 0);
108 BEAST_EXPECT(result[jss::result][jss::TYPES][
"AccountID"].asUInt() == 8);
112 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_FLAGS));
113 json::Value const& leFlags = result[jss::result][jss::LEDGER_ENTRY_FLAGS];
116 BEAST_EXPECT(leFlags[
"AccountRoot"][
"lsfDisallowXRP"] == 0x00080000);
117 BEAST_EXPECT(leFlags[
"AccountRoot"][
"lsfDepositAuth"] == 0x01000000);
118 BEAST_EXPECT(leFlags[
"AccountRoot"][
"lsfAllowTrustLineClawback"] == 0x80000000);
120 BEAST_EXPECT(leFlags[
"RippleState"][
"lsfHighFreeze"] == 0x00800000);
121 BEAST_EXPECT(leFlags[
"RippleState"][
"lsfAMMNode"] == 0x01000000);
123 BEAST_EXPECT(leFlags[
"DirNode"][
"lsfNFTokenBuyOffers"] == 0x00000001);
124 BEAST_EXPECT(leFlags[
"MPTokenIssuance"][
"lsfMPTCanTrade"] == 0x00000010);
125 BEAST_EXPECT(leFlags[
"Credential"][
"lsfAccepted"] == 0x00010000);
126 BEAST_EXPECT(leFlags[
"Loan"][
"lsfLoanImpaired"] == 0x00020000);
127 BEAST_EXPECT(leFlags[
"Vault"][
"lsfVaultPrivate"] == 0x00010000);
128 BEAST_EXPECT(leFlags[
"MPToken"][
"lsfMPTAuthorized"] == 0x00000002);
133 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_FLAGS));
134 json::Value const& txFlags = result[jss::result][jss::TRANSACTION_FLAGS];
136 BEAST_EXPECT(txFlags[
"universal"][
"tfFullyCanonicalSig"] == 0x80000000);
137 BEAST_EXPECT(txFlags[
"universal"][
"tfInnerBatchTxn"] == 0x40000000);
139 BEAST_EXPECT(txFlags[
"AccountSet"][
"tfRequireAuth"] == 0x00040000);
140 BEAST_EXPECT(txFlags[
"AccountSet"][
"tfAllowXRP"] == 0x00200000);
142 BEAST_EXPECT(txFlags[
"MPTokenIssuanceSet"][
"tfMPTLock"] == 0x00000001);
143 BEAST_EXPECT(txFlags[
"MPTokenIssuanceSet"][
"tfMPTUnlock"] == 0x00000002);
145 BEAST_EXPECT(txFlags[
"AMMDeposit"][
"tfLPToken"] == 0x00010000);
146 BEAST_EXPECT(txFlags[
"AMMDeposit"][
"tfLimitLPToken"] == 0x00400000);
151 BEAST_EXPECT(result[jss::result].isMember(jss::ACCOUNT_SET_FLAGS));
152 json::Value const& asFlags = result[jss::result][jss::ACCOUNT_SET_FLAGS];
154 BEAST_EXPECT(asFlags[
"asfDisallowXRP"] == 3);
155 BEAST_EXPECT(asFlags[
"asfGlobalFreeze"] == 7);
156 BEAST_EXPECT(asFlags[
"asfDisallowIncomingNFTokenOffer"] == 12);
157 BEAST_EXPECT(asFlags[
"asfDisallowIncomingTrustline"] == 15);
162 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_FORMATS));
163 json::Value const& txnFormats = result[jss::result][jss::TRANSACTION_FORMATS];
167 BEAST_EXPECT(txnFormats.
isMember(
"common"));
170 BEAST_EXPECT(section[0u][jss::name] ==
"TransactionType");
171 BEAST_EXPECT(section[0u][jss::optionality] ==
SoeRequired);
173 BEAST_EXPECT(section[1u][jss::name] ==
"Flags");
174 BEAST_EXPECT(section[1u][jss::optionality] ==
SoeOptional);
176 BEAST_EXPECT(section[2u][jss::name] ==
"SourceTag");
177 BEAST_EXPECT(section[2u][jss::optionality] ==
SoeOptional);
179 BEAST_EXPECT(section[3u][jss::name] ==
"Account");
180 BEAST_EXPECT(section[3u][jss::optionality] ==
SoeRequired);
182 BEAST_EXPECT(section[4u][jss::name] ==
"Sequence");
183 BEAST_EXPECT(section[4u][jss::optionality] ==
SoeRequired);
185 BEAST_EXPECT(section[5u][jss::name] ==
"PreviousTxnID");
186 BEAST_EXPECT(section[5u][jss::optionality] ==
SoeOptional);
188 BEAST_EXPECT(section[6u][jss::name] ==
"LastLedgerSequence");
189 BEAST_EXPECT(section[6u][jss::optionality] ==
SoeOptional);
191 BEAST_EXPECT(section[7u][jss::name] ==
"AccountTxnID");
192 BEAST_EXPECT(section[7u][jss::optionality] ==
SoeOptional);
194 BEAST_EXPECT(section[8u][jss::name] ==
"Fee");
195 BEAST_EXPECT(section[8u][jss::optionality] ==
SoeRequired);
197 BEAST_EXPECT(section[9u][jss::name] ==
"OperationLimit");
198 BEAST_EXPECT(section[9u][jss::optionality] ==
SoeOptional);
200 BEAST_EXPECT(section[10u][jss::name] ==
"Memos");
201 BEAST_EXPECT(section[10u][jss::optionality] ==
SoeOptional);
203 BEAST_EXPECT(section[11u][jss::name] ==
"SigningPubKey");
204 BEAST_EXPECT(section[11u][jss::optionality] ==
SoeRequired);
206 BEAST_EXPECT(section[12u][jss::name] ==
"TicketSequence");
207 BEAST_EXPECT(section[12u][jss::optionality] ==
SoeOptional);
209 BEAST_EXPECT(section[13u][jss::name] ==
"TxnSignature");
210 BEAST_EXPECT(section[13u][jss::optionality] ==
SoeOptional);
212 BEAST_EXPECT(section[14u][jss::name] ==
"Signers");
213 BEAST_EXPECT(section[14u][jss::optionality] ==
SoeOptional);
215 BEAST_EXPECT(section[15u][jss::name] ==
"NetworkID");
216 BEAST_EXPECT(section[15u][jss::optionality] ==
SoeOptional);
218 BEAST_EXPECT(section[16u][jss::name] ==
"Delegate");
219 BEAST_EXPECT(section[16u][jss::optionality] ==
SoeOptional);
225 BEAST_EXPECT(txnFormats.
isMember(
"OracleSet"));
226 json::Value const& section = txnFormats[
"OracleSet"];
228 BEAST_EXPECT(section[0u][jss::name] ==
"OracleDocumentID");
229 BEAST_EXPECT(section[0u][jss::optionality] ==
SoeRequired);
231 BEAST_EXPECT(section[1u][jss::name] ==
"Provider");
232 BEAST_EXPECT(section[1u][jss::optionality] ==
SoeOptional);
234 BEAST_EXPECT(section[2u][jss::name] ==
"URI");
235 BEAST_EXPECT(section[2u][jss::optionality] ==
SoeOptional);
237 BEAST_EXPECT(section[3u][jss::name] ==
"AssetClass");
238 BEAST_EXPECT(section[3u][jss::optionality] ==
SoeOptional);
240 BEAST_EXPECT(section[4u][jss::name] ==
"LastUpdateTime");
241 BEAST_EXPECT(section[4u][jss::optionality] ==
SoeRequired);
243 BEAST_EXPECT(section[5u][jss::name] ==
"PriceDataSeries");
244 BEAST_EXPECT(section[5u][jss::optionality] ==
SoeRequired);
249 BEAST_EXPECT(txnFormats.
isMember(
"PermissionedDomainDelete"));
250 json::Value const& section = txnFormats[
"PermissionedDomainDelete"];
252 BEAST_EXPECT(section[0u][jss::name] ==
"DomainID");
253 BEAST_EXPECT(section[0u][jss::optionality] ==
SoeRequired);
258 BEAST_EXPECT(txnFormats.
isMember(
"Clawback"));
259 json::Value const& section = txnFormats[
"Clawback"];
261 BEAST_EXPECT(section[0u][jss::name] ==
"Amount");
262 BEAST_EXPECT(section[0u][jss::optionality] ==
SoeRequired);
264 BEAST_EXPECT(section[1u][jss::name] ==
"Holder");
265 BEAST_EXPECT(section[1u][jss::optionality] ==
SoeOptional);
270 BEAST_EXPECT(txnFormats.
isMember(
"SetFee"));
273 BEAST_EXPECT(section[0u][jss::name] ==
"LedgerSequence");
274 BEAST_EXPECT(section[0u][jss::optionality] ==
SoeOptional);
276 BEAST_EXPECT(section[1u][jss::name] ==
"BaseFee");
277 BEAST_EXPECT(section[1u][jss::optionality] ==
SoeOptional);
279 BEAST_EXPECT(section[2u][jss::name] ==
"ReferenceFeeUnits");
280 BEAST_EXPECT(section[2u][jss::optionality] ==
SoeOptional);
282 BEAST_EXPECT(section[3u][jss::name] ==
"ReserveBase");
283 BEAST_EXPECT(section[3u][jss::optionality] ==
SoeOptional);
285 BEAST_EXPECT(section[4u][jss::name] ==
"ReserveIncrement");
286 BEAST_EXPECT(section[4u][jss::optionality] ==
SoeOptional);
288 BEAST_EXPECT(section[5u][jss::name] ==
"BaseFeeDrops");
289 BEAST_EXPECT(section[5u][jss::optionality] ==
SoeOptional);
291 BEAST_EXPECT(section[6u][jss::name] ==
"ReserveBaseDrops");
292 BEAST_EXPECT(section[6u][jss::optionality] ==
SoeOptional);
294 BEAST_EXPECT(section[7u][jss::name] ==
"ReserveIncrementDrops");
295 BEAST_EXPECT(section[7u][jss::optionality] ==
SoeOptional);
302 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_FORMATS));
310 result[jss::result][jss::LEDGER_ENTRY_FORMATS][
"common"];
312 BEAST_EXPECT(observedCommonLedgerEntry[0u][jss::name] ==
"LedgerIndex");
313 BEAST_EXPECT(observedCommonLedgerEntry[0u][jss::optionality] ==
SoeOptional);
315 BEAST_EXPECT(observedCommonLedgerEntry[1u][jss::name] ==
"LedgerEntryType");
316 BEAST_EXPECT(observedCommonLedgerEntry[1u][jss::optionality] ==
SoeRequired);
318 BEAST_EXPECT(observedCommonLedgerEntry[2u][jss::name] ==
"Flags");
319 BEAST_EXPECT(observedCommonLedgerEntry[2u][jss::optionality] ==
SoeRequired);
325 result[jss::result][jss::LEDGER_ENTRY_FORMATS][
"DID"];
327 BEAST_EXPECT(observedDIDLedgerEntry[0u][jss::name] ==
"Account");
328 BEAST_EXPECT(observedDIDLedgerEntry[0u][jss::optionality] ==
SoeRequired);
330 BEAST_EXPECT(observedDIDLedgerEntry[1u][jss::name] ==
"DIDDocument");
331 BEAST_EXPECT(observedDIDLedgerEntry[1u][jss::optionality] ==
SoeOptional);
333 BEAST_EXPECT(observedDIDLedgerEntry[2u][jss::name] ==
"URI");
334 BEAST_EXPECT(observedDIDLedgerEntry[2u][jss::optionality] ==
SoeOptional);
336 BEAST_EXPECT(observedDIDLedgerEntry[3u][jss::name] ==
"Data");
337 BEAST_EXPECT(observedDIDLedgerEntry[3u][jss::optionality] ==
SoeOptional);
339 BEAST_EXPECT(observedDIDLedgerEntry[4u][jss::name] ==
"OwnerNode");
340 BEAST_EXPECT(observedDIDLedgerEntry[4u][jss::optionality] ==
SoeRequired);
342 BEAST_EXPECT(observedDIDLedgerEntry[5u][jss::name] ==
"PreviousTxnID");
343 BEAST_EXPECT(observedDIDLedgerEntry[5u][jss::optionality] ==
SoeRequired);
345 BEAST_EXPECT(observedDIDLedgerEntry[6u][jss::name] ==
"PreviousTxnLgrSeq");
346 BEAST_EXPECT(observedDIDLedgerEntry[6u][jss::optionality] ==
SoeRequired);
352 result[jss::result][jss::LEDGER_ENTRY_FORMATS][
"NegativeUNL"];
354 BEAST_EXPECT(observedNunlLedgerEntry[0u][jss::name] ==
"DisabledValidators");
355 BEAST_EXPECT(observedNunlLedgerEntry[0u][jss::optionality] ==
SoeOptional);
357 BEAST_EXPECT(observedNunlLedgerEntry[1u][jss::name] ==
"ValidatorToDisable");
358 BEAST_EXPECT(observedNunlLedgerEntry[1u][jss::optionality] ==
SoeOptional);
360 BEAST_EXPECT(observedNunlLedgerEntry[2u][jss::name] ==
"ValidatorToReEnable");
361 BEAST_EXPECT(observedNunlLedgerEntry[2u][jss::optionality] ==
SoeOptional);
363 BEAST_EXPECT(observedNunlLedgerEntry[3u][jss::name] ==
"PreviousTxnID");
364 BEAST_EXPECT(observedNunlLedgerEntry[3u][jss::optionality] ==
SoeOptional);
366 BEAST_EXPECT(observedNunlLedgerEntry[4u][jss::name] ==
"PreviousTxnLgrSeq");
367 BEAST_EXPECT(observedNunlLedgerEntry[4u][jss::optionality] ==
SoeOptional);
374 json::Value const& txFlags = result[jss::result][jss::TRANSACTION_FLAGS];
378 BEAST_EXPECT(txFlags.
isMember(txName));
381 for (
auto const& [flagName, flagValue] : flagMap)
383 BEAST_EXPECT(txFlags[txName].isMember(flagName));
384 if (txFlags[txName].isMember(flagName))
386 BEAST_EXPECT(txFlags[txName][flagName].asUInt() == flagValue);
396 json::Value const& leFlags = result[jss::result][jss::LEDGER_ENTRY_FLAGS];
400 BEAST_EXPECT(leFlags.
isMember(ledgerType));
403 for (
auto const& [flagName, flagValue] : flagMap)
405 BEAST_EXPECT(leFlags[ledgerType].isMember(flagName));
406 if (leFlags[ledgerType].isMember(flagName))
408 BEAST_EXPECT(leFlags[ledgerType][flagName].asUInt() == flagValue);
418 json::Value const& asFlags = result[jss::result][jss::ACCOUNT_SET_FLAGS];
422 BEAST_EXPECT(asFlags.
isMember(flagName));
425 BEAST_EXPECT(asFlags[flagName].asInt() == flagValue);
433 auto const firstResult = env.
rpc(
"server_definitions");
434 auto const hash = firstResult[jss::result][jss::hash].
asString();
435 auto const hashParam =
std::string(
"{ ") + R
"("hash": ")" + hash + "\"}";
437 auto const result = env.
rpc(
"json",
"server_definitions", hashParam);
438 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
439 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
440 BEAST_EXPECT(!result[jss::result].isMember(jss::FIELDS));
441 BEAST_EXPECT(!result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
442 BEAST_EXPECT(!result[jss::result].isMember(jss::LEDGER_ENTRY_FLAGS));
443 BEAST_EXPECT(!result[jss::result].isMember(jss::LEDGER_ENTRY_FORMATS));
444 BEAST_EXPECT(!result[jss::result].isMember(jss::TRANSACTION_RESULTS));
445 BEAST_EXPECT(!result[jss::result].isMember(jss::TRANSACTION_TYPES));
446 BEAST_EXPECT(!result[jss::result].isMember(jss::TRANSACTION_FLAGS));
447 BEAST_EXPECT(!result[jss::result].isMember(jss::TRANSACTION_FORMATS));
448 BEAST_EXPECT(!result[jss::result].isMember(jss::TYPES));
449 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
456 "54296160385A27154BFA70A239DD8E8FD4CC2DB7BA32D970BA3A5B132CF749"
458 auto const hashParam =
std::string(
"{ ") + R
"("hash": ")" + hash + "\"}";
460 auto const result = env.
rpc(
"json",
"server_definitions", hashParam);
461 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
462 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
463 BEAST_EXPECT(result[jss::result].isMember(jss::FIELDS));
464 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
465 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_FLAGS));
466 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_FORMATS));
467 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_RESULTS));
468 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_TYPES));
469 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_FLAGS));
470 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_FORMATS));
471 BEAST_EXPECT(result[jss::result].isMember(jss::TYPES));
472 BEAST_EXPECT(result[jss::result].isMember(jss::hash));