21#include <test/jtx/Oracle.h>
22#include <test/jtx/attester.h>
23#include <test/jtx/delegate.h>
24#include <test/jtx/multisign.h>
25#include <test/jtx/xchain_bridge.h>
27#include <xrpl/beast/unit_test.h>
28#include <xrpl/json/json_value.h>
29#include <xrpl/protocol/AccountID.h>
30#include <xrpl/protocol/ErrorCodes.h>
31#include <xrpl/protocol/STXChainBridge.h>
32#include <xrpl/protocol/jss.h>
46 if (BEAST_EXPECT(jv.
isMember(jss::status)))
47 BEAST_EXPECT(jv[jss::status] ==
"error");
48 if (BEAST_EXPECT(jv.
isMember(jss::error)))
49 BEAST_EXPECT(jv[jss::error] == err);
54 jv[jss::error_message] ==
"");
56 else if (BEAST_EXPECT(jv.
isMember(jss::error_message)))
57 BEAST_EXPECT(jv[jss::error_message] == msg);
74 using namespace test::jtx;
77 env.fund(
XRP(10000), alice);
83 jvParams[jss::account_root] = alice.human();
84 jvParams[jss::ledger_hash] =
85 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
87 auto const jrr = env.rpc(
88 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
95 jvParams[jss::ledger_index] =
"validated";
96 jvParams[jss::index] =
97 "00000000000000000000000000000000000000000000000000000000000000"
99 auto const jrr = env.rpc(
100 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
108 testcase(
"ledger_entry Request AccountRoot");
109 using namespace test::jtx;
112 cfg->FEES.reference_fee = 10;
113 Env env{*
this, std::move(cfg)};
116 env.fund(
XRP(10000), alice);
122 Json::Value const jrr = env.rpc(
"ledger_closed")[jss::result];
123 BEAST_EXPECT(jrr[jss::ledger_hash] ==
ledgerHash);
124 BEAST_EXPECT(jrr[jss::ledger_index] == 3);
131 jvParams[jss::account_root] = alice.human();
134 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
135 BEAST_EXPECT(jrr.
isMember(jss::node));
136 BEAST_EXPECT(jrr[jss::node][jss::Account] == alice.human());
137 BEAST_EXPECT(jrr[jss::node][sfBalance.jsonName] ==
"10000000000");
138 accountRootIndex = jrr[jss::index].
asString();
141 constexpr char alicesAcctRootBinary[]{
142 "1100612200800000240000000425000000032D00000000559CE54C3B934E4"
143 "73A995B477E92EC229F99CED5B62BF4D2ACE4DC42719103AE2F6240000002"
144 "540BE4008114AE123A8556F3CF91154711376AFB0F894F832B3D"};
148 jvParams[jss::account_root] = alice.human();
149 jvParams[jss::binary] = 1;
152 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
153 BEAST_EXPECT(jrr.
isMember(jss::node_binary));
154 BEAST_EXPECT(jrr[jss::node_binary] == alicesAcctRootBinary);
159 jvParams[jss::index] = accountRootIndex;
161 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
162 BEAST_EXPECT(!jrr.
isMember(jss::node_binary));
163 BEAST_EXPECT(jrr.
isMember(jss::node));
164 BEAST_EXPECT(jrr[jss::node][jss::Account] == alice.human());
165 BEAST_EXPECT(jrr[jss::node][sfBalance.jsonName] ==
"10000000000");
170 jvParams[jss::index] = accountRootIndex;
171 jvParams[jss::binary] = 0;
173 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
174 BEAST_EXPECT(jrr.
isMember(jss::node));
175 BEAST_EXPECT(jrr[jss::node][jss::Account] == alice.human());
176 BEAST_EXPECT(jrr[jss::node][sfBalance.jsonName] ==
"10000000000");
184 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
193 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
201 testcase(
"ledger_entry Request Check");
202 using namespace test::jtx;
205 env.fund(
XRP(10000), alice);
208 auto const checkId =
keylet::check(env.master, env.seq(env.master));
217 jvParams[jss::check] =
to_string(checkId.key);
220 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
222 jrr[jss::node][sfLedgerEntryType.jsonName] == jss::Check);
223 BEAST_EXPECT(jrr[jss::node][sfSendMax.jsonName] ==
"100000000");
231 jvParams[jss::account_root] = alice.human();
233 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
234 accountRootIndex = jrr[jss::index].
asString();
237 jvParams[jss::check] = accountRootIndex;
240 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
248 testcase(
"ledger_entry credentials");
250 using namespace test::jtx;
253 Account const issuer{
"issuer"};
256 char const credType[] =
"abcde";
258 env.
fund(
XRP(5000), issuer, alice, bob);
269 jv.isObject() && jv.isMember(jss::result) &&
270 !jv[jss::result].isMember(jss::error) &&
271 jv[jss::result].isMember(jss::node) &&
272 jv[jss::result][jss::node].isMember(
273 sfLedgerEntryType.jsonName) &&
274 jv[jss::result][jss::node][sfLedgerEntryType.jsonName] ==
277 std::string const credIdx = jv[jss::result][jss::index].asString();
281 jv.isObject() && jv.isMember(jss::result) &&
282 !jv[jss::result].isMember(jss::error) &&
283 jv[jss::result].isMember(jss::node) &&
284 jv[jss::result][jss::node].isMember(
285 sfLedgerEntryType.jsonName) &&
286 jv[jss::result][jss::node][sfLedgerEntryType.jsonName] ==
300 "48004829F915654A81B11C4AB8218D96FED67F209B58328A72314FB6EA288B"
308 jv[jss::ledger_index] = jss::validated;
309 jv[jss::credential][jss::subject] = 42;
310 jv[jss::credential][jss::issuer] = issuer.human();
311 jv[jss::credential][jss::credential_type] =
313 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
320 jv[jss::ledger_index] = jss::validated;
321 jv[jss::credential][jss::subject] = alice.human();
322 jv[jss::credential][jss::issuer] = 42;
323 jv[jss::credential][jss::credential_type] =
325 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
332 jv[jss::ledger_index] = jss::validated;
333 jv[jss::credential][jss::subject] = alice.human();
334 jv[jss::credential][jss::issuer] = issuer.human();
335 jv[jss::credential][jss::credential_type] = 42;
336 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
343 jv[jss::ledger_index] = jss::validated;
344 jv[jss::credential][jss::subject] =
"";
345 jv[jss::credential][jss::issuer] = issuer.human();
346 jv[jss::credential][jss::credential_type] =
348 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
355 jv[jss::ledger_index] = jss::validated;
356 jv[jss::credential][jss::subject] = alice.human();
357 jv[jss::credential][jss::issuer] =
"";
358 jv[jss::credential][jss::credential_type] =
360 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
367 jv[jss::ledger_index] = jss::validated;
368 jv[jss::credential][jss::subject] = alice.human();
369 jv[jss::credential][jss::issuer] = issuer.human();
370 jv[jss::credential][jss::credential_type] =
"";
371 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
378 jv[jss::ledger_index] = jss::validated;
379 jv[jss::credential][jss::issuer] = issuer.human();
380 jv[jss::credential][jss::credential_type] =
382 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
389 jv[jss::ledger_index] = jss::validated;
390 jv[jss::credential][jss::subject] = alice.human();
391 jv[jss::credential][jss::credential_type] =
393 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
400 jv[jss::ledger_index] = jss::validated;
401 jv[jss::credential][jss::subject] = alice.human();
402 jv[jss::credential][jss::issuer] = issuer.human();
403 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
410 jv[jss::ledger_index] = jss::validated;
411 jv[jss::credential][jss::subject] =
"wehsdbvasbdfvj";
412 jv[jss::credential][jss::issuer] = issuer.human();
413 jv[jss::credential][jss::credential_type] =
415 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
422 jv[jss::ledger_index] = jss::validated;
423 jv[jss::credential][jss::subject] = alice.human();
424 jv[jss::credential][jss::issuer] =
"c4p93ugndfbsiu";
425 jv[jss::credential][jss::credential_type] =
427 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
434 jv[jss::ledger_index] = jss::validated;
435 jv[jss::credential][jss::subject] = alice.human();
436 jv[jss::credential][jss::issuer] = issuer.human();
437 jv[jss::credential][jss::credential_type] =
"12KK";
438 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(jv));
448 using namespace test::jtx;
453 env.fund(
XRP(10000), alice, bob);
462 jvParams[jss::delegate][jss::account] = alice.human();
463 jvParams[jss::delegate][jss::authorize] = bob.human();
466 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
468 jrr[jss::node][sfLedgerEntryType.jsonName] == jss::Delegate);
469 BEAST_EXPECT(jrr[jss::node][sfAccount.jsonName] == alice.human());
470 BEAST_EXPECT(jrr[jss::node][sfAuthorize.jsonName] == bob.human());
471 delegateIndex = jrr[jss::node][jss::index].
asString();
476 jvParams[jss::delegate] = delegateIndex;
479 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
481 jrr[jss::node][sfLedgerEntryType.jsonName] == jss::Delegate);
482 BEAST_EXPECT(jrr[jss::node][sfAccount.jsonName] == alice.human());
483 BEAST_EXPECT(jrr[jss::node][sfAuthorize.jsonName] == bob.human());
488 jvParams[jss::delegate] = 5;
491 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
497 jvParams[jss::delegate] =
"0123456789ABCDEFG";
500 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
506 jvParams[jss::delegate][jss::account] = 5;
507 jvParams[jss::delegate][jss::authorize] = bob.human();
510 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
516 jvParams[jss::delegate][jss::account] = alice.human();
517 jvParams[jss::delegate][jss::authorize] = 5;
520 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
525 auto testMalformedAccount =
532 jvParams[jss::delegate][jss::account] = *account;
534 jvParams[jss::delegate][jss::authorize] = *authorize;
535 auto const jrr = env.rpc(
542 testMalformedAccount(
std::nullopt, bob.human(),
"malformedRequest");
544 testMalformedAccount(
547 testMalformedAccount(
"-", bob.human(),
"malformedAddress");
549 testMalformedAccount(alice.human(),
"-",
"malformedAddress");
556 testcase(
"ledger_entry Deposit Preauth");
558 using namespace test::jtx;
564 env.fund(
XRP(10000), alice, becky);
575 jvParams[jss::deposit_preauth][jss::owner] = alice.human();
576 jvParams[jss::deposit_preauth][jss::authorized] = becky.human();
579 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
582 jrr[jss::node][sfLedgerEntryType.jsonName] ==
583 jss::DepositPreauth);
584 BEAST_EXPECT(jrr[jss::node][sfAccount.jsonName] == alice.human());
585 BEAST_EXPECT(jrr[jss::node][sfAuthorize.jsonName] == becky.human());
586 depositPreauthIndex = jrr[jss::node][jss::index].
asString();
591 jvParams[jss::deposit_preauth] = depositPreauthIndex;
594 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
597 jrr[jss::node][sfLedgerEntryType.jsonName] ==
598 jss::DepositPreauth);
599 BEAST_EXPECT(jrr[jss::node][sfAccount.jsonName] == alice.human());
600 BEAST_EXPECT(jrr[jss::node][sfAuthorize.jsonName] == becky.human());
605 jvParams[jss::deposit_preauth] = -5;
608 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
614 jvParams[jss::deposit_preauth] =
"0123456789ABCDEFG";
617 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
623 jvParams[jss::deposit_preauth][jss::authorized] = becky.human();
626 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
632 jvParams[jss::deposit_preauth][jss::owner] = 7;
633 jvParams[jss::deposit_preauth][jss::authorized] = becky.human();
636 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
642 jvParams[jss::deposit_preauth][jss::owner] = alice.human();
645 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
651 jvParams[jss::deposit_preauth][jss::owner] = alice.human();
652 jvParams[jss::deposit_preauth][jss::authorized] = 47;
655 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
661 jvParams[jss::deposit_preauth][jss::owner] =
662 "rP6P9ypfAmc!pw8SZHNwM4nvZHFXDraQas";
664 jvParams[jss::deposit_preauth][jss::authorized] = becky.human();
667 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
673 jvParams[jss::deposit_preauth][jss::owner] = alice.human();
674 jvParams[jss::deposit_preauth][jss::authorized] =
675 "rP6P9ypfAmc!pw8SZHNwM4nvZHFXDraQas";
679 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
687 testcase(
"ledger_entry Deposit Preauth with credentials");
689 using namespace test::jtx;
692 Account const issuer{
"issuer"};
695 char const credType[] =
"abcde";
697 env.
fund(
XRP(5000), issuer, alice, bob);
711 jvParams[jss::ledger_index] = jss::validated;
712 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
714 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
717 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
720 jo[jss::issuer] = issuer.human();
722 arr.append(std::move(jo));
727 jrr.isObject() && jrr.isMember(jss::result) &&
728 !jrr[jss::result].isMember(jss::error) &&
729 jrr[jss::result].isMember(jss::node) &&
730 jrr[jss::result][jss::node].isMember(
731 sfLedgerEntryType.jsonName) &&
732 jrr[jss::result][jss::node][sfLedgerEntryType.jsonName] ==
733 jss::DepositPreauth);
739 jvParams[jss::ledger_index] = jss::validated;
740 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
742 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
745 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
750 arr.append(std::move(jo));
754 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
760 jvParams[jss::ledger_index] = jss::validated;
761 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
763 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
766 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
769 jo[jss::issuer] = issuer.human();
772 arr.append(std::move(jo));
776 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
782 jvParams[jss::ledger_index] = jss::validated;
783 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
785 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
788 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
791 jo[jss::issuer] = issuer.human();
792 jo[jss::credential_type] =
"";
793 arr.
append(std::move(jo));
798 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
804 jvParams[jss::ledger_index] = jss::validated;
805 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
806 jvParams[jss::deposit_preauth][jss::authorized] = alice.human();
808 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
811 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
814 jo[jss::issuer] = issuer.human();
816 arr.append(std::move(jo));
826 jvParams[jss::ledger_index] = jss::validated;
827 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
828 jvParams[jss::deposit_preauth][jss::authorized_credentials] = 42;
838 jvParams[jss::ledger_index] = jss::validated;
839 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
840 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
843 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
844 arr.append(
"foobar");
849 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
855 jvParams[jss::ledger_index] = jss::validated;
856 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
857 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
860 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
863 arr.
append(std::move(payload));
868 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
874 jvParams[jss::ledger_index] = jss::validated;
875 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
876 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
882 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
899 sizeof(credTypes) /
sizeof(credTypes[0]) >
903 jvParams[jss::ledger_index] = jss::validated;
904 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
905 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
909 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
911 for (
unsigned i = 0; i <
sizeof(credTypes) /
sizeof(credTypes[0]);
915 jo[jss::issuer] = issuer.human();
916 jo[jss::credential_type] =
918 arr.append(std::move(jo));
924 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
930 jvParams[jss::ledger_index] = jss::validated;
931 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
933 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
936 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
940 arr.append(std::move(jo));
945 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
951 jvParams[jss::ledger_index] = jss::validated;
952 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
954 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
957 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
960 jo[jss::issuer] = 42;
962 arr.append(std::move(jo));
967 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
973 jvParams[jss::ledger_index] = jss::validated;
974 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
976 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
979 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
984 jo[jss::issuer] = std::move(payload);
986 arr.append(std::move(jo));
991 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
997 jvParams[jss::ledger_index] = jss::validated;
998 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1000 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1003 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1006 jo[jss::issuer] =
"invalid_account";
1008 arr.append(std::move(jo));
1013 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
1019 jvParams[jss::ledger_index] = jss::validated;
1020 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1022 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1025 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1028 jo[jss::issuer] = issuer.human();
1029 arr.
append(std::move(jo));
1034 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
1040 jvParams[jss::ledger_index] = jss::validated;
1041 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1043 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1046 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1049 jo[jss::issuer] = issuer.human();
1050 jo[jss::credential_type] = 42;
1051 arr.
append(std::move(jo));
1056 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
1062 jvParams[jss::ledger_index] = jss::validated;
1063 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1065 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1068 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1071 jo[jss::issuer] = issuer.human();
1074 jo[jss::credential_type] = std::move(payload);
1075 arr.append(std::move(jo));
1080 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
1086 jvParams[jss::ledger_index] = jss::validated;
1087 jvParams[jss::deposit_preauth][jss::owner] = bob.human();
1089 jvParams[jss::deposit_preauth][jss::authorized_credentials] =
1092 jvParams[jss::deposit_preauth][jss::authorized_credentials]);
1095 jo[jss::issuer] = issuer.human();
1096 jo[jss::credential_type] =
"12KK";
1097 arr.
append(std::move(jo));
1102 jrr[jss::result],
"malformedAuthorizedCredentials",
"");
1109 testcase(
"ledger_entry Request Directory");
1110 using namespace test::jtx;
1114 auto const USD = gw[
"USD"];
1115 env.fund(
XRP(10000), alice, gw);
1118 env.trust(USD(1000), alice);
1123 for (
int d = 1'000'032; d >= 1'000'000; --d)
1132 Json::Value const jrr = env.rpc(
"ledger_closed")[jss::result];
1133 BEAST_EXPECT(jrr[jss::ledger_hash] ==
ledgerHash);
1134 BEAST_EXPECT(jrr[jss::ledger_index] == 5);
1138 "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D";
1142 jvParams[jss::directory] = dirRootIndex;
1145 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1146 BEAST_EXPECT(jrr[jss::node][sfIndexes.jsonName].
size() == 32);
1152 jvParams[jss::directory][jss::dir_root] = dirRootIndex;
1154 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1155 BEAST_EXPECT(jrr[jss::index] == dirRootIndex);
1161 jvParams[jss::directory][jss::owner] = alice.human();
1164 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1165 BEAST_EXPECT(jrr[jss::index] == dirRootIndex);
1171 jvParams[jss::directory][jss::dir_root] = dirRootIndex;
1172 jvParams[jss::directory][jss::sub_index] = 1;
1174 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1175 BEAST_EXPECT(jrr[jss::index] != dirRootIndex);
1176 BEAST_EXPECT(jrr[jss::node][sfIndexes.jsonName].
size() == 2);
1182 jvParams[jss::directory][jss::owner] = alice.human();
1183 jvParams[jss::directory][jss::sub_index] = 1;
1186 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1187 BEAST_EXPECT(jrr[jss::index] != dirRootIndex);
1188 BEAST_EXPECT(jrr[jss::node][sfIndexes.jsonName].
size() == 2);
1196 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1203 jvParams[jss::directory][jss::dir_root] = dirRootIndex;
1204 jvParams[jss::directory][jss::sub_index] = 1.5;
1207 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1216 jvParams[jss::directory][jss::owner] = badAddress;
1219 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1226 jvParams[jss::directory][jss::owner] = alice.human();
1227 jvParams[jss::directory][jss::dir_root] = dirRootIndex;
1230 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1237 jvParams[jss::directory][jss::sub_index] = 1;
1240 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1248 testcase(
"ledger_entry Request Escrow");
1249 using namespace test::jtx;
1252 env.fund(
XRP(10000), alice);
1261 jv[jss::TransactionType] = jss::EscrowCreate;
1262 jv[jss::Account] = account.human();
1263 jv[jss::Destination] = to.human();
1265 jv[sfFinishAfter.jsonName] =
1266 cancelAfter.time_since_epoch().count() + 2;
1270 using namespace std::chrono_literals;
1271 env(escrowCreate(alice, alice,
XRP(333), env.now() + 2s));
1280 jvParams[jss::escrow][jss::owner] = alice.human();
1281 jvParams[jss::escrow][jss::seq] = env.seq(alice) - 1;
1283 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1285 jrr[jss::node][jss::Amount] ==
XRP(333).value().getText());
1286 escrowIndex = jrr[jss::index].
asString();
1291 jvParams[jss::escrow] = escrowIndex;
1294 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1296 jrr[jss::node][jss::Amount] ==
XRP(333).value().getText());
1304 jvParams[jss::escrow][jss::owner] = badAddress;
1305 jvParams[jss::escrow][jss::seq] = env.seq(alice) - 1;
1308 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1315 jvParams[jss::escrow][jss::seq] = env.seq(alice) - 1;
1318 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1325 jvParams[jss::escrow][jss::owner] = alice.human();
1328 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1335 jvParams[jss::escrow][jss::owner] = alice.human();
1336 jvParams[jss::escrow][jss::seq] =
1340 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1348 testcase(
"ledger_entry Request Offer");
1349 using namespace test::jtx;
1353 auto const USD = gw[
"USD"];
1354 env.fund(
XRP(10000), alice, gw);
1357 env(
offer(alice, USD(321),
XRP(322)));
1366 jvParams[jss::offer][jss::account] = alice.human();
1367 jvParams[jss::offer][jss::seq] = env.seq(alice) - 1;
1370 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1371 BEAST_EXPECT(jrr[jss::node][jss::TakerGets] ==
"322000000");
1372 offerIndex = jrr[jss::index].
asString();
1377 jvParams[jss::offer] = offerIndex;
1379 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1380 BEAST_EXPECT(jrr[jss::node][jss::TakerGets] ==
"322000000");
1388 jvParams[jss::offer][jss::account] = badAddress;
1389 jvParams[jss::offer][jss::seq] = env.seq(alice) - 1;
1392 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1399 jvParams[jss::offer][jss::seq] = env.seq(alice) - 1;
1402 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1409 jvParams[jss::offer][jss::account] = alice.human();
1412 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1419 jvParams[jss::offer][jss::account] = alice.human();
1420 jvParams[jss::offer][jss::seq] =
std::to_string(env.seq(alice) - 1);
1423 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1431 testcase(
"ledger_entry Request Pay Chan");
1432 using namespace test::jtx;
1437 env.fund(
XRP(10000), alice);
1447 jv[jss::TransactionType] = jss::PaymentChannelCreate;
1448 jv[jss::Account] = account.human();
1449 jv[jss::Destination] = to.human();
1451 jv[sfSettleDelay.jsonName] = settleDelay.count();
1452 jv[sfPublicKey.jsonName] =
strHex(pk.slice());
1456 env(payChanCreate(alice, env.master,
XRP(57), 18s, alice.pk()));
1466 jvParams[jss::payment_channel] =
to_string(payChanIndex);
1469 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1470 BEAST_EXPECT(jrr[jss::node][sfAmount.jsonName] ==
"57000000");
1471 BEAST_EXPECT(jrr[jss::node][sfBalance.jsonName] ==
"0");
1472 BEAST_EXPECT(jrr[jss::node][sfSettleDelay.jsonName] == 18);
1480 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1488 testcase(
"ledger_entry Request RippleState");
1489 using namespace test::jtx;
1493 auto const USD = gw[
"USD"];
1494 env.fund(
XRP(10000), alice, gw);
1497 env.trust(USD(999), alice);
1500 env(
pay(gw, alice, USD(97)));
1504 for (
auto const& fieldName : {jss::ripple_state, jss::state})
1512 jvParams[fieldName][jss::accounts][0u] = alice.human();
1513 jvParams[fieldName][jss::accounts][1u] = gw.human();
1514 jvParams[fieldName][jss::currency] =
"USD";
1517 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1519 jrr[jss::node][sfBalance.jsonName][jss::value] ==
"-97");
1521 jrr[jss::node][sfHighLimit.jsonName][jss::value] ==
"999");
1526 jvParams[fieldName] =
"ripple_state";
1529 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1537 jvParams[fieldName][jss::accounts][0u] = alice.human();
1538 jvParams[fieldName][jss::accounts][1u] = gw.human();
1541 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1548 jvParams[fieldName][jss::accounts] = 2;
1549 jvParams[fieldName][jss::currency] =
"USD";
1552 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1560 jvParams[fieldName][jss::accounts][0u] = alice.human();
1561 jvParams[fieldName][jss::currency] =
"USD";
1564 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1572 jvParams[fieldName][jss::accounts][0u] = alice.human();
1573 jvParams[fieldName][jss::accounts][1u] = gw.human();
1574 jvParams[fieldName][jss::accounts][2u] = alice.human();
1575 jvParams[fieldName][jss::currency] =
"USD";
1578 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1586 jvParams[fieldName][jss::accounts][0u] = 44;
1587 jvParams[fieldName][jss::accounts][1u] = gw.human();
1588 jvParams[fieldName][jss::currency] =
"USD";
1591 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1599 jvParams[fieldName][jss::accounts][0u] = alice.human();
1600 jvParams[fieldName][jss::accounts][1u] = 21;
1601 jvParams[fieldName][jss::currency] =
"USD";
1604 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1612 jvParams[fieldName][jss::accounts][0u] = alice.human();
1613 jvParams[fieldName][jss::accounts][1u] = alice.human();
1614 jvParams[fieldName][jss::currency] =
"USD";
1617 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1625 jvParams[fieldName][jss::accounts][0u] =
1627 jvParams[fieldName][jss::accounts][1u] = gw.human();
1628 jvParams[fieldName][jss::currency] =
"USD";
1631 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1639 jvParams[fieldName][jss::accounts][0u] = alice.human();
1640 jvParams[fieldName][jss::accounts][1u] =
1642 jvParams[fieldName][jss::currency] =
"USD";
1645 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1653 jvParams[fieldName][jss::accounts][0u] = alice.human();
1654 jvParams[fieldName][jss::accounts][1u] = gw.human();
1655 jvParams[fieldName][jss::currency] =
"USDollars";
1658 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1667 testcase(
"ledger_entry Request Ticket");
1668 using namespace test::jtx;
1684 jvParams[jss::ticket] =
1688 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1697 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1699 jrr[jss::node][sfLedgerEntryType.jsonName] == jss::Ticket);
1700 BEAST_EXPECT(jrr[jss::node][sfTicketSequence.jsonName] == tkt1);
1706 jvParams[jss::ticket][jss::account] = env.master.human();
1707 jvParams[jss::ticket][jss::ticket_seq] = tkt1 + 1;
1710 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1712 jrr[jss::node][jss::index] ==
1719 jvParams[jss::ticket][jss::account] = env.master.human();
1720 jvParams[jss::ticket][jss::ticket_seq] = tkt1 + 2;
1723 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1732 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1741 jvParams[jss::ticket][jss::account] = badAddress;
1742 jvParams[jss::ticket][jss::ticket_seq] = env.seq(env.master) - 1;
1745 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1752 jvParams[jss::ticket][jss::ticket_seq] = env.seq(env.master) - 1;
1755 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1762 jvParams[jss::ticket][jss::account] = env.master.human();
1765 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1772 jvParams[jss::ticket][jss::account] = env.master.human();
1773 jvParams[jss::ticket][jss::ticket_seq] =
1777 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1785 testcase(
"ledger_entry Request DID");
1786 using namespace test::jtx;
1791 env.fund(
XRP(10000), alice);
1797 jv[jss::TransactionType] = jss::DIDSet;
1798 jv[jss::Account] = account.human();
1804 env(didCreate(alice));
1812 jvParams[jss::did] = alice.human();
1815 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1817 jrr[jss::node][sfDIDDocument.jsonName] ==
1825 jvParams[jss::did] = env.master.human();
1828 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1837 "ledger_entry Request With Invalid Parameters v" +
1839 using namespace test::jtx;
1846 params[jss::api_version] = apiVersion;
1852 auto const jvParams =
1858 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1860 if (apiVersion < 2u)
1867 obj[jss::account] =
"rhigTLJJyXXSRUyRCQtqi1NoAZZzZnS4KU";
1868 obj[jss::ledger_index] =
"validated";
1873 arr[0u] =
"rhigTLJJyXXSRUyRCQtqi1NoAZZzZnS4KU";
1874 arr[1u] =
"validated";
1880 for (
auto const& field :
1881 {jss::directory, jss::escrow, jss::offer, jss::ticket, jss::amm})
1883 auto const jvParams =
1884 makeParams([&field, &injectArray](
Json::Value& jvParams) {
1885 jvParams[field] = injectArray;
1889 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1891 if (apiVersion < 2u)
1897 for (
auto const& field :
1898 {jss::directory, jss::escrow, jss::offer, jss::ticket, jss::amm})
1900 auto const jvParams =
1901 makeParams([&field, &injectObject](
Json::Value& jvParams) {
1902 jvParams[field] = injectObject;
1906 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1911 for (
auto const& inject : {injectObject, injectArray})
1914 for (
auto const& field :
1918 jss::payment_channel})
1920 auto const jvParams =
1921 makeParams([&field, &inject](
Json::Value& jvParams) {
1922 jvParams[field] = inject;
1926 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1928 if (apiVersion < 2u)
1934 for (
auto const& field : {jss::dir_root, jss::owner})
1936 auto const jvParams =
1937 makeParams([&field, &inject](
Json::Value& jvParams) {
1938 jvParams[jss::directory][field] = inject;
1942 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1944 if (apiVersion < 2u)
1951 auto const jvParams =
1953 jvParams[jss::escrow][jss::owner] = inject;
1954 jvParams[jss::escrow][jss::seq] = 99;
1958 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1960 if (apiVersion < 2u)
1967 auto const jvParams =
1969 jvParams[jss::offer][jss::account] = inject;
1970 jvParams[jss::offer][jss::seq] = 99;
1974 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1976 if (apiVersion < 2u)
1983 auto const jvParams =
1986 rs[jss::currency] =
"FOO";
1988 rs[jss::accounts][0u] =
1989 "rhigTLJJyXXSRUyRCQtqi1NoAZZzZnS4KU";
1990 rs[jss::accounts][1u] =
1991 "rKssEq6pg1KbqEqAFnua5mFAL6Ggpsh2wv";
1992 rs[jss::currency] = inject;
1993 jvParams[jss::ripple_state] = std::move(rs);
1997 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1999 if (apiVersion < 2u)
2006 auto const jvParams =
2008 jvParams[jss::ticket][jss::account] = inject;
2009 jvParams[jss::ticket][jss::ticket_seq] = 99;
2013 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2015 if (apiVersion < 2u)
2022 for (
auto const& field : {jss::nft_page, jss::deposit_preauth})
2024 auto const jvParams =
2025 makeParams([&field, &inject](
Json::Value& jvParams) {
2026 jvParams[field] = inject;
2030 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2036 for (
auto const& field : {jss::owner, jss::authorized})
2038 auto const jvParams =
2039 makeParams([&field, &inject](
Json::Value& jvParams) {
2041 pa[jss::owner] =
"rhigTLJJyXXSRUyRCQtqi1NoAZZzZnS4KU";
2042 pa[jss::authorized] =
2043 "rKssEq6pg1KbqEqAFnua5mFAL6Ggpsh2wv";
2045 jvParams[jss::deposit_preauth] = std::move(pa);
2049 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2059 testcase(
"Invalid Oracle Ledger Entry");
2069 .fee =
static_cast<int>(env.
current()->fees().base.drops())});
2072 auto res = Oracle::ledgerEntry(env, owner, NoneTag);
2073 BEAST_EXPECT(res[jss::error].asString() ==
"invalidParams");
2077 auto const res = Oracle::ledgerEntry(env, owner, v);
2078 BEAST_EXPECT(res[jss::error].asString() ==
"malformedDocumentID");
2082 BEAST_EXPECT(res[jss::error].asString() ==
"malformedRequest");
2086 BEAST_EXPECT(res[jss::error].asString() ==
"malformedRequest");
2090 malfAccount.
replace(10, 1, 1,
'!');
2091 res = Oracle::ledgerEntry(env, malfAccount, 1);
2092 BEAST_EXPECT(res[jss::error].asString() ==
"malformedAddress");
2103 auto const baseFee =
2104 static_cast<int>(env.
current()->fees().base.drops());
2107 for (
int i = 0; i < 10; ++i)
2113 env, {.owner = owner, .documentID = i, .fee = baseFee});
2118 env, {.owner = owner, .documentID = i + 10, .fee = baseFee});
2120 oracles.
push_back(oracle1.documentID());
2122 for (
int i = 0; i < accounts.
size(); ++i)
2124 auto const jv = [&]() {
2127 return Oracle::ledgerEntry(env, accounts[i], oracles[i]);
2129 return Oracle::ledgerEntry(
2135 jv[jss::node][jss::Owner] ==
to_string(accounts[i]));
2147 testcase(
"ledger_entry Request MPT");
2148 using namespace test::jtx;
2154 MPTTester mptAlice(env, alice, {.holders = {bob}});
2161 mptAlice.authorize({.account = bob, .holderCount = 1});
2166 "00000193B9DDCAF401B5B3B26875986043F82CD0D13B4315";
2170 jvParams[jss::mpt_issuance] =
strHex(mptAlice.issuanceID());
2173 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2175 jrr[jss::node][sfMPTokenMetadata.jsonName] ==
2178 jrr[jss::node][jss::mpt_issuance_id] ==
2179 strHex(mptAlice.issuanceID()));
2184 jvParams[jss::mpt_issuance] = badMptID;
2187 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2194 jvParams[jss::mptoken][jss::account] = bob.
human();
2195 jvParams[jss::mptoken][jss::mpt_issuance_id] =
2196 strHex(mptAlice.issuanceID());
2199 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2201 jrr[jss::node][sfMPTokenIssuanceID.jsonName] ==
2202 strHex(mptAlice.issuanceID()));
2208 jvParams[jss::mptoken][jss::account] = bob.
human();
2209 jvParams[jss::mptoken][jss::mpt_issuance_id] = badMptID;
2212 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2220 testcase(
"ledger_entry PermissionedDomain");
2222 using namespace test::jtx;
2225 Account const issuer{
"issuer"};
2229 env.
fund(
XRP(5000), issuer, alice, bob);
2232 auto const seq = env.
seq(alice);
2236 if (!BEAST_EXPECT(objects.size() == 1))
2242 params[jss::ledger_index] = jss::validated;
2243 params[jss::permissioned_domain][jss::account] = alice.human();
2244 params[jss::permissioned_domain][jss::seq] =
seq;
2245 auto jv = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2247 jv.isObject() && jv.isMember(jss::result) &&
2248 !jv[jss::result].isMember(jss::error) &&
2249 jv[jss::result].isMember(jss::node) &&
2250 jv[jss::result][jss::node].isMember(
2251 sfLedgerEntryType.jsonName) &&
2252 jv[jss::result][jss::node][sfLedgerEntryType.jsonName] ==
2253 jss::PermissionedDomain);
2255 std::string const pdIdx = jv[jss::result][jss::index].asString();
2260 params[jss::ledger_index] = jss::validated;
2261 params[jss::permissioned_domain] = pdIdx;
2262 jv = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2264 jv.isObject() && jv.isMember(jss::result) &&
2265 !jv[jss::result].isMember(jss::error) &&
2266 jv[jss::result].isMember(jss::node) &&
2267 jv[jss::result][jss::node].isMember(
2268 sfLedgerEntryType.jsonName) &&
2269 jv[jss::result][jss::node][sfLedgerEntryType.jsonName] ==
2270 jss::PermissionedDomain);
2276 params[jss::ledger_index] = jss::validated;
2277 params[jss::permissioned_domain] =
2278 "12F1F1F1F180D67377B2FAB292A31C922470326268D2B9B74CD1E582645B9A"
2280 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2287 params[jss::ledger_index] = jss::validated;
2288 params[jss::permissioned_domain] =
"NotAHexString";
2289 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2296 params[jss::ledger_index] = jss::validated;
2297 params[jss::permissioned_domain] = 10;
2298 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2305 params[jss::ledger_index] = jss::validated;
2306 params[jss::permissioned_domain][jss::account] = 1;
2307 params[jss::permissioned_domain][jss::seq] =
seq;
2308 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2315 params[jss::ledger_index] = jss::validated;
2316 params[jss::permissioned_domain][jss::account] =
2318 params[jss::permissioned_domain][jss::seq] =
seq;
2319 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2326 params[jss::ledger_index] = jss::validated;
2327 params[jss::permissioned_domain][jss::account] =
"";
2328 params[jss::permissioned_domain][jss::seq] =
seq;
2329 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2336 params[jss::ledger_index] = jss::validated;
2337 params[jss::permissioned_domain][jss::account] = alice.human();
2338 params[jss::permissioned_domain][jss::seq] =
"12g";
2339 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2347 testcase(
"ledger_entry command-line");
2348 using namespace test::jtx;
2352 env.fund(
XRP(10000), alice);
2355 auto const checkId =
keylet::check(env.master, env.seq(env.master));
2364 env.rpc(
"ledger_entry",
to_string(checkId.key))[jss::result];
2366 jrr[jss::node][sfLedgerEntryType.jsonName] == jss::Check);
2367 BEAST_EXPECT(jrr[jss::node][sfSendMax.jsonName] ==
"100000000");
2409 if (BEAST_EXPECT(jv.
isMember(jss::status)))
2410 BEAST_EXPECT(jv[jss::status] ==
"error");
2411 if (BEAST_EXPECT(jv.
isMember(jss::error)))
2412 BEAST_EXPECT(jv[jss::error] == err);
2417 jv[jss::error_message] ==
"");
2419 else if (BEAST_EXPECT(jv.
isMember(jss::error_message)))
2420 BEAST_EXPECT(jv[jss::error_message] == msg);
2427 using namespace test::jtx;
2441 jvParams[jss::bridge] =
jvb;
2443 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2445 BEAST_EXPECT(jrr.
isMember(jss::node));
2446 auto r = jrr[jss::node];
2449 BEAST_EXPECT(r.isMember(jss::Account));
2452 BEAST_EXPECT(r.isMember(jss::Flags));
2454 BEAST_EXPECT(r.isMember(sfLedgerEntryType.jsonName));
2455 BEAST_EXPECT(r[sfLedgerEntryType.jsonName] == jss::Bridge);
2458 BEAST_EXPECT(r.isMember(sfXChainAccountCreateCount.jsonName));
2459 BEAST_EXPECT(r[sfXChainAccountCreateCount.jsonName].asInt() == 0);
2462 BEAST_EXPECT(r.isMember(sfXChainAccountClaimCount.jsonName));
2463 BEAST_EXPECT(r[sfXChainAccountClaimCount.jsonName].asInt() == 0);
2465 BEAST_EXPECT(r.isMember(jss::index));
2466 bridge_index = r[jss::index].asString();
2472 jvParams[jss::index] = bridge_index;
2474 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2476 BEAST_EXPECT(jrr.
isMember(jss::node));
2477 BEAST_EXPECT(jrr[jss::node] == mcBridge);
2484 jvParams[jss::bridge] =
jvb;
2487 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2502 jvParams[jss::bridge] =
jvb;
2505 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2507 BEAST_EXPECT(jrr.
isMember(jss::node));
2508 auto r = jrr[jss::node];
2511 BEAST_EXPECT(r.isMember(sfXChainClaimID.jsonName));
2512 BEAST_EXPECT(r[sfXChainClaimID.jsonName].asInt() == 2);
2519 testcase(
"ledger_entry: xchain_claim_id");
2520 using namespace test::jtx;
2537 jvParams[jss::xchain_owned_claim_id][jss::xchain_owned_claim_id] =
2541 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2543 BEAST_EXPECT(jrr.
isMember(jss::node));
2544 auto r = jrr[jss::node];
2547 BEAST_EXPECT(r.isMember(jss::Account));
2550 r[sfLedgerEntryType.jsonName] == jss::XChainOwnedClaimID);
2551 BEAST_EXPECT(r[sfXChainClaimID.jsonName].asInt() == 1);
2552 BEAST_EXPECT(r[sfOwnerNode.jsonName].asInt() == 0);
2559 jvParams[jss::xchain_owned_claim_id][jss::xchain_owned_claim_id] =
2562 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2564 BEAST_EXPECT(jrr.
isMember(jss::node));
2565 auto r = jrr[jss::node];
2568 BEAST_EXPECT(r.isMember(jss::Account));
2569 BEAST_EXPECT(r[jss::Account] ==
scBob.
human());
2571 r[sfLedgerEntryType.jsonName] == jss::XChainOwnedClaimID);
2572 BEAST_EXPECT(r[sfXChainClaimID.jsonName].asInt() == 2);
2573 BEAST_EXPECT(r[sfOwnerNode.jsonName].asInt() == 0);
2580 testcase(
"ledger_entry: xchain_create_account_claim_id");
2581 using namespace test::jtx;
2592 auto const amt =
XRP(1000);
2599 size_t constexpr num_attest = 3;
2612 for (
size_t i = 0; i < num_attest; ++i)
2614 scEnv(attestations[i]);
2621 jvParams[jss::xchain_owned_create_account_claim_id] =
2623 jvParams[jss::xchain_owned_create_account_claim_id]
2624 [jss::xchain_owned_create_account_claim_id] = 1;
2627 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2630 BEAST_EXPECT(jrr.
isMember(jss::node));
2631 auto r = jrr[jss::node];
2633 BEAST_EXPECT(r.isMember(jss::Account));
2636 BEAST_EXPECT(r.isMember(sfXChainAccountCreateCount.jsonName));
2637 BEAST_EXPECT(r[sfXChainAccountCreateCount.jsonName].asInt() == 1);
2640 r.isMember(sfXChainCreateAccountAttestations.jsonName));
2641 auto attest = r[sfXChainCreateAccountAttestations.jsonName];
2642 BEAST_EXPECT(attest.isArray());
2643 BEAST_EXPECT(attest.size() == 3);
2645 sfXChainCreateAccountProofSig.jsonName));
2647 for (
size_t i = 0; i < num_attest; ++i)
2650 [sfXChainCreateAccountProofSig.jsonName];
2652 a[i].isMember(jss::Amount) &&
2655 a[i].isMember(jss::Destination) &&
2658 a[i].isMember(sfAttestationSignerAccount.jsonName) &&
2661 return a[i][sfAttestationSignerAccount.jsonName] ==
2665 a[i].isMember(sfAttestationRewardAccount.jsonName) &&
2670 return a[i][sfAttestationRewardAccount.jsonName] ==
2674 a[i].isMember(sfWasLockingChainSend.jsonName) &&
2675 a[i][sfWasLockingChainSend.jsonName] == 1);
2677 a[i].isMember(sfSignatureReward.jsonName) &&
2678 a[i][sfSignatureReward.jsonName].
asInt() ==
2687 scEnv(attestations[i]);
2693 jvParams[jss::xchain_owned_create_account_claim_id] =
2695 jvParams[jss::xchain_owned_create_account_claim_id]
2696 [jss::xchain_owned_create_account_claim_id] = 1;
2699 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
Value & append(Value const &value)
Append value to array at the end.
UInt size() const
Number of values in array or object.
void clear()
Remove all object members and array elements.
std::string asString() const
Returns the unquoted string value.
bool isMember(char const *key) const
Return true if the object has a member named key.
testcase_t testcase
Memberspace for declaring test cases.
void fail(String const &reason, char const *file, int line)
Record a failure.
void testLedgerEntryCreateAccountClaimID()
void testLedgerEntryBridge()
void testLedgerEntryClaimID()
void checkErrorValue(Json::Value const &jv, std::string const &err, std::string const &msg)
void run() override
Runs the suite.
void testLedgerEntryDelegate()
void testInvalidOracleLedgerEntry()
void testLedgerEntryTicket()
void testLedgerEntryCheck()
void testLedgerEntryOffer()
void testLedgerEntryDepositPreauthCred()
void testLedgerEntryMPT()
void testLedgerEntryDepositPreauth()
void testLedgerEntryPermissionedDomain()
void testOracleLedgerEntry()
void testLedgerEntryInvalidParams(unsigned int apiVersion)
void testLedgerEntryAccountRoot()
void testLedgerEntryDID()
void testLedgerEntryRippleState()
void testLedgerEntryDirectory()
void checkErrorValue(Json::Value const &jv, std::string const &err, std::string const &msg)
void testLedgerEntryInvalid()
void testLedgerEntryCLI()
std::string makeBadAddress(std::string good)
void run() override
Runs the suite.
void testLedgerEntryPayChan()
void testLedgerEntryEscrow()
void testLedgerEntryCredentials()
Immutable cryptographic account descriptor.
AccountID id() const
Returns the Account ID.
static Account const master
The master account.
std::string const & human() const
Returns the human readable public key.
A transaction testing environment.
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
Json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
void create(MPTCreate const &arg=MPTCreate{})
Oracle class facilitates unit-testing of the Price Oracle feature.
Set the expected result code for a JTx The test will fail if the code doesn't match.
@ arrayValue
array value (ordered list)
@ objectValue
object value (collection of name/value pairs).
Keylet permissionedDomain(AccountID const &account, std::uint32_t seq) noexcept
Keylet account(AccountID const &id) noexcept
AccountID root.
Keylet check(AccountID const &id, std::uint32_t seq) noexcept
A Check.
Keylet payChan(AccountID const &src, AccountID const &dst, std::uint32_t seq) noexcept
A PaymentChannel.
Json::Value create(A const &account, A const &dest, STAmount const &sendMax)
Create a check.
Json::Value create(jtx::Account const &subject, jtx::Account const &issuer, std::string_view credType)
Json::Value ledgerEntry(jtx::Env &env, jtx::Account const &subject, jtx::Account const &issuer, std::string_view credType)
Json::Value set(jtx::Account const &account, jtx::Account const &authorize, std::vector< std::string > const &permissions)
Json::Value auth(Account const &account, Account const &auth)
Preauthorize for deposit.
Json::Value authCredentials(jtx::Account const &account, std::vector< AuthorizeCredentials > const &auth)
Json::Value setTx(AccountID const &account, Credentials const &credentials, std::optional< uint256 > domain)
std::map< uint256, Json::Value > getObjects(Account const &account, Env &env, bool withType)
Json::Value create(Account const &account, std::uint32_t count)
Create one of more tickets.
PrettyAmount drops(Integer i)
Returns an XRP PrettyAmount, which is trivially convertible to STAmount.
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Json::Value sidechain_xchain_account_create(Account const &acc, Json::Value const &bridge, Account const &dst, AnyAmount const &amt, AnyAmount const &reward)
constexpr std::size_t UT_XCHAIN_DEFAULT_NUM_SIGNERS
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
JValueVec create_account_attestations(jtx::Account const &submittingAccount, Json::Value const &jvBridge, jtx::Account const &sendingAccount, jtx::AnyAmount const &sendingAmount, jtx::AnyAmount const &rewardAmount, std::vector< jtx::Account > const &rewardAccounts, bool wasLockingChainSend, std::uint64_t createCount, jtx::Account const &dst, std::vector< jtx::signer > const &signers, std::size_t const numAtts, std::size_t const fromIdx)
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
FeatureBitset testable_amendments()
Json::Value xchain_create_claim_id(Account const &acc, Json::Value const &bridge, STAmount const &reward, Account const &otherChainSource)
Json::Value offer(Account const &account, STAmount const &takerPays, STAmount const &takerGets, std::uint32_t flags)
Create an offer.
XRP_t const XRP
Converts to XRP Issue or STAmount.
static uint256 ledgerHash(LedgerInfo const &info)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::uint32_t asfDepositAuth
AccountID const & xrpAccount()
Compute AccountID from public key.
constexpr std::uint32_t const tfMPTCanTransfer
constexpr std::uint32_t const tfMPTCanTrade
std::string strHex(FwdIt begin, FwdIt end)
std::size_t constexpr maxCredentialsArraySize
The maximum number of credentials can be passed in array.
@ invalid
Timely, but invalid signature.
void forAllApiVersions(Fn const &fn, Args &&... args)
uint256 getTicketIndex(AccountID const &account, std::uint32_t uSequence)
std::string to_string(base_uint< Bits, Tag > const &a)
constexpr std::uint32_t const tfMPTCanEscrow
constexpr std::uint32_t const tfMPTRequireAuth
constexpr std::uint32_t const tfMPTCanLock
constexpr std::uint32_t const tfMPTCanClawback
std::vector< Account > const payee
static constexpr int drop_per_xrp
FeatureBitset const features
std::vector< signer > const signers
void createBridgeObjects(Env &mcEnv, Env &scEnv)
Json::Value const jvXRPBridgeRPC
Set the sequence number on a JTx.
A signer in a SignerList.