68 testcase(
"Enable AllowTrustLineClawback flag");
75 Env env(*
this, features);
78 env.fund(XRP(1000), alice);
82 env(fset(alice, asfAllowTrustLineClawback));
84 env.require(Flags(alice, asfAllowTrustLineClawback));
87 env(fclear(alice, asfAllowTrustLineClawback));
89 env.require(Flags(alice, asfAllowTrustLineClawback));
92 env.require(Nflags(alice, asfNoFreeze));
100 Env env(*
this, features);
103 env.fund(XRP(1000), alice);
106 env.require(Nflags(alice, asfNoFreeze));
109 env(fset(alice, asfNoFreeze));
113 env.require(Flags(alice, asfNoFreeze));
119 env.require(Nflags(alice, asfAllowTrustLineClawback));
125 Env env(*
this, features);
130 env.fund(XRP(1000), alice, bob);
133 auto const usd = alice[
"USD"];
134 env.require(Nflags(alice, asfAllowTrustLineClawback));
137 env.trust(usd(1000), bob);
138 env(pay(alice, bob, usd(10)));
141 BEAST_EXPECT(ownerCount(env, alice) == 0);
142 BEAST_EXPECT(ownerCount(env, bob) == 1);
145 env(fset(alice, asfAllowTrustLineClawback), Ter(
tecOWNERS));
150 env(trust(bob, usd(0), 0));
151 env(pay(bob, alice, usd(10)));
153 BEAST_EXPECT(ownerCount(env, alice) == 0);
154 BEAST_EXPECT(ownerCount(env, bob) == 0);
157 env(fset(alice, asfAllowTrustLineClawback));
159 env.require(Flags(alice, asfAllowTrustLineClawback));
161 BEAST_EXPECT(ownerCount(env, alice) == 0);
162 BEAST_EXPECT(ownerCount(env, bob) == 0);
181 Env env(*
this, features);
186 env.fund(XRP(1000), alice, bob);
190 env(fset(alice, asfAllowTrustLineClawback));
192 env.require(Flags(alice, asfAllowTrustLineClawback));
194 auto const usd = alice[
"USD"];
197 env.trust(usd(1000), bob);
198 env(pay(alice, bob, usd(10)));
201 env.require(Balance(bob, alice[
"USD"](10)));
202 env.require(Balance(alice, bob[
"USD"](-10)));
205 env(claw(alice, bob[
"USD"](5)), Txflags(0x00008000), Ter(
temINVALID_FLAG));
226 env(pay(bob, alice, usd(10)));
230 BEAST_EXPECT(ownerCount(env, alice) == 0);
231 BEAST_EXPECT(ownerCount(env, bob) == 1);
232 env.require(Balance(bob, alice[
"USD"](0)));
233 env.require(Balance(alice, bob[
"USD"](0)));
240 env(trust(bob, usd(0), 0));
244 BEAST_EXPECT(ownerCount(env, alice) == 0);
245 BEAST_EXPECT(ownerCount(env, bob) == 0);
248 env(claw(alice, bob[
"USD"](5)), Ter(
tecNO_LINE));
263 Env env(*
this, features);
269 env.fund(XRP(1000), alice);
273 env(fset(alice, asfAllowTrustLineClawback));
275 env.require(Flags(alice, asfAllowTrustLineClawback));
285 Env env(*
this, features);
291 env.fund(XRP(1000), alice, bob, cindy);
294 auto const usd = alice[
"USD"];
297 env(fset(alice, asfAllowTrustLineClawback));
299 env.require(Flags(alice, asfAllowTrustLineClawback));
302 env(fset(cindy, asfAllowTrustLineClawback));
304 env.require(Flags(cindy, asfAllowTrustLineClawback));
307 env.trust(usd(1000), bob);
308 env(pay(alice, bob, usd(1000)));
311 env.require(Balance(bob, alice[
"USD"](1000)));
312 env.require(Balance(alice, bob[
"USD"](-1000)));
316 env(claw(cindy, bob[
"USD"](200)), Ter(
tecNO_LINE));
328 Env env(*
this, features);
333 env.fund(XRP(1000), alice, bob);
336 auto const usd = alice[
"USD"];
337 auto const cad = bob[
"CAD"];
340 env(fset(alice, asfAllowTrustLineClawback));
342 env.require(Flags(alice, asfAllowTrustLineClawback));
345 env(fset(bob, asfAllowTrustLineClawback));
347 env.require(Flags(bob, asfAllowTrustLineClawback));
356 env.trust(usd(1000), bob);
357 env(pay(alice, bob, usd(10)));
360 env.require(Balance(bob, alice[
"USD"](10)));
361 env.require(Balance(alice, bob[
"USD"](-10)));
376 env.trust(cad(1000), alice);
377 env(pay(bob, alice, cad(10)));
380 env.require(Balance(bob, alice[
"CAD"](-10)));
381 env.require(Balance(alice, bob[
"CAD"](10)));
398 Env env(*
this, features);
403 env.fund(XRP(1000), alice, bob);
406 auto const usd = alice[
"USD"];
409 env(fset(alice, asfAllowTrustLineClawback));
411 env.require(Flags(alice, asfAllowTrustLineClawback));
414 env.trust(usd(1000), bob);
415 env(pay(alice, bob, usd(1000)));
418 env.require(Balance(bob, alice[
"USD"](1000)));
419 env.require(Balance(alice, bob[
"USD"](-1000)));
422 env(claw(alice, bob[
"USD"](200)));
426 env.require(Balance(bob, alice[
"USD"](800)));
427 env.require(Balance(alice, bob[
"USD"](-800)));
430 env(claw(alice, bob[
"USD"](800)));
434 env.require(Balance(bob, alice[
"USD"](0)));
435 env.require(Balance(alice, bob[
"USD"](0)));
449 Env env(*
this, features);
455 env.fund(XRP(1000), alice, bob, cindy);
459 env(fset(alice, asfAllowTrustLineClawback));
461 env.require(Flags(alice, asfAllowTrustLineClawback));
464 env(fset(bob, asfAllowTrustLineClawback));
466 env.require(Flags(bob, asfAllowTrustLineClawback));
469 env.trust(alice[
"USD"](1000), cindy);
470 env(pay(alice, cindy, alice[
"USD"](1000)));
474 env.trust(bob[
"USD"](1000), cindy);
475 env(pay(bob, cindy, bob[
"USD"](1000)));
479 env(claw(alice, cindy[
"USD"](200)));
483 env.require(Balance(cindy, alice[
"USD"](800)));
484 env.require(Balance(alice, cindy[
"USD"](-800)));
487 env.require(Balance(cindy, bob[
"USD"](1000)));
488 env.require(Balance(bob, cindy[
"USD"](-1000)));
491 env(claw(bob, cindy[
"USD"](600)));
495 env.require(Balance(cindy, bob[
"USD"](400)));
496 env.require(Balance(bob, cindy[
"USD"](-400)));
499 env.require(Balance(cindy, alice[
"USD"](800)));
500 env.require(Balance(alice, cindy[
"USD"](-800)));
507 Env env(*
this, features);
513 env.fund(XRP(1000), alice, bob, cindy);
516 auto const usd = alice[
"USD"];
519 env(fset(alice, asfAllowTrustLineClawback));
521 env.require(Flags(alice, asfAllowTrustLineClawback));
524 env.trust(usd(1000), bob);
525 env(pay(alice, bob, usd(600)));
528 env.require(Balance(alice, bob[
"USD"](-600)));
529 env.require(Balance(bob, alice[
"USD"](600)));
532 env.trust(usd(1000), cindy);
533 env(pay(alice, cindy, usd(1000)));
536 env.require(Balance(alice, cindy[
"USD"](-1000)));
537 env.require(Balance(cindy, alice[
"USD"](1000)));
540 env(claw(alice, bob[
"USD"](500)));
544 env.require(Balance(alice, bob[
"USD"](-100)));
545 env.require(Balance(bob, alice[
"USD"](100)));
548 env.require(Balance(alice, cindy[
"USD"](-1000)));
549 env.require(Balance(cindy, alice[
"USD"](1000)));
552 env(claw(alice, cindy[
"USD"](300)));
556 env.require(Balance(alice, bob[
"USD"](-100)));
557 env.require(Balance(bob, alice[
"USD"](100)));
560 env.require(Balance(alice, cindy[
"USD"](-700)));
561 env.require(Balance(cindy, alice[
"USD"](700)));
577 Env env(*
this, features);
582 env.fund(XRP(1000), alice, bob);
586 env(fset(alice, asfAllowTrustLineClawback));
588 env.require(Flags(alice, asfAllowTrustLineClawback));
591 env(fset(bob, asfAllowTrustLineClawback));
593 env.require(Flags(bob, asfAllowTrustLineClawback));
596 env.trust(alice[
"USD"](1000), bob);
597 env(pay(alice, bob, alice[
"USD"](1000)));
600 BEAST_EXPECT(ownerCount(env, alice) == 0);
601 BEAST_EXPECT(ownerCount(env, bob) == 1);
604 env.require(Balance(bob, alice[
"USD"](1000)));
605 env.require(Balance(alice, bob[
"USD"](-1000)));
608 env.trust(bob[
"USD"](1500), alice);
609 env(pay(bob, alice, bob[
"USD"](1500)));
612 BEAST_EXPECT(ownerCount(env, alice) == 1);
613 BEAST_EXPECT(ownerCount(env, bob) == 1);
617 env.require(Balance(bob, alice[
"USD"](-500)));
618 env.require(Balance(alice, bob[
"USD"](500)));
630 env(claw(bob, alice[
"USD"](200)));
633 env.require(Balance(bob, alice[
"USD"](-300)));
634 env.require(Balance(alice, bob[
"USD"](300)));
637 env(pay(alice, bob, alice[
"USD"](1000)));
642 env.require(Balance(bob, alice[
"USD"](700)));
643 env.require(Balance(alice, bob[
"USD"](-700)));
650 env(claw(alice, bob[
"USD"](200)));
653 env.require(Balance(bob, alice[
"USD"](500)));
654 env.require(Balance(alice, bob[
"USD"](-500)));
660 testcase(
"Delete default trustline");
665 Env env(*
this, features);
669 env.fund(XRP(1000), alice, bob);
672 auto const usd = alice[
"USD"];
675 env(fset(alice, asfAllowTrustLineClawback));
677 env.require(Flags(alice, asfAllowTrustLineClawback));
680 env.trust(usd(1000), bob);
681 env(pay(alice, bob, usd(1000)));
684 BEAST_EXPECT(ownerCount(env, alice) == 0);
685 BEAST_EXPECT(ownerCount(env, bob) == 1);
687 env.require(Balance(bob, alice[
"USD"](1000)));
688 env.require(Balance(alice, bob[
"USD"](-1000)));
691 env(trust(bob, usd(0), 0));
694 BEAST_EXPECT(ownerCount(env, alice) == 0);
695 BEAST_EXPECT(ownerCount(env, bob) == 1);
699 env(claw(alice, bob[
"USD"](1000)));
703 BEAST_EXPECT(ownerCount(env, alice) == 0);
704 BEAST_EXPECT(ownerCount(env, bob) == 0);
715 Env env(*
this, features);
719 env.fund(XRP(1000), alice, bob);
722 auto const usd = alice[
"USD"];
725 env(fset(alice, asfAllowTrustLineClawback));
727 env.require(Flags(alice, asfAllowTrustLineClawback));
730 env.trust(usd(1000), bob);
731 env(pay(alice, bob, usd(1000)));
734 env.require(Balance(bob, alice[
"USD"](1000)));
735 env.require(Balance(alice, bob[
"USD"](-1000)));
738 env(trust(alice, bob[
"USD"](0), tfSetFreeze));
742 env(claw(alice, bob[
"USD"](200)));
746 env.require(Balance(bob, alice[
"USD"](800)));
747 env.require(Balance(alice, bob[
"USD"](-800)));
756 testcase(
"Amount exceeds available");
761 Env env(*
this, features);
765 env.fund(XRP(1000), alice, bob);
768 auto const usd = alice[
"USD"];
771 env(fset(alice, asfAllowTrustLineClawback));
773 env.require(Flags(alice, asfAllowTrustLineClawback));
776 env.trust(usd(1000), bob);
777 env(pay(alice, bob, usd(1000)));
780 env.require(Balance(bob, alice[
"USD"](1000)));
781 env.require(Balance(alice, bob[
"USD"](-1000)));
784 env(claw(alice, bob[
"USD"](2000)));
789 env.require(Balance(bob, alice[
"USD"](0)));
790 env.require(Balance(alice, bob[
"USD"](0)));
794 BEAST_EXPECT(ownerCount(env, alice) == 0);
795 BEAST_EXPECT(ownerCount(env, bob) == 1);
798 env(trust(bob, usd(0), 0));
802 BEAST_EXPECT(ownerCount(env, alice) == 0);
803 BEAST_EXPECT(ownerCount(env, bob) == 0);
813 Env env(*
this, features);
817 env.fund(XRP(1000), alice, bob);
820 auto const usd = alice[
"USD"];
823 env(fset(alice, asfAllowTrustLineClawback));
825 env.require(Flags(alice, asfAllowTrustLineClawback));
828 env.trust(usd(1000), bob);
829 env(pay(alice, bob, usd(100)));
832 env.require(Balance(bob, alice[
"USD"](100)));
833 env.require(Balance(alice, bob[
"USD"](-100)));
838 env(ticket::create(alice, ticketCnt));
841 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
842 BEAST_EXPECT(ownerCount(env, alice) == ticketCnt);
844 while (ticketCnt > 0)
847 env(claw(alice, bob[
"USD"](5)), ticket::Use(aliceTicketSeq++));
851 BEAST_EXPECT(
ticketCount(env, alice) == ticketCnt);
852 BEAST_EXPECT(ownerCount(env, alice) == ticketCnt);
856 env.require(Balance(bob, alice[
"USD"](50)));
857 env.require(Balance(alice, bob[
"USD"](-50)));
860 BEAST_EXPECT(env.seq(alice) == aliceSeq);