2#include <test/jtx/Account.h>
3#include <test/jtx/Env.h>
4#include <test/jtx/TestHelpers.h>
5#include <test/jtx/acctdelete.h>
6#include <test/jtx/amount.h>
7#include <test/jtx/credentials.h>
8#include <test/jtx/deposit.h>
9#include <test/jtx/directory.h>
10#include <test/jtx/fee.h>
11#include <test/jtx/noop.h>
12#include <test/jtx/pay.h>
13#include <test/jtx/permissioned_domains.h>
14#include <test/jtx/ter.h>
15#include <test/jtx/ticket.h>
16#include <test/jtx/txflags.h>
17#include <test/jtx/vault.h>
19#include <xrpl/basics/strHex.h>
20#include <xrpl/beast/unit_test/suite.h>
21#include <xrpl/json/to_string.h>
22#include <xrpl/ledger/ApplyView.h>
23#include <xrpl/ledger/ApplyViewImpl.h>
24#include <xrpl/ledger/helpers/CredentialHelpers.h>
25#include <xrpl/protocol/AccountID.h>
26#include <xrpl/protocol/Feature.h>
27#include <xrpl/protocol/Indexes.h>
28#include <xrpl/protocol/Issue.h>
29#include <xrpl/protocol/LedgerFormats.h>
30#include <xrpl/protocol/Protocol.h>
31#include <xrpl/protocol/SField.h>
32#include <xrpl/protocol/STTx.h>
33#include <xrpl/protocol/TER.h>
34#include <xrpl/protocol/TxFlags.h>
35#include <xrpl/protocol/jss.h>
51 char const credType[] =
"abcde";
52 char const uri[] =
"uri";
55 Account const subject{
"subject"};
58 Env env{*
this, features};
65 env.
fund(
XRP(5000), subject, issuer, other);
72 auto const sleCred = env.
le(credKey);
73 BEAST_EXPECT(
static_cast<bool>(sleCred));
77 BEAST_EXPECT(sleCred->getAccountID(sfSubject) == subject.
id());
78 BEAST_EXPECT(sleCred->getAccountID(sfIssuer) == issuer.
id());
79 BEAST_EXPECT(!sleCred->getFieldU32(sfFlags));
82 BEAST_EXPECT(
checkVL(sleCred, sfCredentialType, credType));
83 BEAST_EXPECT(
checkVL(sleCred, sfURI, uri));
86 jle.isObject() && jle.isMember(jss::result) &&
87 !jle[jss::result].isMember(jss::error) &&
88 jle[jss::result].isMember(jss::node) &&
89 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
90 jle[jss::result][jss::node][
"LedgerEntryType"] == jss::Credential &&
91 jle[jss::result][jss::node][jss::Issuer] == issuer.
human() &&
92 jle[jss::result][jss::node][jss::Subject] == subject.
human() &&
93 jle[jss::result][jss::node][
"CredentialType"] ==
102 auto const sleCred = env.
le(credKey);
103 BEAST_EXPECT(
static_cast<bool>(sleCred));
107 BEAST_EXPECT(sleCred->getAccountID(sfSubject) == subject.
id());
108 BEAST_EXPECT(sleCred->getAccountID(sfIssuer) == issuer.
id());
111 BEAST_EXPECT(
checkVL(sleCred, sfCredentialType, credType));
112 BEAST_EXPECT(
checkVL(sleCred, sfURI, uri));
113 BEAST_EXPECT(sleCred->getFieldU32(sfFlags) == lsfAccepted);
119 BEAST_EXPECT(!env.
le(credKey));
126 jle.isObject() && jle.isMember(jss::result) &&
127 jle[jss::result].isMember(jss::error) &&
128 jle[jss::result][jss::error] ==
"entryNotFound");
140 auto const sleCred = env.
le(credKey);
141 BEAST_EXPECT(
static_cast<bool>(sleCred));
145 BEAST_EXPECT(sleCred->getAccountID(sfSubject) == issuer.
id());
146 BEAST_EXPECT(sleCred->getAccountID(sfIssuer) == issuer.
id());
147 BEAST_EXPECT(sleCred->isFlag(lsfAccepted));
149 sleCred->getFieldU64(sfIssuerNode) == sleCred->getFieldU64(sfSubjectNode));
151 BEAST_EXPECT(
checkVL(sleCred, sfCredentialType, credType));
152 BEAST_EXPECT(
checkVL(sleCred, sfURI, uri));
155 jle.isObject() && jle.isMember(jss::result) &&
156 !jle[jss::result].isMember(jss::error) &&
157 jle[jss::result].isMember(jss::node) &&
158 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
159 jle[jss::result][jss::node][
"LedgerEntryType"] == jss::Credential &&
160 jle[jss::result][jss::node][jss::Issuer] == issuer.
human() &&
161 jle[jss::result][jss::node][jss::Subject] == issuer.
human() &&
162 jle[jss::result][jss::node][
"CredentialType"] ==
169 BEAST_EXPECT(!env.
le(credKey));
175 jle.isObject() && jle.isMember(jss::result) &&
176 jle[jss::result].isMember(jss::error) &&
177 jle[jss::result][jss::error] ==
"entryNotFound");
187 char const credType[] =
"abcde";
189 Account const issuer{
"issuer"};
190 Account const subject{
"subject"};
193 Env env{*
this, features};
196 env.
fund(
XRP(5000), issuer, subject, other);
200 testcase(
"Delete issuer before accept");
208 int const delta = env.
seq(issuer) + 255;
209 for (
int i = 0; i < delta; ++i)
211 auto const acctDelFee{
drops(env.
current()->fees().increment)};
218 BEAST_EXPECT(!env.
le(credKey));
224 jle.isObject() && jle.isMember(jss::result) &&
225 jle[jss::result].isMember(jss::error) &&
226 jle[jss::result][jss::error] ==
"entryNotFound");
235 testcase(
"Delete issuer after accept");
245 int const delta = env.
seq(issuer) + 255;
246 for (
int i = 0; i < delta; ++i)
248 auto const acctDelFee{
drops(env.
current()->fees().increment)};
255 BEAST_EXPECT(!env.
le(credKey));
261 jle.isObject() && jle.isMember(jss::result) &&
262 jle[jss::result].isMember(jss::error) &&
263 jle[jss::result][jss::error] ==
"entryNotFound");
272 testcase(
"Delete subject before accept");
280 int const delta = env.
seq(subject) + 255;
281 for (
int i = 0; i < delta; ++i)
283 auto const acctDelFee{
drops(env.
current()->fees().increment)};
290 BEAST_EXPECT(!env.
le(credKey));
296 jle.isObject() && jle.isMember(jss::result) &&
297 jle[jss::result].isMember(jss::error) &&
298 jle[jss::result][jss::error] ==
"entryNotFound");
307 testcase(
"Delete subject after accept");
317 int const delta = env.
seq(subject) + 255;
318 for (
int i = 0; i < delta; ++i)
320 auto const acctDelFee{
drops(env.
current()->fees().increment)};
327 BEAST_EXPECT(!env.
le(credKey));
333 jle.isObject() && jle.isMember(jss::result) &&
334 jle[jss::result].isMember(jss::error) &&
335 jle[jss::result][jss::error] ==
"entryNotFound");
348 uint32_t
const t = env.
current()->header().parentCloseTime.time_since_epoch().count();
349 jv[sfExpiration.jsonName] = t + 20;
363 BEAST_EXPECT(!env.
le(credKey));
370 jle.isObject() && jle.isMember(jss::result) &&
371 jle[jss::result].isMember(jss::error) &&
372 jle[jss::result][jss::error] ==
"entryNotFound");
387 BEAST_EXPECT(!env.
le(credKey));
392 jle.isObject() && jle.isMember(jss::result) &&
393 jle[jss::result].isMember(jss::error) &&
394 jle[jss::result][jss::error] ==
"entryNotFound");
407 BEAST_EXPECT(!env.
le(credKey));
412 jle.isObject() && jle.isMember(jss::result) &&
413 jle[jss::result].isMember(jss::error) &&
414 jle[jss::result][jss::error] ==
"entryNotFound");
424 char const credType[] =
"abcde";
426 Account const issuer{
"issuer"};
427 Account const subject{
"subject"};
430 Env env{*
this, features};
432 env.
fund(
XRP(5000), subject, issuer);
436 testcase(
"Credentials fail, no subject param.");
438 jv.removeMember(jss::Subject);
449 testcase(
"Credentials fail, no credentialType param.");
451 jv.removeMember(sfCredentialType.jsonName);
456 testcase(
"Credentials fail, empty credentialType param.");
463 "Credentials fail, credentialType length > "
464 "maxCredentialTypeLength.");
466 "abcdefghijklmnopqrstuvwxyz01234567890qwertyuiop[]"
467 "asdfghjkl;'zxcvbnm8237tr28weufwldebvfv8734t07p";
474 testcase(
"Credentials fail, URI length > 256.");
476 "abcdefghijklmnopqrstuvwxyz01234567890qwertyuiop[]"
477 "asdfghjkl;'zxcvbnm8237tr28weufwldebvfv8734t07p "
478 "9hfup;wDJFBVSD8f72 "
480 "djvbldafghwpEFHdjfaidfgio84763tfysgdvhjasbd "
481 "vujhgWQIE7F6WEUYFGWUKEYFVQW87FGWOEFWEFUYWVEF8723GFWEFB"
483 "fv28o37gfwEFB3872TFO8GSDSDVD";
491 testcase(
"Credentials fail, URI empty.");
498 testcase(
"Credentials fail, expiration in the past.");
502 env.
current()->header().parentCloseTime.time_since_epoch().count() - 1;
503 jv[sfExpiration.jsonName] = t;
508 testcase(
"Credentials fail, invalid fee.");
516 testcase(
"Credentials fail, duplicate.");
526 jle.isObject() && jle.isMember(jss::result) &&
527 !jle[jss::result].isMember(jss::error) &&
528 jle[jss::result].isMember(jss::node) &&
529 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
530 jle[jss::result][jss::node][
"LedgerEntryType"] == jss::Credential &&
531 jle[jss::result][jss::node][jss::Issuer] == issuer.
human() &&
532 jle[jss::result][jss::node][jss::Subject] == subject.
human() &&
533 jle[jss::result][jss::node][
"CredentialType"] ==
538 testcase(
"Credentials fail, directory full");
572 testcase(
"Credentials fail, subject is a pseudo-account.");
573 Vault const vault{env};
574 auto [tx,
keylet] = vault.create({.owner = subject, .asset =
xrpIssue()});
578 auto const sleVault = env.
le(
keylet);
579 if (!BEAST_EXPECT(sleVault))
581 Account const vaultPseudo{
"vault", sleVault->at(sfAccount)};
582 auto const expectedResult =
591 Env env{*
this, features};
597 testcase(
"Credentials fail, subject doesn't exist.");
604 Env env{*
this, features};
610 testcase(
"Credentials fail, not enough reserve.");
624 char const credType[] =
"abcde";
625 Account const issuer{
"issuer"};
626 Account const subject{
"subject"};
630 Env env{*
this, features};
632 env.
fund(
XRP(5000), subject, issuer);
635 testcase(
"CredentialsAccept fail, Credential doesn't exist.");
641 testcase(
"CredentialsAccept fail, invalid Issuer account.");
649 testcase(
"CredentialsAccept fail, invalid credentialType param.");
656 Env env{*
this, features};
663 testcase(
"CredentialsAccept fail, not enough reserve.");
673 jle.isObject() && jle.isMember(jss::result) &&
674 !jle[jss::result].isMember(jss::error) &&
675 jle[jss::result].isMember(jss::node) &&
676 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
677 jle[jss::result][jss::node][
"LedgerEntryType"] == jss::Credential &&
678 jle[jss::result][jss::node][jss::Issuer] == issuer.
human() &&
679 jle[jss::result][jss::node][jss::Subject] == subject.
human() &&
680 jle[jss::result][jss::node][
"CredentialType"] ==
687 Env env{*
this, features};
689 env.
fund(
XRP(5000), subject, issuer);
696 testcase(
"CredentialsAccept fail, invalid fee.");
701 testcase(
"CredentialsAccept fail, lsfAccepted already set.");
710 jle.isObject() && jle.isMember(jss::result) &&
711 !jle[jss::result].isMember(jss::error) &&
712 jle[jss::result].isMember(jss::node) &&
713 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
714 jle[jss::result][jss::node][
"LedgerEntryType"] == jss::Credential &&
715 jle[jss::result][jss::node][jss::Issuer] == issuer.
human() &&
716 jle[jss::result][jss::node][jss::Subject] == subject.
human() &&
717 jle[jss::result][jss::node][
"CredentialType"] ==
722 char const credType2[] =
"efghi";
724 testcase(
"CredentialsAccept fail, expired credentials.");
727 env.
current()->header().parentCloseTime.time_since_epoch().count();
728 jv[sfExpiration.jsonName] = t;
739 jDelCred.isObject() && jDelCred.isMember(jss::result) &&
740 jDelCred[jss::result].isMember(jss::error) &&
741 jDelCred[jss::result][jss::error] ==
"entryNotFound");
750 Env env{*
this, features};
752 env.
fund(
XRP(5000), issuer, subject, other);
756 testcase(
"CredentialsAccept fail, issuer doesn't exist.");
762 int const delta = env.
seq(issuer) + 255;
763 for (
int i = 0; i < delta; ++i)
765 auto const acctDelFee{
drops(env.
current()->fees().increment)};
776 jDelCred.isObject() && jDelCred.isMember(jss::result) &&
777 jDelCred[jss::result].isMember(jss::error) &&
778 jDelCred[jss::result][jss::error] ==
"entryNotFound");
788 char const credType[] =
"abcde";
789 Account const issuer{
"issuer"};
790 Account const subject{
"subject"};
795 Env env{*
this, features};
797 env.
fund(
XRP(5000), subject, issuer, other);
801 testcase(
"CredentialsDelete fail, no Credentials.");
807 testcase(
"CredentialsDelete fail, invalid Subject account.");
815 testcase(
"CredentialsDelete fail, invalid Issuer account.");
823 testcase(
"CredentialsDelete fail, invalid credentialType param.");
829 char const credType2[] =
"fghij";
842 jle.isObject() && jle.isMember(jss::result) &&
843 !jle[jss::result].isMember(jss::error) &&
844 jle[jss::result].isMember(jss::node) &&
845 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
846 jle[jss::result][jss::node][
"LedgerEntryType"] == jss::Credential &&
847 jle[jss::result][jss::node][jss::Issuer] == issuer.
human() &&
848 jle[jss::result][jss::node][jss::Subject] == subject.
human() &&
849 jle[jss::result][jss::node][
"CredentialType"] ==
854 testcase(
"CredentialsDelete fail, time not expired yet.");
859 env.
current()->header().parentCloseTime.time_since_epoch().count() + 1000;
860 jv[sfExpiration.jsonName] = t;
872 jle.isObject() && jle.isMember(jss::result) &&
873 !jle[jss::result].isMember(jss::error) &&
874 jle[jss::result].isMember(jss::node) &&
875 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
876 jle[jss::result][jss::node][
"LedgerEntryType"] == jss::Credential &&
877 jle[jss::result][jss::node][jss::Issuer] == issuer.
human() &&
878 jle[jss::result][jss::node][jss::Subject] == subject.
human() &&
879 jle[jss::result][jss::node][
"CredentialType"] ==
884 testcase(
"CredentialsDelete fail, no Issuer and Subject.");
887 jv.removeMember(jss::Subject);
888 jv.removeMember(jss::Issuer);
894 testcase(
"CredentialsDelete fail, invalid fee.");
903 testcase(
"deleteSLE fail, bad SLE.");
917 char const credType[] =
"abcde";
918 Account const issuer{
"issuer"};
919 Account const subject{
"subject"};
923 Env env{*
this, features};
925 env.
fund(
XRP(5000), subject, issuer);
929 testcase(
"Credentials fail, Feature is not enabled.");
942 char const credType[] =
"abcde";
943 Account const issuer{
"issuer"};
944 Account const subject{
"subject"};
950 env.
fund(
XRP(5000), subject, issuer);
964 params[jss::account] = subject.
human();
965 auto const jv = env.
rpc(
"json",
"account_tx",
to_string(params))[jss::result];
967 BEAST_EXPECT(jv[jss::transactions].size() == 4);
968 auto const& tx0(jv[jss::transactions][0u][jss::tx]);
969 BEAST_EXPECT(tx0[jss::TransactionType] == jss::CredentialAccept);
970 auto const& tx1(jv[jss::transactions][1u][jss::tx]);
971 BEAST_EXPECT(tx1[jss::TransactionType] == jss::CredentialCreate);
972 txHash0 = tx0[jss::hash].asString();
973 txHash1 = tx1[jss::hash].asString();
978 params[jss::account] = issuer.
human();
979 auto const jv = env.
rpc(
"json",
"account_tx",
to_string(params))[jss::result];
981 BEAST_EXPECT(jv[jss::transactions].size() == 4);
982 auto const& tx0(jv[jss::transactions][0u][jss::tx]);
983 BEAST_EXPECT(tx0[jss::TransactionType] == jss::CredentialAccept);
984 auto const& tx1(jv[jss::transactions][1u][jss::tx]);
985 BEAST_EXPECT(tx1[jss::TransactionType] == jss::CredentialCreate);
987 BEAST_EXPECT(txHash0 == tx0[jss::hash].asString());
988 BEAST_EXPECT(txHash1 == tx1[jss::hash].asString());
995 params[jss::account] = subject.
human();
996 auto jv = env.
rpc(
"json",
"account_objects",
to_string(params))[jss::result];
998 BEAST_EXPECT(jv[jss::account_objects].size() == 1);
999 auto const& object(jv[jss::account_objects][0u]);
1001 BEAST_EXPECT(
object[
"LedgerEntryType"].asString() == jss::Credential);
1002 objectIdx =
object[jss::index].asString();
1007 params[jss::account] = issuer.
human();
1008 auto jv = env.
rpc(
"json",
"account_objects",
to_string(params))[jss::result];
1010 BEAST_EXPECT(jv[jss::account_objects].size() == 1);
1011 auto const& object(jv[jss::account_objects][0u]);
1013 BEAST_EXPECT(
object[
"LedgerEntryType"].asString() == jss::Credential);
1014 BEAST_EXPECT(objectIdx ==
object[jss::index].asString());
1024 bool const enabled = features[fixInvalidTxFlags];
1027 char const credType[] =
"abcde";
1028 Account const issuer{
"issuer"};
1029 Account const subject{
"subject"};
1032 using namespace jtx;
1033 Env env{*
this, features};
1035 env.
fund(
XRP(5000), subject, issuer);
1056 bool const fixEnabled = features[fixCleanup3_1_3];
1058 "removeExpired ignores deleteSLE failure " +
1063 char const credType[] =
"abcde";
1064 Account const issuer{
"issuer"};
1065 Account const subject{
"subject"};
1068 Env env{*
this, features};
1069 env.
fund(
XRP(10000), issuer, subject, becky);
1074 uint32_t
const expiration =
1075 env.
current()->header().parentCloseTime.time_since_epoch().count() + 40;
1076 jv[sfExpiration.jsonName] = expiration;
1081 std::string const credIdx = credLE[jss::result][jss::index].asString();
1088 auto const credKeylet =
1093 auto const sleCred = env.
current()->read(credKeylet);
1094 BEAST_EXPECT(sleCred && sleCred->isFlag(lsfAccepted));
1102 if (!BEAST_EXPECT(
jtx.stx))
1107 env(
pdomain::setTx(becky, {{.issuer = issuer, .credType = credType}}));
1110 if (!BEAST_EXPECT(!objects.empty()))
1112 auto const domain = objects.begin()->first;
1114 using namespace std::chrono_literals;
1119 auto const sleCred = env.
current()->read(credKeylet);
1132 if (!BEAST_EXPECT(sleIssuer))
1134 av.
erase(sleIssuer);
1138 BEAST_EXPECT(av.
exists(credKeylet));
1142 credHashes.
pushBack(credKeylet.key);
1146 auto sleCredAfter = av.
read(credKeylet);
1147 BEAST_EXPECT(sleCredAfter && sleCredAfter->isFlag(lsfAccepted));
1150 sleCredAfter = av.
read(credKeylet);
1151 BEAST_EXPECT(sleCredAfter && sleCredAfter->isFlag(lsfAccepted));
A generic endpoint for log messages.
static Sink & getNullSink()
Returns a Sink which does nothing.
TestcaseT testcase
Memberspace for declaring test cases.
Editable, discardable view that can build metadata for one tx.
void pushBack(uint256 const &v)
An immutable linear range of bytes.
SLE::pointer peek(Keylet const &k) override
Prepare to modify the SLE associated with key.
SLE::const_pointer read(Keylet const &k) const override
Return the state item associated with a key.
void erase(SLE::ref sle) override
Remove a peeked SLE.
bool exists(Keylet const &k) const override
Determine if a state item exists.
Immutable cryptographic account descriptor.
std::string const & human() const
Returns the human readable public key.
AccountID id() const
Returns the Account ID.
A transaction testing environment.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
SLE::const_pointer le(Account const &account) const
Return an account root.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
JTx jt(JsonValue &&jv, FN const &... fN)
Create a JTx from parameters.
beast::Journal const journal
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
Set the expected result code for a JTx The test will fail if the code doesn't match.
Set a ticket sequence on a JTx.
TER deleteSLE(ApplyView &view, SLE::ref sleCredential, beast::Journal j)
bool checkExpired(SLE const &sleCredential, NetClock::time_point const &closed)
Keylet computation functions.
Keylet ownerDir(AccountID const &id) noexcept
The root page of an account's directory.
Keylet account(AccountID const &id) noexcept
AccountID root.
Keylet credential(AccountID const &subject, AccountID const &issuer, Slice const &credType) noexcept
json::Value deleteCred(jtx::Account const &acc, jtx::Account const &subject, jtx::Account const &issuer, std::string_view credType)
json::Value accept(jtx::Account const &subject, jtx::Account const &issuer, std::string_view credType)
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)
Keylet keylet(test::jtx::Account const &subject, test::jtx::Account const &issuer, std::string_view credType)
json::Value authCredentials(jtx::Account const &account, std::vector< AuthorizeCredentials > const &auth)
auto bumpLastPage(Env &env, std::uint64_t newLastPage, Keylet directory, std::function< bool(ApplyView &, uint256, std::uint64_t)> adjust) -> std::expected< void, Error >
Move the position of the last page in the user's directory on open ledger to newLastPage.
auto maximumPageIndex(Env const &env) -> std::uint64_t
bool adjustOwnerNode(ApplyView &view, uint256 key, std::uint64_t page)
Implementation of adjust for the most common ledger entry, i.e.
std::map< uint256, json::Value > getObjects(Account const &account, Env &env, bool withType)
json::Value setTx(AccountID const &account, Credentials const &credentials, std::optional< uint256 > domain)
json::Value create(Account const &account, std::uint32_t count)
Create one of more tickets.
json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
XrpT const XRP
Converts to XRP Issue or STAmount.
json::Value noop(Account const &account)
The null transaction.
std::uint32_t ownerCount(Env const &env, Account const &account)
FeatureBitset testableAmendments()
json::Value acctdelete(Account const &account, Account const &dest)
Delete account.
PrettyAmount drops(Integer i)
Returns an XRP PrettyAmount, which is trivially convertible to STAmount.
bool checkVL(Slice const &result, std::string const &expected)
static XRPAmount reserve(jtx::Env &env, std::uint32_t count)
BEAST_DEFINE_TESTSUITE(AMMClawback, app, xrpl)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
constexpr std::size_t kMaxCredentialTypeLength
The maximum length of a CredentialType inside a Credential.
TER verifyValidDomain(ApplyView &view, AccountID const &account, uint256 domainID, beast::Journal j)
std::string strHex(FwdIt begin, FwdIt end)
std::string to_string(BaseUInt< Bits, Tag > const &a)
void open(soci::session &s, BasicConfig const &config, std::string const &dbName)
Open a soci session.
constexpr std::size_t kMaxCredentialUriLength
The maximum length of a URI inside a Credential.
bool isTesSuccess(TER x) noexcept
TERSubset< CanCvtToTER > TER
AccountID const & xrpAccount()
Compute AccountID from public key.
@ tecINSUFFICIENT_RESERVE
TER verifyDepositPreauth(STTx const &tx, ApplyView &view, AccountID const &src, AccountID const &dst, SLE::const_ref sleDst, beast::Journal j)
void run() override
Runs the suite.
void testDeleteFailed(FeatureBitset features)
void testCredentialsDelete(FeatureBitset features)
void testRemoveExpiredCorruption(FeatureBitset features)
void testCreateFailed(FeatureBitset features)
void testAcceptFailed(FeatureBitset features)
void testFlags(FeatureBitset features)
void testFeatureFailed(FeatureBitset features)
void testSuccessful(FeatureBitset features)