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 AllowClawback 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);
136 Env env(*
this, features);
138 Account alice{
"alice"};
141 env.fund(XRP(1000), alice, bob);
144 auto const USD = alice[
"USD"];
148 env.trust(USD(1000), bob);
149 env(pay(alice, bob, USD(10)));
161 env(trust(bob, USD(0), 0));
162 env(pay(bob, alice, USD(10)));
181 Account alice{
"alice"};
183 env.fund(XRP(1000), alice);
208 testcase(
"Validation");
209 using namespace test::jtx;
217 Account alice{
"alice"};
220 env.fund(XRP(1000), alice, bob);
225 auto const USD = alice[
"USD"];
228 env.trust(USD(1000), bob);
229 env(pay(alice, bob, USD(10)));
232 env.require(balance(bob, alice[
"USD"](10)));
233 env.require(balance(alice, bob[
"USD"](-10)));
247 env.require(balance(bob, alice[
"USD"](10)));
248 env.require(balance(alice, bob[
"USD"](-10)));
260 Env env(*
this, features);
262 Account alice{
"alice"};
265 env.fund(XRP(1000), alice, bob);
273 auto const USD = alice[
"USD"];
276 env.trust(USD(1000), bob);
277 env(pay(alice, bob, USD(10)));
280 env.require(balance(bob, alice[
"USD"](10)));
281 env.require(balance(alice, bob[
"USD"](-10)));
284 env(claw(alice, bob[
"USD"](5)),
307 env(pay(bob, alice, USD(10)));
313 env.require(balance(bob, alice[
"USD"](0)));
314 env.require(balance(alice, bob[
"USD"](0)));
321 env(trust(bob, USD(0), 0));
329 env(claw(alice, bob[
"USD"](5)), ter(
tecNO_LINE));
339 testcase(
"Permission");
340 using namespace test::jtx;
344 Env env(*
this, features);
346 Account alice{
"alice"};
350 env.fund(XRP(1000), alice);
366 Env env(*
this, features);
368 Account alice{
"alice"};
370 Account cindy{
"cindy"};
372 env.fund(XRP(1000), alice, bob, cindy);
375 auto const USD = alice[
"USD"];
388 env.trust(USD(1000), bob);
389 env(pay(alice, bob, USD(1000)));
392 env.require(balance(bob, alice[
"USD"](1000)));
393 env.require(balance(alice, bob[
"USD"](-1000)));
397 env(claw(cindy, bob[
"USD"](200)), ter(
tecNO_LINE));
409 Env env(*
this, features);
411 Account alice{
"alice"};
414 env.fund(XRP(1000), alice, bob);
417 auto const USD = alice[
"USD"];
418 auto const CAD = bob[
"CAD"];
437 env.trust(USD(1000), bob);
438 env(pay(alice, bob, USD(10)));
441 env.require(balance(bob, alice[
"USD"](10)));
442 env.require(balance(alice, bob[
"USD"](-10)));
457 env.trust(CAD(1000), alice);
458 env(pay(bob, alice, CAD(10)));
461 env.require(balance(bob, alice[
"CAD"](-10)));
462 env.require(balance(alice, bob[
"CAD"](10)));
475 testcase(
"Enable clawback");
476 using namespace test::jtx;
479 Env env(*
this, features);
481 Account alice{
"alice"};
484 env.fund(XRP(1000), alice, bob);
487 auto const USD = alice[
"USD"];
495 env.trust(USD(1000), bob);
496 env(pay(alice, bob, USD(1000)));
499 env.require(balance(bob, alice[
"USD"](1000)));
500 env.require(balance(alice, bob[
"USD"](-1000)));
503 env(claw(alice, bob[
"USD"](200)));
507 env.require(balance(bob, alice[
"USD"](800)));
508 env.require(balance(alice, bob[
"USD"](-800)));
511 env(claw(alice, bob[
"USD"](800)));
515 env.require(balance(bob, alice[
"USD"](0)));
516 env.require(balance(alice, bob[
"USD"](0)));
523 testcase(
"Multi line");
524 using namespace test::jtx;
530 Env env(*
this, features);
532 Account alice{
"alice"};
534 Account cindy{
"cindy"};
536 env.fund(XRP(1000), alice, bob, cindy);
550 env.trust(alice[
"USD"](1000), cindy);
551 env(pay(alice, cindy, alice[
"USD"](1000)));
555 env.trust(bob[
"USD"](1000), cindy);
556 env(pay(bob, cindy, bob[
"USD"](1000)));
560 env(claw(alice, cindy[
"USD"](200)));
564 env.require(balance(cindy, alice[
"USD"](800)));
565 env.require(balance(alice, cindy[
"USD"](-800)));
568 env.require(balance(cindy, bob[
"USD"](1000)));
569 env.require(balance(bob, cindy[
"USD"](-1000)));
572 env(claw(bob, cindy[
"USD"](600)));
576 env.require(balance(cindy, bob[
"USD"](400)));
577 env.require(balance(bob, cindy[
"USD"](-400)));
580 env.require(balance(cindy, alice[
"USD"](800)));
581 env.require(balance(alice, cindy[
"USD"](-800)));
588 Env env(*
this, features);
590 Account alice{
"alice"};
592 Account cindy{
"cindy"};
594 env.fund(XRP(1000), alice, bob, cindy);
597 auto const USD = alice[
"USD"];
605 env.trust(USD(1000), bob);
606 env(pay(alice, bob, USD(600)));
609 env.require(balance(alice, bob[
"USD"](-600)));
610 env.require(balance(bob, alice[
"USD"](600)));
613 env.trust(USD(1000), cindy);
614 env(pay(alice, cindy, USD(1000)));
617 env.require(balance(alice, cindy[
"USD"](-1000)));
618 env.require(balance(cindy, alice[
"USD"](1000)));
621 env(claw(alice, bob[
"USD"](500)));
625 env.require(balance(alice, bob[
"USD"](-100)));
626 env.require(balance(bob, alice[
"USD"](100)));
629 env.require(balance(alice, cindy[
"USD"](-1000)));
630 env.require(balance(cindy, alice[
"USD"](1000)));
633 env(claw(alice, cindy[
"USD"](300)));
637 env.require(balance(alice, bob[
"USD"](-100)));
638 env.require(balance(bob, alice[
"USD"](100)));
641 env.require(balance(alice, cindy[
"USD"](-700)));
642 env.require(balance(cindy, alice[
"USD"](700)));
649 testcase(
"Bidirectional line");
650 using namespace test::jtx;
658 Env env(*
this, features);
660 Account alice{
"alice"};
663 env.fund(XRP(1000), alice, bob);
677 env.trust(alice[
"USD"](1000), bob);
678 env(pay(alice, bob, alice[
"USD"](1000)));
685 env.require(balance(bob, alice[
"USD"](1000)));
686 env.require(balance(alice, bob[
"USD"](-1000)));
689 env.trust(bob[
"USD"](1500), alice);
690 env(pay(bob, alice, bob[
"USD"](1500)));
698 env.require(balance(bob, alice[
"USD"](-500)));
699 env.require(balance(alice, bob[
"USD"](500)));
711 env(claw(bob, alice[
"USD"](200)));
714 env.require(balance(bob, alice[
"USD"](-300)));
715 env.require(balance(alice, bob[
"USD"](300)));
718 env(pay(alice, bob, alice[
"USD"](1000)));
723 env.require(balance(bob, alice[
"USD"](700)));
724 env.require(balance(alice, bob[
"USD"](-700)));
731 env(claw(alice, bob[
"USD"](200)));
734 env.require(balance(bob, alice[
"USD"](500)));
735 env.require(balance(alice, bob[
"USD"](-500)));
741 testcase(
"Delete default trustline");
742 using namespace test::jtx;
746 Env env(*
this, features);
747 Account alice{
"alice"};
750 env.fund(XRP(1000), alice, bob);
753 auto const USD = alice[
"USD"];
761 env.trust(USD(1000), bob);
762 env(pay(alice, bob, USD(1000)));
768 env.require(balance(bob, alice[
"USD"](1000)));
769 env.require(balance(alice, bob[
"USD"](-1000)));
772 env(trust(bob, USD(0), 0));
780 env(claw(alice, bob[
"USD"](1000)));
791 testcase(
"Frozen trustline");
792 using namespace test::jtx;
796 Env env(*
this, features);
797 Account alice{
"alice"};
800 env.fund(XRP(1000), alice, bob);
803 auto const USD = alice[
"USD"];
811 env.trust(USD(1000), bob);
812 env(pay(alice, bob, USD(1000)));
815 env.require(balance(bob, alice[
"USD"](1000)));
816 env.require(balance(alice, bob[
"USD"](-1000)));
823 env(claw(alice, bob[
"USD"](200)));
827 env.require(balance(bob, alice[
"USD"](800)));
828 env.require(balance(alice, bob[
"USD"](-800)));
837 testcase(
"Amount exceeds available");
838 using namespace test::jtx;
842 Env env(*
this, features);
843 Account alice{
"alice"};
846 env.fund(XRP(1000), alice, bob);
849 auto const USD = alice[
"USD"];
857 env.trust(USD(1000), bob);
858 env(pay(alice, bob, USD(1000)));
861 env.require(balance(bob, alice[
"USD"](1000)));
862 env.require(balance(alice, bob[
"USD"](-1000)));
865 env(claw(alice, bob[
"USD"](2000)));
870 env.require(balance(bob, alice[
"USD"](0)));
871 env.require(balance(alice, bob[
"USD"](0)));
879 env(trust(bob, USD(0), 0));
891 using namespace test::jtx;
894 Env env(*
this, features);
895 Account alice{
"alice"};
898 env.fund(XRP(1000), alice, bob);
901 auto const USD = alice[
"USD"];
909 env.trust(USD(1000), bob);
910 env(pay(alice, bob, USD(100)));
913 env.require(balance(bob, alice[
"USD"](100)));
914 env.require(balance(alice, bob[
"USD"](-100)));
919 env(ticket::create(alice, ticketCnt));
922 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
923 BEAST_EXPECT(
ownerCount(env, alice) == ticketCnt);
925 while (ticketCnt > 0)
928 env(claw(alice, bob[
"USD"](5)), ticket::use(aliceTicketSeq++));
932 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
933 BEAST_EXPECT(
ownerCount(env, alice) == ticketCnt);
937 env.require(balance(bob, alice[
"USD"](50)));
938 env.require(balance(alice, bob[
"USD"](-50)));
941 BEAST_EXPECT(env.seq(alice) == aliceSeq);
963 using namespace test::jtx;