21#include <test/jtx/trust.h>
22#include <xrpld/ledger/ApplyViewImpl.h>
23#include <xrpl/basics/random.h>
24#include <xrpl/json/to_string.h>
25#include <xrpl/protocol/Feature.h>
26#include <xrpl/protocol/jss.h>
37 return boost::lexical_cast<std::string>(t);
45 if (
auto const sleAcct = env.
le(acct))
46 ret = sleAcct->at(~sfTicketCount).value_or(0);
60 auto const useHigh = src.
id() > dst.
id();
63 Throw<std::runtime_error>(
"No line in getLineFreezeFlag");
70 testcase(
"Enable AllowTrustLineClawback flag");
71 using namespace test::jtx;
77 Env env(*
this, features);
78 Account alice{
"alice"};
80 env.fund(XRP(1000), alice);
102 Env env(*
this, features);
103 Account alice{
"alice"};
105 env.fund(XRP(1000), alice);
127 Env env(*
this, features);
129 Account alice{
"alice"};
132 env.fund(XRP(1000), alice, bob);
135 auto const USD = alice[
"USD"];
139 env.trust(USD(1000), bob);
140 env(pay(alice, bob, USD(10)));
143 BEAST_EXPECT(ownerCount(env, alice) == 0);
144 BEAST_EXPECT(ownerCount(env, bob) == 1);
152 env(trust(bob, USD(0), 0));
153 env(pay(bob, alice, USD(10)));
155 BEAST_EXPECT(ownerCount(env, alice) == 0);
156 BEAST_EXPECT(ownerCount(env, bob) == 0);
163 BEAST_EXPECT(ownerCount(env, alice) == 0);
164 BEAST_EXPECT(ownerCount(env, bob) == 0);
170 Env env(*
this, features - featureClawback);
172 Account alice{
"alice"};
174 env.fund(XRP(1000), alice);
187 env.enableFeature(featureClawback);
201 using namespace test::jtx;
207 Env env(*
this, features - featureClawback);
209 Account alice{
"alice"};
212 env.fund(XRP(1000), alice, bob);
217 auto const USD = alice[
"USD"];
220 env.trust(USD(1000), bob);
221 env(pay(alice, bob, USD(10)));
224 env.require(balance(bob, alice[
"USD"](10)));
225 env.require(balance(alice, bob[
"USD"](-10)));
232 env.enableFeature(featureClawback);
239 env.require(balance(bob, alice[
"USD"](10)));
240 env.require(balance(alice, bob[
"USD"](-10)));
252 Env env(*
this, features);
254 Account alice{
"alice"};
257 env.fund(XRP(1000), alice, bob);
265 auto const USD = alice[
"USD"];
268 env.trust(USD(1000), bob);
269 env(pay(alice, bob, USD(10)));
272 env.require(balance(bob, alice[
"USD"](10)));
273 env.require(balance(alice, bob[
"USD"](-10)));
276 env(claw(alice, bob[
"USD"](5)),
299 env(pay(bob, alice, USD(10)));
303 BEAST_EXPECT(ownerCount(env, alice) == 0);
304 BEAST_EXPECT(ownerCount(env, bob) == 1);
305 env.require(balance(bob, alice[
"USD"](0)));
306 env.require(balance(alice, bob[
"USD"](0)));
313 env(trust(bob, USD(0), 0));
317 BEAST_EXPECT(ownerCount(env, alice) == 0);
318 BEAST_EXPECT(ownerCount(env, bob) == 0);
321 env(claw(alice, bob[
"USD"](5)), ter(
tecNO_LINE));
332 using namespace test::jtx;
336 Env env(*
this, features);
338 Account alice{
"alice"};
342 env.fund(XRP(1000), alice);
358 Env env(*
this, features);
360 Account alice{
"alice"};
362 Account cindy{
"cindy"};
364 env.fund(XRP(1000), alice, bob, cindy);
367 auto const USD = alice[
"USD"];
380 env.trust(USD(1000), bob);
381 env(pay(alice, bob, USD(1000)));
384 env.require(balance(bob, alice[
"USD"](1000)));
385 env.require(balance(alice, bob[
"USD"](-1000)));
389 env(claw(cindy, bob[
"USD"](200)), ter(
tecNO_LINE));
401 Env env(*
this, features);
403 Account alice{
"alice"};
406 env.fund(XRP(1000), alice, bob);
409 auto const USD = alice[
"USD"];
410 auto const CAD = bob[
"CAD"];
429 env.trust(USD(1000), bob);
430 env(pay(alice, bob, USD(10)));
433 env.require(balance(bob, alice[
"USD"](10)));
434 env.require(balance(alice, bob[
"USD"](-10)));
449 env.trust(CAD(1000), alice);
450 env(pay(bob, alice, CAD(10)));
453 env.require(balance(bob, alice[
"CAD"](-10)));
454 env.require(balance(alice, bob[
"CAD"](10)));
468 using namespace test::jtx;
471 Env env(*
this, features);
473 Account alice{
"alice"};
476 env.fund(XRP(1000), alice, bob);
479 auto const USD = alice[
"USD"];
487 env.trust(USD(1000), bob);
488 env(pay(alice, bob, USD(1000)));
491 env.require(balance(bob, alice[
"USD"](1000)));
492 env.require(balance(alice, bob[
"USD"](-1000)));
495 env(claw(alice, bob[
"USD"](200)));
499 env.require(balance(bob, alice[
"USD"](800)));
500 env.require(balance(alice, bob[
"USD"](-800)));
503 env(claw(alice, bob[
"USD"](800)));
507 env.require(balance(bob, alice[
"USD"](0)));
508 env.require(balance(alice, bob[
"USD"](0)));
516 using namespace test::jtx;
522 Env env(*
this, features);
524 Account alice{
"alice"};
526 Account cindy{
"cindy"};
528 env.fund(XRP(1000), alice, bob, cindy);
542 env.trust(alice[
"USD"](1000), cindy);
543 env(pay(alice, cindy, alice[
"USD"](1000)));
547 env.trust(bob[
"USD"](1000), cindy);
548 env(pay(bob, cindy, bob[
"USD"](1000)));
552 env(claw(alice, cindy[
"USD"](200)));
556 env.require(balance(cindy, alice[
"USD"](800)));
557 env.require(balance(alice, cindy[
"USD"](-800)));
560 env.require(balance(cindy, bob[
"USD"](1000)));
561 env.require(balance(bob, cindy[
"USD"](-1000)));
564 env(claw(bob, cindy[
"USD"](600)));
568 env.require(balance(cindy, bob[
"USD"](400)));
569 env.require(balance(bob, cindy[
"USD"](-400)));
572 env.require(balance(cindy, alice[
"USD"](800)));
573 env.require(balance(alice, cindy[
"USD"](-800)));
580 Env env(*
this, features);
582 Account alice{
"alice"};
584 Account cindy{
"cindy"};
586 env.fund(XRP(1000), alice, bob, cindy);
589 auto const USD = alice[
"USD"];
597 env.trust(USD(1000), bob);
598 env(pay(alice, bob, USD(600)));
601 env.require(balance(alice, bob[
"USD"](-600)));
602 env.require(balance(bob, alice[
"USD"](600)));
605 env.trust(USD(1000), cindy);
606 env(pay(alice, cindy, USD(1000)));
609 env.require(balance(alice, cindy[
"USD"](-1000)));
610 env.require(balance(cindy, alice[
"USD"](1000)));
613 env(claw(alice, bob[
"USD"](500)));
617 env.require(balance(alice, bob[
"USD"](-100)));
618 env.require(balance(bob, alice[
"USD"](100)));
621 env.require(balance(alice, cindy[
"USD"](-1000)));
622 env.require(balance(cindy, alice[
"USD"](1000)));
625 env(claw(alice, cindy[
"USD"](300)));
629 env.require(balance(alice, bob[
"USD"](-100)));
630 env.require(balance(bob, alice[
"USD"](100)));
633 env.require(balance(alice, cindy[
"USD"](-700)));
634 env.require(balance(cindy, alice[
"USD"](700)));
642 using namespace test::jtx;
650 Env env(*
this, features);
652 Account alice{
"alice"};
655 env.fund(XRP(1000), alice, bob);
669 env.trust(alice[
"USD"](1000), bob);
670 env(pay(alice, bob, alice[
"USD"](1000)));
673 BEAST_EXPECT(ownerCount(env, alice) == 0);
674 BEAST_EXPECT(ownerCount(env, bob) == 1);
677 env.require(balance(bob, alice[
"USD"](1000)));
678 env.require(balance(alice, bob[
"USD"](-1000)));
681 env.trust(bob[
"USD"](1500), alice);
682 env(pay(bob, alice, bob[
"USD"](1500)));
685 BEAST_EXPECT(ownerCount(env, alice) == 1);
686 BEAST_EXPECT(ownerCount(env, bob) == 1);
690 env.require(balance(bob, alice[
"USD"](-500)));
691 env.require(balance(alice, bob[
"USD"](500)));
703 env(claw(bob, alice[
"USD"](200)));
706 env.require(balance(bob, alice[
"USD"](-300)));
707 env.require(balance(alice, bob[
"USD"](300)));
710 env(pay(alice, bob, alice[
"USD"](1000)));
715 env.require(balance(bob, alice[
"USD"](700)));
716 env.require(balance(alice, bob[
"USD"](-700)));
723 env(claw(alice, bob[
"USD"](200)));
726 env.require(balance(bob, alice[
"USD"](500)));
727 env.require(balance(alice, bob[
"USD"](-500)));
733 testcase(
"Delete default trustline");
734 using namespace test::jtx;
738 Env env(*
this, features);
739 Account alice{
"alice"};
742 env.fund(XRP(1000), alice, bob);
745 auto const USD = alice[
"USD"];
753 env.trust(USD(1000), bob);
754 env(pay(alice, bob, USD(1000)));
757 BEAST_EXPECT(ownerCount(env, alice) == 0);
758 BEAST_EXPECT(ownerCount(env, bob) == 1);
760 env.require(balance(bob, alice[
"USD"](1000)));
761 env.require(balance(alice, bob[
"USD"](-1000)));
764 env(trust(bob, USD(0), 0));
767 BEAST_EXPECT(ownerCount(env, alice) == 0);
768 BEAST_EXPECT(ownerCount(env, bob) == 1);
772 env(claw(alice, bob[
"USD"](1000)));
776 BEAST_EXPECT(ownerCount(env, alice) == 0);
777 BEAST_EXPECT(ownerCount(env, bob) == 0);
784 using namespace test::jtx;
788 Env env(*
this, features);
789 Account alice{
"alice"};
792 env.fund(XRP(1000), alice, bob);
795 auto const USD = alice[
"USD"];
803 env.trust(USD(1000), bob);
804 env(pay(alice, bob, USD(1000)));
807 env.require(balance(bob, alice[
"USD"](1000)));
808 env.require(balance(alice, bob[
"USD"](-1000)));
815 env(claw(alice, bob[
"USD"](200)));
819 env.require(balance(bob, alice[
"USD"](800)));
820 env.require(balance(alice, bob[
"USD"](-800)));
829 testcase(
"Amount exceeds available");
830 using namespace test::jtx;
834 Env env(*
this, features);
835 Account alice{
"alice"};
838 env.fund(XRP(1000), alice, bob);
841 auto const USD = alice[
"USD"];
849 env.trust(USD(1000), bob);
850 env(pay(alice, bob, USD(1000)));
853 env.require(balance(bob, alice[
"USD"](1000)));
854 env.require(balance(alice, bob[
"USD"](-1000)));
857 env(claw(alice, bob[
"USD"](2000)));
862 env.require(balance(bob, alice[
"USD"](0)));
863 env.require(balance(alice, bob[
"USD"](0)));
867 BEAST_EXPECT(ownerCount(env, alice) == 0);
868 BEAST_EXPECT(ownerCount(env, bob) == 1);
871 env(trust(bob, USD(0), 0));
875 BEAST_EXPECT(ownerCount(env, alice) == 0);
876 BEAST_EXPECT(ownerCount(env, bob) == 0);
883 using namespace test::jtx;
886 Env env(*
this, features);
887 Account alice{
"alice"};
890 env.fund(XRP(1000), alice, bob);
893 auto const USD = alice[
"USD"];
901 env.trust(USD(1000), bob);
902 env(pay(alice, bob, USD(100)));
905 env.require(balance(bob, alice[
"USD"](100)));
906 env.require(balance(alice, bob[
"USD"](-100)));
911 env(ticket::create(alice, ticketCnt));
914 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
915 BEAST_EXPECT(ownerCount(env, alice) == ticketCnt);
917 while (ticketCnt > 0)
920 env(claw(alice, bob[
"USD"](5)), ticket::use(aliceTicketSeq++));
924 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
925 BEAST_EXPECT(ownerCount(env, alice) == ticketCnt);
929 env.require(balance(bob, alice[
"USD"](50)));
930 env.require(balance(alice, bob[
"USD"](-50)));
933 BEAST_EXPECT(env.seq(alice) == aliceSeq);
955 using namespace test::jtx;
testcase_t testcase
Memberspace for declaring test cases.
void testDeleteDefaultLine(FeatureBitset features)
void testPermission(FeatureBitset features)
void testBidirectionalLine(FeatureBitset features)
void testAmountExceedsAvailable(FeatureBitset features)
void run() override
Runs the suite.
static std::uint32_t ticketCount(test::jtx::Env const &env, test::jtx::Account const &acct)
static bool getLineFreezeFlag(test::jtx::Env const &env, test::jtx::Account const &src, test::jtx::Account const &dst, Currency const &cur)
void testTickets(FeatureBitset features)
void testWithFeats(FeatureBitset features)
static std::string to_string(T const &t)
void testMultiLine(FeatureBitset features)
void testFrozenLine(FeatureBitset features)
void testEnabled(FeatureBitset features)
void testAllowTrustLineClawbackFlag(FeatureBitset features)
void testValidation(FeatureBitset features)
Immutable cryptographic account descriptor.
AccountID id() const
Returns the Account ID.
A transaction testing environment.
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
Keylet line(AccountID const &id0, AccountID const &id1, Currency const ¤cy) noexcept
The index of a trust line for a given currency.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::uint32_t asfNoFreeze
constexpr std::uint32_t asfAllowTrustLineClawback
constexpr std::uint32_t tfSetFreeze