2#include <test/jtx/Env.h>
4#include <xrpl/basics/base_uint.h>
5#include <xrpl/beast/unit_test/suite.h>
6#include <xrpl/json/json_forwards.h>
7#include <xrpl/json/json_reader.h>
8#include <xrpl/json/json_value.h>
9#include <xrpl/json/to_string.h>
10#include <xrpl/protocol/AccountID.h>
11#include <xrpl/protocol/SField.h>
12#include <xrpl/protocol/STAmount.h>
13#include <xrpl/protocol/STArray.h>
14#include <xrpl/protocol/STNumber.h>
15#include <xrpl/protocol/STParsedJSON.h>
16#include <xrpl/protocol/STXChainBridge.h>
17#include <xrpl/protocol/UintTypes.h>
18#include <xrpl/protocol/jss.h>
45 j[sfCloseResolution] = 255;
47 BEAST_EXPECT(obj.
object.has_value());
49 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
51 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
57 j[sfCloseResolution] = 255u;
59 BEAST_EXPECT(obj.
object.has_value());
61 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
63 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
69 j[sfCloseResolution] =
"255";
71 BEAST_EXPECT(obj.
object.has_value());
73 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
75 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
81 j[sfCloseResolution] = 0;
83 BEAST_EXPECT(obj.
object.has_value());
85 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 0);
91 j[sfCloseResolution] = -1;
93 BEAST_EXPECT(!obj.
object.has_value());
99 j[sfCloseResolution] = 256;
101 BEAST_EXPECT(!obj.
object.has_value());
109 BEAST_EXPECT(!obj.
object.has_value());
117 BEAST_EXPECT(!obj.
object.has_value());
128 j[sfLedgerEntryType] = 65535;
130 BEAST_EXPECT(obj.
object.has_value());
132 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
134 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
140 j[sfLedgerEntryType] = 65535u;
142 BEAST_EXPECT(obj.
object.has_value());
144 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
146 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
152 j[sfLedgerEntryType] =
"65535";
154 BEAST_EXPECT(obj.
object.has_value());
156 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
158 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
164 j[sfLedgerEntryType] = 0;
166 BEAST_EXPECT(obj.
object.has_value());
168 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 0);
174 j[sfLedgerEntryType] = -1;
176 BEAST_EXPECT(!obj.
object.has_value());
182 j[sfLedgerEntryType] = 65536;
184 BEAST_EXPECT(!obj.
object.has_value());
190 j[sfLedgerEntryType] =
"65536";
192 BEAST_EXPECT(!obj.
object.has_value());
200 BEAST_EXPECT(!obj.
object.has_value());
208 BEAST_EXPECT(!obj.
object.has_value());
214 j[sfTransferFee] =
"Payment";
216 BEAST_EXPECT(!obj.
object.has_value());
226 j[sfNetworkID] = 4294967295u;
228 BEAST_EXPECT(obj.
object.has_value());
230 BEAST_EXPECT(obj.
object->isFieldPresent(sfNetworkID));
232 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 4294967295u);
238 j[sfNetworkID] =
"4294967295";
240 BEAST_EXPECT(obj.
object.has_value());
242 BEAST_EXPECT(obj.
object->isFieldPresent(sfNetworkID));
244 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 4294967295u);
252 BEAST_EXPECT(obj.
object.has_value());
254 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 0);
262 BEAST_EXPECT(!obj.
object.has_value());
268 j[sfNetworkID] =
"4294967296";
270 BEAST_EXPECT(!obj.
object.has_value());
278 BEAST_EXPECT(!obj.
object.has_value());
286 BEAST_EXPECT(!obj.
object.has_value());
296 j[sfIndexNext] =
"ffffffffffffffff";
298 BEAST_EXPECT(obj.
object.has_value());
300 BEAST_EXPECT(obj.
object->isFieldPresent(sfIndexNext));
302 BEAST_EXPECT(obj.
object->getFieldU64(sfIndexNext) == 18446744073709551615ull);
310 BEAST_EXPECT(obj.
object.has_value());
312 BEAST_EXPECT(obj.
object->getFieldU64(sfIndexNext) == 0ull);
320 BEAST_EXPECT(!obj.
object.has_value());
329 j[sfIndexNext] =
"10000000000000000";
331 BEAST_EXPECT(!obj.
object.has_value());
337 j[sfIndexNext] =
"0xabcdefabcdef";
339 BEAST_EXPECT(!obj.
object.has_value());
345 j[sfIndexNext] =
"abcdefga";
347 BEAST_EXPECT(!obj.
object.has_value());
355 BEAST_EXPECT(!obj.
object.has_value());
363 BEAST_EXPECT(!obj.
object.has_value());
373 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDEF";
375 BEAST_EXPECT(obj.
object.has_value());
377 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
379 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash).size() == 16);
404 j[sfEmailHash] =
"0123456789abcdef0123456789abcdef";
406 BEAST_EXPECT(obj.
object.has_value());
408 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
410 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash).size() == 16);
418 BEAST_EXPECT(obj.
object.has_value());
420 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
422 auto const& h128 = obj.
object->getFieldH128(sfEmailHash);
423 BEAST_EXPECT(h128.size() == 16);
425 BEAST_EXPECT(allZero);
431 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDE";
433 BEAST_EXPECT(!obj.
object.has_value());
439 j[sfEmailHash] =
"nothexstring";
441 BEAST_EXPECT(!obj.
object.has_value());
447 j[sfEmailHash] =
"01234567";
449 BEAST_EXPECT(!obj.
object.has_value());
455 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDEF00";
457 BEAST_EXPECT(!obj.
object.has_value());
465 BEAST_EXPECT(!obj.
object.has_value());
473 BEAST_EXPECT(!obj.
object.has_value());
483 j[sfTakerPaysCurrency] =
"0123456789ABCDEF0123456789ABCDEF01234567";
485 BEAST_EXPECT(obj.
object.has_value());
487 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
489 BEAST_EXPECT(obj.
object->getFieldH160(sfTakerPaysCurrency).size() == 20);
491 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB,
492 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67};
500 j[sfTakerPaysCurrency] =
"0123456789abcdef0123456789abcdef01234567";
502 BEAST_EXPECT(obj.
object.has_value());
504 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
506 BEAST_EXPECT(obj.
object->getFieldH160(sfTakerPaysCurrency).size() == 20);
512 j[sfTakerPaysCurrency] =
"";
514 BEAST_EXPECT(obj.
object.has_value());
516 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
518 auto const& h160 = obj.
object->getFieldH160(sfTakerPaysCurrency);
519 BEAST_EXPECT(h160.size() == 20);
521 BEAST_EXPECT(allZero);
527 j[sfTakerPaysCurrency] =
"nothexstring";
529 BEAST_EXPECT(!obj.
object.has_value());
535 j[sfTakerPaysCurrency] =
"01234567";
537 BEAST_EXPECT(!obj.
object.has_value());
543 j[sfTakerPaysCurrency] =
"0123456789ABCDEF0123456789ABCDEF0123456789";
545 BEAST_EXPECT(!obj.
object.has_value());
553 BEAST_EXPECT(!obj.
object.has_value());
561 BEAST_EXPECT(!obj.
object.has_value());
571 j[sfMPTokenIssuanceID] =
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
573 BEAST_EXPECT(obj.
object.has_value());
575 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
577 BEAST_EXPECT(obj.
object->getFieldH192(sfMPTokenIssuanceID).size() == 24);
579 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
580 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
589 j[sfMPTokenIssuanceID] =
"ffffffffffffffffffffffffffffffffffffffffffffffff";
591 BEAST_EXPECT(obj.
object.has_value());
593 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
595 BEAST_EXPECT(obj.
object->getFieldH192(sfMPTokenIssuanceID).size() == 24);
601 j[sfMPTokenIssuanceID] =
"";
603 BEAST_EXPECT(obj.
object.has_value());
605 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
607 auto const& h192 = obj.
object->getFieldH192(sfMPTokenIssuanceID);
608 BEAST_EXPECT(h192.size() == 24);
610 BEAST_EXPECT(allZero);
616 j[sfMPTokenIssuanceID] =
"0123456789ABCDEF0123456789ABCDEF0123456789ABCDE";
618 BEAST_EXPECT(!obj.
object.has_value());
624 j[sfMPTokenIssuanceID] =
"nothexstring";
626 BEAST_EXPECT(!obj.
object.has_value());
632 j[sfMPTokenIssuanceID] =
"01234567";
634 BEAST_EXPECT(!obj.
object.has_value());
640 j[sfMPTokenIssuanceID] =
"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF00";
642 BEAST_EXPECT(!obj.
object.has_value());
650 BEAST_EXPECT(!obj.
object.has_value());
658 BEAST_EXPECT(!obj.
object.has_value());
670 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
673 BEAST_EXPECT(obj.
object.has_value());
675 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
677 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash).size() == 32);
679 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45,
680 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB,
681 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
689 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
692 BEAST_EXPECT(obj.
object.has_value());
694 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
696 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash).size() == 32);
702 j[sfLedgerHash] =
"";
704 BEAST_EXPECT(obj.
object.has_value());
706 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
708 auto const& h256 = obj.
object->getFieldH256(sfLedgerHash);
709 BEAST_EXPECT(h256.size() == 32);
711 BEAST_EXPECT(allZero);
718 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
721 BEAST_EXPECT(!obj.
object.has_value());
727 j[sfLedgerHash] =
"nothexstring";
729 BEAST_EXPECT(!obj.
object.has_value());
735 j[sfLedgerHash] =
"01234567";
737 BEAST_EXPECT(!obj.
object.has_value());
744 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
747 BEAST_EXPECT(!obj.
object.has_value());
755 BEAST_EXPECT(!obj.
object.has_value());
763 BEAST_EXPECT(!obj.
object.has_value());
773 int const minInt32 = -2147483648;
774 j[sfLoanScale] = minInt32;
776 BEAST_EXPECT(obj.
object.has_value());
778 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
781 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == minInt32);
788 int const maxInt32 = 2147483647;
789 j[sfLoanScale] = maxInt32;
791 BEAST_EXPECT(obj.
object.has_value());
793 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
796 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == maxInt32);
803 unsigned int const maxUInt32 = 2147483647u;
804 j[sfLoanScale] = maxUInt32;
806 BEAST_EXPECT(obj.
object.has_value());
808 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
812 obj.
object->getFieldI32(sfLoanScale) ==
static_cast<int32_t
>(maxUInt32));
819 j[sfLoanScale] =
"2147483647";
821 BEAST_EXPECT(obj.
object.has_value());
823 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
826 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == 2147483647u);
833 int const value = -2147483648;
836 BEAST_EXPECT(obj.
object.has_value());
838 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
841 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == value);
848 j[sfLoanScale] =
"-2147483649";
850 BEAST_EXPECT(!obj.
object.has_value());
856 j[sfLoanScale] = 2147483648u;
858 BEAST_EXPECT(!obj.
object.has_value());
864 j[sfLoanScale] =
"2147483648";
866 BEAST_EXPECT(!obj.
object.has_value());
874 BEAST_EXPECT(!obj.
object.has_value());
882 BEAST_EXPECT(!obj.
object.has_value());
893 j[sfPublicKey] =
"DEADBEEF";
895 BEAST_EXPECT(obj.
object.has_value());
897 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
899 obj.
object->getFieldVL(sfPublicKey);
900 BEAST_EXPECT(blob.size() == 4);
901 BEAST_EXPECT(blob[0] == 0xDE);
902 BEAST_EXPECT(blob[1] == 0xAD);
903 BEAST_EXPECT(blob[2] == 0xBE);
904 BEAST_EXPECT(blob[3] == 0xEF);
912 BEAST_EXPECT(obj.
object.has_value());
914 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
916 obj.
object->getFieldVL(sfPublicKey);
917 BEAST_EXPECT(blob.empty());
923 j[sfPublicKey] =
"deadbeef";
925 BEAST_EXPECT(obj.
object.has_value());
927 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
929 obj.
object->getFieldVL(sfPublicKey);
930 BEAST_EXPECT(blob.size() == 4);
931 BEAST_EXPECT(blob[0] == 0xDE);
932 BEAST_EXPECT(blob[1] == 0xAD);
933 BEAST_EXPECT(blob[2] == 0xBE);
934 BEAST_EXPECT(blob[3] == 0xEF);
940 j[sfPublicKey] =
"XYZ123";
942 BEAST_EXPECT(!obj.
object.has_value());
950 BEAST_EXPECT(!obj.
object.has_value());
958 BEAST_EXPECT(!obj.
object.has_value());
971 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
974 "FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA98765432"
978 BEAST_EXPECT(obj.
object.has_value());
980 BEAST_EXPECT(obj.
object->isFieldPresent(sfHashes));
982 obj.
object->getFieldV256(sfHashes);
983 BEAST_EXPECT(vec.size() == 2);
984 BEAST_EXPECT(
to_string(vec[0]) == arr[0u].asString());
985 BEAST_EXPECT(
to_string(vec[1]) == arr[1u].asString());
993 BEAST_EXPECT(obj.
object.has_value());
995 BEAST_EXPECT(obj.
object->isFieldPresent(sfHashes));
997 obj.
object->getFieldV256(sfHashes);
998 BEAST_EXPECT(vec.empty());
1005 arr.
append(
"nothexstring");
1008 BEAST_EXPECT(!obj.
object.has_value());
1015 arr.
append(
"0123456789ABCDEF");
1018 BEAST_EXPECT(!obj.
object.has_value());
1028 BEAST_EXPECT(!obj.
object.has_value());
1034 j[sfHashes] =
"notanarray";
1036 BEAST_EXPECT(!obj.
object.has_value());
1044 objElem[
"foo"] =
"bar";
1048 BEAST_EXPECT(!obj.
object.has_value());
1059 j[sfAccount] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1061 BEAST_EXPECT(obj.
object.has_value());
1063 BEAST_EXPECT(obj.
object->isFieldPresent(sfAccount));
1065 obj.
object->getAccountID(sfAccount);
1066 BEAST_EXPECT(acct.size() == 20);
1067 BEAST_EXPECT(
toBase58(acct) ==
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh");
1073 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F10111213";
1075 BEAST_EXPECT(obj.
object.has_value());
1077 BEAST_EXPECT(obj.
object->isFieldPresent(sfAccount));
1079 obj.
object->getAccountID(sfAccount);
1080 BEAST_EXPECT(acct.size() == 20);
1086 j[sfAccount] =
"notAValidBase58Account";
1088 BEAST_EXPECT(!obj.
object.has_value());
1094 j[sfAccount] =
"001122334455";
1096 BEAST_EXPECT(!obj.
object.has_value());
1102 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F101112131415";
1104 BEAST_EXPECT(!obj.
object.has_value());
1110 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F1011121G";
1112 BEAST_EXPECT(!obj.
object.has_value());
1120 BEAST_EXPECT(!obj.
object.has_value());
1128 BEAST_EXPECT(!obj.
object.has_value());
1136 BEAST_EXPECT(!obj.
object.has_value());
1147 j[sfBaseAsset] =
"USD";
1149 BEAST_EXPECT(obj.
object.has_value());
1151 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1153 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1154 BEAST_EXPECT(curr.currency().size() == 20);
1160 j[sfBaseAsset] =
"EUR";
1162 BEAST_EXPECT(obj.
object.has_value());
1164 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1166 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1167 BEAST_EXPECT(curr.currency().size() == 20);
1173 j[sfBaseAsset] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1177 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1178 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1179 BEAST_EXPECT(curr.currency().size() == 20);
1186 j[sfBaseAsset] =
"USDD";
1188 BEAST_EXPECT(!obj.
object.has_value());
1194 j[sfBaseAsset] =
"usd";
1196 BEAST_EXPECT(obj.
object.has_value());
1198 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1200 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1201 BEAST_EXPECT(curr.currency().size() == 20);
1207 j[sfBaseAsset] =
"0123456789AB";
1209 BEAST_EXPECT(!obj.
object.has_value());
1215 j[sfBaseAsset] =
"0123456789ABCDEF0123456789";
1217 BEAST_EXPECT(!obj.
object.has_value());
1223 j[sfBaseAsset] =
"";
1225 BEAST_EXPECT(obj.
object.has_value());
1227 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1229 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1230 BEAST_EXPECT(curr.currency().size() == 20);
1238 BEAST_EXPECT(!obj.
object.has_value());
1246 BEAST_EXPECT(!obj.
object.has_value());
1257 j[sfAmount] =
"100000000000000000";
1259 BEAST_EXPECT(obj.
object.has_value());
1261 BEAST_EXPECT(obj.
object->isFieldPresent(sfAmount));
1263 BEAST_EXPECT(obj.
object->getFieldAmount(sfAmount) ==
STAmount(100000000000000000ull));
1269 j[sfAmount] = 4294967295u;
1271 BEAST_EXPECT(obj.
object.has_value());
1273 BEAST_EXPECT(obj.
object->isFieldPresent(sfAmount));
1275 BEAST_EXPECT(obj.
object->getFieldAmount(sfAmount) ==
STAmount(4294967295u));
1281 j[sfAmount] =
"123.45";
1283 BEAST_EXPECT(!obj.
object.has_value());
1291 BEAST_EXPECT(!obj.
object.has_value());
1297 j[sfAmount] =
"notanumber";
1299 BEAST_EXPECT(!obj.
object.has_value());
1307 BEAST_EXPECT(!obj.
object.has_value());
1320 elem[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1321 elem[
"currency"] =
"USD";
1322 elem[
"issuer"] =
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
1326 j[sfPaths] = pathset;
1328 if (BEAST_EXPECT(obj.
object.has_value()))
1331 BEAST_EXPECT(obj.
object->isFieldPresent(sfPaths));
1333 auto const& ps = obj.
object->getFieldPathSet(sfPaths);
1334 BEAST_EXPECT(!ps.empty());
1335 BEAST_EXPECT(ps.size() == 1);
1336 BEAST_EXPECT(ps[0].size() == 1);
1338 ps[0][0].getAccountID() ==
1340 BEAST_EXPECT(
to_string(ps[0][0].getCurrency()) ==
"USD");
1342 ps[0][0].getIssuerID() ==
1352 elem[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1353 elem[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1354 elem[
"issuer"] =
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
1358 j[sfPaths] = pathset;
1360 BEAST_EXPECT(obj.
object.has_value());
1362 obj.
object->isFieldPresent(sfPaths));
1364 obj.
object->getFieldPathSet(sfPaths);
1365 BEAST_EXPECT(!ps.empty());
1371 j[sfPaths] =
"notanarray";
1373 BEAST_EXPECT(!obj.
object.has_value());
1380 pathset.
append(
"notanarray");
1381 j[sfPaths] = pathset;
1383 BEAST_EXPECT(!obj.
object.has_value());
1391 path.append(
"notanobject");
1394 j[sfPaths] = pathset;
1396 BEAST_EXPECT(!obj.
object.has_value());
1405 elem[
"foo"] =
"bar";
1409 j[sfPaths] = pathset;
1411 BEAST_EXPECT(!obj.
object.has_value());
1420 elem[
"account"] =
"notAValidBase58Account";
1424 j[sfPaths] = pathset;
1426 BEAST_EXPECT(!obj.
object.has_value());
1434 elem[
"account"] = 12345;
1438 j[sfPaths] = pathset;
1440 BEAST_EXPECT(!obj.
object.has_value());
1448 elem[
"currency"] = 12345;
1452 j[sfPaths] = pathset;
1454 BEAST_EXPECT(!obj.
object.has_value());
1462 elem[
"currency"] =
"notAValidCurrency";
1466 j[sfPaths] = pathset;
1468 BEAST_EXPECT(!obj.
object.has_value());
1476 elem[
"issuer"] = 12345;
1480 j[sfPaths] = pathset;
1482 BEAST_EXPECT(!obj.
object.has_value());
1490 elem[
"issuer"] =
"notAValidBase58Account";
1494 j[sfPaths] = pathset;
1496 BEAST_EXPECT(!obj.
object.has_value());
1508 issueJson[
"currency"] =
"USD";
1509 issueJson[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1510 j[sfAsset] = issueJson;
1512 if (BEAST_EXPECT(obj.
object.has_value()))
1515 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1516 auto const& issueField =
1518 auto const issue = issueField.value().get<
Issue>();
1519 BEAST_EXPECT(issue.currency.size() == 20);
1520 BEAST_EXPECT(
to_string(issue.currency) ==
"USD");
1521 BEAST_EXPECT(issue.account.size() == 20);
1531 issueJson[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1532 issueJson[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1533 j[sfAsset] = issueJson;
1537 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1538 auto const& issueField = (*obj.
object)[sfAsset];
1539 auto const issue = issueField.value().get<
Issue>();
1540 BEAST_EXPECT(issue.currency.size() == 20);
1541 BEAST_EXPECT(issue.account.size() == 20);
1549 issueJson[
"mpt_issuance_id"] =
"0000000000000000000000004D5054494431323334234234";
1550 j[sfAsset] = issueJson;
1554 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1555 auto const& issueField = (*obj.
object)[sfAsset];
1556 auto const issue = issueField.value().get<
MPTIssue>();
1557 BEAST_EXPECT(issue.getMptID().size() == 24);
1565 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1568 BEAST_EXPECT(!obj.
object.has_value());
1575 issue[
"currency"] =
"USD";
1578 BEAST_EXPECT(!obj.
object.has_value());
1585 issue[
"currency"] =
"USDD";
1586 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1589 BEAST_EXPECT(!obj.
object.has_value());
1596 issue[
"currency"] =
"USD";
1597 issue[
"issuer"] =
"notAValidIssuer";
1600 BEAST_EXPECT(!obj.
object.has_value());
1608 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1611 BEAST_EXPECT(!obj.
object.has_value());
1618 issue[
"currency"] =
"USD";
1622 BEAST_EXPECT(!obj.
object.has_value());
1628 j[sfAsset] =
"notanobject";
1630 BEAST_EXPECT(!obj.
object.has_value());
1643 issuingChainIssue[
"currency"] =
"USD";
1644 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1646 lockingChainIssue[
"currency"] =
"EUR";
1647 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1648 bridge[
"LockingChainIssue"] = lockingChainIssue;
1649 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1650 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1651 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1652 j[sfXChainBridge] = bridge;
1656 BEAST_EXPECT(obj.
object->isFieldPresent(sfXChainBridge));
1657 auto const& bridgeField = (*obj.
object)[sfXChainBridge];
1658 BEAST_EXPECT(bridgeField->lockingChainIssue().currency.size() == 20);
1659 BEAST_EXPECT(bridgeField->issuingChainIssue().currency.size() == 20);
1668 issuingChainIssue[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1669 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1671 lockingChainIssue[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1672 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1673 bridge[
"LockingChainIssue"] = lockingChainIssue;
1674 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1675 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1676 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1677 j[sfXChainBridge] = bridge;
1681 BEAST_EXPECT(obj.
object->isFieldPresent(sfXChainBridge));
1682 auto const& bridgeField = (*obj.
object)[sfXChainBridge];
1683 BEAST_EXPECT(bridgeField->lockingChainIssue().currency.size() == 20);
1684 BEAST_EXPECT(bridgeField->issuingChainIssue().currency.size() == 20);
1693 issuingChainIssue[
"currency"] =
"USD";
1694 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1695 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1696 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1697 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1698 j[sfXChainBridge] = bridge;
1700 BEAST_EXPECT(!obj.
object.has_value());
1708 lockingChainIssue[
"currency"] =
"EUR";
1709 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1710 bridge[
"LockingChainIssue"] = lockingChainIssue;
1711 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1712 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1713 j[sfXChainBridge] = bridge;
1715 BEAST_EXPECT(!obj.
object.has_value());
1723 issuingChainIssue[
"currency"] =
"USD";
1724 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1725 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1727 lockingChainIssue[
"currency"] =
"EUR";
1728 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1729 bridge[
"LockingChainIssue"] = lockingChainIssue;
1730 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1731 j[sfXChainBridge] = bridge;
1733 BEAST_EXPECT(!obj.
object.has_value());
1741 issuingChainIssue[
"currency"] =
"USD";
1742 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1743 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1745 lockingChainIssue[
"currency"] =
"EUR";
1746 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1747 bridge[
"LockingChainIssue"] = lockingChainIssue;
1748 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1749 j[sfXChainBridge] = bridge;
1751 BEAST_EXPECT(!obj.
object.has_value());
1758 bridge[
"LockingChainIssue"] =
"notanobject";
1759 bridge[
"IssuingChainIssue"] =
"notanobject";
1760 j[sfXChainBridge] = bridge;
1762 BEAST_EXPECT(!obj.
object.has_value());
1770 asset[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1772 lockingChainIssue[
"currency"] =
"EUR";
1773 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1774 bridge[
"LockingChainIssue"] = lockingChainIssue;
1775 bridge[
"IssuingChainIssue"] = asset;
1776 j[sfXChainBridge] = bridge;
1778 BEAST_EXPECT(!obj.
object.has_value());
1786 asset[
"currency"] =
"USD";
1788 lockingChainIssue[
"currency"] =
"EUR";
1789 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1790 bridge[
"LockingChainIssue"] = lockingChainIssue;
1791 bridge[
"IssuingChainIssue"] = asset;
1792 j[sfXChainBridge] = bridge;
1794 BEAST_EXPECT(!obj.
object.has_value());
1802 asset[
"currency"] =
"USD";
1803 asset[
"issuer"] =
"notAValidBase58Account";
1805 lockingChainIssue[
"currency"] =
"EUR";
1806 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1807 bridge[
"LockingChainIssue"] = lockingChainIssue;
1808 bridge[
"IssuingChainIssue"] = asset;
1809 j[sfXChainBridge] = bridge;
1811 BEAST_EXPECT(!obj.
object.has_value());
1817 j[sfXChainBridge] =
"notanobject";
1819 BEAST_EXPECT(!obj.
object.has_value());
1830 j[sfNumber] = 12345;
1832 BEAST_EXPECT(obj.
object.has_value());
1834 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1836 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(12345, 0));
1842 j[sfNumber] = 12345u;
1844 BEAST_EXPECT(obj.
object.has_value());
1846 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1848 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(12345, 0));
1854 j[sfNumber] =
"67890";
1856 BEAST_EXPECT(obj.
object.has_value());
1858 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1860 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(67890, 0));
1868 BEAST_EXPECT(obj.
object.has_value());
1870 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1872 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(-42, 0));
1878 j[sfNumber] =
"-123";
1880 BEAST_EXPECT(obj.
object.has_value());
1882 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1884 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(-123, 0));
1890 j[sfNumber] =
"3.14159";
1894 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1895 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(314159, -5));
1902 j[sfNumber] =
"notanumber";
1904 BEAST_EXPECT(!obj.
object.has_value());
1912 BEAST_EXPECT(!obj.
object.has_value());
1920 BEAST_EXPECT(!obj.
object.has_value());
1928 BEAST_EXPECT(!obj.
object.has_value());
1940 objVal[sfTransactionResult] = 1;
1941 j[sfTransactionMetaData] = objVal;
1943 BEAST_EXPECT(obj.
object.has_value());
1945 BEAST_EXPECT(obj.
object->isFieldPresent(sfTransactionMetaData));
1947 auto const& result = obj.
object->peekFieldObject(sfTransactionMetaData);
1948 BEAST_EXPECT(result.getFieldU8(sfTransactionResult) == 1);
1954 j[sfTransactionMetaData] =
"notanobject";
1956 BEAST_EXPECT(!obj.
object.has_value());
1964 j[sfTransactionMetaData] = arr;
1966 BEAST_EXPECT(!obj.
object.has_value());
1974 BEAST_EXPECT(!obj.
object.has_value());
1986 (*current)[sfTransactionMetaData] = next;
1987 current = &((*current)[sfTransactionMetaData]);
1989 (*current)[sfTransactionResult.getJsonName()] = 1;
1990 j[sfTransactionMetaData] = obj;
1992 BEAST_EXPECT(parsed.
object.has_value());
1994 BEAST_EXPECT(parsed.
object->isFieldPresent(sfTransactionMetaData));
2005 (*current)[sfTransactionMetaData] = next;
2006 current = &((*current)[sfTransactionMetaData]);
2008 (*current)[sfTransactionResult.getJsonName()] = 1;
2009 j[sfTransactionMetaData] = obj;
2011 BEAST_EXPECT(!parsed.
object.has_value());
2024 elem[sfTransactionResult] = 2;
2026 elem2[sfTransactionMetaData] = elem;
2028 j[sfSignerEntries] = arr;
2030 BEAST_EXPECT(obj.
object.has_value());
2032 BEAST_EXPECT(obj.
object->isFieldPresent(sfSignerEntries));
2034 auto const& result = obj.
object->getFieldArray(sfSignerEntries);
2035 if (BEAST_EXPECT(result.size() == 1))
2037 BEAST_EXPECT(result[0].getFName() == sfTransactionMetaData);
2038 BEAST_EXPECT(result[0].
getJson(0) == elem);
2046 arr.
append(
"notanobject");
2047 j[sfSignerEntries] = arr;
2049 BEAST_EXPECT(!obj.
object.has_value());
2057 elem[
"invalidField"] = 1;
2059 j[sfSignerEntries] = arr;
2061 BEAST_EXPECT(!obj.
object.has_value());
2069 elem[sfTransactionResult] = 2;
2070 elem[sfNetworkID] = 3;
2072 j[sfSignerEntries] = arr;
2074 BEAST_EXPECT(!obj.
object.has_value());
2080 j[sfSignerEntries] =
"notanarray";
2082 BEAST_EXPECT(!obj.
object.has_value());
2091 elem[sfTransactionResult] =
"notanint";
2093 j[sfSignerEntries] = arr;
2095 BEAST_EXPECT(!obj.
object.has_value());
2102 j[sfSignerEntries] = arr;
2104 BEAST_EXPECT(obj.
object.has_value());
2106 BEAST_EXPECT(obj.
object->isFieldPresent(sfSignerEntries));
2114 obj[0u][sfTransactionResult] = 1;
2115 j[sfSignerEntries] = obj;
2117 BEAST_EXPECT(!parsed.
object.has_value());
2138 "\"ModifiedNode\":{\"Sequence\":1}, "
2139 "\"DeletedNode\":{\"Sequence\":1}"
2147 BEAST_EXPECT(!parsed.
object);
2171 entry[
"SignerEntry"][
"Account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
2172 entry[
"SignerEntry"][
"SignerWeight"] = 1;
2175 jv[sfSignerEntries] = entries;
2178 BEAST_EXPECT(!parsed.
object);
2179 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2181 parsed.
error[jss::error_message] ==
2182 "Field 'test.SignerEntries' exceeds allowed JSON array size of " + limitStr);
2191 amendments.append(hash);
2192 jv[sfAmendments] = amendments;
2195 BEAST_EXPECT(!parsed.
object);
2196 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2198 parsed.
error[jss::error_message] ==
2199 "Field 'test.Amendments' exceeds allowed JSON array size of " + limitStr);
2208 amendments.append(hash);
2209 jv[sfAmendments] = amendments;
2212 BEAST_EXPECT(parsed.
object);
2214 auto const arrSize = parsed.
object->getFieldV256(sfAmendments).size();
2226 hop[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
2230 jv[sfPaths] = paths;
2233 BEAST_EXPECT(!parsed.
object);
2234 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2236 parsed.
error[jss::error_message] ==
2237 "Field 'test.Paths' exceeds allowed JSON array size of " + limitStr);
2248 hop[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
2252 jv[sfPaths] = paths;
2255 BEAST_EXPECT(parsed.
object);
2257 auto const arrSize = parsed.
object->getFieldPathSet(sfPaths).size();
2267 hop[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
2271 jv[sfPaths] = paths;
2274 BEAST_EXPECT(!parsed.
object);
2275 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2277 parsed.
error[jss::error_message] ==
2278 "Field 'test.Paths[0]' exceeds allowed JSON array size of " + limitStr);
2287 hop[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
2291 jv[sfPaths] = paths;
2294 BEAST_EXPECT(parsed.
object);
2296 auto const arrSize = parsed.
object->getFieldPathSet(sfPaths)[0].size();
2308 memo[
"Memo"][
"MemoData"] =
"00";
2311 jv[sfMemos] = memos;
2314 BEAST_EXPECT(parsed.
object);
2316 auto const arrSize = parsed.
object->getFieldArray(sfMemos).size();
2328 memo[
"Memo"][
"MemoData"] =
"00";
2331 jv[sfMemos] = memos;
2334 BEAST_EXPECT(!parsed.
object);
2335 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2337 parsed.
error[jss::error_message] ==
2338 "Field 'test.Memos' exceeds allowed JSON array size of " + limitStr);
2349 j[sfLedgerEntry] = 1;
2354 R
"({"CloseResolution":19,"Method":250,)"
2355 R"("TransactionResult":"tecFROZEN"})");
2361 if (BEAST_EXPECT(parsed.
object))
2366 BEAST_EXPECT(serialized == goodJson);
2373 R
"({"CloseResolution":19,"Method":"250",)"
2374 R"("TransactionResult":"tecFROZEN"})");
2376 R
"({"CloseResolution":19,"Method":250,)"
2377 R"("TransactionResult":"tecFROZEN"})");
2386 if (BEAST_EXPECT(parsed.
object))
2391 BEAST_EXPECT(serialized == expectedJson);
2398 R
"({"CloseResolution":"19","Method":"250",)"
2399 R"("TransactionResult":"tecFROZEN"})");
2401 R
"({"CloseResolution":19,"Method":250,)"
2402 R"("TransactionResult":"tecFROZEN"})");
2411 if (BEAST_EXPECT(parsed.
object))
2416 BEAST_EXPECT(serialized == expectedJson);
2423 R
"({"CloseResolution":19,"Method":250,)"
2424 R"("TransactionResult":"terQUEUED"})");
2430 BEAST_EXPECT(!parsed.
object);
2431 BEAST_EXPECT(parsed.
error);
2432 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2434 parsed.
error[jss::error_message] ==
2435 "Field 'test.TransactionResult' is out of range.");
2441 R
"({"CloseResolution":19,"Method":"pony",)"
2442 R"("TransactionResult":"tesSUCCESS"})");
2448 BEAST_EXPECT(!parsed.
object);
2449 BEAST_EXPECT(parsed.
error);
2450 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2452 parsed.
error[jss::error_message] ==
"Field 'test.Method' has bad type.");
2458 R
"({"CloseResolution":19,"Method":3294967296,)"
2459 R"("TransactionResult":"tesSUCCESS"})");
2465 BEAST_EXPECT(!parsed.
object);
2466 BEAST_EXPECT(parsed.
error);
2467 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2469 parsed.
error[jss::error_message] ==
"Field 'test.Method' is out of range.");
2475 R
"({"CloseResolution":-10,"Method":42,)"
2476 R"("TransactionResult":"tesSUCCESS"})");
2482 BEAST_EXPECT(!parsed.
object);
2483 BEAST_EXPECT(parsed.
error);
2484 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2486 parsed.
error[jss::error_message] ==
2487 "Field 'test.CloseResolution' is out of range.");
2493 R
"({"CloseResolution":19,"Method":3.141592653,)"
2494 R"("TransactionResult":"tesSUCCESS"})");
2500 BEAST_EXPECT(!parsed.
object);
2501 BEAST_EXPECT(parsed.
error);
2502 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2504 parsed.
error[jss::error_message] ==
"Field 'test.Method' has bad type.");
2510 R
"({"CloseResolution":19,"Method":250,)"
2511 R"("TransferFee":"65535"})");
2513 R
"({"CloseResolution":19,"Method":250,)"
2514 R"("TransferFee":65535})");
2520 if (BEAST_EXPECT(parsed.
object))
2525 BEAST_EXPECT(serialized == expectedJson);
2532 R
"({"CloseResolution":19,"Method":250,)"
2533 R"("TransferFee":"65536"})");
2539 BEAST_EXPECT(!parsed.
object);
2540 BEAST_EXPECT(parsed.
error);
2541 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2543 parsed.
error[jss::error_message] ==
2544 "Field 'test.TransferFee' has invalid data.");
2550 R
"({"CloseResolution":19,"Method":250,)"
2551 R"("TransferFee":"Payment"})");
2557 BEAST_EXPECT(!parsed.
object);
2558 BEAST_EXPECT(parsed.
error);
2559 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2561 parsed.
error[jss::error_message] ==
2562 "Field 'test.TransferFee' has invalid data.");
2568 R
"({"CloseResolution":19,"Method":250,)"
2569 R"("TransferFee":true})");
2575 BEAST_EXPECT(!parsed.
object);
2576 BEAST_EXPECT(parsed.
error);
2577 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2579 parsed.
error[jss::error_message] ==
"Field 'test.TransferFee' has bad type.");
bool unexpected(Condition shouldBeFalse, String const &reason)
DEPRECATED.
TestcaseT testcase
Memberspace for declaring test cases.
Unserialize a JSON document into a Value.
bool parse(std::string const &document, Value &root)
Read a Value from a JSON document.
Value & append(Value const &value)
Append value to array at the end.
static BaseUInt fromRaw(Container const &c)
A currency issued by an account.
Number is a floating point type that can represent a wide range of values.
Holds the serialized result of parsing an input JSON object.
std::optional< STObject > object
The STObject if the parse was successful.
json::Value error
On failure, an appropriate set of error values.
static bool parseJSONString(std::string const &json, json::Value &to)
void testArrayBoundsChecking()
void run() override
Runs the suite.
A transaction testing environment.
JSON (JavaScript Object Notation).
@ Array
array value (ordered list)
@ Object
object value (collection of name/value pairs).
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
constexpr std::size_t kMaxParsedJsonDepth
Maximum JSON object nesting depth permitted during parsing.
std::string to_string(BaseUInt< Bits, Tag > const &a)
constexpr std::size_t kMaxParsedJsonArraySize
Maximum number of elements permitted in any JSON array field during parsing.
json::Value getJson(LedgerFill const &fill)
Return a new json::Value representing the ledger with given options.
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, xrpl)