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/STNumber.h>
14#include <xrpl/protocol/STParsedJSON.h>
15#include <xrpl/protocol/STXChainBridge.h>
16#include <xrpl/protocol/UintTypes.h>
17#include <xrpl/protocol/jss.h>
43 j[sfCloseResolution] = 255;
45 BEAST_EXPECT(obj.
object.has_value());
47 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
49 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
55 j[sfCloseResolution] = 255u;
57 BEAST_EXPECT(obj.
object.has_value());
59 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
61 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
67 j[sfCloseResolution] =
"255";
69 BEAST_EXPECT(obj.
object.has_value());
71 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
73 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
79 j[sfCloseResolution] = 0;
81 BEAST_EXPECT(obj.
object.has_value());
83 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 0);
89 j[sfCloseResolution] = -1;
91 BEAST_EXPECT(!obj.
object.has_value());
97 j[sfCloseResolution] = 256;
99 BEAST_EXPECT(!obj.
object.has_value());
107 BEAST_EXPECT(!obj.
object.has_value());
115 BEAST_EXPECT(!obj.
object.has_value());
126 j[sfLedgerEntryType] = 65535;
128 BEAST_EXPECT(obj.
object.has_value());
130 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
132 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
138 j[sfLedgerEntryType] = 65535u;
140 BEAST_EXPECT(obj.
object.has_value());
142 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
144 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
150 j[sfLedgerEntryType] =
"65535";
152 BEAST_EXPECT(obj.
object.has_value());
154 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
156 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
162 j[sfLedgerEntryType] = 0;
164 BEAST_EXPECT(obj.
object.has_value());
166 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 0);
172 j[sfLedgerEntryType] = -1;
174 BEAST_EXPECT(!obj.
object.has_value());
180 j[sfLedgerEntryType] = 65536;
182 BEAST_EXPECT(!obj.
object.has_value());
188 j[sfLedgerEntryType] =
"65536";
190 BEAST_EXPECT(!obj.
object.has_value());
198 BEAST_EXPECT(!obj.
object.has_value());
206 BEAST_EXPECT(!obj.
object.has_value());
212 j[sfTransferFee] =
"Payment";
214 BEAST_EXPECT(!obj.
object.has_value());
224 j[sfNetworkID] = 4294967295u;
226 BEAST_EXPECT(obj.
object.has_value());
228 BEAST_EXPECT(obj.
object->isFieldPresent(sfNetworkID));
230 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 4294967295u);
236 j[sfNetworkID] =
"4294967295";
238 BEAST_EXPECT(obj.
object.has_value());
240 BEAST_EXPECT(obj.
object->isFieldPresent(sfNetworkID));
242 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 4294967295u);
250 BEAST_EXPECT(obj.
object.has_value());
252 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 0);
260 BEAST_EXPECT(!obj.
object.has_value());
266 j[sfNetworkID] =
"4294967296";
268 BEAST_EXPECT(!obj.
object.has_value());
276 BEAST_EXPECT(!obj.
object.has_value());
284 BEAST_EXPECT(!obj.
object.has_value());
294 j[sfIndexNext] =
"ffffffffffffffff";
296 BEAST_EXPECT(obj.
object.has_value());
298 BEAST_EXPECT(obj.
object->isFieldPresent(sfIndexNext));
300 BEAST_EXPECT(obj.
object->getFieldU64(sfIndexNext) == 18446744073709551615ull);
308 BEAST_EXPECT(obj.
object.has_value());
310 BEAST_EXPECT(obj.
object->getFieldU64(sfIndexNext) == 0ull);
318 BEAST_EXPECT(!obj.
object.has_value());
327 j[sfIndexNext] =
"10000000000000000";
329 BEAST_EXPECT(!obj.
object.has_value());
335 j[sfIndexNext] =
"0xabcdefabcdef";
337 BEAST_EXPECT(!obj.
object.has_value());
343 j[sfIndexNext] =
"abcdefga";
345 BEAST_EXPECT(!obj.
object.has_value());
353 BEAST_EXPECT(!obj.
object.has_value());
361 BEAST_EXPECT(!obj.
object.has_value());
371 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDEF";
373 BEAST_EXPECT(obj.
object.has_value());
375 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
377 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash).size() == 16);
402 j[sfEmailHash] =
"0123456789abcdef0123456789abcdef";
404 BEAST_EXPECT(obj.
object.has_value());
406 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
408 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash).size() == 16);
416 BEAST_EXPECT(obj.
object.has_value());
418 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
420 auto const& h128 = obj.
object->getFieldH128(sfEmailHash);
421 BEAST_EXPECT(h128.size() == 16);
423 BEAST_EXPECT(allZero);
429 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDE";
431 BEAST_EXPECT(!obj.
object.has_value());
437 j[sfEmailHash] =
"nothexstring";
439 BEAST_EXPECT(!obj.
object.has_value());
445 j[sfEmailHash] =
"01234567";
447 BEAST_EXPECT(!obj.
object.has_value());
453 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDEF00";
455 BEAST_EXPECT(!obj.
object.has_value());
463 BEAST_EXPECT(!obj.
object.has_value());
471 BEAST_EXPECT(!obj.
object.has_value());
481 j[sfTakerPaysCurrency] =
"0123456789ABCDEF0123456789ABCDEF01234567";
483 BEAST_EXPECT(obj.
object.has_value());
485 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
487 BEAST_EXPECT(obj.
object->getFieldH160(sfTakerPaysCurrency).size() == 20);
489 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB,
490 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67};
498 j[sfTakerPaysCurrency] =
"0123456789abcdef0123456789abcdef01234567";
500 BEAST_EXPECT(obj.
object.has_value());
502 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
504 BEAST_EXPECT(obj.
object->getFieldH160(sfTakerPaysCurrency).size() == 20);
510 j[sfTakerPaysCurrency] =
"";
512 BEAST_EXPECT(obj.
object.has_value());
514 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
516 auto const& h160 = obj.
object->getFieldH160(sfTakerPaysCurrency);
517 BEAST_EXPECT(h160.size() == 20);
519 BEAST_EXPECT(allZero);
525 j[sfTakerPaysCurrency] =
"nothexstring";
527 BEAST_EXPECT(!obj.
object.has_value());
533 j[sfTakerPaysCurrency] =
"01234567";
535 BEAST_EXPECT(!obj.
object.has_value());
541 j[sfTakerPaysCurrency] =
"0123456789ABCDEF0123456789ABCDEF0123456789";
543 BEAST_EXPECT(!obj.
object.has_value());
551 BEAST_EXPECT(!obj.
object.has_value());
559 BEAST_EXPECT(!obj.
object.has_value());
569 j[sfMPTokenIssuanceID] =
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
571 BEAST_EXPECT(obj.
object.has_value());
573 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
575 BEAST_EXPECT(obj.
object->getFieldH192(sfMPTokenIssuanceID).size() == 24);
577 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
578 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
587 j[sfMPTokenIssuanceID] =
"ffffffffffffffffffffffffffffffffffffffffffffffff";
589 BEAST_EXPECT(obj.
object.has_value());
591 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
593 BEAST_EXPECT(obj.
object->getFieldH192(sfMPTokenIssuanceID).size() == 24);
599 j[sfMPTokenIssuanceID] =
"";
601 BEAST_EXPECT(obj.
object.has_value());
603 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
605 auto const& h192 = obj.
object->getFieldH192(sfMPTokenIssuanceID);
606 BEAST_EXPECT(h192.size() == 24);
608 BEAST_EXPECT(allZero);
614 j[sfMPTokenIssuanceID] =
"0123456789ABCDEF0123456789ABCDEF0123456789ABCDE";
616 BEAST_EXPECT(!obj.
object.has_value());
622 j[sfMPTokenIssuanceID] =
"nothexstring";
624 BEAST_EXPECT(!obj.
object.has_value());
630 j[sfMPTokenIssuanceID] =
"01234567";
632 BEAST_EXPECT(!obj.
object.has_value());
638 j[sfMPTokenIssuanceID] =
"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF00";
640 BEAST_EXPECT(!obj.
object.has_value());
648 BEAST_EXPECT(!obj.
object.has_value());
656 BEAST_EXPECT(!obj.
object.has_value());
668 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
671 BEAST_EXPECT(obj.
object.has_value());
673 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
675 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash).size() == 32);
677 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45,
678 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB,
679 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
687 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
690 BEAST_EXPECT(obj.
object.has_value());
692 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
694 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash).size() == 32);
700 j[sfLedgerHash] =
"";
702 BEAST_EXPECT(obj.
object.has_value());
704 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
706 auto const& h256 = obj.
object->getFieldH256(sfLedgerHash);
707 BEAST_EXPECT(h256.size() == 32);
709 BEAST_EXPECT(allZero);
716 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
719 BEAST_EXPECT(!obj.
object.has_value());
725 j[sfLedgerHash] =
"nothexstring";
727 BEAST_EXPECT(!obj.
object.has_value());
733 j[sfLedgerHash] =
"01234567";
735 BEAST_EXPECT(!obj.
object.has_value());
742 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
745 BEAST_EXPECT(!obj.
object.has_value());
753 BEAST_EXPECT(!obj.
object.has_value());
761 BEAST_EXPECT(!obj.
object.has_value());
771 int const minInt32 = -2147483648;
772 j[sfLoanScale] = minInt32;
774 BEAST_EXPECT(obj.
object.has_value());
776 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
779 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == minInt32);
786 int const maxInt32 = 2147483647;
787 j[sfLoanScale] = maxInt32;
789 BEAST_EXPECT(obj.
object.has_value());
791 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
794 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == maxInt32);
801 unsigned int const maxUInt32 = 2147483647u;
802 j[sfLoanScale] = maxUInt32;
804 BEAST_EXPECT(obj.
object.has_value());
806 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
810 obj.
object->getFieldI32(sfLoanScale) ==
static_cast<int32_t
>(maxUInt32));
817 j[sfLoanScale] =
"2147483647";
819 BEAST_EXPECT(obj.
object.has_value());
821 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
824 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == 2147483647u);
831 int const value = -2147483648;
834 BEAST_EXPECT(obj.
object.has_value());
836 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
839 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == value);
846 j[sfLoanScale] =
"-2147483649";
848 BEAST_EXPECT(!obj.
object.has_value());
854 j[sfLoanScale] = 2147483648u;
856 BEAST_EXPECT(!obj.
object.has_value());
862 j[sfLoanScale] =
"2147483648";
864 BEAST_EXPECT(!obj.
object.has_value());
872 BEAST_EXPECT(!obj.
object.has_value());
880 BEAST_EXPECT(!obj.
object.has_value());
891 j[sfPublicKey] =
"DEADBEEF";
893 BEAST_EXPECT(obj.
object.has_value());
895 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
897 obj.
object->getFieldVL(sfPublicKey);
898 BEAST_EXPECT(blob.size() == 4);
899 BEAST_EXPECT(blob[0] == 0xDE);
900 BEAST_EXPECT(blob[1] == 0xAD);
901 BEAST_EXPECT(blob[2] == 0xBE);
902 BEAST_EXPECT(blob[3] == 0xEF);
910 BEAST_EXPECT(obj.
object.has_value());
912 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
914 obj.
object->getFieldVL(sfPublicKey);
915 BEAST_EXPECT(blob.empty());
921 j[sfPublicKey] =
"deadbeef";
923 BEAST_EXPECT(obj.
object.has_value());
925 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
927 obj.
object->getFieldVL(sfPublicKey);
928 BEAST_EXPECT(blob.size() == 4);
929 BEAST_EXPECT(blob[0] == 0xDE);
930 BEAST_EXPECT(blob[1] == 0xAD);
931 BEAST_EXPECT(blob[2] == 0xBE);
932 BEAST_EXPECT(blob[3] == 0xEF);
938 j[sfPublicKey] =
"XYZ123";
940 BEAST_EXPECT(!obj.
object.has_value());
948 BEAST_EXPECT(!obj.
object.has_value());
956 BEAST_EXPECT(!obj.
object.has_value());
969 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
972 "FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA98765432"
976 BEAST_EXPECT(obj.
object.has_value());
978 BEAST_EXPECT(obj.
object->isFieldPresent(sfHashes));
980 obj.
object->getFieldV256(sfHashes);
981 BEAST_EXPECT(vec.size() == 2);
982 BEAST_EXPECT(
to_string(vec[0]) == arr[0u].asString());
983 BEAST_EXPECT(
to_string(vec[1]) == arr[1u].asString());
991 BEAST_EXPECT(obj.
object.has_value());
993 BEAST_EXPECT(obj.
object->isFieldPresent(sfHashes));
995 obj.
object->getFieldV256(sfHashes);
996 BEAST_EXPECT(vec.empty());
1003 arr.
append(
"nothexstring");
1006 BEAST_EXPECT(!obj.
object.has_value());
1013 arr.
append(
"0123456789ABCDEF");
1016 BEAST_EXPECT(!obj.
object.has_value());
1026 BEAST_EXPECT(!obj.
object.has_value());
1032 j[sfHashes] =
"notanarray";
1034 BEAST_EXPECT(!obj.
object.has_value());
1042 objElem[
"foo"] =
"bar";
1046 BEAST_EXPECT(!obj.
object.has_value());
1057 j[sfAccount] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1059 BEAST_EXPECT(obj.
object.has_value());
1061 BEAST_EXPECT(obj.
object->isFieldPresent(sfAccount));
1063 obj.
object->getAccountID(sfAccount);
1064 BEAST_EXPECT(acct.size() == 20);
1065 BEAST_EXPECT(
toBase58(acct) ==
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh");
1071 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F10111213";
1073 BEAST_EXPECT(obj.
object.has_value());
1075 BEAST_EXPECT(obj.
object->isFieldPresent(sfAccount));
1077 obj.
object->getAccountID(sfAccount);
1078 BEAST_EXPECT(acct.size() == 20);
1084 j[sfAccount] =
"notAValidBase58Account";
1086 BEAST_EXPECT(!obj.
object.has_value());
1092 j[sfAccount] =
"001122334455";
1094 BEAST_EXPECT(!obj.
object.has_value());
1100 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F101112131415";
1102 BEAST_EXPECT(!obj.
object.has_value());
1108 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F1011121G";
1110 BEAST_EXPECT(!obj.
object.has_value());
1118 BEAST_EXPECT(!obj.
object.has_value());
1126 BEAST_EXPECT(!obj.
object.has_value());
1134 BEAST_EXPECT(!obj.
object.has_value());
1145 j[sfBaseAsset] =
"USD";
1147 BEAST_EXPECT(obj.
object.has_value());
1149 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1151 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1152 BEAST_EXPECT(curr.currency().size() == 20);
1158 j[sfBaseAsset] =
"EUR";
1160 BEAST_EXPECT(obj.
object.has_value());
1162 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1164 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1165 BEAST_EXPECT(curr.currency().size() == 20);
1171 j[sfBaseAsset] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1175 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1176 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1177 BEAST_EXPECT(curr.currency().size() == 20);
1184 j[sfBaseAsset] =
"USDD";
1186 BEAST_EXPECT(!obj.
object.has_value());
1192 j[sfBaseAsset] =
"usd";
1194 BEAST_EXPECT(obj.
object.has_value());
1196 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1198 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1199 BEAST_EXPECT(curr.currency().size() == 20);
1205 j[sfBaseAsset] =
"0123456789AB";
1207 BEAST_EXPECT(!obj.
object.has_value());
1213 j[sfBaseAsset] =
"0123456789ABCDEF0123456789";
1215 BEAST_EXPECT(!obj.
object.has_value());
1221 j[sfBaseAsset] =
"";
1223 BEAST_EXPECT(obj.
object.has_value());
1225 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1227 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1228 BEAST_EXPECT(curr.currency().size() == 20);
1236 BEAST_EXPECT(!obj.
object.has_value());
1244 BEAST_EXPECT(!obj.
object.has_value());
1255 j[sfAmount] =
"100000000000000000";
1257 BEAST_EXPECT(obj.
object.has_value());
1259 BEAST_EXPECT(obj.
object->isFieldPresent(sfAmount));
1261 BEAST_EXPECT(obj.
object->getFieldAmount(sfAmount) ==
STAmount(100000000000000000ull));
1267 j[sfAmount] = 4294967295u;
1269 BEAST_EXPECT(obj.
object.has_value());
1271 BEAST_EXPECT(obj.
object->isFieldPresent(sfAmount));
1273 BEAST_EXPECT(obj.
object->getFieldAmount(sfAmount) ==
STAmount(4294967295u));
1279 j[sfAmount] =
"123.45";
1281 BEAST_EXPECT(!obj.
object.has_value());
1289 BEAST_EXPECT(!obj.
object.has_value());
1295 j[sfAmount] =
"notanumber";
1297 BEAST_EXPECT(!obj.
object.has_value());
1305 BEAST_EXPECT(!obj.
object.has_value());
1318 elem[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1319 elem[
"currency"] =
"USD";
1320 elem[
"issuer"] =
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
1324 j[sfPaths] = pathset;
1326 if (BEAST_EXPECT(obj.
object.has_value()))
1329 BEAST_EXPECT(obj.
object->isFieldPresent(sfPaths));
1331 auto const& ps = obj.
object->getFieldPathSet(sfPaths);
1332 BEAST_EXPECT(!ps.empty());
1333 BEAST_EXPECT(ps.size() == 1);
1334 BEAST_EXPECT(ps[0].size() == 1);
1336 ps[0][0].getAccountID() ==
1338 BEAST_EXPECT(
to_string(ps[0][0].getCurrency()) ==
"USD");
1340 ps[0][0].getIssuerID() ==
1350 elem[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1351 elem[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1352 elem[
"issuer"] =
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
1356 j[sfPaths] = pathset;
1358 BEAST_EXPECT(obj.
object.has_value());
1360 obj.
object->isFieldPresent(sfPaths));
1362 obj.
object->getFieldPathSet(sfPaths);
1363 BEAST_EXPECT(!ps.empty());
1369 j[sfPaths] =
"notanarray";
1371 BEAST_EXPECT(!obj.
object.has_value());
1378 pathset.
append(
"notanarray");
1379 j[sfPaths] = pathset;
1381 BEAST_EXPECT(!obj.
object.has_value());
1389 path.append(
"notanobject");
1392 j[sfPaths] = pathset;
1394 BEAST_EXPECT(!obj.
object.has_value());
1403 elem[
"foo"] =
"bar";
1407 j[sfPaths] = pathset;
1409 BEAST_EXPECT(!obj.
object.has_value());
1418 elem[
"account"] =
"notAValidBase58Account";
1422 j[sfPaths] = pathset;
1424 BEAST_EXPECT(!obj.
object.has_value());
1432 elem[
"account"] = 12345;
1436 j[sfPaths] = pathset;
1438 BEAST_EXPECT(!obj.
object.has_value());
1446 elem[
"currency"] = 12345;
1450 j[sfPaths] = pathset;
1452 BEAST_EXPECT(!obj.
object.has_value());
1460 elem[
"currency"] =
"notAValidCurrency";
1464 j[sfPaths] = pathset;
1466 BEAST_EXPECT(!obj.
object.has_value());
1474 elem[
"issuer"] = 12345;
1478 j[sfPaths] = pathset;
1480 BEAST_EXPECT(!obj.
object.has_value());
1488 elem[
"issuer"] =
"notAValidBase58Account";
1492 j[sfPaths] = pathset;
1494 BEAST_EXPECT(!obj.
object.has_value());
1506 issueJson[
"currency"] =
"USD";
1507 issueJson[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1508 j[sfAsset] = issueJson;
1510 if (BEAST_EXPECT(obj.
object.has_value()))
1513 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1514 auto const& issueField =
1516 auto const issue = issueField.value().get<
Issue>();
1517 BEAST_EXPECT(issue.currency.size() == 20);
1518 BEAST_EXPECT(
to_string(issue.currency) ==
"USD");
1519 BEAST_EXPECT(issue.account.size() == 20);
1529 issueJson[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1530 issueJson[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1531 j[sfAsset] = issueJson;
1535 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1536 auto const& issueField = (*obj.
object)[sfAsset];
1537 auto const issue = issueField.value().get<
Issue>();
1538 BEAST_EXPECT(issue.currency.size() == 20);
1539 BEAST_EXPECT(issue.account.size() == 20);
1547 issueJson[
"mpt_issuance_id"] =
"0000000000000000000000004D5054494431323334234234";
1548 j[sfAsset] = issueJson;
1552 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1553 auto const& issueField = (*obj.
object)[sfAsset];
1554 auto const issue = issueField.value().get<
MPTIssue>();
1555 BEAST_EXPECT(issue.getMptID().size() == 24);
1563 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1566 BEAST_EXPECT(!obj.
object.has_value());
1573 issue[
"currency"] =
"USD";
1576 BEAST_EXPECT(!obj.
object.has_value());
1583 issue[
"currency"] =
"USDD";
1584 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1587 BEAST_EXPECT(!obj.
object.has_value());
1594 issue[
"currency"] =
"USD";
1595 issue[
"issuer"] =
"notAValidIssuer";
1598 BEAST_EXPECT(!obj.
object.has_value());
1606 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1609 BEAST_EXPECT(!obj.
object.has_value());
1616 issue[
"currency"] =
"USD";
1620 BEAST_EXPECT(!obj.
object.has_value());
1626 j[sfAsset] =
"notanobject";
1628 BEAST_EXPECT(!obj.
object.has_value());
1641 issuingChainIssue[
"currency"] =
"USD";
1642 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1644 lockingChainIssue[
"currency"] =
"EUR";
1645 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1646 bridge[
"LockingChainIssue"] = lockingChainIssue;
1647 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1648 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1649 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1650 j[sfXChainBridge] = bridge;
1654 BEAST_EXPECT(obj.
object->isFieldPresent(sfXChainBridge));
1655 auto const& bridgeField = (*obj.
object)[sfXChainBridge];
1656 BEAST_EXPECT(bridgeField->lockingChainIssue().currency.size() == 20);
1657 BEAST_EXPECT(bridgeField->issuingChainIssue().currency.size() == 20);
1666 issuingChainIssue[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1667 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1669 lockingChainIssue[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1670 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1671 bridge[
"LockingChainIssue"] = lockingChainIssue;
1672 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1673 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1674 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1675 j[sfXChainBridge] = bridge;
1679 BEAST_EXPECT(obj.
object->isFieldPresent(sfXChainBridge));
1680 auto const& bridgeField = (*obj.
object)[sfXChainBridge];
1681 BEAST_EXPECT(bridgeField->lockingChainIssue().currency.size() == 20);
1682 BEAST_EXPECT(bridgeField->issuingChainIssue().currency.size() == 20);
1691 issuingChainIssue[
"currency"] =
"USD";
1692 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1693 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1694 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1695 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1696 j[sfXChainBridge] = bridge;
1698 BEAST_EXPECT(!obj.
object.has_value());
1706 lockingChainIssue[
"currency"] =
"EUR";
1707 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1708 bridge[
"LockingChainIssue"] = lockingChainIssue;
1709 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1710 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1711 j[sfXChainBridge] = bridge;
1713 BEAST_EXPECT(!obj.
object.has_value());
1721 issuingChainIssue[
"currency"] =
"USD";
1722 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1723 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1725 lockingChainIssue[
"currency"] =
"EUR";
1726 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1727 bridge[
"LockingChainIssue"] = lockingChainIssue;
1728 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1729 j[sfXChainBridge] = bridge;
1731 BEAST_EXPECT(!obj.
object.has_value());
1739 issuingChainIssue[
"currency"] =
"USD";
1740 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1741 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1743 lockingChainIssue[
"currency"] =
"EUR";
1744 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1745 bridge[
"LockingChainIssue"] = lockingChainIssue;
1746 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1747 j[sfXChainBridge] = bridge;
1749 BEAST_EXPECT(!obj.
object.has_value());
1756 bridge[
"LockingChainIssue"] =
"notanobject";
1757 bridge[
"IssuingChainIssue"] =
"notanobject";
1758 j[sfXChainBridge] = bridge;
1760 BEAST_EXPECT(!obj.
object.has_value());
1768 asset[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1770 lockingChainIssue[
"currency"] =
"EUR";
1771 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1772 bridge[
"LockingChainIssue"] = lockingChainIssue;
1773 bridge[
"IssuingChainIssue"] = asset;
1774 j[sfXChainBridge] = bridge;
1776 BEAST_EXPECT(!obj.
object.has_value());
1784 asset[
"currency"] =
"USD";
1786 lockingChainIssue[
"currency"] =
"EUR";
1787 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1788 bridge[
"LockingChainIssue"] = lockingChainIssue;
1789 bridge[
"IssuingChainIssue"] = asset;
1790 j[sfXChainBridge] = bridge;
1792 BEAST_EXPECT(!obj.
object.has_value());
1800 asset[
"currency"] =
"USD";
1801 asset[
"issuer"] =
"notAValidBase58Account";
1803 lockingChainIssue[
"currency"] =
"EUR";
1804 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1805 bridge[
"LockingChainIssue"] = lockingChainIssue;
1806 bridge[
"IssuingChainIssue"] = asset;
1807 j[sfXChainBridge] = bridge;
1809 BEAST_EXPECT(!obj.
object.has_value());
1815 j[sfXChainBridge] =
"notanobject";
1817 BEAST_EXPECT(!obj.
object.has_value());
1828 j[sfNumber] = 12345;
1830 BEAST_EXPECT(obj.
object.has_value());
1832 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1834 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(12345, 0));
1840 j[sfNumber] = 12345u;
1842 BEAST_EXPECT(obj.
object.has_value());
1844 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1846 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(12345, 0));
1852 j[sfNumber] =
"67890";
1854 BEAST_EXPECT(obj.
object.has_value());
1856 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1858 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(67890, 0));
1866 BEAST_EXPECT(obj.
object.has_value());
1868 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1870 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(-42, 0));
1876 j[sfNumber] =
"-123";
1878 BEAST_EXPECT(obj.
object.has_value());
1880 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1882 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(-123, 0));
1888 j[sfNumber] =
"3.14159";
1892 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1893 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(314159, -5));
1900 j[sfNumber] =
"notanumber";
1902 BEAST_EXPECT(!obj.
object.has_value());
1910 BEAST_EXPECT(!obj.
object.has_value());
1918 BEAST_EXPECT(!obj.
object.has_value());
1926 BEAST_EXPECT(!obj.
object.has_value());
1938 objVal[sfTransactionResult] = 1;
1939 j[sfTransactionMetaData] = objVal;
1941 BEAST_EXPECT(obj.
object.has_value());
1943 BEAST_EXPECT(obj.
object->isFieldPresent(sfTransactionMetaData));
1945 auto const& result = obj.
object->peekFieldObject(sfTransactionMetaData);
1946 BEAST_EXPECT(result.getFieldU8(sfTransactionResult) == 1);
1952 j[sfTransactionMetaData] =
"notanobject";
1954 BEAST_EXPECT(!obj.
object.has_value());
1962 j[sfTransactionMetaData] = arr;
1964 BEAST_EXPECT(!obj.
object.has_value());
1972 BEAST_EXPECT(!obj.
object.has_value());
1981 for (
int i = 0; i < 63; ++i)
1984 (*current)[sfTransactionMetaData] = next;
1985 current = &((*current)[sfTransactionMetaData]);
1987 (*current)[sfTransactionResult.getJsonName()] = 1;
1988 j[sfTransactionMetaData] = obj;
1990 BEAST_EXPECT(parsed.
object.has_value());
1992 BEAST_EXPECT(parsed.
object->isFieldPresent(sfTransactionMetaData));
2000 for (
int i = 0; i < 64; ++i)
2003 (*current)[sfTransactionMetaData] = next;
2004 current = &((*current)[sfTransactionMetaData]);
2006 (*current)[sfTransactionResult.getJsonName()] = 1;
2007 j[sfTransactionMetaData] = obj;
2009 BEAST_EXPECT(!parsed.
object.has_value());
2022 elem[sfTransactionResult] = 2;
2024 elem2[sfTransactionMetaData] = elem;
2026 j[sfSignerEntries] = arr;
2028 BEAST_EXPECT(obj.
object.has_value());
2030 BEAST_EXPECT(obj.
object->isFieldPresent(sfSignerEntries));
2032 auto const& result = obj.
object->getFieldArray(sfSignerEntries);
2033 if (BEAST_EXPECT(result.size() == 1))
2035 BEAST_EXPECT(result[0].getFName() == sfTransactionMetaData);
2036 BEAST_EXPECT(result[0].
getJson(0) == elem);
2044 arr.
append(
"notanobject");
2045 j[sfSignerEntries] = arr;
2047 BEAST_EXPECT(!obj.
object.has_value());
2055 elem[
"invalidField"] = 1;
2057 j[sfSignerEntries] = arr;
2059 BEAST_EXPECT(!obj.
object.has_value());
2067 elem[sfTransactionResult] = 2;
2068 elem[sfNetworkID] = 3;
2070 j[sfSignerEntries] = arr;
2072 BEAST_EXPECT(!obj.
object.has_value());
2078 j[sfSignerEntries] =
"notanarray";
2080 BEAST_EXPECT(!obj.
object.has_value());
2089 elem[sfTransactionResult] =
"notanint";
2091 j[sfSignerEntries] = arr;
2093 BEAST_EXPECT(!obj.
object.has_value());
2100 j[sfSignerEntries] = arr;
2102 BEAST_EXPECT(obj.
object.has_value());
2104 BEAST_EXPECT(obj.
object->isFieldPresent(sfSignerEntries));
2112 obj[0u][sfTransactionResult] = 1;
2113 j[sfSignerEntries] = obj;
2115 BEAST_EXPECT(!parsed.
object.has_value());
2136 "\"ModifiedNode\":{\"Sequence\":1}, "
2137 "\"DeletedNode\":{\"Sequence\":1}"
2145 BEAST_EXPECT(!parsed.
object);
2162 j[sfLedgerEntry] = 1;
2167 R
"({"CloseResolution":19,"Method":250,)"
2168 R"("TransactionResult":"tecFROZEN"})");
2174 if (BEAST_EXPECT(parsed.
object))
2179 BEAST_EXPECT(serialized == goodJson);
2186 R
"({"CloseResolution":19,"Method":"250",)"
2187 R"("TransactionResult":"tecFROZEN"})");
2189 R
"({"CloseResolution":19,"Method":250,)"
2190 R"("TransactionResult":"tecFROZEN"})");
2199 if (BEAST_EXPECT(parsed.
object))
2204 BEAST_EXPECT(serialized == expectedJson);
2211 R
"({"CloseResolution":"19","Method":"250",)"
2212 R"("TransactionResult":"tecFROZEN"})");
2214 R
"({"CloseResolution":19,"Method":250,)"
2215 R"("TransactionResult":"tecFROZEN"})");
2224 if (BEAST_EXPECT(parsed.
object))
2229 BEAST_EXPECT(serialized == expectedJson);
2236 R
"({"CloseResolution":19,"Method":250,)"
2237 R"("TransactionResult":"terQUEUED"})");
2243 BEAST_EXPECT(!parsed.
object);
2244 BEAST_EXPECT(parsed.
error);
2245 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2247 parsed.
error[jss::error_message] ==
2248 "Field 'test.TransactionResult' is out of range.");
2254 R
"({"CloseResolution":19,"Method":"pony",)"
2255 R"("TransactionResult":"tesSUCCESS"})");
2261 BEAST_EXPECT(!parsed.
object);
2262 BEAST_EXPECT(parsed.
error);
2263 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2265 parsed.
error[jss::error_message] ==
"Field 'test.Method' has bad type.");
2271 R
"({"CloseResolution":19,"Method":3294967296,)"
2272 R"("TransactionResult":"tesSUCCESS"})");
2278 BEAST_EXPECT(!parsed.
object);
2279 BEAST_EXPECT(parsed.
error);
2280 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2282 parsed.
error[jss::error_message] ==
"Field 'test.Method' is out of range.");
2288 R
"({"CloseResolution":-10,"Method":42,)"
2289 R"("TransactionResult":"tesSUCCESS"})");
2295 BEAST_EXPECT(!parsed.
object);
2296 BEAST_EXPECT(parsed.
error);
2297 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2299 parsed.
error[jss::error_message] ==
2300 "Field 'test.CloseResolution' is out of range.");
2306 R
"({"CloseResolution":19,"Method":3.141592653,)"
2307 R"("TransactionResult":"tesSUCCESS"})");
2313 BEAST_EXPECT(!parsed.
object);
2314 BEAST_EXPECT(parsed.
error);
2315 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2317 parsed.
error[jss::error_message] ==
"Field 'test.Method' has bad type.");
2323 R
"({"CloseResolution":19,"Method":250,)"
2324 R"("TransferFee":"65535"})");
2326 R
"({"CloseResolution":19,"Method":250,)"
2327 R"("TransferFee":65535})");
2333 if (BEAST_EXPECT(parsed.
object))
2338 BEAST_EXPECT(serialized == expectedJson);
2345 R
"({"CloseResolution":19,"Method":250,)"
2346 R"("TransferFee":"65536"})");
2352 BEAST_EXPECT(!parsed.
object);
2353 BEAST_EXPECT(parsed.
error);
2354 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2356 parsed.
error[jss::error_message] ==
2357 "Field 'test.TransferFee' has invalid data.");
2363 R
"({"CloseResolution":19,"Method":250,)"
2364 R"("TransferFee":"Payment"})");
2370 BEAST_EXPECT(!parsed.
object);
2371 BEAST_EXPECT(parsed.
error);
2372 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2374 parsed.
error[jss::error_message] ==
2375 "Field 'test.TransferFee' has invalid data.");
2381 R
"({"CloseResolution":19,"Method":250,)"
2382 R"("TransferFee":true})");
2388 BEAST_EXPECT(!parsed.
object);
2389 BEAST_EXPECT(parsed.
error);
2390 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2392 parsed.
error[jss::error_message] ==
"Field 'test.TransferFee' has bad type.");
bool unexpected(Condition shouldBeFalse, String const &reason)
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 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.
std::string to_string(BaseUInt< Bits, Tag > const &a)
json::Value getJson(LedgerFill const &fill)
Return a new json::Value representing the ledger with given options.
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, xrpl)