21#include <xrpl/protocol/AmountConversions.h>
22#include <xrpl/protocol/Feature.h>
23#include <xrpl/protocol/Quality.h>
24#include <xrpl/protocol/Rate.h>
25#include <xrpl/protocol/jss.h>
37 using namespace test::jtx;
39 Account
const alice(
"alice");
40 env.fund(XRP(10000), noripple(alice));
42 auto const jrr = env.le(alice);
43 BEAST_EXPECT(jrr && jrr->at(sfFlags) == 0u);
51 using namespace test::jtx;
52 Account
const alice(
"alice");
55 Env env(*
this, supported_amendments() - featureDepositAuth);
56 env.fund(XRP(10000), noripple(alice));
61 env(regkey(alice, alie));
64 auto testFlags = [
this, &alice, &alie, &env](
68 flag < std::numeric_limits<std::uint32_t>::digits;
102 if (
std::find(goodFlags.begin(), goodFlags.end(), flag) !=
106 env.require(nflags(alice, flag));
107 env(fset(alice, flag), sig(alice));
109 env.require(flags(alice, flag));
110 env(fclear(alice, flag), sig(alie));
112 env.require(nflags(alice, flag));
114 BEAST_EXPECT(now_flags == orig_flags);
119 BEAST_EXPECT((*env.le(alice))[sfFlags] == orig_flags);
120 env(fset(alice, flag), sig(alice));
122 BEAST_EXPECT((*env.le(alice))[sfFlags] == orig_flags);
123 env(fclear(alice, flag), sig(alie));
125 BEAST_EXPECT((*env.le(alice))[sfFlags] == orig_flags);
140 env.enableFeature(featureDepositAuth);
155 testcase(
"Set and reset AccountTxnID");
157 using namespace test::jtx;
159 Account
const alice(
"alice");
160 env.fund(XRP(10000), noripple(alice));
166 BEAST_EXPECT(!env.le(alice)->isFieldPresent(sfAccountTxnID));
168 BEAST_EXPECT(env.le(alice)->isFieldPresent(sfAccountTxnID));
170 BEAST_EXPECT(!env.le(alice)->isFieldPresent(sfAccountTxnID));
172 BEAST_EXPECT(now_flags == orig_flags);
180 using namespace test::jtx;
182 Account
const alice(
"alice");
183 env.fund(XRP(10000), noripple(alice));
185 env(regkey(alice,
"eric"));
201 using namespace test::jtx;
203 Account
const alice(
"alice");
204 env.fund(XRP(10000), alice);
205 auto jt = noop(alice);
213 jt[sfDomain.fieldName] =
strHex(domain);
215 BEAST_EXPECT((*env.le(alice))[sfDomain] ==
makeSlice(domain));
217 jt[sfDomain.fieldName] =
"";
219 BEAST_EXPECT(!env.le(alice)->isFieldPresent(sfDomain));
225 for (
std::size_t len = maxLength - 1; len <= maxLength + 1; ++len)
230 BEAST_EXPECT(domain2.
length() == len);
232 jt[sfDomain.fieldName] =
strHex(domain2);
234 if (len <= maxLength)
237 BEAST_EXPECT((*env.le(alice))[sfDomain] ==
makeSlice(domain2));
251 using namespace test::jtx;
253 Account
const alice(
"alice");
254 env.fund(XRP(10000), alice);
255 auto jt = noop(alice);
258 jt[sfMessageKey.fieldName] =
strHex(rkp.first.slice());
261 strHex((*env.le(alice))[sfMessageKey]) ==
262 strHex(rkp.first.slice()));
264 jt[sfMessageKey.fieldName] =
"";
266 BEAST_EXPECT(!env.le(alice)->isFieldPresent(sfMessageKey));
268 using namespace std::string_literals;
269 jt[sfMessageKey.fieldName] =
strHex(
"NOT_REALLY_A_PUBKEY"s);
278 using namespace test::jtx;
280 Account
const alice(
"alice");
281 env.fund(XRP(10000), alice);
282 auto jt = noop(alice);
285 "9633EC8AF54F16B5286DB1D7B519EF49EEFC050C0C8AC4384F1D88ACD1BFDF05";
286 jt[sfWalletLocator.fieldName] = locator;
288 BEAST_EXPECT(
to_string((*env.le(alice))[sfWalletLocator]) == locator);
290 jt[sfWalletLocator.fieldName] =
"";
292 BEAST_EXPECT(!env.le(alice)->isFieldPresent(sfWalletLocator));
300 using namespace test::jtx;
302 Account
const alice(
"alice");
303 env.fund(XRP(10000), alice);
304 auto jt = noop(alice);
306 std::string const mh(
"5F31A79367DC3137FADA860C05742EE6");
307 jt[sfEmailHash.fieldName] = mh;
309 BEAST_EXPECT(
to_string((*env.le(alice))[sfEmailHash]) == mh);
311 jt[sfEmailHash.fieldName] =
"";
313 BEAST_EXPECT(!env.le(alice)->isFieldPresent(sfEmailHash));
328 using namespace test::jtx;
329 auto doTests = [
this](
332 Env env(*
this, features);
334 Account
const alice(
"alice");
335 env.fund(XRP(10000), alice);
337 for (
auto const& r : testData)
339 env(rate(alice, r.set), ter(r.code));
343 if (!(*env.le(alice))[~sfTransferRate])
344 BEAST_EXPECT(r.get == 1.0);
347 *(*env.le(alice))[~sfTransferRate] ==
348 r.get * QUALITY_ONE);
353 supported_amendments(),
368 using namespace test::jtx;
370 Account
const alice(
"alice");
371 Account
const bob(
"bob");
372 Account
const gw(
"gateway");
373 auto const USD = gw[
"USD"];
380 env.fund(XRP(10000), gw, alice, bob);
382 env.trust(USD(10), alice, bob);
387 auto const amount = USD(1);
389 auto const amountWithRate =
392 env(pay(gw, alice, USD(10)));
394 env(pay(alice, bob, USD(1)), sendmax(USD(10)));
397 env.require(balance(alice, USD(10) - amountWithRate));
398 env.require(balance(bob, USD(1)));
412 env.fund(XRP(10000), gw, alice, bob);
414 env.trust(USD(10), alice, bob);
428 uint256 const nftId0{token::getNextID(env, gw, 0u)};
429 env(token::mint(gw, 0u));
432 env(token::burn(gw, nftId0));
439 env.app().openLedger().modify(
448 auto replacement = std::make_shared<SLE>(*sle, sle->key());
449 (*replacement)[sfTransferRate] =
455 auto const amount = USD(1);
459 env(pay(gw, alice, USD(10)));
460 env(pay(alice, bob, amount), sendmax(USD(10)));
462 env.require(balance(alice, USD(10) - amountWithRate));
463 env.require(balance(bob, amount));
472 using namespace test::jtx;
474 Account
const alice(
"alice");
475 env.fund(XRP(10000), alice);
515 using namespace test::jtx;
517 Account
const alice(
"alice");
518 Account
const bob(
"bob");
520 env.fund(XRP(10000), alice);
527 env(signers(alice, 1, {{bob, 1}}));
544 using namespace test::jtx;
546 Account
const alice(
"alice");
548 env.fund(XRP(10000), alice);
552 env(ticket::create(alice, 1));
554 env.require(owners(alice, 1), tickets(alice, 1));
557 env(noop(alice), ticket::use(ticketSeq + 1), ter(
terPRE_TICKET));
559 env.require(owners(alice, 1), tickets(alice, 1));
564 env(noop(alice), ticket::use(ticketSeq));
566 env.require(owners(alice, 0), tickets(alice, 0));
567 BEAST_EXPECT(aliceSeq == env.seq(alice));
570 env(noop(alice), ticket::use(ticketSeq), ter(
tefNO_TICKET));
A generic endpoint for log messages.
testcase_t testcase
Memberspace for declaring test cases.
void testNullAccountSet()
void testSetAndResetAccountTxnID()
void testRequireAuthWithDir()
void run() override
Runs the suite.
Writable ledger view that accumulates state and tx changes.
std::shared_ptr< SLE const > read(Keylet const &k) const override
Return the state item associated with a key.
void rawReplace(std::shared_ptr< SLE > const &sle) override
Unconditionally replace a state item.
Keylet account(AccountID const &id) noexcept
AccountID root.
Keylet ownerDir(AccountID const &id) noexcept
The root page of an account's directory.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::uint32_t tfAllowXRP
constexpr std::uint32_t asfGlobalFreeze
constexpr std::uint32_t asfDepositAuth
constexpr std::uint32_t asfDisallowIncomingNFTokenOffer
constexpr std::uint32_t asfRequireDest
STAmount toAmount< STAmount >(STAmount const &amt)
Rate transferRate(ReadView const &view, AccountID const &issuer)
Returns IOU issuer transfer fee as Rate.
constexpr std::uint32_t asfAuthorizedNFTokenMinter
constexpr std::uint32_t tfOptionalDestTag
constexpr std::uint32_t tfAccountSetMask
bool set(T &target, std::string const &name, Section const §ion)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
STAmount multiply(STAmount const &amount, Rate const &rate)
constexpr std::uint32_t asfNoFreeze
constexpr std::uint32_t asfDisableMaster
constexpr std::uint32_t asfDisallowIncomingTrustline
std::string strHex(FwdIt begin, FwdIt end)
constexpr std::uint32_t asfAccountTxnID
constexpr std::uint32_t asfDefaultRipple
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
constexpr std::uint32_t asfDisallowIncomingCheck
constexpr std::uint32_t tfOptionalAuth
std::string to_string(base_uint< Bits, Tag > const &a)
constexpr std::uint32_t asfDisallowIncomingPayChan
T get(Section const §ion, std::string const &name, T const &defaultValue=T{})
Retrieve a key/value pair from a section.
std::pair< PublicKey, SecretKey > randomKeyPair(KeyType type)
Create a key pair using secure random numbers.
constexpr std::uint32_t asfAllowTrustLineClawback
constexpr std::uint32_t asfRequireAuth
bool dirIsEmpty(ReadView const &view, Keylet const &k)
Returns true if the directory is empty.
constexpr std::uint32_t asfDisallowXRP
Represents a transfer rate.