21#include <test/jtx/trust.h>
22#include <xrpl/protocol/Feature.h>
32 return boost::lexical_cast<std::string>(t);
40 if (
auto const sleAcct = env.
le(acct))
41 ret = sleAcct->at(~sfTicketCount).value_or(0);
55 auto const useHigh = src.
id() > dst.
id();
58 Throw<std::runtime_error>(
"No line in getLineFreezeFlag");
65 testcase(
"Enable AllowTrustLineClawback flag");
66 using namespace test::jtx;
72 Env env(*
this, features);
73 Account alice{
"alice"};
75 env.fund(XRP(1000), alice);
97 Env env(*
this, features);
98 Account alice{
"alice"};
100 env.fund(XRP(1000), alice);
122 Env env(*
this, features);
124 Account alice{
"alice"};
127 env.fund(XRP(1000), alice, bob);
130 auto const USD = alice[
"USD"];
134 env.trust(USD(1000), bob);
135 env(pay(alice, bob, USD(10)));
138 BEAST_EXPECT(ownerCount(env, alice) == 0);
139 BEAST_EXPECT(ownerCount(env, bob) == 1);
147 env(trust(bob, USD(0), 0));
148 env(pay(bob, alice, USD(10)));
150 BEAST_EXPECT(ownerCount(env, alice) == 0);
151 BEAST_EXPECT(ownerCount(env, bob) == 0);
158 BEAST_EXPECT(ownerCount(env, alice) == 0);
159 BEAST_EXPECT(ownerCount(env, bob) == 0);
165 Env env(*
this, features - featureClawback);
167 Account alice{
"alice"};
169 env.fund(XRP(1000), alice);
182 env.enableFeature(featureClawback);
196 using namespace test::jtx;
202 Env env(*
this, features - featureClawback);
204 Account alice{
"alice"};
207 env.fund(XRP(1000), alice, bob);
212 auto const USD = alice[
"USD"];
215 env.trust(USD(1000), bob);
216 env(pay(alice, bob, USD(10)));
219 env.require(balance(bob, alice[
"USD"](10)));
220 env.require(balance(alice, bob[
"USD"](-10)));
227 env.enableFeature(featureClawback);
234 env.require(balance(bob, alice[
"USD"](10)));
235 env.require(balance(alice, bob[
"USD"](-10)));
247 Env env(*
this, features);
249 Account alice{
"alice"};
252 env.fund(XRP(1000), alice, bob);
260 auto const USD = alice[
"USD"];
263 env.trust(USD(1000), bob);
264 env(pay(alice, bob, USD(10)));
267 env.require(balance(bob, alice[
"USD"](10)));
268 env.require(balance(alice, bob[
"USD"](-10)));
271 env(claw(alice, bob[
"USD"](5)),
294 env(pay(bob, alice, USD(10)));
298 BEAST_EXPECT(ownerCount(env, alice) == 0);
299 BEAST_EXPECT(ownerCount(env, bob) == 1);
300 env.require(balance(bob, alice[
"USD"](0)));
301 env.require(balance(alice, bob[
"USD"](0)));
308 env(trust(bob, USD(0), 0));
312 BEAST_EXPECT(ownerCount(env, alice) == 0);
313 BEAST_EXPECT(ownerCount(env, bob) == 0);
316 env(claw(alice, bob[
"USD"](5)), ter(
tecNO_LINE));
327 using namespace test::jtx;
331 Env env(*
this, features);
333 Account alice{
"alice"};
337 env.fund(XRP(1000), alice);
353 Env env(*
this, features);
355 Account alice{
"alice"};
357 Account cindy{
"cindy"};
359 env.fund(XRP(1000), alice, bob, cindy);
362 auto const USD = alice[
"USD"];
375 env.trust(USD(1000), bob);
376 env(pay(alice, bob, USD(1000)));
379 env.require(balance(bob, alice[
"USD"](1000)));
380 env.require(balance(alice, bob[
"USD"](-1000)));
384 env(claw(cindy, bob[
"USD"](200)), ter(
tecNO_LINE));
396 Env env(*
this, features);
398 Account alice{
"alice"};
401 env.fund(XRP(1000), alice, bob);
404 auto const USD = alice[
"USD"];
405 auto const CAD = bob[
"CAD"];
424 env.trust(USD(1000), bob);
425 env(pay(alice, bob, USD(10)));
428 env.require(balance(bob, alice[
"USD"](10)));
429 env.require(balance(alice, bob[
"USD"](-10)));
444 env.trust(CAD(1000), alice);
445 env(pay(bob, alice, CAD(10)));
448 env.require(balance(bob, alice[
"CAD"](-10)));
449 env.require(balance(alice, bob[
"CAD"](10)));
463 using namespace test::jtx;
466 Env env(*
this, features);
468 Account alice{
"alice"};
471 env.fund(XRP(1000), alice, bob);
474 auto const USD = alice[
"USD"];
482 env.trust(USD(1000), bob);
483 env(pay(alice, bob, USD(1000)));
486 env.require(balance(bob, alice[
"USD"](1000)));
487 env.require(balance(alice, bob[
"USD"](-1000)));
490 env(claw(alice, bob[
"USD"](200)));
494 env.require(balance(bob, alice[
"USD"](800)));
495 env.require(balance(alice, bob[
"USD"](-800)));
498 env(claw(alice, bob[
"USD"](800)));
502 env.require(balance(bob, alice[
"USD"](0)));
503 env.require(balance(alice, bob[
"USD"](0)));
511 using namespace test::jtx;
517 Env env(*
this, features);
519 Account alice{
"alice"};
521 Account cindy{
"cindy"};
523 env.fund(XRP(1000), alice, bob, cindy);
537 env.trust(alice[
"USD"](1000), cindy);
538 env(pay(alice, cindy, alice[
"USD"](1000)));
542 env.trust(bob[
"USD"](1000), cindy);
543 env(pay(bob, cindy, bob[
"USD"](1000)));
547 env(claw(alice, cindy[
"USD"](200)));
551 env.require(balance(cindy, alice[
"USD"](800)));
552 env.require(balance(alice, cindy[
"USD"](-800)));
555 env.require(balance(cindy, bob[
"USD"](1000)));
556 env.require(balance(bob, cindy[
"USD"](-1000)));
559 env(claw(bob, cindy[
"USD"](600)));
563 env.require(balance(cindy, bob[
"USD"](400)));
564 env.require(balance(bob, cindy[
"USD"](-400)));
567 env.require(balance(cindy, alice[
"USD"](800)));
568 env.require(balance(alice, cindy[
"USD"](-800)));
575 Env env(*
this, features);
577 Account alice{
"alice"};
579 Account cindy{
"cindy"};
581 env.fund(XRP(1000), alice, bob, cindy);
584 auto const USD = alice[
"USD"];
592 env.trust(USD(1000), bob);
593 env(pay(alice, bob, USD(600)));
596 env.require(balance(alice, bob[
"USD"](-600)));
597 env.require(balance(bob, alice[
"USD"](600)));
600 env.trust(USD(1000), cindy);
601 env(pay(alice, cindy, USD(1000)));
604 env.require(balance(alice, cindy[
"USD"](-1000)));
605 env.require(balance(cindy, alice[
"USD"](1000)));
608 env(claw(alice, bob[
"USD"](500)));
612 env.require(balance(alice, bob[
"USD"](-100)));
613 env.require(balance(bob, alice[
"USD"](100)));
616 env.require(balance(alice, cindy[
"USD"](-1000)));
617 env.require(balance(cindy, alice[
"USD"](1000)));
620 env(claw(alice, cindy[
"USD"](300)));
624 env.require(balance(alice, bob[
"USD"](-100)));
625 env.require(balance(bob, alice[
"USD"](100)));
628 env.require(balance(alice, cindy[
"USD"](-700)));
629 env.require(balance(cindy, alice[
"USD"](700)));
637 using namespace test::jtx;
645 Env env(*
this, features);
647 Account alice{
"alice"};
650 env.fund(XRP(1000), alice, bob);
664 env.trust(alice[
"USD"](1000), bob);
665 env(pay(alice, bob, alice[
"USD"](1000)));
668 BEAST_EXPECT(ownerCount(env, alice) == 0);
669 BEAST_EXPECT(ownerCount(env, bob) == 1);
672 env.require(balance(bob, alice[
"USD"](1000)));
673 env.require(balance(alice, bob[
"USD"](-1000)));
676 env.trust(bob[
"USD"](1500), alice);
677 env(pay(bob, alice, bob[
"USD"](1500)));
680 BEAST_EXPECT(ownerCount(env, alice) == 1);
681 BEAST_EXPECT(ownerCount(env, bob) == 1);
685 env.require(balance(bob, alice[
"USD"](-500)));
686 env.require(balance(alice, bob[
"USD"](500)));
698 env(claw(bob, alice[
"USD"](200)));
701 env.require(balance(bob, alice[
"USD"](-300)));
702 env.require(balance(alice, bob[
"USD"](300)));
705 env(pay(alice, bob, alice[
"USD"](1000)));
710 env.require(balance(bob, alice[
"USD"](700)));
711 env.require(balance(alice, bob[
"USD"](-700)));
718 env(claw(alice, bob[
"USD"](200)));
721 env.require(balance(bob, alice[
"USD"](500)));
722 env.require(balance(alice, bob[
"USD"](-500)));
728 testcase(
"Delete default trustline");
729 using namespace test::jtx;
733 Env env(*
this, features);
734 Account alice{
"alice"};
737 env.fund(XRP(1000), alice, bob);
740 auto const USD = alice[
"USD"];
748 env.trust(USD(1000), bob);
749 env(pay(alice, bob, USD(1000)));
752 BEAST_EXPECT(ownerCount(env, alice) == 0);
753 BEAST_EXPECT(ownerCount(env, bob) == 1);
755 env.require(balance(bob, alice[
"USD"](1000)));
756 env.require(balance(alice, bob[
"USD"](-1000)));
759 env(trust(bob, USD(0), 0));
762 BEAST_EXPECT(ownerCount(env, alice) == 0);
763 BEAST_EXPECT(ownerCount(env, bob) == 1);
767 env(claw(alice, bob[
"USD"](1000)));
771 BEAST_EXPECT(ownerCount(env, alice) == 0);
772 BEAST_EXPECT(ownerCount(env, bob) == 0);
779 using namespace test::jtx;
783 Env env(*
this, features);
784 Account alice{
"alice"};
787 env.fund(XRP(1000), alice, bob);
790 auto const USD = alice[
"USD"];
798 env.trust(USD(1000), bob);
799 env(pay(alice, bob, USD(1000)));
802 env.require(balance(bob, alice[
"USD"](1000)));
803 env.require(balance(alice, bob[
"USD"](-1000)));
810 env(claw(alice, bob[
"USD"](200)));
814 env.require(balance(bob, alice[
"USD"](800)));
815 env.require(balance(alice, bob[
"USD"](-800)));
824 testcase(
"Amount exceeds available");
825 using namespace test::jtx;
829 Env env(*
this, features);
830 Account alice{
"alice"};
833 env.fund(XRP(1000), alice, bob);
836 auto const USD = alice[
"USD"];
844 env.trust(USD(1000), bob);
845 env(pay(alice, bob, USD(1000)));
848 env.require(balance(bob, alice[
"USD"](1000)));
849 env.require(balance(alice, bob[
"USD"](-1000)));
852 env(claw(alice, bob[
"USD"](2000)));
857 env.require(balance(bob, alice[
"USD"](0)));
858 env.require(balance(alice, bob[
"USD"](0)));
862 BEAST_EXPECT(ownerCount(env, alice) == 0);
863 BEAST_EXPECT(ownerCount(env, bob) == 1);
866 env(trust(bob, USD(0), 0));
870 BEAST_EXPECT(ownerCount(env, alice) == 0);
871 BEAST_EXPECT(ownerCount(env, bob) == 0);
878 using namespace test::jtx;
881 Env env(*
this, features);
882 Account alice{
"alice"};
885 env.fund(XRP(1000), alice, bob);
888 auto const USD = alice[
"USD"];
896 env.trust(USD(1000), bob);
897 env(pay(alice, bob, USD(100)));
900 env.require(balance(bob, alice[
"USD"](100)));
901 env.require(balance(alice, bob[
"USD"](-100)));
906 env(ticket::create(alice, ticketCnt));
909 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
910 BEAST_EXPECT(ownerCount(env, alice) == ticketCnt);
912 while (ticketCnt > 0)
915 env(claw(alice, bob[
"USD"](5)), ticket::use(aliceTicketSeq++));
919 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
920 BEAST_EXPECT(ownerCount(env, alice) == ticketCnt);
924 env.require(balance(bob, alice[
"USD"](50)));
925 env.require(balance(alice, bob[
"USD"](-50)));
928 BEAST_EXPECT(env.seq(alice) == aliceSeq);
950 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