20 #include <ripple/basics/random.h>
21 #include <ripple/json/to_string.h>
22 #include <ripple/ledger/ApplyViewImpl.h>
23 #include <ripple/protocol/Feature.h>
24 #include <ripple/protocol/jss.h>
27 #include <test/jtx/trust.h>
37 return boost::lexical_cast<std::string>(t);
45 if (
auto const sleAcct = env.
le(acct))
55 if (
auto const sleAcct = env.
le(acct))
70 auto const useHigh = src.
id() > dst.
id();
73 Throw<std::runtime_error>(
"No line in getLineFreezeFlag");
80 testcase(
"Enable AllowTrustLineClawback flag");
81 using namespace test::jtx;
87 Env env(*
this, features);
88 Account alice{
"alice"};
90 env.fund(XRP(1000), alice);
112 Env env(*
this, features);
113 Account alice{
"alice"};
115 env.fund(XRP(1000), alice);
137 Env env(*
this, features);
139 Account alice{
"alice"};
142 env.fund(XRP(1000), alice, bob);
145 auto const USD = alice[
"USD"];
149 env.trust(USD(1000), bob);
150 env(pay(alice, bob, USD(10)));
162 env(trust(bob, USD(0), 0));
163 env(pay(bob, alice, USD(10)));
182 Account alice{
"alice"};
184 env.fund(XRP(1000), alice);
210 testcase(
"Validation");
211 using namespace test::jtx;
219 Account alice{
"alice"};
222 env.fund(XRP(1000), alice, bob);
227 auto const USD = alice[
"USD"];
230 env.trust(USD(1000), bob);
231 env(pay(alice, bob, USD(10)));
234 env.require(balance(bob, alice[
"USD"](10)));
235 env.require(balance(alice, bob[
"USD"](-10)));
249 env.require(balance(bob, alice[
"USD"](10)));
250 env.require(balance(alice, bob[
"USD"](-10)));
262 Env env(*
this, features);
264 Account alice{
"alice"};
267 env.fund(XRP(1000), alice, bob);
275 auto const USD = alice[
"USD"];
278 env.trust(USD(1000), bob);
279 env(pay(alice, bob, USD(10)));
282 env.require(balance(bob, alice[
"USD"](10)));
283 env.require(balance(alice, bob[
"USD"](-10)));
286 env(claw(alice, bob[
"USD"](5)),
309 env(pay(bob, alice, USD(10)));
315 env.require(balance(bob, alice[
"USD"](0)));
316 env.require(balance(alice, bob[
"USD"](0)));
323 env(trust(bob, USD(0), 0));
331 env(claw(alice, bob[
"USD"](5)), ter(
tecNO_LINE));
341 testcase(
"Permission");
342 using namespace test::jtx;
346 Env env(*
this, features);
348 Account alice{
"alice"};
352 env.fund(XRP(1000), alice);
368 Env env(*
this, features);
370 Account alice{
"alice"};
372 Account cindy{
"cindy"};
374 env.fund(XRP(1000), alice, bob, cindy);
377 auto const USD = alice[
"USD"];
390 env.trust(USD(1000), bob);
391 env(pay(alice, bob, USD(1000)));
394 env.require(balance(bob, alice[
"USD"](1000)));
395 env.require(balance(alice, bob[
"USD"](-1000)));
399 env(claw(cindy, bob[
"USD"](200)), ter(
tecNO_LINE));
411 Env env(*
this, features);
413 Account alice{
"alice"};
416 env.fund(XRP(1000), alice, bob);
419 auto const USD = alice[
"USD"];
420 auto const CAD = bob[
"CAD"];
439 env.trust(USD(1000), bob);
440 env(pay(alice, bob, USD(10)));
443 env.require(balance(bob, alice[
"USD"](10)));
444 env.require(balance(alice, bob[
"USD"](-10)));
459 env.trust(CAD(1000), alice);
460 env(pay(bob, alice, CAD(10)));
463 env.require(balance(bob, alice[
"CAD"](-10)));
464 env.require(balance(alice, bob[
"CAD"](10)));
477 testcase(
"Enable clawback");
478 using namespace test::jtx;
481 Env env(*
this, features);
483 Account alice{
"alice"};
486 env.fund(XRP(1000), alice, bob);
489 auto const USD = alice[
"USD"];
497 env.trust(USD(1000), bob);
498 env(pay(alice, bob, USD(1000)));
501 env.require(balance(bob, alice[
"USD"](1000)));
502 env.require(balance(alice, bob[
"USD"](-1000)));
505 env(claw(alice, bob[
"USD"](200)));
509 env.require(balance(bob, alice[
"USD"](800)));
510 env.require(balance(alice, bob[
"USD"](-800)));
513 env(claw(alice, bob[
"USD"](800)));
517 env.require(balance(bob, alice[
"USD"](0)));
518 env.require(balance(alice, bob[
"USD"](0)));
525 testcase(
"Multi line");
526 using namespace test::jtx;
532 Env env(*
this, features);
534 Account alice{
"alice"};
536 Account cindy{
"cindy"};
538 env.fund(XRP(1000), alice, bob, cindy);
552 env.trust(alice[
"USD"](1000), cindy);
553 env(pay(alice, cindy, alice[
"USD"](1000)));
557 env.trust(bob[
"USD"](1000), cindy);
558 env(pay(bob, cindy, bob[
"USD"](1000)));
562 env(claw(alice, cindy[
"USD"](200)));
566 env.require(balance(cindy, alice[
"USD"](800)));
567 env.require(balance(alice, cindy[
"USD"](-800)));
570 env.require(balance(cindy, bob[
"USD"](1000)));
571 env.require(balance(bob, cindy[
"USD"](-1000)));
574 env(claw(bob, cindy[
"USD"](600)));
578 env.require(balance(cindy, bob[
"USD"](400)));
579 env.require(balance(bob, cindy[
"USD"](-400)));
582 env.require(balance(cindy, alice[
"USD"](800)));
583 env.require(balance(alice, cindy[
"USD"](-800)));
590 Env env(*
this, features);
592 Account alice{
"alice"};
594 Account cindy{
"cindy"};
596 env.fund(XRP(1000), alice, bob, cindy);
599 auto const USD = alice[
"USD"];
607 env.trust(USD(1000), bob);
608 env(pay(alice, bob, USD(600)));
611 env.require(balance(alice, bob[
"USD"](-600)));
612 env.require(balance(bob, alice[
"USD"](600)));
615 env.trust(USD(1000), cindy);
616 env(pay(alice, cindy, USD(1000)));
619 env.require(balance(alice, cindy[
"USD"](-1000)));
620 env.require(balance(cindy, alice[
"USD"](1000)));
623 env(claw(alice, bob[
"USD"](500)));
627 env.require(balance(alice, bob[
"USD"](-100)));
628 env.require(balance(bob, alice[
"USD"](100)));
631 env.require(balance(alice, cindy[
"USD"](-1000)));
632 env.require(balance(cindy, alice[
"USD"](1000)));
635 env(claw(alice, cindy[
"USD"](300)));
639 env.require(balance(alice, bob[
"USD"](-100)));
640 env.require(balance(bob, alice[
"USD"](100)));
643 env.require(balance(alice, cindy[
"USD"](-700)));
644 env.require(balance(cindy, alice[
"USD"](700)));
651 testcase(
"Bidirectional line");
652 using namespace test::jtx;
660 Env env(*
this, features);
662 Account alice{
"alice"};
665 env.fund(XRP(1000), alice, bob);
679 env.trust(alice[
"USD"](1000), bob);
680 env(pay(alice, bob, alice[
"USD"](1000)));
687 env.require(balance(bob, alice[
"USD"](1000)));
688 env.require(balance(alice, bob[
"USD"](-1000)));
691 env.trust(bob[
"USD"](1500), alice);
692 env(pay(bob, alice, bob[
"USD"](1500)));
700 env.require(balance(bob, alice[
"USD"](-500)));
701 env.require(balance(alice, bob[
"USD"](500)));
713 env(claw(bob, alice[
"USD"](200)));
716 env.require(balance(bob, alice[
"USD"](-300)));
717 env.require(balance(alice, bob[
"USD"](300)));
720 env(pay(alice, bob, alice[
"USD"](1000)));
725 env.require(balance(bob, alice[
"USD"](700)));
726 env.require(balance(alice, bob[
"USD"](-700)));
733 env(claw(alice, bob[
"USD"](200)));
736 env.require(balance(bob, alice[
"USD"](500)));
737 env.require(balance(alice, bob[
"USD"](-500)));
743 testcase(
"Delete default trustline");
744 using namespace test::jtx;
748 Env env(*
this, features);
749 Account alice{
"alice"};
752 env.fund(XRP(1000), alice, bob);
755 auto const USD = alice[
"USD"];
763 env.trust(USD(1000), bob);
764 env(pay(alice, bob, USD(1000)));
770 env.require(balance(bob, alice[
"USD"](1000)));
771 env.require(balance(alice, bob[
"USD"](-1000)));
774 env(trust(bob, USD(0), 0));
782 env(claw(alice, bob[
"USD"](1000)));
793 testcase(
"Frozen trustline");
794 using namespace test::jtx;
798 Env env(*
this, features);
799 Account alice{
"alice"};
802 env.fund(XRP(1000), alice, bob);
805 auto const USD = alice[
"USD"];
813 env.trust(USD(1000), bob);
814 env(pay(alice, bob, USD(1000)));
817 env.require(balance(bob, alice[
"USD"](1000)));
818 env.require(balance(alice, bob[
"USD"](-1000)));
825 env(claw(alice, bob[
"USD"](200)));
829 env.require(balance(bob, alice[
"USD"](800)));
830 env.require(balance(alice, bob[
"USD"](-800)));
839 testcase(
"Amount exceeds available");
840 using namespace test::jtx;
844 Env env(*
this, features);
845 Account alice{
"alice"};
848 env.fund(XRP(1000), alice, bob);
851 auto const USD = alice[
"USD"];
859 env.trust(USD(1000), bob);
860 env(pay(alice, bob, USD(1000)));
863 env.require(balance(bob, alice[
"USD"](1000)));
864 env.require(balance(alice, bob[
"USD"](-1000)));
867 env(claw(alice, bob[
"USD"](2000)));
872 env.require(balance(bob, alice[
"USD"](0)));
873 env.require(balance(alice, bob[
"USD"](0)));
881 env(trust(bob, USD(0), 0));
893 using namespace test::jtx;
896 Env env(*
this, features);
897 Account alice{
"alice"};
900 env.fund(XRP(1000), alice, bob);
903 auto const USD = alice[
"USD"];
911 env.trust(USD(1000), bob);
912 env(pay(alice, bob, USD(100)));
915 env.require(balance(bob, alice[
"USD"](100)));
916 env.require(balance(alice, bob[
"USD"](-100)));
921 env(ticket::create(alice, ticketCnt));
924 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
925 BEAST_EXPECT(
ownerCount(env, alice) == ticketCnt);
927 while (ticketCnt > 0)
930 env(claw(alice, bob[
"USD"](5)), ticket::use(aliceTicketSeq++));
934 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
935 BEAST_EXPECT(
ownerCount(env, alice) == ticketCnt);
939 env.require(balance(bob, alice[
"USD"](50)));
940 env.require(balance(alice, bob[
"USD"](-50)));
943 BEAST_EXPECT(env.seq(alice) == aliceSeq);
965 using namespace test::jtx;