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(
545 alice.human(), std::nullopt,
"malformedRequest");
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;
1263 jv[jss::Account] = account.human();
1264 jv[jss::Destination] = to.human();
1266 jv[sfFinishAfter.jsonName] =
1267 cancelAfter.time_since_epoch().count() + 2;
1271 using namespace std::chrono_literals;
1272 env(escrowCreate(alice, alice,
XRP(333), env.now() + 2s));
1281 jvParams[jss::escrow][jss::owner] = alice.human();
1282 jvParams[jss::escrow][jss::seq] = env.seq(alice) - 1;
1284 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1286 jrr[jss::node][jss::Amount] ==
XRP(333).value().getText());
1287 escrowIndex = jrr[jss::index].
asString();
1292 jvParams[jss::escrow] = escrowIndex;
1295 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1297 jrr[jss::node][jss::Amount] ==
XRP(333).value().getText());
1305 jvParams[jss::escrow][jss::owner] = badAddress;
1306 jvParams[jss::escrow][jss::seq] = env.seq(alice) - 1;
1309 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1316 jvParams[jss::escrow][jss::seq] = env.seq(alice) - 1;
1319 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1326 jvParams[jss::escrow][jss::owner] = alice.human();
1329 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1336 jvParams[jss::escrow][jss::owner] = alice.human();
1337 jvParams[jss::escrow][jss::seq] =
1341 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1349 testcase(
"ledger_entry Request Offer");
1350 using namespace test::jtx;
1354 auto const USD = gw[
"USD"];
1355 env.fund(
XRP(10000), alice, gw);
1358 env(
offer(alice, USD(321),
XRP(322)));
1367 jvParams[jss::offer][jss::account] = alice.human();
1368 jvParams[jss::offer][jss::seq] = env.seq(alice) - 1;
1371 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1372 BEAST_EXPECT(jrr[jss::node][jss::TakerGets] ==
"322000000");
1373 offerIndex = jrr[jss::index].
asString();
1378 jvParams[jss::offer] = offerIndex;
1380 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1381 BEAST_EXPECT(jrr[jss::node][jss::TakerGets] ==
"322000000");
1389 jvParams[jss::offer][jss::account] = badAddress;
1390 jvParams[jss::offer][jss::seq] = env.seq(alice) - 1;
1393 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1400 jvParams[jss::offer][jss::seq] = env.seq(alice) - 1;
1403 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1410 jvParams[jss::offer][jss::account] = alice.human();
1413 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1420 jvParams[jss::offer][jss::account] = alice.human();
1421 jvParams[jss::offer][jss::seq] =
std::to_string(env.seq(alice) - 1);
1424 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1432 testcase(
"ledger_entry Request Pay Chan");
1433 using namespace test::jtx;
1434 using namespace std::literals::chrono_literals;
1438 env.fund(
XRP(10000), alice);
1448 jv[jss::TransactionType] = jss::PaymentChannelCreate;
1449 jv[jss::Account] = account.human();
1450 jv[jss::Destination] = to.human();
1452 jv[sfSettleDelay.jsonName] = settleDelay.count();
1453 jv[sfPublicKey.jsonName] =
strHex(pk.slice());
1457 env(payChanCreate(alice, env.master,
XRP(57), 18s, alice.pk()));
1467 jvParams[jss::payment_channel] =
to_string(payChanIndex);
1470 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1471 BEAST_EXPECT(jrr[jss::node][sfAmount.jsonName] ==
"57000000");
1472 BEAST_EXPECT(jrr[jss::node][sfBalance.jsonName] ==
"0");
1473 BEAST_EXPECT(jrr[jss::node][sfSettleDelay.jsonName] == 18);
1481 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1489 testcase(
"ledger_entry Request RippleState");
1490 using namespace test::jtx;
1494 auto const USD = gw[
"USD"];
1495 env.fund(
XRP(10000), alice, gw);
1498 env.trust(USD(999), alice);
1501 env(
pay(gw, alice, USD(97)));
1505 for (
auto const& fieldName : {jss::ripple_state, jss::state})
1513 jvParams[fieldName][jss::accounts][0u] = alice.human();
1514 jvParams[fieldName][jss::accounts][1u] = gw.human();
1515 jvParams[fieldName][jss::currency] =
"USD";
1518 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1520 jrr[jss::node][sfBalance.jsonName][jss::value] ==
"-97");
1522 jrr[jss::node][sfHighLimit.jsonName][jss::value] ==
"999");
1527 jvParams[fieldName] =
"ripple_state";
1530 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1538 jvParams[fieldName][jss::accounts][0u] = alice.human();
1539 jvParams[fieldName][jss::accounts][1u] = gw.human();
1542 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1549 jvParams[fieldName][jss::accounts] = 2;
1550 jvParams[fieldName][jss::currency] =
"USD";
1553 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1561 jvParams[fieldName][jss::accounts][0u] = alice.human();
1562 jvParams[fieldName][jss::currency] =
"USD";
1565 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1573 jvParams[fieldName][jss::accounts][0u] = alice.human();
1574 jvParams[fieldName][jss::accounts][1u] = gw.human();
1575 jvParams[fieldName][jss::accounts][2u] = alice.human();
1576 jvParams[fieldName][jss::currency] =
"USD";
1579 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1587 jvParams[fieldName][jss::accounts][0u] = 44;
1588 jvParams[fieldName][jss::accounts][1u] = gw.human();
1589 jvParams[fieldName][jss::currency] =
"USD";
1592 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1600 jvParams[fieldName][jss::accounts][0u] = alice.human();
1601 jvParams[fieldName][jss::accounts][1u] = 21;
1602 jvParams[fieldName][jss::currency] =
"USD";
1605 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1613 jvParams[fieldName][jss::accounts][0u] = alice.human();
1614 jvParams[fieldName][jss::accounts][1u] = alice.human();
1615 jvParams[fieldName][jss::currency] =
"USD";
1618 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1626 jvParams[fieldName][jss::accounts][0u] =
1628 jvParams[fieldName][jss::accounts][1u] = gw.human();
1629 jvParams[fieldName][jss::currency] =
"USD";
1632 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1640 jvParams[fieldName][jss::accounts][0u] = alice.human();
1641 jvParams[fieldName][jss::accounts][1u] =
1643 jvParams[fieldName][jss::currency] =
"USD";
1646 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1654 jvParams[fieldName][jss::accounts][0u] = alice.human();
1655 jvParams[fieldName][jss::accounts][1u] = gw.human();
1656 jvParams[fieldName][jss::currency] =
"USDollars";
1659 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1668 testcase(
"ledger_entry Request Ticket");
1669 using namespace test::jtx;
1685 jvParams[jss::ticket] =
1689 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1698 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1700 jrr[jss::node][sfLedgerEntryType.jsonName] == jss::Ticket);
1701 BEAST_EXPECT(jrr[jss::node][sfTicketSequence.jsonName] == tkt1);
1707 jvParams[jss::ticket][jss::account] = env.master.human();
1708 jvParams[jss::ticket][jss::ticket_seq] = tkt1 + 1;
1711 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1713 jrr[jss::node][jss::index] ==
1720 jvParams[jss::ticket][jss::account] = env.master.human();
1721 jvParams[jss::ticket][jss::ticket_seq] = tkt1 + 2;
1724 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1733 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1742 jvParams[jss::ticket][jss::account] = badAddress;
1743 jvParams[jss::ticket][jss::ticket_seq] = env.seq(env.master) - 1;
1746 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1753 jvParams[jss::ticket][jss::ticket_seq] = env.seq(env.master) - 1;
1756 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1763 jvParams[jss::ticket][jss::account] = env.master.human();
1766 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1773 jvParams[jss::ticket][jss::account] = env.master.human();
1774 jvParams[jss::ticket][jss::ticket_seq] =
1778 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1786 testcase(
"ledger_entry Request DID");
1787 using namespace test::jtx;
1788 using namespace std::literals::chrono_literals;
1792 env.fund(
XRP(10000), alice);
1798 jv[jss::TransactionType] = jss::DIDSet;
1799 jv[jss::Account] = account.human();
1805 env(didCreate(alice));
1813 jvParams[jss::did] = alice.human();
1816 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1818 jrr[jss::node][sfDIDDocument.jsonName] ==
1826 jvParams[jss::did] = env.master.human();
1829 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1838 "ledger_entry Request With Invalid Parameters v" +
1840 using namespace test::jtx;
1847 params[jss::api_version] = apiVersion;
1853 auto const jvParams =
1859 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1861 if (apiVersion < 2u)
1868 obj[jss::account] =
"rhigTLJJyXXSRUyRCQtqi1NoAZZzZnS4KU";
1869 obj[jss::ledger_index] =
"validated";
1874 arr[0u] =
"rhigTLJJyXXSRUyRCQtqi1NoAZZzZnS4KU";
1875 arr[1u] =
"validated";
1881 for (
auto const& field :
1882 {jss::directory, jss::escrow, jss::offer, jss::ticket, jss::amm})
1884 auto const jvParams =
1885 makeParams([&field, &injectArray](
Json::Value& jvParams) {
1886 jvParams[field] = injectArray;
1890 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1892 if (apiVersion < 2u)
1898 for (
auto const& field :
1899 {jss::directory, jss::escrow, jss::offer, jss::ticket, jss::amm})
1901 auto const jvParams =
1902 makeParams([&field, &injectObject](
Json::Value& jvParams) {
1903 jvParams[field] = injectObject;
1907 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1912 for (
auto const& inject : {injectObject, injectArray})
1915 for (
auto const& field :
1919 jss::payment_channel})
1921 auto const jvParams =
1922 makeParams([&field, &inject](
Json::Value& jvParams) {
1923 jvParams[field] = inject;
1927 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1929 if (apiVersion < 2u)
1935 for (
auto const& field : {jss::dir_root, jss::owner})
1937 auto const jvParams =
1938 makeParams([&field, &inject](
Json::Value& jvParams) {
1939 jvParams[jss::directory][field] = inject;
1943 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1945 if (apiVersion < 2u)
1952 auto const jvParams =
1954 jvParams[jss::escrow][jss::owner] = inject;
1955 jvParams[jss::escrow][jss::seq] = 99;
1959 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1961 if (apiVersion < 2u)
1968 auto const jvParams =
1970 jvParams[jss::offer][jss::account] = inject;
1971 jvParams[jss::offer][jss::seq] = 99;
1975 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
1977 if (apiVersion < 2u)
1984 auto const jvParams =
1987 rs[jss::currency] =
"FOO";
1989 rs[jss::accounts][0u] =
1990 "rhigTLJJyXXSRUyRCQtqi1NoAZZzZnS4KU";
1991 rs[jss::accounts][1u] =
1992 "rKssEq6pg1KbqEqAFnua5mFAL6Ggpsh2wv";
1993 rs[jss::currency] = inject;
1994 jvParams[jss::ripple_state] = std::move(rs);
1998 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2000 if (apiVersion < 2u)
2007 auto const jvParams =
2009 jvParams[jss::ticket][jss::account] = inject;
2010 jvParams[jss::ticket][jss::ticket_seq] = 99;
2014 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2016 if (apiVersion < 2u)
2023 for (
auto const& field : {jss::nft_page, jss::deposit_preauth})
2025 auto const jvParams =
2026 makeParams([&field, &inject](
Json::Value& jvParams) {
2027 jvParams[field] = inject;
2031 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2037 for (
auto const& field : {jss::owner, jss::authorized})
2039 auto const jvParams =
2040 makeParams([&field, &inject](
Json::Value& jvParams) {
2042 pa[jss::owner] =
"rhigTLJJyXXSRUyRCQtqi1NoAZZzZnS4KU";
2043 pa[jss::authorized] =
2044 "rKssEq6pg1KbqEqAFnua5mFAL6Ggpsh2wv";
2046 jvParams[jss::deposit_preauth] = std::move(pa);
2050 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2060 testcase(
"Invalid Oracle Ledger Entry");
2070 .fee =
static_cast<int>(env.
current()->fees().base.drops())});
2073 auto res = Oracle::ledgerEntry(env, owner, NoneTag);
2074 BEAST_EXPECT(res[jss::error].asString() ==
"invalidParams");
2078 auto const res = Oracle::ledgerEntry(env, owner, v);
2079 BEAST_EXPECT(res[jss::error].asString() ==
"malformedDocumentID");
2082 res = Oracle::ledgerEntry(env, owner, std::nullopt);
2083 BEAST_EXPECT(res[jss::error].asString() ==
"malformedRequest");
2086 res = Oracle::ledgerEntry(env, std::nullopt, 1);
2087 BEAST_EXPECT(res[jss::error].asString() ==
"malformedRequest");
2091 malfAccount.
replace(10, 1, 1,
'!');
2092 res = Oracle::ledgerEntry(env, malfAccount, 1);
2093 BEAST_EXPECT(res[jss::error].asString() ==
"malformedAddress");
2104 auto const baseFee =
2105 static_cast<int>(env.
current()->fees().base.drops());
2108 for (
int i = 0; i < 10; ++i)
2114 env, {.owner = owner, .documentID = i, .fee = baseFee});
2119 env, {.owner = owner, .documentID = i + 10, .fee = baseFee});
2121 oracles.
push_back(oracle1.documentID());
2123 for (
int i = 0; i < accounts.
size(); ++i)
2125 auto const jv = [&]() {
2128 return Oracle::ledgerEntry(env, accounts[i], oracles[i]);
2130 return Oracle::ledgerEntry(
2136 jv[jss::node][jss::Owner] ==
to_string(accounts[i]));
2148 testcase(
"ledger_entry Request MPT");
2149 using namespace test::jtx;
2150 using namespace std::literals::chrono_literals;
2155 MPTTester mptAlice(env, alice, {.holders = {bob}});
2162 mptAlice.authorize({.account = bob, .holderCount = 1});
2167 "00000193B9DDCAF401B5B3B26875986043F82CD0D13B4315";
2171 jvParams[jss::mpt_issuance] =
strHex(mptAlice.issuanceID());
2174 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2176 jrr[jss::node][sfMPTokenMetadata.jsonName] ==
2179 jrr[jss::node][jss::mpt_issuance_id] ==
2180 strHex(mptAlice.issuanceID()));
2185 jvParams[jss::mpt_issuance] = badMptID;
2188 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2195 jvParams[jss::mptoken][jss::account] = bob.
human();
2196 jvParams[jss::mptoken][jss::mpt_issuance_id] =
2197 strHex(mptAlice.issuanceID());
2200 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2202 jrr[jss::node][sfMPTokenIssuanceID.jsonName] ==
2203 strHex(mptAlice.issuanceID()));
2209 jvParams[jss::mptoken][jss::account] = bob.
human();
2210 jvParams[jss::mptoken][jss::mpt_issuance_id] = badMptID;
2213 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2221 testcase(
"ledger_entry PermissionedDomain");
2223 using namespace test::jtx;
2226 Account const issuer{
"issuer"};
2230 env.
fund(
XRP(5000), issuer, alice, bob);
2233 auto const seq = env.
seq(alice);
2237 if (!BEAST_EXPECT(objects.size() == 1))
2243 params[jss::ledger_index] = jss::validated;
2244 params[jss::permissioned_domain][jss::account] = alice.human();
2245 params[jss::permissioned_domain][jss::seq] =
seq;
2246 auto jv = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2248 jv.isObject() && jv.isMember(jss::result) &&
2249 !jv[jss::result].isMember(jss::error) &&
2250 jv[jss::result].isMember(jss::node) &&
2251 jv[jss::result][jss::node].isMember(
2252 sfLedgerEntryType.jsonName) &&
2253 jv[jss::result][jss::node][sfLedgerEntryType.jsonName] ==
2254 jss::PermissionedDomain);
2256 std::string const pdIdx = jv[jss::result][jss::index].asString();
2261 params[jss::ledger_index] = jss::validated;
2262 params[jss::permissioned_domain] = pdIdx;
2263 jv = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2265 jv.isObject() && jv.isMember(jss::result) &&
2266 !jv[jss::result].isMember(jss::error) &&
2267 jv[jss::result].isMember(jss::node) &&
2268 jv[jss::result][jss::node].isMember(
2269 sfLedgerEntryType.jsonName) &&
2270 jv[jss::result][jss::node][sfLedgerEntryType.jsonName] ==
2271 jss::PermissionedDomain);
2277 params[jss::ledger_index] = jss::validated;
2278 params[jss::permissioned_domain] =
2279 "12F1F1F1F180D67377B2FAB292A31C922470326268D2B9B74CD1E582645B9A"
2281 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2288 params[jss::ledger_index] = jss::validated;
2289 params[jss::permissioned_domain] =
"NotAHexString";
2290 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2297 params[jss::ledger_index] = jss::validated;
2298 params[jss::permissioned_domain] = 10;
2299 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2306 params[jss::ledger_index] = jss::validated;
2307 params[jss::permissioned_domain][jss::account] = 1;
2308 params[jss::permissioned_domain][jss::seq] =
seq;
2309 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2316 params[jss::ledger_index] = jss::validated;
2317 params[jss::permissioned_domain][jss::account] =
2319 params[jss::permissioned_domain][jss::seq] =
seq;
2320 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2327 params[jss::ledger_index] = jss::validated;
2328 params[jss::permissioned_domain][jss::account] =
"";
2329 params[jss::permissioned_domain][jss::seq] =
seq;
2330 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2337 params[jss::ledger_index] = jss::validated;
2338 params[jss::permissioned_domain][jss::account] = alice.human();
2339 params[jss::permissioned_domain][jss::seq] =
"12g";
2340 auto const jrr = env.
rpc(
"json",
"ledger_entry",
to_string(params));
2348 testcase(
"ledger_entry command-line");
2349 using namespace test::jtx;
2353 env.fund(
XRP(10000), alice);
2356 auto const checkId =
keylet::check(env.master, env.seq(env.master));
2365 env.rpc(
"ledger_entry",
to_string(checkId.key))[jss::result];
2367 jrr[jss::node][sfLedgerEntryType.jsonName] == jss::Check);
2368 BEAST_EXPECT(jrr[jss::node][sfSendMax.jsonName] ==
"100000000");
2410 if (BEAST_EXPECT(jv.
isMember(jss::status)))
2411 BEAST_EXPECT(jv[jss::status] ==
"error");
2412 if (BEAST_EXPECT(jv.
isMember(jss::error)))
2413 BEAST_EXPECT(jv[jss::error] == err);
2418 jv[jss::error_message] ==
"");
2420 else if (BEAST_EXPECT(jv.
isMember(jss::error_message)))
2421 BEAST_EXPECT(jv[jss::error_message] == msg);
2428 using namespace test::jtx;
2442 jvParams[jss::bridge] =
jvb;
2444 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2446 BEAST_EXPECT(jrr.
isMember(jss::node));
2447 auto r = jrr[jss::node];
2450 BEAST_EXPECT(r.isMember(jss::Account));
2453 BEAST_EXPECT(r.isMember(jss::Flags));
2455 BEAST_EXPECT(r.isMember(sfLedgerEntryType.jsonName));
2456 BEAST_EXPECT(r[sfLedgerEntryType.jsonName] == jss::Bridge);
2459 BEAST_EXPECT(r.isMember(sfXChainAccountCreateCount.jsonName));
2460 BEAST_EXPECT(r[sfXChainAccountCreateCount.jsonName].asInt() == 0);
2463 BEAST_EXPECT(r.isMember(sfXChainAccountClaimCount.jsonName));
2464 BEAST_EXPECT(r[sfXChainAccountClaimCount.jsonName].asInt() == 0);
2466 BEAST_EXPECT(r.isMember(jss::index));
2467 bridge_index = r[jss::index].asString();
2473 jvParams[jss::index] = bridge_index;
2475 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2477 BEAST_EXPECT(jrr.
isMember(jss::node));
2478 BEAST_EXPECT(jrr[jss::node] == mcBridge);
2485 jvParams[jss::bridge] =
jvb;
2488 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2503 jvParams[jss::bridge] =
jvb;
2506 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2508 BEAST_EXPECT(jrr.
isMember(jss::node));
2509 auto r = jrr[jss::node];
2512 BEAST_EXPECT(r.isMember(sfXChainClaimID.jsonName));
2513 BEAST_EXPECT(r[sfXChainClaimID.jsonName].asInt() == 2);
2520 testcase(
"ledger_entry: xchain_claim_id");
2521 using namespace test::jtx;
2538 jvParams[jss::xchain_owned_claim_id][jss::xchain_owned_claim_id] =
2542 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2544 BEAST_EXPECT(jrr.
isMember(jss::node));
2545 auto r = jrr[jss::node];
2548 BEAST_EXPECT(r.isMember(jss::Account));
2551 r[sfLedgerEntryType.jsonName] == jss::XChainOwnedClaimID);
2552 BEAST_EXPECT(r[sfXChainClaimID.jsonName].asInt() == 1);
2553 BEAST_EXPECT(r[sfOwnerNode.jsonName].asInt() == 0);
2560 jvParams[jss::xchain_owned_claim_id][jss::xchain_owned_claim_id] =
2563 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2565 BEAST_EXPECT(jrr.
isMember(jss::node));
2566 auto r = jrr[jss::node];
2569 BEAST_EXPECT(r.isMember(jss::Account));
2570 BEAST_EXPECT(r[jss::Account] ==
scBob.
human());
2572 r[sfLedgerEntryType.jsonName] == jss::XChainOwnedClaimID);
2573 BEAST_EXPECT(r[sfXChainClaimID.jsonName].asInt() == 2);
2574 BEAST_EXPECT(r[sfOwnerNode.jsonName].asInt() == 0);
2581 testcase(
"ledger_entry: xchain_create_account_claim_id");
2582 using namespace test::jtx;
2593 auto const amt =
XRP(1000);
2600 size_t constexpr num_attest = 3;
2613 for (
size_t i = 0; i < num_attest; ++i)
2615 scEnv(attestations[i]);
2622 jvParams[jss::xchain_owned_create_account_claim_id] =
2624 jvParams[jss::xchain_owned_create_account_claim_id]
2625 [jss::xchain_owned_create_account_claim_id] = 1;
2628 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2631 BEAST_EXPECT(jrr.
isMember(jss::node));
2632 auto r = jrr[jss::node];
2634 BEAST_EXPECT(r.isMember(jss::Account));
2637 BEAST_EXPECT(r.isMember(sfXChainAccountCreateCount.jsonName));
2638 BEAST_EXPECT(r[sfXChainAccountCreateCount.jsonName].asInt() == 1);
2641 r.isMember(sfXChainCreateAccountAttestations.jsonName));
2642 auto attest = r[sfXChainCreateAccountAttestations.jsonName];
2643 BEAST_EXPECT(attest.isArray());
2644 BEAST_EXPECT(attest.size() == 3);
2646 sfXChainCreateAccountProofSig.jsonName));
2648 for (
size_t i = 0; i < num_attest; ++i)
2651 [sfXChainCreateAccountProofSig.jsonName];
2653 a[i].isMember(jss::Amount) &&
2656 a[i].isMember(jss::Destination) &&
2659 a[i].isMember(sfAttestationSignerAccount.jsonName) &&
2662 return a[i][sfAttestationSignerAccount.jsonName] ==
2666 a[i].isMember(sfAttestationRewardAccount.jsonName) &&
2671 return a[i][sfAttestationRewardAccount.jsonName] ==
2675 a[i].isMember(sfWasLockingChainSend.jsonName) &&
2676 a[i][sfWasLockingChainSend.jsonName] == 1);
2678 a[i].isMember(sfSignatureReward.jsonName) &&
2679 a[i][sfSignatureReward.jsonName].
asInt() ==
2688 scEnv(attestations[i]);
2694 jvParams[jss::xchain_owned_create_account_claim_id] =
2696 jvParams[jss::xchain_owned_create_account_claim_id]
2697 [jss::xchain_owned_create_account_claim_id] = 1;
2700 "json",
"ledger_entry",
to_string(jvParams))[jss::result];
2716BEAST_DEFINE_TESTSUITE(LedgerEntry_XChain, app,
ripple);
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.
@ 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
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.
FeatureBitset supported_amendments()
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)
constexpr std::uint32_t tfUniversal
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.